devise 4.4.3 → 4.7.3

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 (222) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +98 -4
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +96 -59
  5. data/app/controllers/devise/passwords_controller.rb +1 -0
  6. data/app/controllers/devise/registrations_controller.rb +26 -8
  7. data/app/controllers/devise_controller.rb +3 -3
  8. data/app/helpers/devise_helper.rb +21 -18
  9. data/app/mailers/devise/mailer.rb +5 -5
  10. data/app/views/devise/confirmations/new.html.erb +1 -1
  11. data/app/views/devise/passwords/edit.html.erb +3 -3
  12. data/app/views/devise/passwords/new.html.erb +1 -1
  13. data/app/views/devise/registrations/edit.html.erb +4 -4
  14. data/app/views/devise/registrations/new.html.erb +3 -3
  15. data/app/views/devise/sessions/new.html.erb +3 -3
  16. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  17. data/app/views/devise/shared/_links.html.erb +7 -7
  18. data/app/views/devise/unlocks/new.html.erb +1 -1
  19. data/config/locales/en.yml +3 -2
  20. data/lib/devise.rb +4 -4
  21. data/lib/devise/controllers/helpers.rb +8 -8
  22. data/lib/devise/controllers/sign_in_out.rb +6 -3
  23. data/lib/devise/controllers/url_helpers.rb +1 -1
  24. data/lib/devise/failure_app.rb +25 -5
  25. data/lib/devise/hooks/timeoutable.rb +2 -2
  26. data/lib/devise/mapping.rb +1 -1
  27. data/lib/devise/models/authenticatable.rb +44 -45
  28. data/lib/devise/models/confirmable.rb +18 -3
  29. data/lib/devise/models/database_authenticatable.rb +50 -12
  30. data/lib/devise/models/lockable.rb +3 -3
  31. data/lib/devise/models/recoverable.rb +2 -2
  32. data/lib/devise/models/registerable.rb +2 -0
  33. data/lib/devise/models/rememberable.rb +1 -1
  34. data/lib/devise/models/trackable.rb +9 -2
  35. data/lib/devise/models/validatable.rb +1 -1
  36. data/lib/devise/parameter_filter.rb +2 -0
  37. data/lib/devise/parameter_sanitizer.rb +13 -1
  38. data/lib/devise/rails/routes.rb +6 -6
  39. data/lib/devise/secret_key_finder.rb +2 -0
  40. data/lib/devise/strategies/authenticatable.rb +1 -1
  41. data/lib/devise/strategies/database_authenticatable.rb +6 -1
  42. data/lib/devise/test/controller_helpers.rb +4 -2
  43. data/lib/devise/test/integration_helpers.rb +1 -1
  44. data/lib/devise/version.rb +1 -1
  45. data/lib/generators/active_record/devise_generator.rb +9 -9
  46. data/lib/generators/devise/controllers_generator.rb +1 -1
  47. data/lib/generators/devise/devise_generator.rb +1 -1
  48. data/lib/generators/devise/install_generator.rb +1 -5
  49. data/lib/generators/devise/orm_helpers.rb +2 -2
  50. data/lib/generators/devise/views_generator.rb +1 -1
  51. data/lib/generators/mongoid/devise_generator.rb +5 -5
  52. data/lib/generators/templates/README +9 -1
  53. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +1 -1
  54. data/lib/generators/templates/devise.rb +34 -6
  55. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +5 -1
  56. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +10 -2
  57. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +4 -1
  58. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +11 -3
  59. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +11 -3
  60. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +7 -2
  61. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +4 -1
  62. metadata +7 -312
  63. data/.gitignore +0 -10
  64. data/.travis.yml +0 -68
  65. data/.yardopts +0 -9
  66. data/CODE_OF_CONDUCT.md +0 -22
  67. data/CONTRIBUTING.md +0 -79
  68. data/Gemfile +0 -39
  69. data/Gemfile.lock +0 -193
  70. data/ISSUE_TEMPLATE.md +0 -19
  71. data/Rakefile +0 -37
  72. data/bin/test +0 -13
  73. data/devise.gemspec +0 -28
  74. data/devise.png +0 -0
  75. data/gemfiles/Gemfile.rails-4.1-stable +0 -32
  76. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -171
  77. data/gemfiles/Gemfile.rails-4.2-stable +0 -32
  78. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -192
  79. data/gemfiles/Gemfile.rails-5.0-stable +0 -33
  80. data/gemfiles/Gemfile.rails-5.0-stable.lock +0 -192
  81. data/gemfiles/Gemfile.rails-5.2-rc1 +0 -26
  82. data/gemfiles/Gemfile.rails-5.2-rc1.lock +0 -201
  83. data/guides/bug_report_templates/integration_test.rb +0 -106
  84. data/test/controllers/custom_registrations_controller_test.rb +0 -42
  85. data/test/controllers/custom_strategy_test.rb +0 -66
  86. data/test/controllers/helper_methods_test.rb +0 -24
  87. data/test/controllers/helpers_test.rb +0 -318
  88. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -53
  89. data/test/controllers/internal_helpers_test.rb +0 -129
  90. data/test/controllers/load_hooks_controller_test.rb +0 -21
  91. data/test/controllers/passwords_controller_test.rb +0 -34
  92. data/test/controllers/sessions_controller_test.rb +0 -108
  93. data/test/controllers/url_helpers_test.rb +0 -67
  94. data/test/delegator_test.rb +0 -21
  95. data/test/devise_test.rb +0 -109
  96. data/test/failure_app_test.rb +0 -340
  97. data/test/generators/active_record_generator_test.rb +0 -130
  98. data/test/generators/controllers_generator_test.rb +0 -50
  99. data/test/generators/devise_generator_test.rb +0 -41
  100. data/test/generators/install_generator_test.rb +0 -26
  101. data/test/generators/mongoid_generator_test.rb +0 -25
  102. data/test/generators/views_generator_test.rb +0 -105
  103. data/test/helpers/devise_helper_test.rb +0 -51
  104. data/test/integration/authenticatable_test.rb +0 -706
  105. data/test/integration/confirmable_test.rb +0 -326
  106. data/test/integration/database_authenticatable_test.rb +0 -97
  107. data/test/integration/http_authenticatable_test.rb +0 -114
  108. data/test/integration/lockable_test.rb +0 -242
  109. data/test/integration/mounted_engine_test.rb +0 -38
  110. data/test/integration/omniauthable_test.rb +0 -148
  111. data/test/integration/recoverable_test.rb +0 -349
  112. data/test/integration/registerable_test.rb +0 -365
  113. data/test/integration/rememberable_test.rb +0 -219
  114. data/test/integration/timeoutable_test.rb +0 -186
  115. data/test/integration/trackable_test.rb +0 -99
  116. data/test/mailers/confirmation_instructions_test.rb +0 -117
  117. data/test/mailers/email_changed_test.rb +0 -132
  118. data/test/mailers/mailer_test.rb +0 -20
  119. data/test/mailers/reset_password_instructions_test.rb +0 -98
  120. data/test/mailers/unlock_instructions_test.rb +0 -93
  121. data/test/mapping_test.rb +0 -136
  122. data/test/models/authenticatable_test.rb +0 -25
  123. data/test/models/confirmable_test.rb +0 -549
  124. data/test/models/database_authenticatable_test.rb +0 -283
  125. data/test/models/lockable_test.rb +0 -352
  126. data/test/models/omniauthable_test.rb +0 -9
  127. data/test/models/recoverable_test.rb +0 -263
  128. data/test/models/registerable_test.rb +0 -9
  129. data/test/models/rememberable_test.rb +0 -184
  130. data/test/models/serializable_test.rb +0 -60
  131. data/test/models/timeoutable_test.rb +0 -53
  132. data/test/models/trackable_test.rb +0 -62
  133. data/test/models/validatable_test.rb +0 -121
  134. data/test/models_test.rb +0 -155
  135. data/test/omniauth/config_test.rb +0 -61
  136. data/test/omniauth/url_helpers_test.rb +0 -53
  137. data/test/orm/active_record.rb +0 -24
  138. data/test/orm/mongoid.rb +0 -15
  139. data/test/parameter_sanitizer_test.rb +0 -77
  140. data/test/rails_app/Rakefile +0 -6
  141. data/test/rails_app/app/active_record/admin.rb +0 -8
  142. data/test/rails_app/app/active_record/shim.rb +0 -4
  143. data/test/rails_app/app/active_record/user.rb +0 -20
  144. data/test/rails_app/app/active_record/user_on_engine.rb +0 -9
  145. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -9
  146. data/test/rails_app/app/active_record/user_with_validations.rb +0 -12
  147. data/test/rails_app/app/active_record/user_without_email.rb +0 -10
  148. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -8
  149. data/test/rails_app/app/controllers/admins_controller.rb +0 -8
  150. data/test/rails_app/app/controllers/application_controller.rb +0 -13
  151. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -32
  152. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -33
  153. data/test/rails_app/app/controllers/home_controller.rb +0 -31
  154. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -4
  155. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -4
  156. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -16
  157. data/test/rails_app/app/controllers/users_controller.rb +0 -33
  158. data/test/rails_app/app/helpers/application_helper.rb +0 -5
  159. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -5
  160. data/test/rails_app/app/mailers/users/mailer.rb +0 -5
  161. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -6
  162. data/test/rails_app/app/mongoid/admin.rb +0 -31
  163. data/test/rails_app/app/mongoid/shim.rb +0 -25
  164. data/test/rails_app/app/mongoid/user.rb +0 -50
  165. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -41
  166. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -41
  167. data/test/rails_app/app/mongoid/user_with_validations.rb +0 -37
  168. data/test/rails_app/app/mongoid/user_without_email.rb +0 -35
  169. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  170. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  171. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  172. data/test/rails_app/app/views/home/index.html.erb +0 -1
  173. data/test/rails_app/app/views/home/join.html.erb +0 -1
  174. data/test/rails_app/app/views/home/private.html.erb +0 -1
  175. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  176. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  177. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  178. data/test/rails_app/app/views/users/index.html.erb +0 -1
  179. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  180. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  181. data/test/rails_app/bin/bundle +0 -3
  182. data/test/rails_app/bin/rails +0 -4
  183. data/test/rails_app/bin/rake +0 -4
  184. data/test/rails_app/config.ru +0 -4
  185. data/test/rails_app/config/application.rb +0 -48
  186. data/test/rails_app/config/boot.rb +0 -27
  187. data/test/rails_app/config/database.yml +0 -18
  188. data/test/rails_app/config/environment.rb +0 -7
  189. data/test/rails_app/config/environments/development.rb +0 -32
  190. data/test/rails_app/config/environments/production.rb +0 -88
  191. data/test/rails_app/config/environments/test.rb +0 -47
  192. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -9
  193. data/test/rails_app/config/initializers/devise.rb +0 -182
  194. data/test/rails_app/config/initializers/inflections.rb +0 -4
  195. data/test/rails_app/config/initializers/secret_token.rb +0 -5
  196. data/test/rails_app/config/initializers/session_store.rb +0 -3
  197. data/test/rails_app/config/routes.rb +0 -128
  198. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -77
  199. data/test/rails_app/db/schema.rb +0 -57
  200. data/test/rails_app/lib/shared_admin.rb +0 -23
  201. data/test/rails_app/lib/shared_user.rb +0 -32
  202. data/test/rails_app/lib/shared_user_without_email.rb +0 -28
  203. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -15
  204. data/test/rails_app/public/404.html +0 -26
  205. data/test/rails_app/public/422.html +0 -26
  206. data/test/rails_app/public/500.html +0 -26
  207. data/test/rails_app/public/favicon.ico +0 -0
  208. data/test/rails_test.rb +0 -11
  209. data/test/routes_test.rb +0 -281
  210. data/test/secret_key_finder_test.rb +0 -97
  211. data/test/support/action_controller/record_identifier.rb +0 -12
  212. data/test/support/assertions.rb +0 -30
  213. data/test/support/helpers.rb +0 -83
  214. data/test/support/http_method_compatibility.rb +0 -53
  215. data/test/support/integration.rb +0 -95
  216. data/test/support/locale/en.yml +0 -8
  217. data/test/support/mongoid.yml +0 -6
  218. data/test/support/webrat/integrations/rails.rb +0 -35
  219. data/test/test/controller_helpers_test.rb +0 -193
  220. data/test/test/integration_helpers_test.rb +0 -34
  221. data/test/test_helper.rb +0 -36
  222. data/test/test_models.rb +0 -35
@@ -1,283 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
- require 'test_models'
5
- require 'digest/sha1'
6
-
7
- class DatabaseAuthenticatableTest < ActiveSupport::TestCase
8
- def setup
9
- setup_mailer
10
- end
11
-
12
- test 'should downcase case insensitive keys when saving' do
13
- # case_insensitive_keys is set to :email by default.
14
- email = 'Foo@Bar.com'
15
- user = new_user(email: email)
16
-
17
- assert_equal email, user.email
18
- user.save!
19
- assert_equal email.downcase, user.email
20
- end
21
-
22
- test 'should downcase case insensitive keys that refer to virtual attributes when saving' do
23
- email = 'Foo@Bar1.com'
24
- confirmation = 'Foo@Bar1.com'
25
- attributes = valid_attributes(email: email, email_confirmation: confirmation)
26
- user = UserWithVirtualAttributes.new(attributes)
27
-
28
- assert_equal confirmation, user.email_confirmation
29
- user.save!
30
- assert_equal confirmation.downcase, user.email_confirmation
31
- end
32
-
33
- test 'should not mutate value assigned to case insensitive key' do
34
- email = 'Foo@Bar.com'
35
- original_email = email.dup
36
- user = new_user(email: email)
37
-
38
- user.save!
39
- assert_equal original_email, email
40
- end
41
-
42
- test 'should remove whitespace from strip whitespace keys when saving' do
43
- # strip_whitespace_keys is set to :email by default.
44
- email = ' foo@bar.com '
45
- user = new_user(email: email)
46
-
47
- assert_equal email, user.email
48
- user.save!
49
- assert_equal email.strip, user.email
50
- end
51
-
52
- test 'should not mutate value assigned to string whitespace key' do
53
- email = ' foo@bar.com '
54
- original_email = email.dup
55
- user = new_user(email: email)
56
-
57
- user.save!
58
- assert_equal original_email, email
59
- end
60
-
61
- test "doesn't throw exception when globally configured strip_whitespace_keys are not present on a model" do
62
- swap Devise, strip_whitespace_keys: [:fake_key] do
63
- assert_nothing_raised { create_user }
64
- end
65
- end
66
-
67
- test "doesn't throw exception when globally configured case_insensitive_keys are not present on a model" do
68
- swap Devise, case_insensitive_keys: [:fake_key] do
69
- assert_nothing_raised { create_user }
70
- end
71
- end
72
-
73
- test "param filter should not convert booleans and integer to strings" do
74
- conditions = { "login" => "foo@bar.com", "bool1" => true, "bool2" => false, "fixnum" => 123, "will_be_converted" => (1..10) }
75
- conditions = Devise::ParameterFilter.new([], []).filter(conditions)
76
- assert_equal( { "login" => "foo@bar.com", "bool1" => "true", "bool2" => "false", "fixnum" => "123", "will_be_converted" => "1..10" }, conditions)
77
- end
78
-
79
- test 'param filter should filter case_insensitive_keys as insensitive' do
80
- conditions = {'insensitive' => 'insensitive_VAL', 'sensitive' => 'sensitive_VAL'}
81
- conditions = Devise::ParameterFilter.new(['insensitive'], []).filter(conditions)
82
- assert_equal( {'insensitive' => 'insensitive_val', 'sensitive' => 'sensitive_VAL'}, conditions )
83
- end
84
-
85
- test 'param filter should filter strip_whitespace_keys stripping whitespaces' do
86
- conditions = {'strip_whitespace' => ' strip_whitespace_val ', 'do_not_strip_whitespace' => ' do_not_strip_whitespace_val '}
87
- conditions = Devise::ParameterFilter.new([], ['strip_whitespace']).filter(conditions)
88
- assert_equal( {'strip_whitespace' => 'strip_whitespace_val', 'do_not_strip_whitespace' => ' do_not_strip_whitespace_val '}, conditions )
89
- end
90
-
91
- test 'should respond to password and password confirmation' do
92
- user = new_user
93
- assert user.respond_to?(:password)
94
- assert user.respond_to?(:password_confirmation)
95
- end
96
-
97
- test 'should generate a hashed password while setting password' do
98
- user = new_user
99
- assert_present user.encrypted_password
100
- end
101
-
102
- test 'should support custom hashing methods' do
103
- user = UserWithCustomHashing.new(password: '654321')
104
- assert_equal user.encrypted_password, '123456'
105
- end
106
-
107
- test 'allow authenticatable_salt to work even with nil hashed password' do
108
- user = User.new
109
- user.encrypted_password = nil
110
- assert_nil user.authenticatable_salt
111
- end
112
-
113
- test 'should not generate a hashed password if password is blank' do
114
- assert_blank new_user(password: nil).encrypted_password
115
- assert_blank new_user(password: '').encrypted_password
116
- end
117
-
118
- test 'should hash password again if password has changed' do
119
- user = create_user
120
- encrypted_password = user.encrypted_password
121
- user.password = user.password_confirmation = 'new_password'
122
- user.save!
123
- assert_not_equal encrypted_password, user.encrypted_password
124
- end
125
-
126
- test 'should test for a valid password' do
127
- user = create_user
128
- assert user.valid_password?('12345678')
129
- refute user.valid_password?('654321')
130
- end
131
-
132
- test 'should not raise error with an empty password' do
133
- user = create_user
134
- user.encrypted_password = ''
135
- assert_nothing_raised { user.valid_password?('12345678') }
136
- end
137
-
138
- test 'should be an invalid password if the user has an empty password' do
139
- user = create_user
140
- user.encrypted_password = ''
141
- refute user.valid_password?('654321')
142
- end
143
-
144
- test 'should respond to current password' do
145
- assert new_user.respond_to?(:current_password)
146
- end
147
-
148
- test 'should update password with valid current password' do
149
- user = create_user
150
- assert user.update_with_password(current_password: '12345678',
151
- password: 'pass4321', password_confirmation: 'pass4321')
152
- assert user.reload.valid_password?('pass4321')
153
- end
154
-
155
- test 'should add an error to current password when it is invalid' do
156
- user = create_user
157
- refute user.update_with_password(current_password: 'other',
158
- password: 'pass4321', password_confirmation: 'pass4321')
159
- assert user.reload.valid_password?('12345678')
160
- assert_match "is invalid", user.errors[:current_password].join
161
- end
162
-
163
- test 'should add an error to current password when it is blank' do
164
- user = create_user
165
- refute user.update_with_password(password: 'pass4321',
166
- password_confirmation: 'pass4321')
167
- assert user.reload.valid_password?('12345678')
168
- assert_match "can't be blank", user.errors[:current_password].join
169
- end
170
-
171
- test 'should run validations even when current password is invalid or blank' do
172
- user = UserWithValidation.create!(valid_attributes)
173
- user.save
174
- assert user.persisted?
175
- refute user.update_with_password(username: "")
176
- assert_match "usertest", user.reload.username
177
- assert_match "can't be blank", user.errors[:username].join
178
- end
179
-
180
- test 'should ignore password and its confirmation if they are blank' do
181
- user = create_user
182
- assert user.update_with_password(current_password: '12345678', email: "new@example.com")
183
- assert_equal "new@example.com", user.email
184
- end
185
-
186
- test 'should not update password with invalid confirmation' do
187
- user = create_user
188
- refute user.update_with_password(current_password: '12345678',
189
- password: 'pass4321', password_confirmation: 'other')
190
- assert user.reload.valid_password?('12345678')
191
- end
192
-
193
- test 'should clean up password fields on failure' do
194
- user = create_user
195
- refute user.update_with_password(current_password: '12345678',
196
- password: 'pass4321', password_confirmation: 'other')
197
- assert user.password.blank?
198
- assert user.password_confirmation.blank?
199
- end
200
-
201
- test 'should update the user without password' do
202
- user = create_user
203
- user.update_without_password(email: 'new@example.com')
204
- assert_equal 'new@example.com', user.email
205
- end
206
-
207
- test 'should not update password without password' do
208
- user = create_user
209
- user.update_without_password(password: 'pass4321', password_confirmation: 'pass4321')
210
- assert !user.reload.valid_password?('pass4321')
211
- assert user.valid_password?('12345678')
212
- end
213
-
214
- test 'should destroy user if current password is valid' do
215
- user = create_user
216
- assert user.destroy_with_password('12345678')
217
- assert !user.persisted?
218
- end
219
-
220
- test 'should not destroy user with invalid password' do
221
- user = create_user
222
- refute user.destroy_with_password('other')
223
- assert user.persisted?
224
- assert_match "is invalid", user.errors[:current_password].join
225
- end
226
-
227
- test 'should not destroy user with blank password' do
228
- user = create_user
229
- refute user.destroy_with_password(nil)
230
- assert user.persisted?
231
- assert_match "can't be blank", user.errors[:current_password].join
232
- end
233
-
234
- test 'should not email on password change' do
235
- user = create_user
236
- assert_email_not_sent do
237
- assert user.update_attributes(password: 'newpass', password_confirmation: 'newpass')
238
- end
239
- end
240
-
241
- test 'should notify previous email on email change when configured' do
242
- swap Devise, send_email_changed_notification: true do
243
- user = create_user
244
- original_email = user.email
245
- assert_email_sent original_email do
246
- assert user.update_attributes(email: 'new-email@example.com')
247
- end
248
- assert_match original_email, ActionMailer::Base.deliveries.last.body.encoded
249
- end
250
- end
251
-
252
- test 'should notify email on password change when configured' do
253
- swap Devise, send_password_change_notification: true do
254
- user = create_user
255
- assert_email_sent user.email do
256
- assert user.update_attributes(password: 'newpass', password_confirmation: 'newpass')
257
- end
258
- assert_match user.email, ActionMailer::Base.deliveries.last.body.encoded
259
- end
260
- end
261
-
262
- test 'downcase_keys with validation' do
263
- User.create(email: "HEllO@example.com", password: "123456")
264
- user = User.create(email: "HEllO@example.com", password: "123456")
265
- assert !user.valid?
266
- end
267
-
268
- test 'required_fields should be encryptable_password and the email field by default' do
269
- assert_equal Devise::Models::DatabaseAuthenticatable.required_fields(User), [
270
- :encrypted_password,
271
- :email
272
- ]
273
- end
274
-
275
- test 'required_fields should be encryptable_password and the login when the login is on authentication_keys' do
276
- swap Devise, authentication_keys: [:login] do
277
- assert_equal Devise::Models::DatabaseAuthenticatable.required_fields(User), [
278
- :encrypted_password,
279
- :login
280
- ]
281
- end
282
- end
283
- end
@@ -1,352 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class LockableTest < ActiveSupport::TestCase
6
- def setup
7
- setup_mailer
8
- end
9
-
10
- test "should respect maximum attempts configuration" do
11
- user = create_user
12
- user.confirm
13
- swap Devise, maximum_attempts: 2 do
14
- 2.times { user.valid_for_authentication?{ false } }
15
- assert user.reload.access_locked?
16
- end
17
- end
18
-
19
- test "should increment failed_attempts on successful validation if the user is already locked" do
20
- user = create_user
21
- user.confirm
22
-
23
- swap Devise, maximum_attempts: 2 do
24
- 2.times { user.valid_for_authentication?{ false } }
25
- assert user.reload.access_locked?
26
- end
27
-
28
- user.valid_for_authentication?{ true }
29
- assert_equal 3, user.reload.failed_attempts
30
- end
31
-
32
- test "should not touch failed_attempts if lock_strategy is none" do
33
- user = create_user
34
- user.confirm
35
- swap Devise, lock_strategy: :none, maximum_attempts: 2 do
36
- 3.times { user.valid_for_authentication?{ false } }
37
- assert !user.access_locked?
38
- assert_equal 0, user.failed_attempts
39
- end
40
- end
41
-
42
- test 'should be valid for authentication with a unlocked user' do
43
- user = create_user
44
- user.lock_access!
45
- user.unlock_access!
46
- assert user.valid_for_authentication?{ true }
47
- end
48
-
49
- test "should verify whether a user is locked or not" do
50
- user = create_user
51
- refute user.access_locked?
52
- user.lock_access!
53
- assert user.access_locked?
54
- end
55
-
56
- test "active_for_authentication? should be the opposite of locked?" do
57
- user = create_user
58
- user.confirm
59
- assert user.active_for_authentication?
60
- user.lock_access!
61
- refute user.active_for_authentication?
62
- end
63
-
64
- test "should unlock a user by cleaning locked_at, failed_attempts and unlock_token" do
65
- user = create_user
66
- user.lock_access!
67
- assert_not_nil user.reload.locked_at
68
- assert_not_nil user.reload.unlock_token
69
-
70
- user.unlock_access!
71
- assert_nil user.reload.locked_at
72
- assert_nil user.reload.unlock_token
73
- assert_equal 0, user.reload.failed_attempts
74
- end
75
-
76
- test "new user should not be locked and should have zero failed_attempts" do
77
- refute new_user.access_locked?
78
- assert_equal 0, create_user.failed_attempts
79
- end
80
-
81
- test "should unlock user after unlock_in period" do
82
- swap Devise, unlock_in: 3.hours do
83
- user = new_user
84
- user.locked_at = 2.hours.ago
85
- assert user.access_locked?
86
-
87
- Devise.unlock_in = 1.hour
88
- refute user.access_locked?
89
- end
90
- end
91
-
92
- test "should not unlock in 'unlock_in' if :time unlock strategy is not set" do
93
- swap Devise, unlock_strategy: :email do
94
- user = new_user
95
- user.locked_at = 2.hours.ago
96
- assert user.access_locked?
97
- end
98
- end
99
-
100
- test "should set unlock_token when locking" do
101
- user = create_user
102
- assert_nil user.unlock_token
103
- user.lock_access!
104
- assert_not_nil user.unlock_token
105
- end
106
-
107
- test "should never generate the same unlock token for different users" do
108
- unlock_tokens = []
109
- 3.times do
110
- user = create_user
111
- user.lock_access!
112
- token = user.unlock_token
113
- assert !unlock_tokens.include?(token)
114
- unlock_tokens << token
115
- end
116
- end
117
-
118
- test "should not generate unlock_token when :email is not an unlock strategy" do
119
- swap Devise, unlock_strategy: :time do
120
- user = create_user
121
- user.lock_access!
122
- assert_nil user.unlock_token
123
- end
124
- end
125
-
126
- test "should send email with unlock instructions when :email is an unlock strategy" do
127
- swap Devise, unlock_strategy: :email do
128
- user = create_user
129
- assert_email_sent do
130
- user.lock_access!
131
- end
132
- end
133
- end
134
-
135
- test "doesn't send email when you pass option send_instructions to false" do
136
- swap Devise, unlock_strategy: :email do
137
- user = create_user
138
- assert_email_not_sent do
139
- user.lock_access! send_instructions: false
140
- end
141
- end
142
- end
143
-
144
- test "sends email when you pass options other than send_instructions" do
145
- swap Devise, unlock_strategy: :email do
146
- user = create_user
147
- assert_email_sent do
148
- user.lock_access! foo: :bar, bar: :foo
149
- end
150
- end
151
- end
152
-
153
- test "should not send email with unlock instructions when :email is not an unlock strategy" do
154
- swap Devise, unlock_strategy: :time do
155
- user = create_user
156
- assert_email_not_sent do
157
- user.lock_access!
158
- end
159
- end
160
- end
161
-
162
- test 'should find and unlock a user automatically based on raw token' do
163
- user = create_user
164
- raw = user.send_unlock_instructions
165
- locked_user = User.unlock_access_by_token(raw)
166
- assert_equal locked_user, user
167
- refute user.reload.access_locked?
168
- end
169
-
170
- test 'should return a new record with errors when a invalid token is given' do
171
- locked_user = User.unlock_access_by_token('invalid_token')
172
- refute locked_user.persisted?
173
- assert_equal "is invalid", locked_user.errors[:unlock_token].join
174
- end
175
-
176
- test 'should return a new record with errors when a blank token is given' do
177
- locked_user = User.unlock_access_by_token('')
178
- refute locked_user.persisted?
179
- assert_equal "can't be blank", locked_user.errors[:unlock_token].join
180
- end
181
-
182
- test 'should find a user to send unlock instructions' do
183
- user = create_user
184
- user.lock_access!
185
- unlock_user = User.send_unlock_instructions(email: user.email)
186
- assert_equal unlock_user, user
187
- end
188
-
189
- test 'should return a new user if no email was found' do
190
- unlock_user = User.send_unlock_instructions(email: "invalid@example.com")
191
- refute unlock_user.persisted?
192
- end
193
-
194
- test 'should add error to new user email if no email was found' do
195
- unlock_user = User.send_unlock_instructions(email: "invalid@example.com")
196
- assert_equal 'not found', unlock_user.errors[:email].join
197
- end
198
-
199
- test 'should find a user to send unlock instructions by authentication_keys' do
200
- swap Devise, authentication_keys: [:username, :email] do
201
- user = create_user
202
- unlock_user = User.send_unlock_instructions(email: user.email, username: user.username)
203
- assert_equal unlock_user, user
204
- end
205
- end
206
-
207
- test 'should require all unlock_keys' do
208
- swap Devise, unlock_keys: [:username, :email] do
209
- user = create_user
210
- unlock_user = User.send_unlock_instructions(email: user.email)
211
- refute unlock_user.persisted?
212
- assert_equal "can't be blank", unlock_user.errors[:username].join
213
- end
214
- end
215
-
216
- test 'should not be able to send instructions if the user is not locked' do
217
- user = create_user
218
- refute user.resend_unlock_instructions
219
- refute user.access_locked?
220
- assert_equal 'was not locked', user.errors[:email].join
221
- end
222
-
223
- test 'should not be able to send instructions if the user if not locked and have username as unlock key' do
224
- swap Devise, unlock_keys: [:username] do
225
- user = create_user
226
- refute user.resend_unlock_instructions
227
- refute user.access_locked?
228
- assert_equal 'was not locked', user.errors[:username].join
229
- end
230
- end
231
-
232
- test 'should unlock account if lock has expired and increase attempts on failure' do
233
- swap Devise, unlock_in: 1.minute do
234
- user = create_user
235
- user.confirm
236
-
237
- user.failed_attempts = 2
238
- user.locked_at = 2.minutes.ago
239
-
240
- user.valid_for_authentication? { false }
241
- assert_equal 1, user.failed_attempts
242
- end
243
- end
244
-
245
- test 'should unlock account if lock has expired on success' do
246
- swap Devise, unlock_in: 1.minute do
247
- user = create_user
248
- user.confirm
249
-
250
- user.failed_attempts = 2
251
- user.locked_at = 2.minutes.ago
252
-
253
- user.valid_for_authentication? { true }
254
- assert_equal 0, user.failed_attempts
255
- assert_nil user.locked_at
256
- end
257
- end
258
-
259
- test 'required_fields should contain the all the fields when all the strategies are enabled' do
260
- swap Devise, unlock_strategy: :both do
261
- swap Devise, lock_strategy: :failed_attempts do
262
- assert_equal Devise::Models::Lockable.required_fields(User), [
263
- :failed_attempts,
264
- :locked_at,
265
- :unlock_token
266
- ]
267
- end
268
- end
269
- end
270
-
271
- test 'required_fields should contain only failed_attempts and locked_at when the strategies are time and failed_attempts are enabled' do
272
- swap Devise, unlock_strategy: :time do
273
- swap Devise, lock_strategy: :failed_attempts do
274
- assert_equal Devise::Models::Lockable.required_fields(User), [
275
- :failed_attempts,
276
- :locked_at
277
- ]
278
- end
279
- end
280
- end
281
-
282
- test 'required_fields should contain only failed_attempts and unlock_token when the strategies are token and failed_attempts are enabled' do
283
- swap Devise, unlock_strategy: :email do
284
- swap Devise, lock_strategy: :failed_attempts do
285
- assert_equal Devise::Models::Lockable.required_fields(User), [
286
- :failed_attempts,
287
- :unlock_token
288
- ]
289
- end
290
- end
291
- end
292
-
293
- test 'should not return a locked unauthenticated message if in paranoid mode' do
294
- swap Devise, paranoid: :true do
295
- user = create_user
296
- user.failed_attempts = Devise.maximum_attempts + 1
297
- user.lock_access!
298
-
299
- assert_equal :invalid, user.unauthenticated_message
300
- end
301
- end
302
-
303
- test 'should return last attempt message if user made next-to-last attempt of password entering' do
304
- swap Devise, last_attempt_warning: true, lock_strategy: :failed_attempts do
305
- user = create_user
306
- user.failed_attempts = Devise.maximum_attempts - 2
307
- assert_equal :invalid, user.unauthenticated_message
308
-
309
- user.failed_attempts = Devise.maximum_attempts - 1
310
- assert_equal :last_attempt, user.unauthenticated_message
311
-
312
- user.failed_attempts = Devise.maximum_attempts
313
- assert_equal :locked, user.unauthenticated_message
314
- end
315
- end
316
-
317
- test 'should not return last attempt message if last_attempt_warning is disabled' do
318
- swap Devise, last_attempt_warning: false, lock_strategy: :failed_attempts do
319
- user = create_user
320
- user.failed_attempts = Devise.maximum_attempts - 1
321
- assert_equal :invalid, user.unauthenticated_message
322
- end
323
- end
324
-
325
- test 'should return locked message if user was programatically locked' do
326
- user = create_user
327
- user.lock_access!
328
- assert_equal :locked, user.unauthenticated_message
329
- end
330
-
331
- test 'unlock_strategy_enabled? should return true for both, email, and time strategies if :both is used' do
332
- swap Devise, unlock_strategy: :both do
333
- user = create_user
334
- assert_equal true, user.unlock_strategy_enabled?(:both)
335
- assert_equal true, user.unlock_strategy_enabled?(:time)
336
- assert_equal true, user.unlock_strategy_enabled?(:email)
337
- assert_equal false, user.unlock_strategy_enabled?(:none)
338
- assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
339
- end
340
- end
341
-
342
- test 'unlock_strategy_enabled? should return true only for the configured strategy' do
343
- swap Devise, unlock_strategy: :email do
344
- user = create_user
345
- assert_equal false, user.unlock_strategy_enabled?(:both)
346
- assert_equal false, user.unlock_strategy_enabled?(:time)
347
- assert_equal true, user.unlock_strategy_enabled?(:email)
348
- assert_equal false, user.unlock_strategy_enabled?(:none)
349
- assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
350
- end
351
- end
352
- end