rmello-devise 2.1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. data/.gitignore +12 -0
  2. data/.travis.yml +15 -0
  3. data/CHANGELOG.rdoc +845 -0
  4. data/Gemfile +35 -0
  5. data/Gemfile.lock +165 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +383 -0
  8. data/Rakefile +34 -0
  9. data/app/controllers/devise/confirmations_controller.rb +43 -0
  10. data/app/controllers/devise/omniauth_callbacks_controller.rb +24 -0
  11. data/app/controllers/devise/passwords_controller.rb +47 -0
  12. data/app/controllers/devise/registrations_controller.rb +107 -0
  13. data/app/controllers/devise/sessions_controller.rb +49 -0
  14. data/app/controllers/devise/unlocks_controller.rb +44 -0
  15. data/app/controllers/devise_controller.rb +184 -0
  16. data/app/helpers/devise_helper.rb +25 -0
  17. data/app/mailers/devise/mailer.rb +15 -0
  18. data/app/views/devise/_links.erb +3 -0
  19. data/app/views/devise/confirmations/new.html.erb +12 -0
  20. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  21. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  22. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  23. data/app/views/devise/passwords/edit.html.erb +16 -0
  24. data/app/views/devise/passwords/new.html.erb +12 -0
  25. data/app/views/devise/registrations/edit.html.erb +25 -0
  26. data/app/views/devise/registrations/new.html.erb +18 -0
  27. data/app/views/devise/sessions/new.html.erb +17 -0
  28. data/app/views/devise/shared/_links.erb +25 -0
  29. data/app/views/devise/unlocks/new.html.erb +12 -0
  30. data/config/locales/en.yml +57 -0
  31. data/devise.gemspec +25 -0
  32. data/gemfiles/Gemfile.rails-3.1.x +35 -0
  33. data/gemfiles/Gemfile.rails-3.1.x.lock +167 -0
  34. data/lib/devise.rb +440 -0
  35. data/lib/devise/controllers/helpers.rb +269 -0
  36. data/lib/devise/controllers/rememberable.rb +52 -0
  37. data/lib/devise/controllers/scoped_views.rb +17 -0
  38. data/lib/devise/controllers/url_helpers.rb +67 -0
  39. data/lib/devise/delegator.rb +16 -0
  40. data/lib/devise/failure_app.rb +187 -0
  41. data/lib/devise/hooks/activatable.rb +11 -0
  42. data/lib/devise/hooks/forgetable.rb +9 -0
  43. data/lib/devise/hooks/lockable.rb +7 -0
  44. data/lib/devise/hooks/rememberable.rb +6 -0
  45. data/lib/devise/hooks/timeoutable.rb +22 -0
  46. data/lib/devise/hooks/trackable.rb +9 -0
  47. data/lib/devise/mailers/helpers.rb +86 -0
  48. data/lib/devise/mapping.rb +172 -0
  49. data/lib/devise/models.rb +128 -0
  50. data/lib/devise/models/authenticatable.rb +231 -0
  51. data/lib/devise/models/confirmable.rb +268 -0
  52. data/lib/devise/models/database_authenticatable.rb +126 -0
  53. data/lib/devise/models/lockable.rb +185 -0
  54. data/lib/devise/models/omniauthable.rb +27 -0
  55. data/lib/devise/models/recoverable.rb +140 -0
  56. data/lib/devise/models/registerable.rb +25 -0
  57. data/lib/devise/models/rememberable.rb +125 -0
  58. data/lib/devise/models/timeoutable.rb +49 -0
  59. data/lib/devise/models/token_authenticatable.rb +77 -0
  60. data/lib/devise/models/trackable.rb +35 -0
  61. data/lib/devise/models/validatable.rb +66 -0
  62. data/lib/devise/modules.rb +29 -0
  63. data/lib/devise/omniauth.rb +28 -0
  64. data/lib/devise/omniauth/config.rb +45 -0
  65. data/lib/devise/omniauth/url_helpers.rb +33 -0
  66. data/lib/devise/orm/active_record.rb +3 -0
  67. data/lib/devise/orm/mongoid.rb +3 -0
  68. data/lib/devise/param_filter.rb +41 -0
  69. data/lib/devise/rails.rb +54 -0
  70. data/lib/devise/rails/routes.rb +426 -0
  71. data/lib/devise/rails/warden_compat.rb +43 -0
  72. data/lib/devise/strategies/authenticatable.rb +176 -0
  73. data/lib/devise/strategies/base.rb +15 -0
  74. data/lib/devise/strategies/database_authenticatable.rb +20 -0
  75. data/lib/devise/strategies/rememberable.rb +55 -0
  76. data/lib/devise/strategies/token_authenticatable.rb +56 -0
  77. data/lib/devise/test_helpers.rb +130 -0
  78. data/lib/devise/version.rb +3 -0
  79. data/lib/generators/active_record/devise_generator.rb +75 -0
  80. data/lib/generators/active_record/templates/migration.rb +19 -0
  81. data/lib/generators/active_record/templates/migration_existing.rb +26 -0
  82. data/lib/generators/devise/devise_generator.rb +24 -0
  83. data/lib/generators/devise/install_generator.rb +24 -0
  84. data/lib/generators/devise/orm_helpers.rb +32 -0
  85. data/lib/generators/devise/views_generator.rb +110 -0
  86. data/lib/generators/mongoid/devise_generator.rb +57 -0
  87. data/lib/generators/templates/README +31 -0
  88. data/lib/generators/templates/devise.rb +216 -0
  89. data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
  90. data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
  91. data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
  92. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +15 -0
  93. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
  94. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
  95. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +22 -0
  96. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
  97. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
  98. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +15 -0
  99. data/test/controllers/custom_strategy_test.rb +62 -0
  100. data/test/controllers/helpers_test.rb +254 -0
  101. data/test/controllers/internal_helpers_test.rb +104 -0
  102. data/test/controllers/sessions_controller_test.rb +43 -0
  103. data/test/controllers/url_helpers_test.rb +59 -0
  104. data/test/delegator_test.rb +19 -0
  105. data/test/devise_test.rb +72 -0
  106. data/test/failure_app_test.rb +221 -0
  107. data/test/generators/active_record_generator_test.rb +69 -0
  108. data/test/generators/devise_generator_test.rb +39 -0
  109. data/test/generators/install_generator_test.rb +13 -0
  110. data/test/generators/mongoid_generator_test.rb +23 -0
  111. data/test/generators/views_generator_test.rb +52 -0
  112. data/test/helpers/devise_helper_test.rb +51 -0
  113. data/test/indifferent_hash.rb +33 -0
  114. data/test/integration/authenticatable_test.rb +587 -0
  115. data/test/integration/confirmable_test.rb +255 -0
  116. data/test/integration/database_authenticatable_test.rb +82 -0
  117. data/test/integration/http_authenticatable_test.rb +97 -0
  118. data/test/integration/lockable_test.rb +224 -0
  119. data/test/integration/omniauthable_test.rb +133 -0
  120. data/test/integration/recoverable_test.rb +300 -0
  121. data/test/integration/registerable_test.rb +324 -0
  122. data/test/integration/rememberable_test.rb +158 -0
  123. data/test/integration/timeoutable_test.rb +114 -0
  124. data/test/integration/token_authenticatable_test.rb +161 -0
  125. data/test/integration/trackable_test.rb +92 -0
  126. data/test/mailers/confirmation_instructions_test.rb +95 -0
  127. data/test/mailers/reset_password_instructions_test.rb +83 -0
  128. data/test/mailers/unlock_instructions_test.rb +77 -0
  129. data/test/mapping_test.rb +127 -0
  130. data/test/models/authenticatable_test.rb +7 -0
  131. data/test/models/confirmable_test.rb +377 -0
  132. data/test/models/database_authenticatable_test.rb +189 -0
  133. data/test/models/lockable_test.rb +263 -0
  134. data/test/models/omniauthable_test.rb +7 -0
  135. data/test/models/recoverable_test.rb +205 -0
  136. data/test/models/registerable_test.rb +7 -0
  137. data/test/models/rememberable_test.rb +174 -0
  138. data/test/models/serializable_test.rb +48 -0
  139. data/test/models/timeoutable_test.rb +46 -0
  140. data/test/models/token_authenticatable_test.rb +55 -0
  141. data/test/models/trackable_test.rb +13 -0
  142. data/test/models/validatable_test.rb +117 -0
  143. data/test/models_test.rb +179 -0
  144. data/test/omniauth/config_test.rb +57 -0
  145. data/test/omniauth/url_helpers_test.rb +58 -0
  146. data/test/orm/active_record.rb +9 -0
  147. data/test/orm/mongoid.rb +14 -0
  148. data/test/rails_app/Rakefile +10 -0
  149. data/test/rails_app/app/active_record/admin.rb +6 -0
  150. data/test/rails_app/app/active_record/mobile_user.rb +6 -0
  151. data/test/rails_app/app/active_record/shim.rb +2 -0
  152. data/test/rails_app/app/active_record/user.rb +6 -0
  153. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  154. data/test/rails_app/app/controllers/admins_controller.rb +6 -0
  155. data/test/rails_app/app/controllers/application_controller.rb +8 -0
  156. data/test/rails_app/app/controllers/home_controller.rb +25 -0
  157. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  158. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  159. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  160. data/test/rails_app/app/controllers/users_controller.rb +23 -0
  161. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  162. data/test/rails_app/app/mailers/users/mailer.rb +3 -0
  163. data/test/rails_app/app/mongoid/admin.rb +27 -0
  164. data/test/rails_app/app/mongoid/shim.rb +24 -0
  165. data/test/rails_app/app/mongoid/user.rb +42 -0
  166. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  167. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  168. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
  169. data/test/rails_app/app/views/home/index.html.erb +1 -0
  170. data/test/rails_app/app/views/home/join.html.erb +1 -0
  171. data/test/rails_app/app/views/home/private.html.erb +1 -0
  172. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
  173. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  174. data/test/rails_app/app/views/users/index.html.erb +1 -0
  175. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  176. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  177. data/test/rails_app/config.ru +4 -0
  178. data/test/rails_app/config/application.rb +41 -0
  179. data/test/rails_app/config/boot.rb +8 -0
  180. data/test/rails_app/config/database.yml +18 -0
  181. data/test/rails_app/config/environment.rb +5 -0
  182. data/test/rails_app/config/environments/development.rb +18 -0
  183. data/test/rails_app/config/environments/production.rb +33 -0
  184. data/test/rails_app/config/environments/test.rb +33 -0
  185. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  186. data/test/rails_app/config/initializers/devise.rb +178 -0
  187. data/test/rails_app/config/initializers/inflections.rb +2 -0
  188. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  189. data/test/rails_app/config/routes.rb +93 -0
  190. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +88 -0
  191. data/test/rails_app/db/schema.rb +52 -0
  192. data/test/rails_app/lib/shared_admin.rb +14 -0
  193. data/test/rails_app/lib/shared_mobile_user.rb +13 -0
  194. data/test/rails_app/lib/shared_user.rb +26 -0
  195. data/test/rails_app/public/404.html +26 -0
  196. data/test/rails_app/public/422.html +26 -0
  197. data/test/rails_app/public/500.html +26 -0
  198. data/test/rails_app/public/favicon.ico +0 -0
  199. data/test/rails_app/script/rails +10 -0
  200. data/test/routes_test.rb +248 -0
  201. data/test/support/assertions.rb +40 -0
  202. data/test/support/helpers.rb +97 -0
  203. data/test/support/integration.rb +90 -0
  204. data/test/support/locale/en.yml +4 -0
  205. data/test/support/webrat/integrations/rails.rb +24 -0
  206. data/test/test_helper.rb +27 -0
  207. data/test/test_helpers_test.rb +134 -0
  208. metadata +425 -0
@@ -0,0 +1,158 @@
1
+ require 'test_helper'
2
+
3
+ class RememberMeTest < ActionController::IntegrationTest
4
+ def create_user_and_remember(add_to_token='')
5
+ user = create_user
6
+ user.remember_me!
7
+ raw_cookie = User.serialize_into_cookie(user).tap { |a| a.last << add_to_token }
8
+ cookies['remember_user_token'] = generate_signed_cookie(raw_cookie)
9
+ user
10
+ end
11
+
12
+ def generate_signed_cookie(raw_cookie)
13
+ request = ActionDispatch::TestRequest.new
14
+ request.cookie_jar.signed['raw_cookie'] = raw_cookie
15
+ request.cookie_jar['raw_cookie']
16
+ end
17
+
18
+ def signed_cookie(key)
19
+ controller.send(:cookies).signed[key]
20
+ end
21
+
22
+ def cookie_expires(key)
23
+ cookie = response.headers["Set-Cookie"].split("\n").grep(/^#{key}/).first
24
+ expires = cookie.split(";").map(&:strip).grep(/^expires=/).first
25
+ Time.parse(expires).utc
26
+ end
27
+
28
+ test 'do not remember the user if he has not checked remember me option' do
29
+ user = sign_in_as_user
30
+ assert_nil request.cookies["remember_user_cookie"]
31
+ end
32
+
33
+ test 'handles unverified requests gets rid of caches' do
34
+ swap UsersController, :allow_forgery_protection => true do
35
+ post exhibit_user_url(1)
36
+ assert_not warden.authenticated?(:user)
37
+
38
+ create_user_and_remember
39
+ post exhibit_user_url(1)
40
+ assert_equal "User is not authenticated", response.body
41
+ assert_not warden.authenticated?(:user)
42
+ end
43
+ end
44
+
45
+ test 'generate remember token after sign in' do
46
+ user = sign_in_as_user :remember_me => true
47
+ assert request.cookies["remember_user_token"]
48
+ end
49
+
50
+ test 'generate remember token after sign in setting cookie options' do
51
+ # We test this by asserting the cookie is not sent after the redirect
52
+ # since we changed the domain. This is the only difference with the
53
+ # previous test.
54
+ swap Devise, :rememberable_options => { :domain => "omg.somewhere.com" } do
55
+ user = sign_in_as_user :remember_me => true
56
+ assert_nil request.cookies["remember_user_token"]
57
+ end
58
+ end
59
+
60
+ test 'generate remember token after sign in setting session options' do
61
+ begin
62
+ Rails.configuration.session_options[:domain] = "omg.somewhere.com"
63
+ user = sign_in_as_user :remember_me => true
64
+ assert_nil request.cookies["remember_user_token"]
65
+ ensure
66
+ Rails.configuration.session_options.delete(:domain)
67
+ end
68
+ end
69
+
70
+ test 'remember the user before sign in' do
71
+ user = create_user_and_remember
72
+ get users_path
73
+ assert_response :success
74
+ assert warden.authenticated?(:user)
75
+ assert warden.user(:user) == user
76
+ assert_match /remember_user_token[^\n]*HttpOnly/, response.headers["Set-Cookie"], "Expected Set-Cookie header in response to set HttpOnly flag on remember_user_token cookie."
77
+ end
78
+
79
+ test 'remember the user before sign up and redirect him to his home' do
80
+ user = create_user_and_remember
81
+ get new_user_registration_path
82
+ assert warden.authenticated?(:user)
83
+ assert_redirected_to root_path
84
+ end
85
+
86
+ test 'cookies are destroyed on unverified requests' do
87
+ swap ApplicationController, :allow_forgery_protection => true do
88
+ user = create_user_and_remember
89
+ get users_path
90
+ assert warden.authenticated?(:user)
91
+ post root_path, :authenticity_token => 'INVALID'
92
+ assert_not warden.authenticated?(:user)
93
+ end
94
+ end
95
+
96
+ test 'does not extend remember period through sign in' do
97
+ swap Devise, :extend_remember_period => true, :remember_for => 1.year do
98
+ user = create_user
99
+ user.remember_me!
100
+
101
+ user.remember_created_at = old = 10.days.ago
102
+ user.save
103
+
104
+ sign_in_as_user :remember_me => true
105
+ user.reload
106
+
107
+ assert warden.user(:user) == user
108
+ assert_equal old.to_i, user.remember_created_at.to_i
109
+ end
110
+ end
111
+
112
+ test 'do not remember other scopes' do
113
+ user = create_user_and_remember
114
+ get root_path
115
+ assert_response :success
116
+ assert warden.authenticated?(:user)
117
+ assert_not warden.authenticated?(:admin)
118
+ end
119
+
120
+ test 'do not remember with invalid token' do
121
+ user = create_user_and_remember('add')
122
+ get users_path
123
+ assert_not warden.authenticated?(:user)
124
+ assert_redirected_to new_user_session_path
125
+ end
126
+
127
+ test 'do not remember with expired token' do
128
+ user = create_user_and_remember
129
+ swap Devise, :remember_for => 0 do
130
+ get users_path
131
+ assert_not warden.authenticated?(:user)
132
+ assert_redirected_to new_user_session_path
133
+ end
134
+ end
135
+
136
+ test 'do not remember the user anymore after forget' do
137
+ user = create_user_and_remember
138
+ get users_path
139
+ assert warden.authenticated?(:user)
140
+
141
+ get destroy_user_session_path
142
+ assert_not warden.authenticated?(:user)
143
+ assert_nil warden.cookies['remember_user_token']
144
+
145
+ get users_path
146
+ assert_not warden.authenticated?(:user)
147
+ end
148
+
149
+ test 'changing user password expires remember me token' do
150
+ user = create_user_and_remember
151
+ user.password = "another_password"
152
+ user.password_confirmation = "another_password"
153
+ user.save!
154
+
155
+ get users_path
156
+ assert_not warden.authenticated?(:user)
157
+ end
158
+ end
@@ -0,0 +1,114 @@
1
+ require 'test_helper'
2
+
3
+ class SessionTimeoutTest < ActionController::IntegrationTest
4
+
5
+ def last_request_at
6
+ @controller.user_session['last_request_at']
7
+ end
8
+
9
+ test 'set last request at in user session after each request' do
10
+ sign_in_as_user
11
+ old_last_request = last_request_at
12
+ assert_not_nil last_request_at
13
+
14
+ get users_path
15
+ assert_not_nil last_request_at
16
+ assert_not_equal old_last_request, last_request_at
17
+ end
18
+
19
+ test 'set last request at in user session after each request is skipped if tracking is disabled' do
20
+ sign_in_as_user
21
+ old_last_request = last_request_at
22
+ assert_not_nil last_request_at
23
+
24
+ get users_path, {}, 'devise.skip_trackable' => true
25
+ assert_equal old_last_request, last_request_at
26
+ end
27
+
28
+ test 'not time out user session before default limit time' do
29
+ sign_in_as_user
30
+ assert_response :success
31
+ assert warden.authenticated?(:user)
32
+
33
+ get users_path
34
+ assert_response :success
35
+ assert warden.authenticated?(:user)
36
+ end
37
+
38
+ test 'time out user session after default limit time' do
39
+ user = sign_in_as_user
40
+ get expire_user_path(user)
41
+ assert_not_nil last_request_at
42
+
43
+ get users_path
44
+ assert_redirected_to users_path
45
+ assert_not warden.authenticated?(:user)
46
+ end
47
+
48
+ test 'time out is not triggered on sign out' do
49
+ user = sign_in_as_user
50
+ get expire_user_path(user)
51
+
52
+ get destroy_user_session_path
53
+
54
+ assert_response :redirect
55
+ assert_redirected_to root_path
56
+
57
+ follow_redirect!
58
+
59
+ assert_contain 'Signed out successfully'
60
+ end
61
+
62
+ test 'user configured timeout limit' do
63
+ swap Devise, :timeout_in => 8.minutes do
64
+ user = sign_in_as_user
65
+
66
+ get users_path
67
+ assert_not_nil last_request_at
68
+ assert_response :success
69
+ assert warden.authenticated?(:user)
70
+
71
+ get expire_user_path(user)
72
+ get users_path
73
+ assert_redirected_to users_path
74
+ assert_not warden.authenticated?(:user)
75
+ end
76
+ end
77
+
78
+ test 'error message with i18n' do
79
+ store_translations :en, :devise => {
80
+ :failure => { :user => { :timeout => 'Session expired!' } }
81
+ } do
82
+ user = sign_in_as_user
83
+
84
+ get expire_user_path(user)
85
+ get root_path
86
+ follow_redirect!
87
+ assert_contain 'Session expired!'
88
+ end
89
+ end
90
+
91
+ test 'error message with i18n with double redirect' do
92
+ store_translations :en, :devise => {
93
+ :failure => { :user => { :timeout => 'Session expired!' } }
94
+ } do
95
+ user = sign_in_as_user
96
+
97
+ get expire_user_path(user)
98
+ get users_path
99
+ follow_redirect!
100
+ follow_redirect!
101
+ assert_contain 'Session expired!'
102
+ end
103
+ end
104
+
105
+ test 'time out not triggered if remembered' do
106
+ user = sign_in_as_user :remember_me => true
107
+ get expire_user_path(user)
108
+ assert_not_nil last_request_at
109
+
110
+ get users_path
111
+ assert_response :success
112
+ assert warden.authenticated?(:user)
113
+ end
114
+ end
@@ -0,0 +1,161 @@
1
+ require 'test_helper'
2
+
3
+ class TokenAuthenticationTest < ActionController::IntegrationTest
4
+
5
+ test 'authenticate with valid authentication token key and value through params' do
6
+ swap Devise, :token_authentication_key => :secret_token do
7
+ sign_in_as_new_user_with_token
8
+
9
+ assert_response :success
10
+ assert_current_url "/users?secret_token=#{VALID_AUTHENTICATION_TOKEN}"
11
+ assert_contain 'Welcome'
12
+ assert warden.authenticated?(:user)
13
+ end
14
+ end
15
+
16
+ test 'authenticate with valid authentication token key and value through params, when params with the same key as scope exist' do
17
+ swap Devise, :token_authentication_key => :secret_token do
18
+ user = create_user_with_authentication_token
19
+ post exhibit_user_path(user), Devise.token_authentication_key => user.authentication_token, :user => { :some => "data" }
20
+
21
+ assert_response :success
22
+ assert_contain 'User is authenticated'
23
+ assert warden.authenticated?(:user)
24
+ end
25
+ end
26
+
27
+ test 'authenticate with valid authentication token key but does not store if stateless' do
28
+ swap Devise, :token_authentication_key => :secret_token, :skip_session_storage => [:token_auth] do
29
+ sign_in_as_new_user_with_token
30
+ assert warden.authenticated?(:user)
31
+
32
+ get users_path
33
+ assert_redirected_to new_user_session_path
34
+ assert_not warden.authenticated?(:user)
35
+ end
36
+ end
37
+
38
+ test 'authenticate with valid authentication token key and value through http' do
39
+ swap Devise, :token_authentication_key => :secret_token do
40
+ sign_in_as_new_user_with_token(:http_auth => true)
41
+
42
+ assert_response :success
43
+ assert_match '<email>user@test.com</email>', response.body
44
+ assert warden.authenticated?(:user)
45
+ end
46
+ end
47
+
48
+ test 'does authenticate with valid authentication token key and value through params if not configured' do
49
+ swap Devise, :token_authentication_key => :secret_token, :params_authenticatable => [:database] do
50
+ sign_in_as_new_user_with_token
51
+
52
+ assert_contain 'You need to sign in or sign up before continuing'
53
+ assert_contain 'Sign in'
54
+ assert_not warden.authenticated?(:user)
55
+ end
56
+ end
57
+
58
+ test 'does authenticate with valid authentication token key and value through http if not configured' do
59
+ swap Devise, :token_authentication_key => :secret_token, :http_authenticatable => [:database] do
60
+ sign_in_as_new_user_with_token(:http_auth => true)
61
+
62
+ assert_response 401
63
+ assert_contain 'Invalid email or password.'
64
+ assert_not warden.authenticated?(:user)
65
+ end
66
+ end
67
+
68
+ test 'does not authenticate with improper authentication token key' do
69
+ swap Devise, :token_authentication_key => :donald_duck_token do
70
+ sign_in_as_new_user_with_token(:auth_token_key => :secret_token)
71
+ assert_equal new_user_session_path, @request.path
72
+
73
+ assert_contain 'You need to sign in or sign up before continuing'
74
+ assert_contain 'Sign in'
75
+ assert_not warden.authenticated?(:user)
76
+ end
77
+ end
78
+
79
+ test 'does not authenticate with improper authentication token value' do
80
+ store_translations :en, :devise => {:failure => {:invalid_token => 'LOL, that was not a single character correct.'}} do
81
+ sign_in_as_new_user_with_token(:auth_token => '*** INVALID TOKEN ***')
82
+ assert_equal new_user_session_path, @request.path
83
+
84
+ assert_contain 'LOL, that was not a single character correct.'
85
+ assert_contain 'Sign in'
86
+ assert_not warden.authenticated?(:user)
87
+ end
88
+ end
89
+
90
+ test 'authenticate with valid authentication token key and do not store if stateless and timeoutable are enabled' do
91
+ swap Devise, :token_authentication_key => :secret_token, :skip_session_storage => [:token_auth], :timeout_in => (0.1).second do
92
+ user = sign_in_as_new_user_with_token
93
+ assert warden.authenticated?(:user)
94
+
95
+ # Expiring does not work because we are setting the session value when accessing it
96
+ sleep 0.3
97
+
98
+ get_users_path_as_existing_user(user)
99
+ assert warden.authenticated?(:user)
100
+ end
101
+ end
102
+
103
+ test 'should reset token and not authenticate when expire_auth_token_on_timeout is set to true, timeoutable is enabled and we have a timed out session' do
104
+ swap Devise, :token_authentication_key => :secret_token, :expire_auth_token_on_timeout => true, :timeout_in => (-1).minute do
105
+ user = sign_in_as_new_user_with_token
106
+ assert warden.authenticated?(:user)
107
+ token = user.authentication_token
108
+
109
+ get_users_path_as_existing_user(user)
110
+ assert_not warden.authenticated?(:user)
111
+ user.reload
112
+ assert_not_equal token, user.authentication_token
113
+ end
114
+ end
115
+
116
+ test 'should not be subject to injection' do
117
+ swap Devise, :token_authentication_key => :secret_token do
118
+ user1 = create_user_with_authentication_token()
119
+
120
+ # Clean up user cache
121
+ @user = nil
122
+
123
+ user2 = create_user_with_authentication_token(:email => "another@test.com")
124
+ user2.update_attribute(:authentication_token, "ANOTHERTOKEN")
125
+
126
+ assert_not_equal user1, user2
127
+ visit users_path(Devise.token_authentication_key.to_s + '[$ne]' => user1.authentication_token)
128
+ assert_nil warden.user(:user)
129
+ end
130
+ end
131
+
132
+ private
133
+
134
+ def sign_in_as_new_user_with_token(options = {})
135
+ user = options.delete(:user) || create_user_with_authentication_token(options)
136
+
137
+ options[:auth_token_key] ||= Devise.token_authentication_key
138
+ options[:auth_token] ||= user.authentication_token
139
+
140
+ if options[:http_auth]
141
+ header = "Basic #{Base64.encode64("#{VALID_AUTHENTICATION_TOKEN}:X")}"
142
+ get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => header
143
+ else
144
+ visit users_path(options[:auth_token_key].to_sym => options[:auth_token])
145
+ end
146
+
147
+ user
148
+ end
149
+
150
+ def create_user_with_authentication_token(options={})
151
+ user = create_user(options)
152
+ user.authentication_token = VALID_AUTHENTICATION_TOKEN
153
+ user.save
154
+ user
155
+ end
156
+
157
+ def get_users_path_as_existing_user(user)
158
+ sign_in_as_new_user_with_token(:user => user)
159
+ end
160
+
161
+ end
@@ -0,0 +1,92 @@
1
+ require 'test_helper'
2
+
3
+ class TrackableHooksTest < ActionController::IntegrationTest
4
+
5
+ test "current and last sign in timestamps are updated on each sign in" do
6
+ user = create_user
7
+ assert_nil user.current_sign_in_at
8
+ assert_nil user.last_sign_in_at
9
+
10
+ sign_in_as_user
11
+ user.reload
12
+
13
+ assert_kind_of Time, user.current_sign_in_at
14
+ assert_kind_of Time, user.last_sign_in_at
15
+
16
+ assert_equal user.current_sign_in_at, user.last_sign_in_at
17
+ assert user.current_sign_in_at >= user.created_at
18
+
19
+ visit destroy_user_session_path
20
+ new_time = 2.seconds.from_now
21
+ Time.stubs(:now).returns(new_time)
22
+
23
+ sign_in_as_user
24
+ user.reload
25
+ assert user.current_sign_in_at > user.last_sign_in_at
26
+ end
27
+
28
+ test "current and last sign in remote ip are updated on each sign in" do
29
+ user = create_user
30
+ assert_nil user.current_sign_in_ip
31
+ assert_nil user.last_sign_in_ip
32
+
33
+ sign_in_as_user
34
+ user.reload
35
+
36
+ assert_equal "127.0.0.1", user.current_sign_in_ip
37
+ assert_equal "127.0.0.1", user.last_sign_in_ip
38
+ end
39
+
40
+ test "current remote ip returns original ip behind a non transparent proxy" do
41
+ user = create_user
42
+
43
+ arbitrary_ip = '200.121.1.69'
44
+ sign_in_as_user do
45
+ header 'HTTP_X_FORWARDED_FOR', arbitrary_ip
46
+ end
47
+ user.reload
48
+ assert_equal arbitrary_ip, user.current_sign_in_ip
49
+ end
50
+
51
+ test "increase sign in count" do
52
+ user = create_user
53
+ assert_equal 0, user.sign_in_count
54
+
55
+ sign_in_as_user
56
+ user.reload
57
+ assert_equal 1, user.sign_in_count
58
+
59
+ visit destroy_user_session_path
60
+ sign_in_as_user
61
+ user.reload
62
+ assert_equal 2, user.sign_in_count
63
+ end
64
+
65
+ test "does not update anything if user has signed out along the way" do
66
+ swap Devise, :allow_unconfirmed_access_for => 0 do
67
+ user = create_user(:confirm => false)
68
+ sign_in_as_user
69
+
70
+ user.reload
71
+ assert_nil user.current_sign_in_at
72
+ assert_nil user.last_sign_in_at
73
+ end
74
+ end
75
+
76
+ test "do not track if devise.skip_trackable is set" do
77
+ user = create_user
78
+ sign_in_as_user do
79
+ header 'devise.skip_trackable', '1'
80
+ end
81
+ user.reload
82
+ assert_equal 0, user.sign_in_count
83
+ visit destroy_user_session_path
84
+
85
+ sign_in_as_user do
86
+ header 'devise.skip_trackable', false
87
+ end
88
+ user.reload
89
+ assert_equal 1, user.sign_in_count
90
+ end
91
+
92
+ end