devise-security 0.15.0 → 0.16.0
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.
- checksums.yaml +4 -4
- data/README.md +27 -19
- data/app/controllers/devise/password_expired_controller.rb +1 -5
- data/config/locales/by.yml +1 -0
- data/config/locales/cs.yml +1 -0
- data/config/locales/de.yml +1 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/fa.yml +1 -0
- data/config/locales/fr.yml +1 -0
- data/config/locales/hi.yml +21 -20
- data/config/locales/it.yml +1 -0
- data/config/locales/ja.yml +1 -0
- data/config/locales/nl.yml +1 -0
- data/config/locales/pt.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/config/locales/tr.yml +1 -0
- data/config/locales/uk.yml +1 -0
- data/config/locales/zh_CN.yml +1 -0
- data/config/locales/zh_TW.yml +1 -0
- data/lib/devise-security.rb +6 -3
- data/lib/devise-security/controllers/helpers.rb +2 -2
- data/lib/devise-security/hooks/session_limitable.rb +10 -6
- data/lib/devise-security/models/secure_validatable.rb +15 -1
- data/lib/devise-security/version.rb +1 -1
- data/lib/generators/devise_security/install_generator.rb +3 -3
- data/lib/generators/templates/{devise-security.rb → devise_security.rb} +3 -0
- data/test/controllers/test_password_expired_controller.rb +67 -98
- data/test/controllers/test_security_question_controller.rb +16 -40
- data/test/dummy/config/environments/test.rb +3 -13
- data/test/dummy/config/initializers/migration_class.rb +1 -8
- data/test/dummy/config/mongoid.yml +1 -1
- data/test/dummy/log/development.log +883 -0
- data/test/dummy/log/test.log +19890 -0
- data/test/integration/test_password_expirable_workflow.rb +0 -4
- data/test/orm/mongoid.rb +2 -1
- data/test/support/integration_helpers.rb +14 -32
- data/test/support/mongoid.yml +1 -1
- data/test/test_helper.rb +4 -4
- data/test/test_install_generator.rb +1 -1
- data/test/test_secure_validatable.rb +76 -0
- data/test/tmp/config/initializers/devise-security.rb +3 -0
- data/test/tmp/config/locales/devise.security_extension.by.yml +49 -0
- data/test/tmp/config/locales/devise.security_extension.cs.yml +41 -0
- data/test/tmp/config/locales/devise.security_extension.de.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.en.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.es.yml +10 -9
- data/test/tmp/config/locales/devise.security_extension.fa.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.fr.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.hi.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.it.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.ja.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.nl.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.pt.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.ru.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.tr.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.uk.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.zh_CN.yml +1 -0
- data/test/tmp/config/locales/devise.security_extension.zh_TW.yml +41 -0
- metadata +19 -40
- data/lib/devise-security/orm/active_record.rb +0 -20
- data/lib/devise-security/schema.rb +0 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d065158ce85c823918ca0fb7ad40382ca9957f7c5e0847e1fec86e1eaed0ffb
|
4
|
+
data.tar.gz: fa07606b583076da6b68ceeddf70f74f80c05f3adf752a057b8f935c9af68fb6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f18a70374b20c80908006811184fc4757c4f678e11ff226d60b78ff0a3c1cf2612382185911b23692c6c7ed1553914f1361ab1243948ad1e1ff3ac91fdb5ab7
|
7
|
+
data.tar.gz: 68e392e9f0049659ad62977a0bb31910d4942b26ab24fab11b28e1e875286f2b48e9da20dd952f94bc4ac8350b1cd5199d9984e431d4664c865544a095b274b8
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
[](https://coveralls.io/github/devise-security/devise-security?branch=master)
|
5
5
|
[](https://codeclimate.com/github/devise-security/devise-security/maintainability)
|
6
6
|
|
7
|
-
A [Devise](https://github.com/
|
7
|
+
A [Devise](https://github.com/heartcombo/devise) extension to add additional
|
8
8
|
security features required by modern web applications. Forked from
|
9
9
|
[Devise Security Extension](https://github.com/phatworx/devise_security_extension)
|
10
10
|
|
@@ -37,9 +37,9 @@ automated mass creation and brute forcing of accounts harder)
|
|
37
37
|
|
38
38
|
## Getting started
|
39
39
|
|
40
|
-
Devise Security works with Devise on Rails
|
40
|
+
Devise Security works with Devise on Rails >= 5.0. You can add it to your
|
41
41
|
Gemfile after you successfully set up Devise (see
|
42
|
-
[Devise documentation](https://github.com/
|
42
|
+
[Devise documentation](https://github.com/heartcombo/devise)) with:
|
43
43
|
|
44
44
|
```ruby
|
45
45
|
gem 'devise-security'
|
@@ -54,7 +54,7 @@ rails generate devise_security:install
|
|
54
54
|
```
|
55
55
|
|
56
56
|
The generator adds optional configurations to
|
57
|
-
`config/initializers/
|
57
|
+
`config/initializers/devise_security.rb`. Enable the modules you wish to use in
|
58
58
|
the initializer you are ready to add Devise Security modules on top of Devise
|
59
59
|
modules to any of your Devise models:
|
60
60
|
|
@@ -124,6 +124,9 @@ Devise.setup do |config|
|
|
124
124
|
# ==> Configuration for :expirable
|
125
125
|
# Time period for account expiry from last_activity_at
|
126
126
|
# config.expire_after = 90.days
|
127
|
+
|
128
|
+
# Allow passwords to be equal to email (false, true)
|
129
|
+
# config.allow_passwords_equal_to_email = false
|
127
130
|
end
|
128
131
|
```
|
129
132
|
|
@@ -187,10 +190,10 @@ documentation there.
|
|
187
190
|
4. Add the captcha in the generated devise views for each controller you have
|
188
191
|
activated.
|
189
192
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
193
|
+
```erb
|
194
|
+
<p><%= captcha_tag %></p>
|
195
|
+
<p><%= text_field_tag :captcha %></p>
|
196
|
+
```
|
194
197
|
|
195
198
|
## Schema
|
196
199
|
|
@@ -231,6 +234,20 @@ create_table :the_resources do |t|
|
|
231
234
|
end
|
232
235
|
```
|
233
236
|
|
237
|
+
#### Bypassing session limitable
|
238
|
+
|
239
|
+
Sometimes it's useful to impersonate a user without authentication (e.g.
|
240
|
+
[administrator impersonating a user](https://github.com/heartcombo/devise/wiki/How-To:-Sign-in-as-another-user-if-you-are-an-admin)),
|
241
|
+
in this case the `session_limitable` strategy will log out the user, and if the
|
242
|
+
user logs in while the administrator is still logged in, the administrator will
|
243
|
+
be logged out.
|
244
|
+
|
245
|
+
For such cases the following can be used:
|
246
|
+
|
247
|
+
```ruby
|
248
|
+
sign_in(User.find(params[:id]), scope: :user, skip_session_limitable: true)
|
249
|
+
```
|
250
|
+
|
234
251
|
### Expirable
|
235
252
|
|
236
253
|
```ruby
|
@@ -303,8 +320,8 @@ end
|
|
303
320
|
|
304
321
|
## Requirements
|
305
322
|
|
306
|
-
- Devise (<https://github.com/
|
307
|
-
- Rails
|
323
|
+
- Devise (<https://github.com/heartcombo/devise>)
|
324
|
+
- Rails 5.0 onwards (<http://github.com/rails/rails>)
|
308
325
|
- recommendations:
|
309
326
|
- `autocomplete-off` (<http://github.com/phatworx/autocomplete-off>)
|
310
327
|
- `easy_captcha` (<http://github.com/phatworx/easy_captcha>)
|
@@ -356,13 +373,6 @@ See also
|
|
356
373
|
Standard tests can be invoked using `rake`. To run the tests against the
|
357
374
|
`mongoid` ORM, use `DEVISE_ORM=mongoid rake` while `mongodb` is running.
|
358
375
|
|
359
|
-
To locally simulate what travis-ci will run when you push code use:
|
360
|
-
|
361
|
-
```bash
|
362
|
-
gem install bundler -v '1.17.3'
|
363
|
-
BUNDLER_VERSION=1.17.3 wwtd
|
364
|
-
```
|
365
|
-
|
366
376
|
## Maintenance Policy
|
367
377
|
|
368
378
|
We are committed to maintain support for `devise-security` for all normal or
|
@@ -371,8 +381,6 @@ security maintenance versions of the Ruby language
|
|
371
381
|
Ruby on Rails framework
|
372
382
|
[as per their maintenance policy](https://rubyonrails.org/maintenance/).
|
373
383
|
|
374
|
-
Support for Rails 4.2 will be dropped in version 0.16.0.
|
375
|
-
|
376
384
|
In order to avoid introducing bugs caused by backwardly incompatible Ruby
|
377
385
|
language features, it is highly recommended that all development work be done
|
378
386
|
using the oldest supported ruby version. The contents of the `.ruby-version`
|
@@ -41,11 +41,7 @@ class Devise::PasswordExpiredController < DeviseController
|
|
41
41
|
def resource_params
|
42
42
|
permitted_params = [:current_password, :password, :password_confirmation]
|
43
43
|
|
44
|
-
|
45
|
-
params.require(resource_name).permit(*permitted_params)
|
46
|
-
else
|
47
|
-
params[scope].slice(*permitted_params)
|
48
|
-
end
|
44
|
+
params.require(resource_name).permit(*permitted_params)
|
49
45
|
end
|
50
46
|
|
51
47
|
def scope
|
data/config/locales/by.yml
CHANGED
@@ -3,6 +3,7 @@ by:
|
|
3
3
|
messages:
|
4
4
|
taken_in_past: 'ужо раней выкарыстоўваўся.'
|
5
5
|
equal_to_current_password: 'павінен адрознівацца ад сучаснага пароля.'
|
6
|
+
equal_to_email: 'павінна адрознівацца ад электроннай пошты.'
|
6
7
|
password_complexity:
|
7
8
|
digit:
|
8
9
|
one: 'павінен утрымліваць хоць адну лічбу'
|
data/config/locales/cs.yml
CHANGED
data/config/locales/de.yml
CHANGED
@@ -3,6 +3,7 @@ de:
|
|
3
3
|
messages:
|
4
4
|
taken_in_past: 'wurde bereits in der Vergangenheit verwendet.'
|
5
5
|
equal_to_current_password: 'darf nicht dem aktuellen Passwort entsprechen.'
|
6
|
+
equal_to_email: 'darf nicht dem E-mail entsprechen.'
|
6
7
|
password_complexity:
|
7
8
|
digit:
|
8
9
|
one: muss mindestens eine Ziffer enthalten
|
data/config/locales/en.yml
CHANGED
data/config/locales/es.yml
CHANGED
@@ -3,6 +3,7 @@ es:
|
|
3
3
|
messages:
|
4
4
|
taken_in_past: 'la contraseña fue usada previamente, por favor elige otra.'
|
5
5
|
equal_to_current_password: 'tiene que ser diferente a la contraseña actual.'
|
6
|
+
equal_to_email: 'tiene que ser diferente al email'
|
6
7
|
password_complexity:
|
7
8
|
digit:
|
8
9
|
one: tiene que contener al menos un dígito
|
data/config/locales/fa.yml
CHANGED
data/config/locales/fr.yml
CHANGED
@@ -3,6 +3,7 @@ fr:
|
|
3
3
|
messages:
|
4
4
|
taken_in_past: a été utilisé trop récemment. Veuillez en choisir un autre
|
5
5
|
equal_to_current_password: doit être différent de l'actuel
|
6
|
+
equal_to_email: doit être différent de l'e-mail
|
6
7
|
password_complexity:
|
7
8
|
digit:
|
8
9
|
one: doit contenir au moins un chiffre
|
data/config/locales/hi.yml
CHANGED
@@ -2,40 +2,41 @@
|
|
2
2
|
hi:
|
3
3
|
errors:
|
4
4
|
messages:
|
5
|
-
taken_in_past: यह पासवर्ड, आपके द्वारा पूर्व मे प्रयोग किया जा चुका है
|
6
|
-
equal_to_current_password: नया पासवर्ड, वर्तमान पासवर्ड से भिन्न होना चाहिए
|
5
|
+
taken_in_past: यह पासवर्ड, आपके द्वारा पूर्व मे प्रयोग किया जा चुका है
|
6
|
+
equal_to_current_password: नया पासवर्ड, वर्तमान पासवर्ड से भिन्न होना चाहिए
|
7
|
+
equal_to_email: ईमेल से अलग होना चाहिए
|
7
8
|
password_complexity:
|
8
9
|
digit:
|
9
|
-
one: एक अंक होना चाहिए
|
10
|
-
other: कम से कम %{count} अंक होने चाहिए
|
10
|
+
one: एक अंक होना चाहिए
|
11
|
+
other: कम से कम %{count} अंक होने चाहिए
|
11
12
|
lower:
|
12
|
-
one: एक लोअर-केस अक्षर होना चाहिए
|
13
|
-
other: कम से कम %{count} अक्षर होने चाहिए
|
13
|
+
one: एक लोअर-केस अक्षर होना चाहिए
|
14
|
+
other: कम से कम %{count} अक्षर होने चाहिए
|
14
15
|
symbol:
|
15
|
-
one: एक चिन्ह होना चाहिए
|
16
|
-
other: कम से कम %{count} चिन्ह होने चाहिए
|
16
|
+
one: एक चिन्ह होना चाहिए
|
17
|
+
other: कम से कम %{count} चिन्ह होने चाहिए
|
17
18
|
upper:
|
18
|
-
one: एक अपर-केस अक्षर होना चाहिए
|
19
|
-
other: कम से कम %{count} अपर-केस अक्षर होने चाहिए
|
19
|
+
one: एक अपर-केस अक्षर होना चाहिए
|
20
|
+
other: कम से कम %{count} अपर-केस अक्षर होने चाहिए
|
20
21
|
devise:
|
21
22
|
invalid_captcha: अमान्य कॅप्टचा
|
22
23
|
invalid_security_question: अमान्य सुरक्षा उत्तर
|
23
24
|
paranoid_verify:
|
24
|
-
code_required: सपोर्ट टीम द्वारा दिया गया कोड डाले
|
25
|
+
code_required: सपोर्ट टीम द्वारा दिया गया कोड डाले
|
25
26
|
paranoid_verification_code:
|
26
27
|
show:
|
27
|
-
submit_verification_code: वेरिफिकेशन कोड डाले
|
28
|
-
verification_code: वेरिफिकेशन कोड
|
29
|
-
submit: सबमिट
|
28
|
+
submit_verification_code: वेरिफिकेशन कोड डाले
|
29
|
+
verification_code: वेरिफिकेशन कोड
|
30
|
+
submit: सबमिट
|
30
31
|
password_expired:
|
31
32
|
updated: पासवर्ड अद्यतन किया गया
|
32
|
-
change_required: पासवर्ड अमान्य हो चुका, पासवर्ड बदले
|
33
|
+
change_required: पासवर्ड अमान्य हो चुका, पासवर्ड बदले
|
33
34
|
show:
|
34
|
-
renew_your_password: पासवर्ड बदले
|
35
|
+
renew_your_password: पासवर्ड बदले
|
35
36
|
current_password: वर्तमान पासवर्ड
|
36
|
-
new_password: नया पासवर्ड
|
37
|
-
new_password_confirmation: नए पासवर्ड की पुष्टि करें
|
38
|
-
change_my_password: पासवर्ड बदले
|
37
|
+
new_password: नया पासवर्ड
|
38
|
+
new_password_confirmation: नए पासवर्ड की पुष्टि करें
|
39
|
+
change_my_password: पासवर्ड बदले
|
39
40
|
failure:
|
40
|
-
session_limited: जानकारी, दूसरे ब्राउज़र में उपयोग की गयी थी जारी रखने फिर से साइन-इन करे
|
41
|
+
session_limited: जानकारी, दूसरे ब्राउज़र में उपयोग की गयी थी जारी रखने फिर से साइन-इन करे
|
41
42
|
expired: कोई गतिविधि न होने के कारण खाता बंद हो गया, सिस्टम व्यवस्थापक से संपर्क करें
|
data/config/locales/it.yml
CHANGED
@@ -3,6 +3,7 @@ it:
|
|
3
3
|
messages:
|
4
4
|
taken_in_past: "è stata gia' utilizzata in passato!"
|
5
5
|
equal_to_current_password: " deve essere differente dalla password corrente!"
|
6
|
+
equal_to_email: "deve essere differente dall'email"
|
6
7
|
password_complexity:
|
7
8
|
digit:
|
8
9
|
one: deve contenere almeno una cifra
|
data/config/locales/ja.yml
CHANGED
data/config/locales/nl.yml
CHANGED
data/config/locales/pt.yml
CHANGED
data/config/locales/ru.yml
CHANGED
@@ -3,6 +3,7 @@ ru:
|
|
3
3
|
messages:
|
4
4
|
taken_in_past: 'уже ранее использовался.'
|
5
5
|
equal_to_current_password: 'должен отличаться от текущего пароля.'
|
6
|
+
equal_to_email: 'должно отличаться от адреса электронной почты.'
|
6
7
|
password_complexity:
|
7
8
|
digit:
|
8
9
|
one: 'должен содержать хотя бы одну цифру'
|
data/config/locales/tr.yml
CHANGED
@@ -3,6 +3,7 @@ tr:
|
|
3
3
|
messages:
|
4
4
|
taken_in_past: "daha önce kullanıldı."
|
5
5
|
equal_to_current_password: "mevcut paroladan farklı olmalı."
|
6
|
+
equal_to_email: "e-postadan farklı olmalı."
|
6
7
|
password_format: "büyük, küçük harfler ve sayılar içermeli."
|
7
8
|
devise:
|
8
9
|
invalid_captcha: "Captcha hatalı."
|
data/config/locales/uk.yml
CHANGED
data/config/locales/zh_CN.yml
CHANGED
data/config/locales/zh_TW.yml
CHANGED
data/lib/devise-security.rb
CHANGED
@@ -79,11 +79,14 @@ module Devise
|
|
79
79
|
# paranoid_verification will regenerate verifacation code after faild attempt
|
80
80
|
mattr_accessor :paranoid_code_regenerate_after_attempt
|
81
81
|
@@paranoid_code_regenerate_after_attempt = 10
|
82
|
+
|
83
|
+
# Whether to allow passwords that are equal (case insensitive) to the email
|
84
|
+
mattr_accessor :allow_passwords_equal_to_email
|
85
|
+
@@allow_passwords_equal_to_email = false
|
82
86
|
end
|
83
87
|
|
84
|
-
#
|
88
|
+
# a security extension for devise
|
85
89
|
module DeviseSecurity
|
86
|
-
autoload :Schema, 'devise-security/schema'
|
87
90
|
autoload :Patches, 'devise-security/patches'
|
88
91
|
|
89
92
|
module Controllers
|
@@ -104,6 +107,6 @@ Devise.add_module :paranoid_verification, controller: :paranoid_verification_cod
|
|
104
107
|
# requires
|
105
108
|
require 'devise-security/routes'
|
106
109
|
require 'devise-security/rails'
|
107
|
-
require "devise-security/orm/#{DEVISE_ORM}"
|
110
|
+
require "devise-security/orm/#{DEVISE_ORM}" if DEVISE_ORM == :mongoid
|
108
111
|
require 'devise-security/models/database_authenticatable_patch'
|
109
112
|
require 'devise-security/models/paranoid_verification'
|
@@ -88,11 +88,11 @@ module DeviseSecurity
|
|
88
88
|
|
89
89
|
# redirect for password update with alert message
|
90
90
|
def redirect_for_password_change(scope)
|
91
|
-
redirect_to change_password_required_path_for(scope), alert: I18n.t('change_required',
|
91
|
+
redirect_to change_password_required_path_for(scope), alert: I18n.t('change_required', scope: 'devise.password_expired')
|
92
92
|
end
|
93
93
|
|
94
94
|
def redirect_for_paranoid_verification(scope)
|
95
|
-
redirect_to paranoid_verification_code_path_for(scope), alert: I18n.t('code_required',
|
95
|
+
redirect_to paranoid_verification_code_path_for(scope), alert: I18n.t('code_required', scope: 'devise.paranoid_verify')
|
96
96
|
end
|
97
97
|
|
98
98
|
# path for change password
|
@@ -7,9 +7,14 @@ Warden::Manager.after_set_user except: :fetch do |record, warden, options|
|
|
7
7
|
if record.devise_modules.include?(:session_limitable) &&
|
8
8
|
warden.authenticated?(options[:scope]) &&
|
9
9
|
!record.skip_session_limitable?
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
|
11
|
+
if !options[:skip_session_limitable]
|
12
|
+
unique_session_id = Devise.friendly_token
|
13
|
+
warden.session(options[:scope])['unique_session_id'] = unique_session_id
|
14
|
+
record.update_unique_session_id!(unique_session_id)
|
15
|
+
else
|
16
|
+
warden.session(options[:scope])['devise.skip_session_limitable'] = true
|
17
|
+
end
|
13
18
|
end
|
14
19
|
end
|
15
20
|
|
@@ -19,14 +24,13 @@ end
|
|
19
24
|
# page on the next request.
|
20
25
|
Warden::Manager.after_set_user only: :fetch do |record, warden, options|
|
21
26
|
scope = options[:scope]
|
22
|
-
env = warden.request.env
|
23
27
|
|
24
28
|
if record.devise_modules.include?(:session_limitable) &&
|
25
29
|
warden.authenticated?(scope) &&
|
26
30
|
options[:store] != false
|
27
31
|
if record.unique_session_id != warden.session(scope)['unique_session_id'] &&
|
28
|
-
!
|
29
|
-
!
|
32
|
+
!record.skip_session_limitable? &&
|
33
|
+
!warden.session(scope)['devise.skip_session_limitable']
|
30
34
|
Rails.logger.warn do
|
31
35
|
'[devise-security][session_limitable] session id mismatch: '\
|
32
36
|
"expected=#{record.unique_session_id.inspect} "\
|
@@ -55,6 +55,9 @@ module Devise
|
|
55
55
|
|
56
56
|
# don't allow use same password
|
57
57
|
validate :current_equal_password_validation
|
58
|
+
|
59
|
+
# don't allow email to equal password
|
60
|
+
validate :email_not_equal_password_validation unless allow_passwords_equal_to_email
|
58
61
|
end
|
59
62
|
end
|
60
63
|
|
@@ -70,6 +73,17 @@ module Devise
|
|
70
73
|
self.errors.add(:password, :equal_to_current_password) if dummy.valid_password?(password)
|
71
74
|
end
|
72
75
|
|
76
|
+
def email_not_equal_password_validation
|
77
|
+
return if password.blank? || (!new_record? && !will_save_change_to_encrypted_password?)
|
78
|
+
dummy = self.class.new.tap do |user|
|
79
|
+
user.password_salt = password_salt if respond_to?(:password_salt)
|
80
|
+
# whether case_insensitive_keys or strip_whitespace_keys include email or not, any
|
81
|
+
# variation of the email should not be a supported password
|
82
|
+
user.password = email.downcase.strip
|
83
|
+
end
|
84
|
+
self.errors.add(:password, :equal_to_email) if dummy.valid_password?(password.downcase.strip)
|
85
|
+
end
|
86
|
+
|
73
87
|
protected
|
74
88
|
|
75
89
|
# Checks whether a password is needed or not. For validations only.
|
@@ -84,7 +98,7 @@ module Devise
|
|
84
98
|
end
|
85
99
|
|
86
100
|
module ClassMethods
|
87
|
-
Devise::Models.config(self, :password_complexity, :password_length, :email_validation)
|
101
|
+
Devise::Models.config(self, :password_complexity, :password_length, :email_validation, :allow_passwords_equal_to_email)
|
88
102
|
|
89
103
|
private
|
90
104
|
|