devise-security 0.14.1 → 0.18.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/LICENSE.txt +3 -1
- data/README.md +136 -61
- data/app/controllers/devise/paranoid_verification_code_controller.rb +26 -12
- data/app/controllers/devise/password_expired_controller.rb +32 -10
- data/app/views/devise/paranoid_verification_code/show.html.erb +3 -3
- data/app/views/devise/password_expired/show.html.erb +5 -5
- data/config/locales/bg.yml +42 -0
- data/config/locales/by.yml +50 -0
- data/config/locales/cs.yml +46 -0
- data/config/locales/de.yml +16 -2
- data/config/locales/en.yml +15 -2
- data/config/locales/es.yml +22 -9
- data/config/locales/fa.yml +42 -0
- data/config/locales/fr.yml +15 -2
- data/config/locales/hi.yml +43 -0
- data/config/locales/it.yml +36 -4
- data/config/locales/ja.yml +14 -1
- data/config/locales/nl.yml +42 -0
- data/config/locales/pt.yml +42 -0
- data/config/locales/ru.yml +50 -0
- data/config/locales/tr.yml +26 -1
- data/config/locales/uk.yml +50 -0
- data/config/locales/zh_CN.yml +42 -0
- data/config/locales/zh_TW.yml +42 -0
- data/lib/devise-security/controllers/helpers.rb +72 -51
- data/lib/devise-security/hooks/expirable.rb +3 -3
- data/lib/devise-security/hooks/paranoid_verification.rb +1 -3
- data/lib/devise-security/hooks/password_expirable.rb +3 -3
- data/lib/devise-security/hooks/session_limitable.rb +29 -14
- data/lib/devise-security/models/compatibility/{active_record.rb → active_record_patch.rb} +14 -2
- data/lib/devise-security/models/compatibility/{mongoid.rb → mongoid_patch.rb} +12 -1
- data/lib/devise-security/models/compatibility.rb +2 -2
- data/lib/devise-security/models/database_authenticatable_patch.rb +18 -10
- data/lib/devise-security/models/expirable.rb +6 -5
- data/lib/devise-security/models/paranoid_verification.rb +2 -2
- data/lib/devise-security/models/password_archivable.rb +3 -3
- data/lib/devise-security/models/password_expirable.rb +5 -1
- data/lib/devise-security/models/secure_validatable.rb +62 -11
- data/lib/devise-security/models/session_limitable.rb +17 -2
- data/lib/devise-security/orm/mongoid.rb +1 -1
- data/lib/devise-security/patches.rb +14 -8
- data/lib/devise-security/routes.rb +2 -3
- data/lib/devise-security/validators/password_complexity_validator.rb +53 -24
- data/lib/devise-security/version.rb +1 -1
- data/lib/devise-security.rb +15 -6
- data/lib/generators/devise_security/install_generator.rb +4 -6
- data/lib/generators/templates/{devise-security.rb → devise_security.rb} +9 -1
- data/test/controllers/test_paranoid_verification_code_controller.rb +133 -0
- data/test/controllers/test_password_expired_controller.rb +164 -0
- data/test/{test_security_question_controller.rb → controllers/test_security_question_controller.rb} +19 -37
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/app/controllers/overrides/paranoid_verification_code_controller.rb +7 -0
- data/test/dummy/app/controllers/overrides/password_expired_controller.rb +17 -0
- data/test/dummy/app/controllers/widgets_controller.rb +9 -0
- data/test/dummy/app/models/application_user_record.rb +2 -1
- data/test/dummy/app/models/mongoid/confirmable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/database_authenticable_fields.rb +4 -3
- data/test/dummy/app/models/mongoid/expirable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/lockable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/mappings.rb +4 -2
- data/test/dummy/app/models/mongoid/omniauthable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/paranoid_verification_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/password_archivable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/password_expirable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/recoverable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/registerable_fields.rb +4 -2
- data/test/dummy/app/models/mongoid/rememberable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/secure_validatable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/security_questionable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/session_limitable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/timeoutable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/trackable_fields.rb +2 -0
- data/test/dummy/app/models/mongoid/validatable_fields.rb +2 -0
- data/test/dummy/app/models/paranoid_verification_user.rb +26 -0
- data/test/dummy/app/models/password_expired_user.rb +26 -0
- data/test/dummy/app/models/user.rb +10 -2
- data/test/dummy/app/models/widget.rb +1 -3
- data/test/dummy/app/mongoid/one_user.rb +5 -5
- data/test/dummy/app/mongoid/user_on_engine.rb +2 -2
- data/test/dummy/app/mongoid/user_on_main_app.rb +2 -2
- data/test/dummy/app/mongoid/user_with_validations.rb +3 -3
- data/test/dummy/app/mongoid/user_without_email.rb +7 -4
- data/test/dummy/config/application.rb +3 -7
- data/test/dummy/config/boot.rb +1 -1
- data/test/dummy/config/environment.rb +1 -1
- data/test/dummy/config/environments/test.rb +4 -13
- data/test/dummy/config/initializers/devise.rb +1 -5
- data/test/dummy/config/initializers/migration_class.rb +1 -8
- data/test/dummy/config/locales/en.yml +10 -0
- data/test/dummy/config/mongoid.yml +1 -1
- data/test/dummy/config/routes.rb +6 -3
- data/test/dummy/config.ru +1 -1
- data/test/dummy/db/migrate/20120508165529_create_tables.rb +15 -6
- data/test/dummy/lib/shared_expirable_columns.rb +1 -0
- data/test/dummy/lib/shared_security_questions_fields.rb +1 -0
- data/test/dummy/lib/shared_user.rb +17 -6
- data/test/dummy/lib/shared_user_without_omniauth.rb +12 -3
- data/test/dummy/lib/shared_verification_fields.rb +1 -0
- data/test/dummy/log/test.log +45240 -0
- data/test/i18n_test.rb +22 -0
- data/test/integration/test_paranoid_verification_code_workflow.rb +53 -0
- data/test/integration/test_password_expirable_workflow.rb +53 -0
- data/test/integration/test_session_limitable_workflow.rb +69 -0
- data/test/orm/active_record.rb +7 -4
- data/test/orm/mongoid.rb +2 -1
- data/test/support/integration_helpers.rb +35 -0
- data/test/support/mongoid.yml +1 -1
- data/test/test_compatibility.rb +15 -0
- data/test/test_complexity_validator.rb +251 -29
- data/test/test_database_authenticatable_patch.rb +146 -0
- data/test/test_helper.rb +23 -8
- data/test/test_install_generator.rb +12 -2
- data/test/test_paranoid_verification.rb +8 -9
- data/test/test_password_archivable.rb +34 -11
- data/test/test_password_expirable.rb +27 -27
- data/test/test_secure_validatable.rb +284 -50
- data/test/test_secure_validatable_overrides.rb +185 -0
- data/test/test_session_limitable.rb +57 -0
- data/test/tmp/config/initializers/devise_security.rb +52 -0
- data/test/tmp/config/locales/devise.security_extension.by.yml +50 -0
- data/test/tmp/config/locales/devise.security_extension.cs.yml +46 -0
- data/test/tmp/config/locales/devise.security_extension.de.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.en.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.es.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.fa.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.fr.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.hi.yml +43 -0
- data/test/tmp/config/locales/devise.security_extension.it.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.ja.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.nl.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.pt.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.ru.yml +50 -0
- data/test/tmp/config/locales/devise.security_extension.tr.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.uk.yml +50 -0
- data/test/tmp/config/locales/devise.security_extension.zh_CN.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.zh_TW.yml +42 -0
- metadata +202 -138
- data/.codeclimate.yml +0 -63
- data/.document +0 -5
- data/.gitignore +0 -43
- data/.mdlrc +0 -1
- data/.rubocop.yml +0 -64
- data/.ruby-version +0 -1
- data/.travis.yml +0 -39
- data/Appraisals +0 -35
- data/Gemfile +0 -10
- data/Rakefile +0 -27
- data/devise-security.gemspec +0 -50
- data/gemfiles/rails_4.2_stable.gemfile +0 -16
- data/gemfiles/rails_5.0_stable.gemfile +0 -15
- data/gemfiles/rails_5.1_stable.gemfile +0 -15
- data/gemfiles/rails_5.2_stable.gemfile +0 -15
- data/gemfiles/rails_6.0_beta.gemfile +0 -15
- data/lib/devise-security/orm/active_record.rb +0 -20
- data/lib/devise-security/patches/confirmations_controller_captcha.rb +0 -23
- data/lib/devise-security/patches/confirmations_controller_security_question.rb +0 -26
- data/lib/devise-security/patches/passwords_controller_captcha.rb +0 -22
- data/lib/devise-security/patches/passwords_controller_security_question.rb +0 -25
- data/lib/devise-security/patches/registrations_controller_captcha.rb +0 -35
- data/lib/devise-security/patches/sessions_controller_captcha.rb +0 -26
- data/lib/devise-security/patches/unlocks_controller_captcha.rb +0 -22
- data/lib/devise-security/patches/unlocks_controller_security_question.rb +0 -25
- data/lib/devise-security/schema.rb +0 -66
- data/test/dummy/app/controllers/foos_controller.rb +0 -0
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/dummy/app/models/secure_user.rb +0 -9
- data/test/dummy/lib/shared_user_without_email.rb +0 -28
- data/test/test_password_expired_controller.rb +0 -46
- /data/test/{test_captcha_controller.rb → controllers/test_captcha_controller.rb} +0 -0
@@ -0,0 +1,164 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class Devise::PasswordExpiredControllerTest < ActionController::TestCase
|
6
|
+
include Devise::Test::ControllerHelpers
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@controller.class.respond_to :json, :xml
|
10
|
+
@request.env['devise.mapping'] = Devise.mappings[:user]
|
11
|
+
@user = User.create!(
|
12
|
+
username: 'hello',
|
13
|
+
email: 'hello@path.travel',
|
14
|
+
password: 'Password4',
|
15
|
+
password_changed_at: 4.months.ago,
|
16
|
+
confirmed_at: 5.months.ago
|
17
|
+
)
|
18
|
+
assert @user.valid?
|
19
|
+
assert @user.need_change_password?
|
20
|
+
|
21
|
+
sign_in(@user)
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'redirects on show if user not logged in' do
|
25
|
+
sign_out(@user)
|
26
|
+
get :show
|
27
|
+
assert_redirected_to :root
|
28
|
+
end
|
29
|
+
|
30
|
+
test 'redirects on show if user does not need password change' do
|
31
|
+
@user.update(password_changed_at: Time.zone.now)
|
32
|
+
get :show
|
33
|
+
assert_redirected_to :root
|
34
|
+
end
|
35
|
+
|
36
|
+
test 'should render show' do
|
37
|
+
get :show
|
38
|
+
assert_includes @response.body, 'Renew your password'
|
39
|
+
end
|
40
|
+
|
41
|
+
test 'redirects on update if user not logged in' do
|
42
|
+
sign_out(@user)
|
43
|
+
put :update
|
44
|
+
assert_redirected_to :root
|
45
|
+
end
|
46
|
+
|
47
|
+
test 'redirects on update if user does not need password change' do
|
48
|
+
@user.update(password_changed_at: Time.zone.now)
|
49
|
+
put :update
|
50
|
+
assert_redirected_to :root
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'update password with default format' do
|
54
|
+
put(
|
55
|
+
:update,
|
56
|
+
params: {
|
57
|
+
user: {
|
58
|
+
current_password: 'Password4',
|
59
|
+
password: 'Password5',
|
60
|
+
password_confirmation: 'Password5'
|
61
|
+
}
|
62
|
+
}
|
63
|
+
)
|
64
|
+
assert_redirected_to root_path
|
65
|
+
assert_equal('text/html', response.media_type)
|
66
|
+
end
|
67
|
+
|
68
|
+
test 'password confirmation does not match' do
|
69
|
+
put(
|
70
|
+
:update,
|
71
|
+
params: {
|
72
|
+
user: {
|
73
|
+
current_password: 'Password4',
|
74
|
+
password: 'Password5',
|
75
|
+
password_confirmation: 'Password6'
|
76
|
+
}
|
77
|
+
}
|
78
|
+
)
|
79
|
+
|
80
|
+
assert_response :success
|
81
|
+
assert_template :show
|
82
|
+
assert_equal('text/html', response.media_type)
|
83
|
+
assert_includes(
|
84
|
+
response.body,
|
85
|
+
'Password confirmation doesn't match Password'
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
test 'update password using JSON format' do
|
90
|
+
put(
|
91
|
+
:update,
|
92
|
+
format: :json,
|
93
|
+
params: {
|
94
|
+
user: {
|
95
|
+
current_password: 'Password4',
|
96
|
+
password: 'Password5',
|
97
|
+
password_confirmation: 'Password5'
|
98
|
+
}
|
99
|
+
}
|
100
|
+
)
|
101
|
+
|
102
|
+
assert_response 204
|
103
|
+
assert_equal root_url, response.location
|
104
|
+
assert_nil response.media_type, 'No Content-Type header should be set for No Content response'
|
105
|
+
end
|
106
|
+
|
107
|
+
test 'update password using XML format' do
|
108
|
+
put(
|
109
|
+
:update,
|
110
|
+
format: :xml,
|
111
|
+
params: {
|
112
|
+
user: {
|
113
|
+
current_password: 'Password4',
|
114
|
+
password: 'Password5',
|
115
|
+
password_confirmation: 'Password5'
|
116
|
+
}
|
117
|
+
}
|
118
|
+
)
|
119
|
+
assert_response 204
|
120
|
+
assert_equal root_url, response.location
|
121
|
+
assert_nil response.media_type, 'No Content-Type header should be set for No Content response'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class PasswordExpiredCustomRedirectTest < ActionController::TestCase
|
126
|
+
include Devise::Test::ControllerHelpers
|
127
|
+
tests Overrides::PasswordExpiredController
|
128
|
+
|
129
|
+
setup do
|
130
|
+
@controller.class.respond_to :json, :xml
|
131
|
+
@request.env['devise.mapping'] = Devise.mappings[:password_expired_user]
|
132
|
+
@user = PasswordExpiredUser.create!(
|
133
|
+
username: 'hello',
|
134
|
+
email: 'hello@path.travel',
|
135
|
+
password: 'Password4',
|
136
|
+
password_changed_at: 4.months.ago,
|
137
|
+
confirmed_at: 5.months.ago
|
138
|
+
)
|
139
|
+
assert @user.valid?
|
140
|
+
assert @user.need_change_password?
|
141
|
+
|
142
|
+
sign_in(@user)
|
143
|
+
end
|
144
|
+
|
145
|
+
test 'update password with custom redirect route' do
|
146
|
+
put(
|
147
|
+
:update,
|
148
|
+
params: {
|
149
|
+
password_expired_user: {
|
150
|
+
current_password: 'Password4',
|
151
|
+
password: 'Password5',
|
152
|
+
password_confirmation: 'Password5'
|
153
|
+
}
|
154
|
+
}
|
155
|
+
)
|
156
|
+
|
157
|
+
assert_redirected_to '/cookies'
|
158
|
+
end
|
159
|
+
|
160
|
+
test 'yield resource to block on update' do
|
161
|
+
put(:update, params: { password_expired_user: { current_password: '123' } })
|
162
|
+
assert @controller.update_block_called?, 'Update failed to yield resource to provided block'
|
163
|
+
end
|
164
|
+
end
|
data/test/{test_security_question_controller.rb → controllers/test_security_question_controller.rb}
RENAMED
@@ -7,45 +7,38 @@ class TestWithSecurityQuestion < ActionController::TestCase
|
|
7
7
|
tests SecurityQuestion::UnlocksController
|
8
8
|
|
9
9
|
setup do
|
10
|
-
@user = SecurityQuestionUser.create!(
|
11
|
-
|
10
|
+
@user = SecurityQuestionUser.create!(
|
11
|
+
username: 'hello', email: 'hello@microsoft.com', password: 'A1234567z!', security_question_answer: 'Right Answer'
|
12
|
+
)
|
12
13
|
@user.lock_access!
|
13
14
|
assert @user.locked_at.present?
|
14
15
|
@request.env['devise.mapping'] = Devise.mappings[:security_question_user]
|
15
16
|
end
|
16
17
|
|
17
18
|
test 'When security question is enabled, it is inserted correctly' do
|
18
|
-
|
19
|
-
|
19
|
+
post(
|
20
|
+
:create,
|
21
|
+
params: {
|
22
|
+
security_question_answer: 'wrong answer',
|
20
23
|
security_question_user: {
|
21
24
|
email: @user.email
|
22
|
-
}
|
23
|
-
}
|
24
|
-
else
|
25
|
-
post :create, params: {
|
26
|
-
security_question_user: {
|
27
|
-
email: @user.email
|
28
|
-
}, security_question_answer: "wrong answer"
|
25
|
+
}
|
29
26
|
}
|
30
|
-
|
27
|
+
)
|
31
28
|
assert_equal I18n.t('devise.invalid_security_question'), flash[:alert]
|
32
29
|
assert_redirected_to new_security_question_user_unlock_path
|
33
30
|
end
|
34
31
|
|
35
32
|
test 'When security_question is valid, it runs as normal' do
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
}, security_question_answer: @user.security_question_answer
|
41
|
-
}
|
42
|
-
else
|
43
|
-
post :create, params: {
|
33
|
+
post(
|
34
|
+
:create,
|
35
|
+
params: {
|
36
|
+
security_question_answer: @user.security_question_answer,
|
44
37
|
security_question_user: {
|
45
38
|
email: @user.email
|
46
|
-
}
|
39
|
+
}
|
47
40
|
}
|
48
|
-
|
41
|
+
)
|
49
42
|
|
50
43
|
assert_equal I18n.t('devise.unlocks.send_instructions'), flash[:notice]
|
51
44
|
assert_redirected_to new_security_question_user_session_path
|
@@ -57,26 +50,15 @@ class TestWithoutSecurityQuestion < ActionController::TestCase
|
|
57
50
|
tests Devise::UnlocksController
|
58
51
|
|
59
52
|
setup do
|
60
|
-
@user = User.create(
|
61
|
-
|
53
|
+
@user = User.create(
|
54
|
+
username: 'hello', email: 'hello@path.travel', password: '1234', security_question_answer: 'Right Answer'
|
55
|
+
)
|
62
56
|
@user.lock_access!
|
63
57
|
@request.env['devise.mapping'] = Devise.mappings[:user]
|
64
58
|
end
|
65
59
|
|
66
60
|
test 'When security question is not enabled it is not inserted' do
|
67
|
-
|
68
|
-
post :create, {
|
69
|
-
user: {
|
70
|
-
email: @user.email
|
71
|
-
}
|
72
|
-
}
|
73
|
-
else
|
74
|
-
post :create, params: {
|
75
|
-
user: {
|
76
|
-
email: @user.email
|
77
|
-
}
|
78
|
-
}
|
79
|
-
end
|
61
|
+
post :create, params: { user: { email: @user.email } }
|
80
62
|
|
81
63
|
assert_equal I18n.t('devise.unlocks.send_instructions'), flash[:notice]
|
82
64
|
assert_redirected_to new_user_session_path
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Overrides::PasswordExpiredController < Devise::PasswordExpiredController
|
4
|
+
def update
|
5
|
+
super do |resource|
|
6
|
+
@update_block_called = true
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def after_password_expired_update_path_for(_)
|
11
|
+
'/cookies'
|
12
|
+
end
|
13
|
+
|
14
|
+
def update_block_called?
|
15
|
+
@update_block_called == true
|
16
|
+
end
|
17
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DatabaseAuthenticatableFields
|
2
4
|
extend ::ActiveSupport::Concern
|
3
5
|
|
@@ -6,10 +8,9 @@ module DatabaseAuthenticatableFields
|
|
6
8
|
|
7
9
|
## Database authenticatable
|
8
10
|
field :username, type: String
|
9
|
-
field :email, type: String, default:
|
10
|
-
#validates_presence_of :email
|
11
|
+
field :email, type: String, default: ''
|
11
12
|
|
12
|
-
field :encrypted_password, type: String, default:
|
13
|
+
field :encrypted_password, type: String, default: ''
|
13
14
|
validates_presence_of :encrypted_password
|
14
15
|
|
15
16
|
include Mongoid::Timestamps
|
@@ -1,11 +1,13 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Dir[File.expand_path('*_fields.rb', __dir__)].each { |f| require_relative f }
|
2
4
|
|
3
5
|
module Mongoid
|
4
6
|
module Mappings
|
5
7
|
extend ::ActiveSupport::Concern
|
6
8
|
|
7
9
|
included do
|
8
|
-
|
10
|
+
devise_modules.each do |devise_module_name|
|
9
11
|
include "#{devise_module_name.to_s.classify}Fields".constantize
|
10
12
|
end
|
11
13
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RegisterableFields
|
2
4
|
extend ::ActiveSupport::Concern
|
3
5
|
|
@@ -5,10 +7,10 @@ module RegisterableFields
|
|
5
7
|
include Mongoid::Document
|
6
8
|
|
7
9
|
## Database authenticatable
|
8
|
-
field :email, type: String, default:
|
10
|
+
field :email, type: String, default: ''
|
9
11
|
validates_presence_of :email
|
10
12
|
|
11
|
-
field :encrypted_password, type: String, default:
|
13
|
+
field :encrypted_password, type: String, default: ''
|
12
14
|
validates_presence_of :encrypted_password
|
13
15
|
|
14
16
|
field :password_changed_at, type: Time
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class ParanoidVerificationUser < ApplicationUserRecord
|
4
|
+
devise :database_authenticatable,
|
5
|
+
:confirmable,
|
6
|
+
:expirable,
|
7
|
+
:lockable,
|
8
|
+
:omniauthable,
|
9
|
+
:paranoid_verification,
|
10
|
+
:password_archivable,
|
11
|
+
:password_expirable,
|
12
|
+
:recoverable,
|
13
|
+
:registerable,
|
14
|
+
:rememberable,
|
15
|
+
:secure_validatable,
|
16
|
+
:security_questionable,
|
17
|
+
:session_limitable,
|
18
|
+
:timeoutable,
|
19
|
+
:trackable,
|
20
|
+
:validatable
|
21
|
+
|
22
|
+
if DEVISE_ORM == :mongoid
|
23
|
+
require './test/dummy/app/models/mongoid/mappings'
|
24
|
+
include ::Mongoid::Mappings
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class PasswordExpiredUser < ApplicationUserRecord
|
4
|
+
devise :database_authenticatable,
|
5
|
+
:confirmable,
|
6
|
+
:expirable,
|
7
|
+
:lockable,
|
8
|
+
:omniauthable,
|
9
|
+
:paranoid_verification,
|
10
|
+
:password_archivable,
|
11
|
+
:password_expirable,
|
12
|
+
:recoverable,
|
13
|
+
:registerable,
|
14
|
+
:rememberable,
|
15
|
+
:secure_validatable,
|
16
|
+
:security_questionable,
|
17
|
+
:session_limitable,
|
18
|
+
:timeoutable,
|
19
|
+
:trackable,
|
20
|
+
:validatable
|
21
|
+
|
22
|
+
if DEVISE_ORM == :mongoid
|
23
|
+
require './test/dummy/app/models/mongoid/mappings'
|
24
|
+
include ::Mongoid::Mappings
|
25
|
+
end
|
26
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class User < ApplicationRecord
|
4
|
-
|
5
4
|
devise :database_authenticatable,
|
6
5
|
:confirmable,
|
7
6
|
:expirable,
|
@@ -22,8 +21,17 @@ class User < ApplicationRecord
|
|
22
21
|
|
23
22
|
has_many :widgets
|
24
23
|
|
25
|
-
|
24
|
+
case DEVISE_ORM
|
25
|
+
when :mongoid
|
26
26
|
require './test/dummy/app/models/mongoid/mappings'
|
27
27
|
include ::Mongoid::Mappings
|
28
|
+
|
29
|
+
def some_method_calling_mongoid
|
30
|
+
Mongoid.logger
|
31
|
+
end
|
32
|
+
when :active_record
|
33
|
+
def some_method_calling_active_record
|
34
|
+
ActiveRecord::Base.transaction { break; }
|
35
|
+
end
|
28
36
|
end
|
29
37
|
end
|
@@ -11,16 +11,16 @@ class OneUser
|
|
11
11
|
field :password_changed_at, type: Time
|
12
12
|
index({ password_changed_at: 1 }, {})
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
field :paranoid_verification_code, type: String
|
15
|
+
field :paranoid_verified_at, type: Time
|
16
|
+
field :paranoid_verification_attempt, type: Integer, default: 0
|
17
17
|
|
18
18
|
field :username, type: String
|
19
19
|
field :facebook_token, type: String
|
20
20
|
|
21
21
|
## Database authenticatable
|
22
|
-
field :email, type: String, default:
|
23
|
-
field :encrypted_password, type: String, default:
|
22
|
+
field :email, type: String, default: ''
|
23
|
+
field :encrypted_password, type: String, default: ''
|
24
24
|
|
25
25
|
## Recoverable
|
26
26
|
field :reset_password_token, type: String
|
@@ -11,8 +11,8 @@ class UserOnEngine
|
|
11
11
|
field :facebook_token, type: String
|
12
12
|
|
13
13
|
## Database authenticatable
|
14
|
-
field :email, type: String, default:
|
15
|
-
field :encrypted_password, type: String, default:
|
14
|
+
field :email, type: String, default: ''
|
15
|
+
field :encrypted_password, type: String, default: ''
|
16
16
|
|
17
17
|
## Recoverable
|
18
18
|
field :reset_password_token, type: String
|
@@ -11,8 +11,8 @@ class UserOnMainApp
|
|
11
11
|
field :facebook_token, type: String
|
12
12
|
|
13
13
|
## Database authenticatable
|
14
|
-
field :email, type: String, default:
|
15
|
-
field :encrypted_password, type: String, default:
|
14
|
+
field :email, type: String, default: ''
|
15
|
+
field :encrypted_password, type: String, default: ''
|
16
16
|
|
17
17
|
## Recoverable
|
18
18
|
field :reset_password_token, type: String
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'shared_user'
|
4
4
|
|
5
5
|
class UserWithValidations
|
6
6
|
include Mongoid::Document
|
@@ -11,8 +11,8 @@ class UserWithValidations
|
|
11
11
|
field :facebook_token, type: String
|
12
12
|
|
13
13
|
## Database authenticatable
|
14
|
-
field :email, type: String, default:
|
15
|
-
field :encrypted_password, type: String, default:
|
14
|
+
field :email, type: String, default: ''
|
15
|
+
field :encrypted_password, type: String, default: ''
|
16
16
|
|
17
17
|
## Recoverable
|
18
18
|
field :reset_password_token, type: String
|
@@ -1,18 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'shared_user_without_email'
|
4
4
|
|
5
5
|
class UserWithoutEmail
|
6
6
|
include Mongoid::Document
|
7
7
|
include Shim
|
8
|
-
|
8
|
+
|
9
|
+
devise :database_authenticatable, :lockable, :recoverable,
|
10
|
+
:registerable, :rememberable, :timeoutable,
|
11
|
+
:trackable
|
9
12
|
|
10
13
|
field :username, type: String
|
11
14
|
field :facebook_token, type: String
|
12
15
|
|
13
16
|
## Database authenticatable
|
14
|
-
field :email, type: String, default:
|
15
|
-
field :encrypted_password, type: String, default:
|
17
|
+
field :email, type: String, default: ''
|
18
|
+
field :encrypted_password, type: String, default: ''
|
16
19
|
|
17
20
|
## Recoverable
|
18
21
|
field :reset_password_token, type: String
|