devise 3.4.1 → 3.5.10
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.
Potentially problematic release.
This version of devise might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +28 -19
- data/CHANGELOG.md +193 -104
- data/CODE_OF_CONDUCT.md +22 -0
- data/CONTRIBUTING.md +2 -0
- data/Gemfile +3 -2
- data/Gemfile.lock +90 -95
- data/MIT-LICENSE +1 -1
- data/README.md +55 -34
- data/Rakefile +2 -1
- data/app/controllers/devise/confirmations_controller.rb +4 -0
- data/app/controllers/devise/omniauth_callbacks_controller.rb +4 -0
- data/app/controllers/devise/passwords_controller.rb +14 -4
- data/app/controllers/devise/registrations_controller.rb +10 -11
- data/app/controllers/devise/sessions_controller.rb +7 -2
- data/app/controllers/devise/unlocks_controller.rb +3 -0
- data/app/controllers/devise_controller.rb +34 -18
- data/app/mailers/devise/mailer.rb +4 -0
- data/app/views/devise/confirmations/new.html.erb +1 -1
- data/app/views/devise/mailer/password_change.html.erb +3 -0
- data/app/views/devise/passwords/edit.html.erb +3 -0
- data/app/views/devise/registrations/new.html.erb +1 -1
- data/app/views/devise/shared/_links.html.erb +1 -1
- data/config/locales/en.yml +2 -0
- data/devise.gemspec +0 -2
- data/gemfiles/Gemfile.rails-3.2-stable.lock +52 -49
- data/gemfiles/Gemfile.rails-4.0-stable +1 -0
- data/gemfiles/Gemfile.rails-4.0-stable.lock +61 -60
- data/gemfiles/Gemfile.rails-4.1-stable +1 -0
- data/gemfiles/Gemfile.rails-4.1-stable.lock +66 -65
- data/gemfiles/Gemfile.rails-4.2-stable +30 -0
- data/gemfiles/Gemfile.rails-4.2-stable.lock +193 -0
- data/lib/devise/controllers/helpers.rb +12 -6
- data/lib/devise/controllers/rememberable.rb +9 -2
- data/lib/devise/controllers/sign_in_out.rb +2 -8
- data/lib/devise/controllers/store_location.rb +3 -1
- data/lib/devise/controllers/url_helpers.rb +7 -9
- data/lib/devise/encryptor.rb +22 -0
- data/lib/devise/failure_app.rb +48 -13
- data/lib/devise/hooks/timeoutable.rb +5 -7
- data/lib/devise/mapping.rb +1 -0
- data/lib/devise/models/authenticatable.rb +20 -26
- data/lib/devise/models/confirmable.rb +51 -17
- data/lib/devise/models/database_authenticatable.rb +17 -11
- data/lib/devise/models/lockable.rb +5 -1
- data/lib/devise/models/recoverable.rb +23 -15
- data/lib/devise/models/rememberable.rb +56 -22
- data/lib/devise/models/timeoutable.rb +0 -6
- data/lib/devise/models/trackable.rb +1 -2
- data/lib/devise/models/validatable.rb +3 -3
- data/lib/devise/models.rb +1 -1
- data/lib/devise/rails/routes.rb +27 -18
- data/lib/devise/rails.rb +1 -1
- data/lib/devise/strategies/authenticatable.rb +7 -4
- data/lib/devise/strategies/database_authenticatable.rb +1 -1
- data/lib/devise/strategies/rememberable.rb +13 -6
- data/lib/devise/test_helpers.rb +2 -2
- data/lib/devise/version.rb +1 -1
- data/lib/devise.rb +37 -36
- data/lib/generators/active_record/templates/migration.rb +1 -1
- data/lib/generators/active_record/templates/migration_existing.rb +1 -1
- data/lib/generators/devise/views_generator.rb +14 -3
- data/lib/generators/templates/controllers/README +2 -2
- data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +1 -1
- data/lib/generators/templates/controllers/registrations_controller.rb +2 -2
- data/lib/generators/templates/controllers/sessions_controller.rb +1 -1
- data/lib/generators/templates/devise.rb +17 -11
- data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/password_change.markerb +3 -0
- data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
- data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +1 -1
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +1 -1
- data/test/controllers/custom_registrations_controller_test.rb +6 -1
- data/test/controllers/helper_methods_test.rb +21 -0
- data/test/controllers/helpers_test.rb +5 -0
- data/test/controllers/inherited_controller_i18n_messages_test.rb +51 -0
- data/test/controllers/internal_helpers_test.rb +4 -4
- data/test/controllers/load_hooks_controller_test.rb +19 -0
- data/test/controllers/passwords_controller_test.rb +1 -1
- data/test/controllers/sessions_controller_test.rb +3 -3
- data/test/devise_test.rb +3 -3
- data/test/failure_app_test.rb +40 -0
- data/test/generators/views_generator_test.rb +7 -0
- data/test/integration/database_authenticatable_test.rb +11 -0
- data/test/integration/omniauthable_test.rb +12 -10
- data/test/integration/recoverable_test.rb +13 -0
- data/test/integration/rememberable_test.rb +50 -3
- data/test/integration/timeoutable_test.rb +13 -18
- data/test/mailers/confirmation_instructions_test.rb +1 -1
- data/test/mapping_test.rb +6 -0
- data/test/models/confirmable_test.rb +93 -37
- data/test/models/database_authenticatable_test.rb +20 -0
- data/test/models/lockable_test.rb +29 -7
- data/test/models/recoverable_test.rb +62 -7
- data/test/models/rememberable_test.rb +68 -97
- data/test/models/validatable_test.rb +5 -5
- data/test/models_test.rb +15 -6
- data/test/rails_app/app/active_record/user_without_email.rb +8 -0
- data/test/rails_app/app/controllers/admins_controller.rb +0 -5
- data/test/rails_app/app/controllers/custom/registrations_controller.rb +10 -0
- data/test/rails_app/app/mongoid/user_without_email.rb +33 -0
- data/test/rails_app/config/application.rb +1 -1
- data/test/rails_app/config/environments/production.rb +6 -2
- data/test/rails_app/config/environments/test.rb +7 -2
- data/test/rails_app/config/initializers/devise.rb +12 -15
- data/test/rails_app/config/routes.rb +6 -3
- data/test/rails_app/lib/shared_user.rb +1 -1
- data/test/rails_app/lib/shared_user_without_email.rb +26 -0
- data/test/rails_test.rb +9 -0
- data/test/support/helpers.rb +4 -0
- data/test/support/integration.rb +2 -2
- data/test/test_helpers_test.rb +22 -7
- data/test/test_models.rb +2 -2
- data/test/time_helpers.rb +137 -0
- metadata +26 -4
@@ -197,6 +197,19 @@ class PasswordTest < ActionDispatch::IntegrationTest
|
|
197
197
|
assert warden.authenticated?(:user)
|
198
198
|
end
|
199
199
|
|
200
|
+
test 'does not sign in user automatically after changing its password if config.sign_in_after_reset_password is false' do
|
201
|
+
swap Devise, sign_in_after_reset_password: false do
|
202
|
+
create_user
|
203
|
+
request_forgot_password
|
204
|
+
reset_password
|
205
|
+
|
206
|
+
assert_contain 'Your password has been changed successfully.'
|
207
|
+
assert_not_contain 'You are now signed in.'
|
208
|
+
assert_equal new_user_session_path, @request.path
|
209
|
+
assert !warden.authenticated?(:user)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
200
213
|
test 'does not sign in user automatically after changing its password if it\'s locked and unlock strategy is :none or :time' do
|
201
214
|
[:none, :time].each do |strategy|
|
202
215
|
swap Devise, unlock_strategy: strategy do
|
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class RememberMeTest < ActionDispatch::IntegrationTest
|
4
|
+
if (Rails::VERSION::MAJOR < 4) || (Rails::VERSION::MAJOR >= 4 && Rails::VERSION::MINOR < 1)
|
5
|
+
require 'time_helpers'
|
6
|
+
include ActiveSupport::Testing::TimeHelpers
|
7
|
+
end
|
8
|
+
|
4
9
|
def create_user_and_remember(add_to_token='')
|
5
10
|
user = create_user
|
6
11
|
user.remember_me!
|
7
|
-
raw_cookie = User.serialize_into_cookie(user).tap { |a| a
|
12
|
+
raw_cookie = User.serialize_into_cookie(user).tap { |a| a[1] << add_to_token }
|
8
13
|
cookies['remember_user_token'] = generate_signed_cookie(raw_cookie)
|
9
14
|
user
|
10
15
|
end
|
@@ -92,7 +97,6 @@ class RememberMeTest < ActionDispatch::IntegrationTest
|
|
92
97
|
assert_response :success
|
93
98
|
assert warden.authenticated?(:user)
|
94
99
|
assert warden.user(:user) == user
|
95
|
-
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."
|
96
100
|
end
|
97
101
|
|
98
102
|
test 'remember the user before sign up and redirect them to their home' do
|
@@ -118,6 +122,40 @@ class RememberMeTest < ActionDispatch::IntegrationTest
|
|
118
122
|
end
|
119
123
|
end
|
120
124
|
|
125
|
+
test 'extends remember period when extend remember period config is true' do
|
126
|
+
swap Devise, extend_remember_period: true, remember_for: 1.year do
|
127
|
+
user = create_user_and_remember
|
128
|
+
old_remember_token = nil
|
129
|
+
|
130
|
+
travel_to 1.day.ago do
|
131
|
+
get root_path
|
132
|
+
old_remember_token = request.cookies['remember_user_token']
|
133
|
+
end
|
134
|
+
|
135
|
+
get root_path
|
136
|
+
current_remember_token = request.cookies['remember_user_token']
|
137
|
+
|
138
|
+
refute_equal old_remember_token, current_remember_token
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
test 'does not extend remember period when extend period config is false' do
|
143
|
+
swap Devise, extend_remember_period: false, remember_for: 1.year do
|
144
|
+
user = create_user_and_remember
|
145
|
+
old_remember_token = nil
|
146
|
+
|
147
|
+
travel_to 1.day.ago do
|
148
|
+
get root_path
|
149
|
+
old_remember_token = request.cookies['remember_user_token']
|
150
|
+
end
|
151
|
+
|
152
|
+
get root_path
|
153
|
+
current_remember_token = request.cookies['remember_user_token']
|
154
|
+
|
155
|
+
assert_equal old_remember_token, current_remember_token
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
121
159
|
test 'do not remember other scopes' do
|
122
160
|
create_user_and_remember
|
123
161
|
get root_path
|
@@ -135,7 +173,7 @@ class RememberMeTest < ActionDispatch::IntegrationTest
|
|
135
173
|
|
136
174
|
test 'do not remember with expired token' do
|
137
175
|
create_user_and_remember
|
138
|
-
swap Devise, remember_for: 0 do
|
176
|
+
swap Devise, remember_for: 0.days do
|
139
177
|
get users_path
|
140
178
|
assert_not warden.authenticated?(:user)
|
141
179
|
assert_redirected_to new_user_session_path
|
@@ -164,4 +202,13 @@ class RememberMeTest < ActionDispatch::IntegrationTest
|
|
164
202
|
get users_path
|
165
203
|
assert_not warden.authenticated?(:user)
|
166
204
|
end
|
205
|
+
|
206
|
+
test 'valid sign in calls after_remembered callback' do
|
207
|
+
user = create_user_and_remember
|
208
|
+
|
209
|
+
User.expects(:serialize_from_cookie).returns user
|
210
|
+
user.expects :after_remembered
|
211
|
+
|
212
|
+
get new_user_registration_path
|
213
|
+
end
|
167
214
|
end
|
@@ -24,6 +24,18 @@ class SessionTimeoutTest < ActionDispatch::IntegrationTest
|
|
24
24
|
assert_equal old_last_request, last_request_at
|
25
25
|
end
|
26
26
|
|
27
|
+
test 'does not set last request at in user session after each request if timeoutable is disabled' do
|
28
|
+
sign_in_as_user
|
29
|
+
old_last_request = last_request_at
|
30
|
+
assert_not_nil last_request_at
|
31
|
+
|
32
|
+
new_time = 2.seconds.from_now
|
33
|
+
Time.stubs(:now).returns(new_time)
|
34
|
+
|
35
|
+
get users_path, {}, 'devise.skip_timeoutable' => true
|
36
|
+
assert_equal old_last_request, last_request_at
|
37
|
+
end
|
38
|
+
|
27
39
|
test 'does not time out user session before default limit time' do
|
28
40
|
sign_in_as_user
|
29
41
|
assert_response :success
|
@@ -110,23 +122,6 @@ class SessionTimeoutTest < ActionDispatch::IntegrationTest
|
|
110
122
|
assert_contain 'You are signed in'
|
111
123
|
end
|
112
124
|
|
113
|
-
test 'admin does not explode on time out' do
|
114
|
-
admin = sign_in_as_admin
|
115
|
-
get expire_admin_path(admin)
|
116
|
-
|
117
|
-
Admin.send :define_method, :reset_authentication_token! do
|
118
|
-
nil
|
119
|
-
end
|
120
|
-
|
121
|
-
begin
|
122
|
-
get admins_path
|
123
|
-
assert_redirected_to admins_path
|
124
|
-
assert_not warden.authenticated?(:admin)
|
125
|
-
ensure
|
126
|
-
Admin.send(:remove_method, :reset_authentication_token!)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
125
|
test 'user configured timeout limit' do
|
131
126
|
swap Devise, timeout_in: 8.minutes do
|
132
127
|
user = sign_in_as_user
|
@@ -180,7 +175,7 @@ class SessionTimeoutTest < ActionDispatch::IntegrationTest
|
|
180
175
|
assert warden.authenticated?(:user)
|
181
176
|
end
|
182
177
|
|
183
|
-
test 'does not
|
178
|
+
test 'does not crash when the last_request_at is a String' do
|
184
179
|
user = sign_in_as_user
|
185
180
|
|
186
181
|
get edit_form_user_path(user, last_request_at: Time.now.utc.to_s)
|
@@ -86,7 +86,7 @@ class ConfirmationInstructionsTest < ActionMailer::TestCase
|
|
86
86
|
host, port = ActionMailer::Base.default_url_options.values_at :host, :port
|
87
87
|
|
88
88
|
if mail.body.encoded =~ %r{<a href=\"http://#{host}:#{port}/users/confirmation\?confirmation_token=([^"]+)">}
|
89
|
-
assert_equal
|
89
|
+
assert_equal $1, user.confirmation_token
|
90
90
|
else
|
91
91
|
flunk "expected confirmation url regex to match"
|
92
92
|
end
|
data/test/mapping_test.rb
CHANGED
@@ -71,6 +71,12 @@ class MappingTest < ActiveSupport::TestCase
|
|
71
71
|
assert_equal :user, Devise::Mapping.find_scope!(Class.new(User).new)
|
72
72
|
end
|
73
73
|
|
74
|
+
test 'find scope uses devise_scope' do
|
75
|
+
user = User.new
|
76
|
+
def user.devise_scope; :special_scope; end
|
77
|
+
assert_equal :special_scope, Devise::Mapping.find_scope!(user)
|
78
|
+
end
|
79
|
+
|
74
80
|
test 'find scope raises an error if cannot be found' do
|
75
81
|
assert_raise RuntimeError do
|
76
82
|
Devise::Mapping.find_scope!(String)
|
@@ -23,31 +23,24 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
23
23
|
test 'should confirm a user by updating confirmed at' do
|
24
24
|
user = create_user
|
25
25
|
assert_nil user.confirmed_at
|
26
|
-
assert user.confirm
|
26
|
+
assert user.confirm
|
27
27
|
assert_not_nil user.confirmed_at
|
28
28
|
end
|
29
29
|
|
30
|
-
test 'should clear confirmation token while confirming a user' do
|
31
|
-
user = create_user
|
32
|
-
assert_present user.confirmation_token
|
33
|
-
user.confirm!
|
34
|
-
assert_nil user.confirmation_token
|
35
|
-
end
|
36
|
-
|
37
30
|
test 'should verify whether a user is confirmed or not' do
|
38
31
|
assert_not new_user.confirmed?
|
39
32
|
user = create_user
|
40
33
|
assert_not user.confirmed?
|
41
|
-
user.confirm
|
34
|
+
user.confirm
|
42
35
|
assert user.confirmed?
|
43
36
|
end
|
44
37
|
|
45
38
|
test 'should not confirm a user already confirmed' do
|
46
39
|
user = create_user
|
47
|
-
assert user.confirm
|
40
|
+
assert user.confirm
|
48
41
|
assert_blank user.errors[:email]
|
49
42
|
|
50
|
-
assert_not user.confirm
|
43
|
+
assert_not user.confirm
|
51
44
|
assert_equal "was already confirmed, please try signing in", user.errors[:email].join
|
52
45
|
end
|
53
46
|
|
@@ -80,6 +73,16 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
80
73
|
assert_equal "was already confirmed, please try signing in", confirmed_user.errors[:email].join
|
81
74
|
end
|
82
75
|
|
76
|
+
test 'should show error when a token has already been used' do
|
77
|
+
user = create_user
|
78
|
+
raw = user.raw_confirmation_token
|
79
|
+
User.confirm_by_token(raw)
|
80
|
+
assert user.reload.confirmed?
|
81
|
+
|
82
|
+
confirmed_user = User.confirm_by_token(raw)
|
83
|
+
assert_equal "was already confirmed, please try signing in", confirmed_user.errors[:email].join
|
84
|
+
end
|
85
|
+
|
83
86
|
test 'should send confirmation instructions by email' do
|
84
87
|
assert_email_sent "mynewuser@example.com" do
|
85
88
|
create_user email: "mynewuser@example.com"
|
@@ -111,7 +114,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
111
114
|
|
112
115
|
assert_email_not_sent do
|
113
116
|
user.save!
|
114
|
-
|
117
|
+
assert_not user.confirmed?
|
115
118
|
end
|
116
119
|
end
|
117
120
|
|
@@ -165,18 +168,19 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
165
168
|
|
166
169
|
test 'should not reset confirmation status or token when updating email' do
|
167
170
|
user = create_user
|
168
|
-
user.
|
171
|
+
original_token = user.confirmation_token
|
172
|
+
user.confirm
|
169
173
|
user.email = 'new_test@example.com'
|
170
174
|
user.save!
|
171
175
|
|
172
176
|
user.reload
|
173
177
|
assert user.confirmed?
|
174
|
-
|
178
|
+
assert_equal original_token, user.confirmation_token
|
175
179
|
end
|
176
180
|
|
177
181
|
test 'should not be able to send instructions if the user is already confirmed' do
|
178
182
|
user = create_user
|
179
|
-
user.confirm
|
183
|
+
user.confirm
|
180
184
|
assert_not user.resend_confirmation_instructions
|
181
185
|
assert user.confirmed?
|
182
186
|
assert_equal 'was already confirmed, please try signing in', user.errors[:email].join
|
@@ -211,7 +215,7 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
211
215
|
assert_not user.confirmed?
|
212
216
|
assert_not user.active_for_authentication?
|
213
217
|
|
214
|
-
user.confirm
|
218
|
+
user.confirm
|
215
219
|
assert user.confirmed?
|
216
220
|
assert user.active_for_authentication?
|
217
221
|
end
|
@@ -246,6 +250,16 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
246
250
|
assert user.reload.active_for_authentication?
|
247
251
|
end
|
248
252
|
|
253
|
+
test 'should not break when a user tries to reset their password in the case where confirmation is not required and confirm_within is set' do
|
254
|
+
swap Devise, confirm_within: 3.days do
|
255
|
+
user = create_user
|
256
|
+
user.instance_eval { def confirmation_required?; false end }
|
257
|
+
user.confirmation_sent_at = nil
|
258
|
+
user.save
|
259
|
+
assert user.reload.confirm!
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
249
263
|
test 'should find a user to send email instructions for the user confirm its email by authentication_keys' do
|
250
264
|
swap Devise, authentication_keys: [:username, :email] do
|
251
265
|
user = create_user
|
@@ -287,12 +301,23 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
287
301
|
end
|
288
302
|
end
|
289
303
|
|
290
|
-
test '
|
304
|
+
test 'do not generate a new token on resend' do
|
291
305
|
user = create_user
|
292
306
|
old = user.confirmation_token
|
293
307
|
user = User.find(user.id)
|
294
308
|
user.resend_confirmation_instructions
|
295
|
-
|
309
|
+
assert_equal user.confirmation_token, old
|
310
|
+
end
|
311
|
+
|
312
|
+
test 'generate a new token after first has expired' do
|
313
|
+
swap Devise, confirm_within: 3.days do
|
314
|
+
user = create_user
|
315
|
+
old = user.confirmation_token
|
316
|
+
user.update_attribute(:confirmation_sent_at, 4.days.ago)
|
317
|
+
user = User.find(user.id)
|
318
|
+
user.resend_confirmation_instructions
|
319
|
+
assert_not_equal user.confirmation_token, old
|
320
|
+
end
|
296
321
|
end
|
297
322
|
|
298
323
|
test 'should call after_confirmation if confirmed' do
|
@@ -301,43 +326,52 @@ class ConfirmableTest < ActiveSupport::TestCase
|
|
301
326
|
self.username = self.username.to_s + 'updated'
|
302
327
|
end
|
303
328
|
old = user.username
|
304
|
-
assert user.confirm
|
329
|
+
assert user.confirm
|
305
330
|
assert_not_equal user.username, old
|
306
331
|
end
|
307
332
|
|
308
333
|
test 'should not call after_confirmation if not confirmed' do
|
309
334
|
user = create_user
|
310
|
-
assert user.confirm
|
335
|
+
assert user.confirm
|
311
336
|
user.define_singleton_method :after_confirmation do
|
312
337
|
self.username = self.username.to_s + 'updated'
|
313
338
|
end
|
314
339
|
old = user.username
|
315
|
-
assert_not user.confirm
|
340
|
+
assert_not user.confirm
|
316
341
|
assert_equal user.username, old
|
317
342
|
end
|
343
|
+
|
344
|
+
test 'should always perform validations upon confirm when ensure valid true' do
|
345
|
+
admin = create_admin
|
346
|
+
admin.stubs(:valid?).returns(false)
|
347
|
+
assert_not admin.confirm(ensure_valid: true)
|
348
|
+
end
|
318
349
|
end
|
319
350
|
|
320
351
|
class ReconfirmableTest < ActiveSupport::TestCase
|
321
352
|
test 'should not worry about validations on confirm even with reconfirmable' do
|
322
353
|
admin = create_admin
|
323
354
|
admin.reset_password_token = "a"
|
324
|
-
assert admin.confirm
|
355
|
+
assert admin.confirm
|
325
356
|
end
|
326
357
|
|
327
358
|
test 'should generate confirmation token after changing email' do
|
328
359
|
admin = create_admin
|
329
|
-
assert admin.confirm
|
330
|
-
|
360
|
+
assert admin.confirm
|
361
|
+
residual_token = admin.confirmation_token
|
331
362
|
assert admin.update_attributes(email: 'new_test@example.com')
|
332
|
-
|
363
|
+
assert_not_equal residual_token, admin.confirmation_token
|
333
364
|
end
|
334
365
|
|
335
|
-
test 'should not
|
366
|
+
test 'should not regenerate confirmation token or require reconfirmation if skipping reconfirmation after changing email' do
|
336
367
|
admin = create_admin
|
337
|
-
|
368
|
+
original_token = admin.confirmation_token
|
369
|
+
assert admin.confirm
|
338
370
|
admin.skip_reconfirmation!
|
339
371
|
assert admin.update_attributes(email: 'new_test@example.com')
|
340
|
-
|
372
|
+
assert admin.confirmed?
|
373
|
+
assert_not admin.pending_reconfirmation?
|
374
|
+
assert_equal original_token, admin.confirmation_token
|
341
375
|
end
|
342
376
|
|
343
377
|
test 'should skip sending reconfirmation email when email is changed and skip_confirmation_notification! is invoked' do
|
@@ -351,7 +385,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
351
385
|
|
352
386
|
test 'should regenerate confirmation token after changing email' do
|
353
387
|
admin = create_admin
|
354
|
-
assert admin.confirm
|
388
|
+
assert admin.confirm
|
355
389
|
assert admin.update_attributes(email: 'old_test@example.com')
|
356
390
|
token = admin.confirmation_token
|
357
391
|
assert admin.update_attributes(email: 'new_test@example.com')
|
@@ -360,7 +394,15 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
360
394
|
|
361
395
|
test 'should send confirmation instructions by email after changing email' do
|
362
396
|
admin = create_admin
|
363
|
-
assert admin.confirm
|
397
|
+
assert admin.confirm
|
398
|
+
assert_email_sent "new_test@example.com" do
|
399
|
+
assert admin.update_attributes(email: 'new_test@example.com')
|
400
|
+
end
|
401
|
+
assert_match "new_test@example.com", ActionMailer::Base.deliveries.last.body.encoded
|
402
|
+
end
|
403
|
+
|
404
|
+
test 'should send confirmation instructions by email after changing email from nil' do
|
405
|
+
admin = create_admin(email: nil)
|
364
406
|
assert_email_sent "new_test@example.com" do
|
365
407
|
assert admin.update_attributes(email: 'new_test@example.com')
|
366
408
|
end
|
@@ -369,7 +411,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
369
411
|
|
370
412
|
test 'should not send confirmation by email after changing password' do
|
371
413
|
admin = create_admin
|
372
|
-
assert admin.confirm
|
414
|
+
assert admin.confirm
|
373
415
|
assert_email_not_sent do
|
374
416
|
assert admin.update_attributes(password: 'newpass', password_confirmation: 'newpass')
|
375
417
|
end
|
@@ -377,7 +419,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
377
419
|
|
378
420
|
test 'should not send confirmation by email after changing to a blank email' do
|
379
421
|
admin = create_admin
|
380
|
-
assert admin.confirm
|
422
|
+
assert admin.confirm
|
381
423
|
assert_email_not_sent do
|
382
424
|
admin.email = ''
|
383
425
|
admin.save(validate: false)
|
@@ -386,23 +428,23 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
386
428
|
|
387
429
|
test 'should stay confirmed when email is changed' do
|
388
430
|
admin = create_admin
|
389
|
-
assert admin.confirm
|
431
|
+
assert admin.confirm
|
390
432
|
assert admin.update_attributes(email: 'new_test@example.com')
|
391
433
|
assert admin.confirmed?
|
392
434
|
end
|
393
435
|
|
394
436
|
test 'should update email only when it is confirmed' do
|
395
437
|
admin = create_admin
|
396
|
-
assert admin.confirm
|
438
|
+
assert admin.confirm
|
397
439
|
assert admin.update_attributes(email: 'new_test@example.com')
|
398
440
|
assert_not_equal 'new_test@example.com', admin.email
|
399
|
-
assert admin.confirm
|
441
|
+
assert admin.confirm
|
400
442
|
assert_equal 'new_test@example.com', admin.email
|
401
443
|
end
|
402
444
|
|
403
445
|
test 'should not allow admin to get past confirmation email by resubmitting their new address' do
|
404
446
|
admin = create_admin
|
405
|
-
assert admin.confirm
|
447
|
+
assert admin.confirm
|
406
448
|
assert admin.update_attributes(email: 'new_test@example.com')
|
407
449
|
assert_not_equal 'new_test@example.com', admin.email
|
408
450
|
assert admin.update_attributes(email: 'new_test@example.com')
|
@@ -411,7 +453,7 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
411
453
|
|
412
454
|
test 'should find a admin by send confirmation instructions with unconfirmed_email' do
|
413
455
|
admin = create_admin
|
414
|
-
assert admin.confirm
|
456
|
+
assert admin.confirm
|
415
457
|
assert admin.update_attributes(email: 'new_test@example.com')
|
416
458
|
confirmation_admin = Admin.send_confirmation_instructions(email: admin.unconfirmed_email)
|
417
459
|
assert_equal confirmation_admin, admin
|
@@ -452,4 +494,18 @@ class ReconfirmableTest < ActiveSupport::TestCase
|
|
452
494
|
:unconfirmed_email
|
453
495
|
]
|
454
496
|
end
|
497
|
+
|
498
|
+
test 'should not require reconfirmation after creating a record' do
|
499
|
+
admin = create_admin
|
500
|
+
assert !admin.pending_reconfirmation?
|
501
|
+
end
|
502
|
+
|
503
|
+
test 'should not require reconfirmation after creating a record with #save called in callback' do
|
504
|
+
class Admin::WithSaveInCallback < Admin
|
505
|
+
after_create :save
|
506
|
+
end
|
507
|
+
|
508
|
+
admin = Admin::WithSaveInCallback.create(valid_attributes.except(:username))
|
509
|
+
assert !admin.pending_reconfirmation?
|
510
|
+
end
|
455
511
|
end
|
@@ -3,6 +3,10 @@ require 'test_models'
|
|
3
3
|
require 'digest/sha1'
|
4
4
|
|
5
5
|
class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
6
|
+
def setup
|
7
|
+
setup_mailer
|
8
|
+
end
|
9
|
+
|
6
10
|
test 'should downcase case insensitive keys when saving' do
|
7
11
|
# case_insensitive_keys is set to :email by default.
|
8
12
|
email = 'Foo@Bar.com'
|
@@ -225,6 +229,22 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase
|
|
225
229
|
assert_match "can't be blank", user.errors[:current_password].join
|
226
230
|
end
|
227
231
|
|
232
|
+
test 'should not email on password change' do
|
233
|
+
user = create_user
|
234
|
+
assert_email_not_sent do
|
235
|
+
assert user.update_attributes(password: 'newpass', password_confirmation: 'newpass')
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
test 'should email on password change when configured' do
|
240
|
+
swap Devise, send_password_change_notification: true do
|
241
|
+
user = create_user
|
242
|
+
assert_email_sent user.email do
|
243
|
+
assert user.update_attributes(password: 'newpass', password_confirmation: 'newpass')
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
228
248
|
test 'downcase_keys with validation' do
|
229
249
|
User.create(email: "HEllO@example.com", password: "123456")
|
230
250
|
user = User.create(email: "HEllO@example.com", password: "123456")
|
@@ -7,16 +7,16 @@ class LockableTest < ActiveSupport::TestCase
|
|
7
7
|
|
8
8
|
test "should respect maximum attempts configuration" do
|
9
9
|
user = create_user
|
10
|
-
user.confirm
|
10
|
+
user.confirm
|
11
11
|
swap Devise, maximum_attempts: 2 do
|
12
12
|
2.times { user.valid_for_authentication?{ false } }
|
13
13
|
assert user.reload.access_locked?
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
test "should increment failed_attempts on
|
17
|
+
test "should increment failed_attempts on successful validation if the user is already locked" do
|
18
18
|
user = create_user
|
19
|
-
user.confirm
|
19
|
+
user.confirm
|
20
20
|
|
21
21
|
swap Devise, maximum_attempts: 2 do
|
22
22
|
2.times { user.valid_for_authentication?{ false } }
|
@@ -29,7 +29,7 @@ class LockableTest < ActiveSupport::TestCase
|
|
29
29
|
|
30
30
|
test "should not touch failed_attempts if lock_strategy is none" do
|
31
31
|
user = create_user
|
32
|
-
user.confirm
|
32
|
+
user.confirm
|
33
33
|
swap Devise, lock_strategy: :none, maximum_attempts: 2 do
|
34
34
|
3.times { user.valid_for_authentication?{ false } }
|
35
35
|
assert !user.access_locked?
|
@@ -53,7 +53,7 @@ class LockableTest < ActiveSupport::TestCase
|
|
53
53
|
|
54
54
|
test "active_for_authentication? should be the opposite of locked?" do
|
55
55
|
user = create_user
|
56
|
-
user.confirm
|
56
|
+
user.confirm
|
57
57
|
assert user.active_for_authentication?
|
58
58
|
user.lock_access!
|
59
59
|
assert_not user.active_for_authentication?
|
@@ -230,7 +230,7 @@ class LockableTest < ActiveSupport::TestCase
|
|
230
230
|
test 'should unlock account if lock has expired and increase attempts on failure' do
|
231
231
|
swap Devise, unlock_in: 1.minute do
|
232
232
|
user = create_user
|
233
|
-
user.confirm
|
233
|
+
user.confirm
|
234
234
|
|
235
235
|
user.failed_attempts = 2
|
236
236
|
user.locked_at = 2.minutes.ago
|
@@ -243,7 +243,7 @@ class LockableTest < ActiveSupport::TestCase
|
|
243
243
|
test 'should unlock account if lock has expired on success' do
|
244
244
|
swap Devise, unlock_in: 1.minute do
|
245
245
|
user = create_user
|
246
|
-
user.confirm
|
246
|
+
user.confirm
|
247
247
|
|
248
248
|
user.failed_attempts = 2
|
249
249
|
user.locked_at = 2.minutes.ago
|
@@ -325,4 +325,26 @@ class LockableTest < ActiveSupport::TestCase
|
|
325
325
|
user.lock_access!
|
326
326
|
assert_equal :locked, user.unauthenticated_message
|
327
327
|
end
|
328
|
+
|
329
|
+
test 'unlock_strategy_enabled? should return true for both, email, and time strategies if :both is used' do
|
330
|
+
swap Devise, unlock_strategy: :both do
|
331
|
+
user = create_user
|
332
|
+
assert_equal true, user.unlock_strategy_enabled?(:both)
|
333
|
+
assert_equal true, user.unlock_strategy_enabled?(:time)
|
334
|
+
assert_equal true, user.unlock_strategy_enabled?(:email)
|
335
|
+
assert_equal false, user.unlock_strategy_enabled?(:none)
|
336
|
+
assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
test 'unlock_strategy_enabled? should return true only for the configured strategy' do
|
341
|
+
swap Devise, unlock_strategy: :email do
|
342
|
+
user = create_user
|
343
|
+
assert_equal false, user.unlock_strategy_enabled?(:both)
|
344
|
+
assert_equal false, user.unlock_strategy_enabled?(:time)
|
345
|
+
assert_equal true, user.unlock_strategy_enabled?(:email)
|
346
|
+
assert_equal false, user.unlock_strategy_enabled?(:none)
|
347
|
+
assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
|
348
|
+
end
|
349
|
+
end
|
328
350
|
end
|