devise-security 0.12.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 +186 -63
- data/app/controllers/devise/paranoid_verification_code_controller.rb +2 -0
- data/app/controllers/devise/password_expired_controller.rb +13 -6
- data/app/views/devise/paranoid_verification_code/show.html.erb +4 -4
- data/app/views/devise/password_expired/show.html.erb +6 -6
- data/config/locales/by.yml +49 -0
- data/config/locales/cs.yml +41 -0
- data/config/locales/de.yml +30 -7
- data/config/locales/en.yml +25 -1
- data/config/locales/es.yml +19 -6
- data/config/locales/fa.yml +41 -0
- data/config/locales/fr.yml +30 -0
- data/config/locales/hi.yml +42 -0
- data/config/locales/it.yml +35 -4
- data/config/locales/ja.yml +30 -0
- data/config/locales/nl.yml +41 -0
- data/config/locales/pt.yml +41 -0
- data/config/locales/ru.yml +49 -0
- data/config/locales/tr.yml +18 -0
- data/config/locales/uk.yml +49 -0
- data/config/locales/zh_CN.yml +41 -0
- data/config/locales/zh_TW.yml +41 -0
- data/lib/devise-security/controllers/helpers.rb +61 -50
- data/lib/devise-security/hooks/expirable.rb +3 -1
- data/lib/devise-security/hooks/paranoid_verification.rb +2 -0
- data/lib/devise-security/hooks/password_expirable.rb +4 -0
- data/lib/devise-security/hooks/session_limitable.rb +31 -14
- data/lib/devise-security/models/active_record/old_password.rb +5 -0
- data/lib/devise-security/models/compatibility/active_record_patch.rb +40 -0
- data/lib/devise-security/models/compatibility/mongoid_patch.rb +31 -0
- data/lib/devise-security/models/compatibility.rb +8 -15
- data/lib/devise-security/models/database_authenticatable_patch.rb +3 -1
- data/lib/devise-security/models/expirable.rb +8 -2
- data/lib/devise-security/models/mongoid/old_password.rb +21 -0
- data/lib/devise-security/models/paranoid_verification.rb +2 -0
- data/lib/devise-security/models/password_archivable.rb +18 -7
- data/lib/devise-security/models/password_expirable.rb +103 -48
- data/lib/devise-security/models/secure_validatable.rb +26 -6
- data/lib/devise-security/models/security_questionable.rb +2 -0
- data/lib/devise-security/models/session_limitable.rb +19 -2
- data/lib/devise-security/orm/mongoid.rb +7 -0
- data/lib/devise-security/patches/confirmations_controller_captcha.rb +2 -0
- data/lib/devise-security/patches/confirmations_controller_security_question.rb +2 -0
- data/lib/devise-security/patches/controller_captcha.rb +2 -0
- data/lib/devise-security/patches/controller_security_question.rb +3 -1
- data/lib/devise-security/patches/passwords_controller_captcha.rb +2 -0
- data/lib/devise-security/patches/passwords_controller_security_question.rb +2 -0
- data/lib/devise-security/patches/registrations_controller_captcha.rb +2 -0
- data/lib/devise-security/patches/sessions_controller_captcha.rb +2 -0
- data/lib/devise-security/patches/unlocks_controller_captcha.rb +2 -0
- data/lib/devise-security/patches/unlocks_controller_security_question.rb +2 -0
- data/lib/devise-security/patches.rb +2 -0
- data/lib/devise-security/rails.rb +2 -0
- data/lib/devise-security/routes.rb +2 -0
- data/lib/devise-security/validators/password_complexity_validator.rb +35 -0
- data/lib/devise-security/version.rb +3 -1
- data/lib/devise-security.rb +16 -10
- data/lib/generators/devise_security/install_generator.rb +5 -3
- data/lib/generators/templates/devise_security.rb +47 -0
- data/test/{test_captcha_controller.rb → controllers/test_captcha_controller.rb} +2 -0
- data/test/controllers/test_password_expired_controller.rb +110 -0
- data/test/controllers/test_security_question_controller.rb +60 -0
- data/test/dummy/Rakefile +3 -1
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/app/controllers/application_controller.rb +2 -0
- data/test/dummy/app/controllers/captcha/sessions_controller.rb +2 -0
- data/test/dummy/app/controllers/security_question/unlocks_controller.rb +2 -0
- data/test/dummy/app/controllers/widgets_controller.rb +6 -0
- data/test/dummy/app/models/application_record.rb +10 -2
- data/test/dummy/app/models/application_user_record.rb +11 -0
- data/test/dummy/app/models/captcha_user.rb +7 -2
- data/test/dummy/app/models/mongoid/confirmable_fields.rb +13 -0
- data/test/dummy/app/models/mongoid/database_authenticable_fields.rb +17 -0
- data/test/dummy/app/models/mongoid/expirable_fields.rb +11 -0
- data/test/dummy/app/models/mongoid/lockable_fields.rb +13 -0
- data/test/dummy/app/models/mongoid/mappings.rb +13 -0
- data/test/dummy/app/models/mongoid/omniauthable_fields.rb +11 -0
- data/test/dummy/app/models/mongoid/paranoid_verification_fields.rb +10 -0
- data/test/dummy/app/models/mongoid/password_archivable_fields.rb +9 -0
- data/test/dummy/app/models/mongoid/password_expirable_fields.rb +10 -0
- data/test/dummy/app/models/mongoid/recoverable_fields.rb +11 -0
- data/test/dummy/app/models/mongoid/registerable_fields.rb +19 -0
- data/test/dummy/app/models/mongoid/rememberable_fields.rb +10 -0
- data/test/dummy/app/models/mongoid/secure_validatable_fields.rb +11 -0
- data/test/dummy/app/models/mongoid/security_questionable_fields.rb +13 -0
- data/test/dummy/app/models/mongoid/session_limitable_fields.rb +10 -0
- data/test/dummy/app/models/mongoid/timeoutable_fields.rb +9 -0
- data/test/dummy/app/models/mongoid/trackable_fields.rb +14 -0
- data/test/dummy/app/models/mongoid/validatable_fields.rb +7 -0
- data/test/dummy/app/models/secure_user.rb +7 -1
- data/test/dummy/app/models/security_question_user.rb +9 -4
- data/test/dummy/app/models/user.rb +15 -0
- data/test/dummy/app/models/widget.rb +6 -0
- data/test/dummy/app/mongoid/admin.rb +31 -0
- data/test/dummy/app/mongoid/one_user.rb +58 -0
- data/test/dummy/app/mongoid/shim.rb +25 -0
- data/test/dummy/app/mongoid/user_on_engine.rb +41 -0
- data/test/dummy/app/mongoid/user_on_main_app.rb +41 -0
- data/test/dummy/app/mongoid/user_with_validations.rb +37 -0
- data/test/dummy/app/mongoid/user_without_email.rb +35 -0
- data/test/dummy/config/application.rb +13 -7
- data/test/dummy/config/boot.rb +2 -0
- data/test/dummy/config/environment.rb +2 -0
- data/test/dummy/config/environments/test.rb +5 -13
- data/test/dummy/config/initializers/devise.rb +10 -3
- data/test/dummy/config/initializers/migration_class.rb +3 -6
- data/test/dummy/config/mongoid.yml +6 -0
- data/test/dummy/config/routes.rb +6 -3
- data/test/dummy/config.ru +3 -1
- data/test/dummy/db/migrate/20120508165529_create_tables.rb +13 -2
- data/test/dummy/db/migrate/20150402165590_add_verification_columns.rb +2 -0
- data/test/dummy/db/migrate/20150407162345_add_verification_attempt_column.rb +2 -0
- data/test/dummy/db/migrate/20160320162345_add_security_questions_fields.rb +2 -0
- data/test/dummy/db/migrate/20180318103603_add_expireable_columns.rb +2 -0
- data/test/dummy/db/migrate/20180318105329_add_confirmable_columns.rb +2 -0
- data/test/dummy/db/migrate/20180318105732_add_rememberable_columns.rb +2 -0
- data/test/dummy/db/migrate/20180318111336_add_recoverable_columns.rb +2 -0
- data/test/dummy/db/migrate/20180319114023_add_widget.rb +2 -0
- data/test/dummy/lib/shared_expirable_columns.rb +14 -0
- data/test/dummy/lib/shared_security_questions_fields.rb +16 -0
- data/test/dummy/lib/shared_user.rb +32 -0
- data/test/dummy/lib/shared_user_with_password_verification.rb +13 -0
- data/test/dummy/lib/shared_user_without_email.rb +28 -0
- data/test/dummy/lib/shared_user_without_omniauth.rb +15 -0
- data/test/dummy/lib/shared_verification_fields.rb +15 -0
- data/test/dummy/log/development.log +883 -0
- data/test/dummy/log/test.log +21689 -0
- data/test/integration/test_password_expirable_workflow.rb +53 -0
- data/test/integration/test_session_limitable_workflow.rb +67 -0
- data/test/orm/active_record.rb +15 -0
- data/test/orm/mongoid.rb +13 -0
- data/test/support/integration_helpers.rb +29 -0
- data/test/support/mongoid.yml +6 -0
- data/test/test_compatibility.rb +13 -0
- data/test/test_complexity_validator.rb +72 -0
- data/test/test_helper.rb +42 -9
- data/test/test_install_generator.rb +19 -2
- data/test/test_paranoid_verification.rb +2 -0
- data/test/test_password_archivable.rb +8 -7
- data/test/test_password_expirable.rb +70 -7
- data/test/test_secure_validatable.rb +97 -21
- data/test/test_session_limitable.rb +57 -0
- data/{lib/generators/templates → test/tmp/config/initializers}/devise-security.rb +12 -3
- 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 +39 -0
- data/test/tmp/config/locales/devise.security_extension.en.yml +41 -0
- data/test/tmp/config/locales/devise.security_extension.es.yml +30 -0
- data/test/tmp/config/locales/devise.security_extension.fa.yml +41 -0
- data/test/tmp/config/locales/devise.security_extension.fr.yml +30 -0
- data/test/tmp/config/locales/devise.security_extension.hi.yml +42 -0
- data/test/tmp/config/locales/devise.security_extension.it.yml +41 -0
- data/test/tmp/config/locales/devise.security_extension.ja.yml +30 -0
- data/test/tmp/config/locales/devise.security_extension.nl.yml +41 -0
- data/test/tmp/config/locales/devise.security_extension.pt.yml +41 -0
- data/test/tmp/config/locales/devise.security_extension.ru.yml +49 -0
- data/test/tmp/config/locales/devise.security_extension.tr.yml +18 -0
- data/test/tmp/config/locales/devise.security_extension.uk.yml +49 -0
- data/test/tmp/config/locales/devise.security_extension.zh_CN.yml +41 -0
- data/test/tmp/config/locales/devise.security_extension.zh_TW.yml +41 -0
- metadata +235 -110
- data/.circleci/config.yml +0 -41
- data/.document +0 -5
- data/.gitignore +0 -40
- data/.rubocop.yml +0 -63
- data/.ruby-version +0 -1
- data/.travis.yml +0 -25
- data/Appraisals +0 -19
- data/Gemfile +0 -3
- data/Rakefile +0 -28
- data/devise-security.gemspec +0 -44
- data/gemfiles/rails_4.1_stable.gemfile +0 -8
- data/gemfiles/rails_4.2_stable.gemfile +0 -8
- data/gemfiles/rails_5.0_stable.gemfile +0 -8
- data/gemfiles/rails_5.1_stable.gemfile +0 -8
- data/gemfiles/rails_5.2_rc1.gemfile +0 -8
- data/lib/devise-security/models/old_password.rb +0 -4
- data/lib/devise-security/orm/active_record.rb +0 -18
- data/lib/devise-security/schema.rb +0 -64
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/test_password_expired_controller.rb +0 -44
- data/test/test_security_question_controller.rb +0 -84
@@ -1,22 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
require 'rails_email_validator'
|
3
5
|
|
4
6
|
class TestSecureValidatable < ActiveSupport::TestCase
|
5
|
-
class User <
|
7
|
+
class User < ApplicationRecord
|
6
8
|
devise :database_authenticatable, :password_archivable,
|
7
9
|
:paranoid_verification, :password_expirable, :secure_validatable
|
8
|
-
|
9
|
-
|
10
|
-
setup do
|
11
|
-
Devise.password_regex = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/
|
10
|
+
include ::Mongoid::Mappings if DEVISE_ORM == :mongoid
|
12
11
|
end
|
13
12
|
|
14
13
|
test 'email cannot be blank' do
|
15
14
|
msg = "Email can't be blank"
|
16
15
|
user = User.create password: 'passWord1', password_confirmation: 'passWord1'
|
16
|
+
|
17
17
|
assert_equal(false, user.valid?)
|
18
18
|
assert_equal([msg], user.errors.full_messages)
|
19
|
-
assert_raises(
|
19
|
+
assert_raises(ORMInvalidRecordException) do
|
20
20
|
user.save!
|
21
21
|
end
|
22
22
|
end
|
@@ -26,49 +26,49 @@ class TestSecureValidatable < ActiveSupport::TestCase
|
|
26
26
|
user = User.create email: 'bob', password: 'passWord1', password_confirmation: 'passWord1'
|
27
27
|
assert_equal(false, user.valid?)
|
28
28
|
assert_equal([msg], user.errors.full_messages)
|
29
|
-
assert_raises(
|
29
|
+
assert_raises(ORMInvalidRecordException) do
|
30
30
|
user.save!
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
test '
|
35
|
-
msgs = ['Email is invalid', 'Password must contain
|
36
|
-
user = User.create email: 'bob
|
34
|
+
test 'validate both email and password' do
|
35
|
+
msgs = ['Email is invalid', 'Password must contain at least one upper-case letter']
|
36
|
+
user = User.create email: 'bob@@foo.tv', password: 'password1', password_confirmation: 'password1'
|
37
37
|
assert_equal(false, user.valid?)
|
38
38
|
assert_equal(msgs, user.errors.full_messages)
|
39
|
-
assert_raises(
|
39
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
40
40
|
end
|
41
41
|
|
42
42
|
test 'password must have capital letter' do
|
43
|
-
msgs = ['
|
44
|
-
user = User.create email: 'bob@
|
43
|
+
msgs = ['Password must contain at least one upper-case letter']
|
44
|
+
user = User.create email: 'bob@microsoft.com', password: 'password1', password_confirmation: 'password1'
|
45
45
|
assert_equal(false, user.valid?)
|
46
46
|
assert_equal(msgs, user.errors.full_messages)
|
47
|
-
assert_raises(
|
47
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
48
48
|
end
|
49
49
|
|
50
50
|
test 'password must have lowercase letter' do
|
51
|
-
msg = 'Password must contain
|
51
|
+
msg = 'Password must contain at least one lower-case letter'
|
52
52
|
user = User.create email: 'bob@microsoft.com', password: 'PASSWORD1', password_confirmation: 'PASSWORD1'
|
53
53
|
assert_equal(false, user.valid?)
|
54
54
|
assert_equal([msg], user.errors.full_messages)
|
55
|
-
assert_raises(
|
55
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
56
56
|
end
|
57
57
|
|
58
58
|
test 'password must have number' do
|
59
|
-
msg = 'Password must contain
|
59
|
+
msg = 'Password must contain at least one digit'
|
60
60
|
user = User.create email: 'bob@microsoft.com', password: 'PASSword', password_confirmation: 'PASSword'
|
61
61
|
assert_equal(false, user.valid?)
|
62
62
|
assert_equal([msg], user.errors.full_messages)
|
63
|
-
assert_raises(
|
63
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
64
64
|
end
|
65
65
|
|
66
66
|
test 'password must have minimum length' do
|
67
|
-
msg = 'Password is too short (minimum is
|
67
|
+
msg = 'Password is too short (minimum is 7 characters)'
|
68
68
|
user = User.create email: 'bob@microsoft.com', password: 'Pa3zZ', password_confirmation: 'Pa3zZ'
|
69
69
|
assert_equal(false, user.valid?)
|
70
70
|
assert_equal([msg], user.errors.full_messages)
|
71
|
-
assert_raises(
|
71
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
72
72
|
end
|
73
73
|
|
74
74
|
test 'duplicate email validation message is added only once' do
|
@@ -80,6 +80,82 @@ class TestSecureValidatable < ActiveSupport::TestCase
|
|
80
80
|
SecureUser.create!(options)
|
81
81
|
user = SecureUser.new(options)
|
82
82
|
refute user.valid?
|
83
|
-
assert_equal ['Email has already been taken'], user.errors.full_messages
|
83
|
+
assert_equal DEVISE_ORM == :active_record ? ['Email has already been taken'] : ['Email is already taken'], user.errors.full_messages
|
84
|
+
end
|
85
|
+
|
86
|
+
test 'password can not equal email for new user' do
|
87
|
+
msg = 'Password must be different than the email.'
|
88
|
+
user = User.create email: 'bob@microsoft.com', password: 'bob@microsoft.com', password_confirmation: 'bob@microsoft.com'
|
89
|
+
refute user.valid?
|
90
|
+
assert_includes(user.errors.full_messages, msg)
|
91
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
92
|
+
end
|
93
|
+
|
94
|
+
test 'password can not equal case sensitive version of email for new user' do
|
95
|
+
msg = 'Password must be different than the email.'
|
96
|
+
user = User.create email: 'bob@microsoft.com', password: 'BoB@microsoft.com', password_confirmation: 'BoB@microsoft.com'
|
97
|
+
refute user.valid?
|
98
|
+
assert_includes(user.errors.full_messages, msg)
|
99
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
100
|
+
end
|
101
|
+
|
102
|
+
test 'password can not equal email with spaces for new user' do
|
103
|
+
msg = 'Password must be different than the email.'
|
104
|
+
user = User.create email: 'bob@microsoft.com', password: 'bob@microsoft.com ', password_confirmation: 'bob@microsoft.com '
|
105
|
+
refute user.valid?
|
106
|
+
assert_includes(user.errors.full_messages, msg)
|
107
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
108
|
+
end
|
109
|
+
|
110
|
+
test 'password can not equal case sensitive version of email with spaces for new user' do
|
111
|
+
msg = 'Password must be different than the email.'
|
112
|
+
user = User.create email: 'bob@microsoft.com', password: ' BoB@microsoft.com ', password_confirmation: ' BoB@microsoft.com '
|
113
|
+
refute user.valid?
|
114
|
+
assert_includes(user.errors.full_messages, msg)
|
115
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
116
|
+
end
|
117
|
+
|
118
|
+
test 'password can not equal email for existing user' do
|
119
|
+
user = User.create email: 'bob@microsoft.com', password: 'pAs5W0rd!Is5e6Ure', password_confirmation: 'pAs5W0rd!Is5e6Ure'
|
120
|
+
|
121
|
+
msg = 'Password must be different than the email.'
|
122
|
+
user.password = 'bob@microsoft.com'
|
123
|
+
user.password_confirmation = 'bob@microsoft.com'
|
124
|
+
refute user.valid?
|
125
|
+
assert_includes(user.errors.full_messages, msg)
|
126
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
127
|
+
end
|
128
|
+
|
129
|
+
test 'password can not equal case sensitive version of email for existing user' do
|
130
|
+
user = User.create email: 'bob@microsoft.com', password: 'pAs5W0rd!Is5e6Ure', password_confirmation: 'pAs5W0rd!Is5e6Ure'
|
131
|
+
|
132
|
+
msg = 'Password must be different than the email.'
|
133
|
+
user.password = 'BoB@microsoft.com'
|
134
|
+
user.password_confirmation = 'BoB@microsoft.com'
|
135
|
+
refute user.valid?
|
136
|
+
assert_includes(user.errors.full_messages, msg)
|
137
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
138
|
+
end
|
139
|
+
|
140
|
+
test 'password can not equal email with spaces for existing user' do
|
141
|
+
user = User.create email: 'bob@microsoft.com', password: 'pAs5W0rd!Is5e6Ure', password_confirmation: 'pAs5W0rd!Is5e6Ure'
|
142
|
+
|
143
|
+
msg = 'Password must be different than the email.'
|
144
|
+
user.password = 'bob@microsoft.com '
|
145
|
+
user.password_confirmation = 'bob@microsoft.com '
|
146
|
+
refute user.valid?
|
147
|
+
assert_includes(user.errors.full_messages, msg)
|
148
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
149
|
+
end
|
150
|
+
|
151
|
+
test 'password can not equal case sensitive version of email with spaces for existing user' do
|
152
|
+
user = User.create email: 'bob@microsoft.com', password: 'pAs5W0rd!Is5e6Ure', password_confirmation: 'pAs5W0rd!Is5e6Ure'
|
153
|
+
|
154
|
+
msg = 'Password must be different than the email.'
|
155
|
+
user.password = ' BoB@microsoft.com '
|
156
|
+
user.password_confirmation = ' BoB@microsoft.com '
|
157
|
+
refute user.valid?
|
158
|
+
assert_includes(user.errors.full_messages, msg)
|
159
|
+
assert_raises(ORMInvalidRecordException) { user.save! }
|
84
160
|
end
|
85
161
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class TestSessionLimitable < ActiveSupport::TestCase
|
6
|
+
class ModifiedUser < User
|
7
|
+
def skip_session_limitable?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
test 'check is not skipped by default' do
|
13
|
+
user = User.create email: 'bob@microsoft.com', password: 'password1', password_confirmation: 'password1'
|
14
|
+
assert_equal(false, user.skip_session_limitable?)
|
15
|
+
end
|
16
|
+
|
17
|
+
test 'default check can be overridden by record instance' do
|
18
|
+
modified_user = ModifiedUser.create email: 'bob2@microsoft.com', password: 'password1', password_confirmation: 'password1'
|
19
|
+
assert_equal(true, modified_user.skip_session_limitable?)
|
20
|
+
end
|
21
|
+
|
22
|
+
class SessionLimitableUser < User
|
23
|
+
devise :session_limitable
|
24
|
+
include ::Mongoid::Mappings if DEVISE_ORM == :mongoid
|
25
|
+
end
|
26
|
+
|
27
|
+
test 'includes Devise::Models::Compatibility' do
|
28
|
+
assert_kind_of(Devise::Models::Compatibility, SessionLimitableUser.new)
|
29
|
+
end
|
30
|
+
|
31
|
+
test '#update_unique_session_id!(value) updates valid record' do
|
32
|
+
user = User.create! password: 'passWord1', password_confirmation: 'passWord1', email: 'bob@microsoft.com'
|
33
|
+
assert user.persisted?
|
34
|
+
assert_nil user.unique_session_id
|
35
|
+
user.update_unique_session_id!('unique_value')
|
36
|
+
user.reload
|
37
|
+
assert_equal user.unique_session_id, 'unique_value'
|
38
|
+
end
|
39
|
+
|
40
|
+
test '#update_unique_session_id!(value) updates invalid record atomically' do
|
41
|
+
user = User.create! password: 'passWord1', password_confirmation: 'passWord1', email: 'bob@microsoft.com'
|
42
|
+
assert user.persisted?
|
43
|
+
user.email = ''
|
44
|
+
assert user.invalid?
|
45
|
+
assert_nil user.unique_session_id
|
46
|
+
user.update_unique_session_id!('unique_value')
|
47
|
+
user.reload
|
48
|
+
assert_equal user.email, 'bob@microsoft.com'
|
49
|
+
assert_equal user.unique_session_id, 'unique_value'
|
50
|
+
end
|
51
|
+
|
52
|
+
test '#update_unique_session_id!(value) raises an exception on an unpersisted record' do
|
53
|
+
user = User.create
|
54
|
+
assert !user.persisted?
|
55
|
+
assert_raises(Devise::Models::Compatibility::NotPersistedError) { user.update_unique_session_id!('unique_value') }
|
56
|
+
end
|
57
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Devise.setup do |config|
|
2
4
|
# ==> Security Extension
|
3
5
|
# Configure security extension for devise
|
@@ -6,16 +8,20 @@ Devise.setup do |config|
|
|
6
8
|
# config.expire_password_after = false
|
7
9
|
|
8
10
|
# Need 1 char of A-Z, a-z and 0-9
|
9
|
-
# config.
|
11
|
+
# config.password_complexity = { digit: 1, lower: 1, symbol: 1, upper: 1 }
|
10
12
|
|
11
13
|
# How many passwords to keep in archive
|
12
14
|
# config.password_archiving_count = 5
|
13
15
|
|
14
|
-
# Deny old
|
16
|
+
# Deny old passwords (true, false, number_of_old_passwords_to_check)
|
17
|
+
# Examples:
|
18
|
+
# config.deny_old_passwords = false # allow old passwords
|
19
|
+
# config.deny_old_passwords = true # will deny all the old passwords
|
20
|
+
# config.deny_old_passwords = 3 # will deny new passwords that matches with the last 3 passwords
|
15
21
|
# config.deny_old_passwords = true
|
16
22
|
|
17
23
|
# enable email validation for :secure_validatable. (true, false, validation_options)
|
18
|
-
# dependency:
|
24
|
+
# dependency: see https://github.com/devise-security/devise-security/blob/master/README.md#e-mail-validation
|
19
25
|
# config.email_validation = true
|
20
26
|
|
21
27
|
# captcha integration for recover form
|
@@ -35,4 +41,7 @@ Devise.setup do |config|
|
|
35
41
|
|
36
42
|
# Time period for account expiry from last_activity_at
|
37
43
|
# config.expire_after = 90.days
|
44
|
+
|
45
|
+
# Allow password to equal the email
|
46
|
+
# config.allow_passwords_equal_to_email = false
|
38
47
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
by:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken_in_past: 'ужо раней выкарыстоўваўся.'
|
5
|
+
equal_to_current_password: 'павінен адрознівацца ад сучаснага пароля.'
|
6
|
+
equal_to_email: 'павінна адрознівацца ад электроннай пошты.'
|
7
|
+
password_complexity:
|
8
|
+
digit:
|
9
|
+
one: 'павінен утрымліваць хоць адну лічбу'
|
10
|
+
few: 'павінен утрымліваць хоць %{count} лічбы'
|
11
|
+
many: 'павінен утрымліваць хоць %{count} лічбы'
|
12
|
+
other: 'павінен утрымліваць хоць %{count} лічбы'
|
13
|
+
lower:
|
14
|
+
one: 'павінен утрымліваць хоць адну маленькую літару'
|
15
|
+
few: 'павінен утрымліваць хоць %{count} малыx літары'
|
16
|
+
many: 'павінен утрымліваць хоць %{count} малыx літары'
|
17
|
+
other: 'павінен утрымліваць хоць %{count} малыx літары'
|
18
|
+
symbol:
|
19
|
+
one: 'павінен утрымліваць хоць адзін знак пунктуацыі або сімвал'
|
20
|
+
few: 'павінен утрымліваць хоць %{count} знака пунктуацыі або сімвала'
|
21
|
+
many: 'павінен утрымліваць хоць %{count} знака пунктуацыі або сімвала'
|
22
|
+
other: 'павінен утрымліваць хоць %{count} знака пунктуацыі або сімвала'
|
23
|
+
upper:
|
24
|
+
one: 'павінен утрымліваць хоць адну вялікую літару'
|
25
|
+
few: 'павінен утрымліваць хоць %{count} вялікіx літары'
|
26
|
+
many: 'павінен утрымліваць хоць %{count} вялікіx літары'
|
27
|
+
other: 'павінен утрымліваць хоць %{count} вялікіx літары'
|
28
|
+
devise:
|
29
|
+
invalid_captcha: 'Уведзены няправільны код капчы.'
|
30
|
+
invalid_security_question: 'Адказ на сакрэтнае пытанне быў няправільны.'
|
31
|
+
paranoid_verify:
|
32
|
+
code_required: 'Калі ласка, увядзіце код, атрыманы ад нашай каманды падтрымкі'
|
33
|
+
paranoid_verification_code:
|
34
|
+
show:
|
35
|
+
submit_verification_code: 'Увод кода пацверджання'
|
36
|
+
verification_code: 'Код пацверджання'
|
37
|
+
submit: 'Адправіць'
|
38
|
+
password_expired:
|
39
|
+
updated: 'Ваш новы пароль захаваны.'
|
40
|
+
change_required: 'Ваш пароль састарэў. Калі ласка, усталюйце новы.'
|
41
|
+
show:
|
42
|
+
renew_your_password: 'Змена пароля'
|
43
|
+
current_password: 'Сучасны пароль'
|
44
|
+
new_password: 'Новы пароль'
|
45
|
+
new_password_confirmation: 'Пацвердзіце новы пароль'
|
46
|
+
change_my_password: 'Змяніць пароль'
|
47
|
+
failure:
|
48
|
+
session_limited: 'Вашы параметры ўваходу выкарыстоўваюцца ў іншым браўзэры. Калі ласка, аўтарызуйцеся зноў, каб працягнуць у гэтым браўзэры.'
|
49
|
+
expired: 'Ваш уліковы запіс састарэў з-за неактыўнасці. Калі ласка, звяжыцеся з адміністратарам.'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
cs:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken_in_past: bylo již použito v minulosti.
|
5
|
+
equal_to_current_password: se musí lišit od aktuálního hesla.
|
6
|
+
equal_to_email: musí být jiný než e-mail.
|
7
|
+
password_complexity:
|
8
|
+
digit:
|
9
|
+
one: musí obsahovat alespoň jednu číslici
|
10
|
+
other: musí obsahovat alespoň %{count} číslice
|
11
|
+
lower:
|
12
|
+
one: musí obsahovat alespoň jedno malé písmeno
|
13
|
+
other: musí obsahovat alespoň %{count} malé písmena
|
14
|
+
symbol:
|
15
|
+
one: musí obsahovat alespoň jedno interpunkční znaménko nebo symbol
|
16
|
+
other: musí obsahovat alespoň %{count} interpunkční znaménka nebo symboly
|
17
|
+
upper:
|
18
|
+
one: musí obsahovat alespoň jedno velké písmeno
|
19
|
+
other: musí obsahovat alespoň %{count} velké písmena
|
20
|
+
devise:
|
21
|
+
invalid_captcha: Chybná captcha.
|
22
|
+
invalid_security_question: Chybná odpověď na bezpečnostní otázku.
|
23
|
+
paranoid_verify:
|
24
|
+
code_required: Zadejte kód, který poskytla naše podpora
|
25
|
+
paranoid_verification_code:
|
26
|
+
show:
|
27
|
+
submit_verification_code: Odeslat ověřovací kód
|
28
|
+
verification_code: Ověřovací kód
|
29
|
+
submit: Odeslat
|
30
|
+
password_expired:
|
31
|
+
updated: Vaše nové heslo bylo uloženo.
|
32
|
+
change_required: Platnost Vašeho hesla vypršela. Prosím, obnovte si jej.
|
33
|
+
show:
|
34
|
+
renew_your_password: Obnovit heslo
|
35
|
+
current_password: Současné heslo
|
36
|
+
new_password: Nové heslo
|
37
|
+
new_password_confirmation: Potvrďte nové heslo
|
38
|
+
change_my_password: Změnit moje heslo
|
39
|
+
failure:
|
40
|
+
session_limited: Vaše přihlašovací údaje byly použity v jiném prohlížeči. Chcete-li pokračovat v tomto prohlížeči, znovu se přihlaste.
|
41
|
+
expired: Platnost Vašeho účtu vypršela z důvodu nečinnosti. Obraťte se na správce webu.
|
@@ -0,0 +1,39 @@
|
|
1
|
+
de:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken_in_past: 'wurde bereits in der Vergangenheit verwendet.'
|
5
|
+
equal_to_current_password: 'darf nicht dem aktuellen Passwort entsprechen.'
|
6
|
+
equal_to_email: 'darf nicht dem E-mail entsprechen.'
|
7
|
+
password_complexity:
|
8
|
+
digit:
|
9
|
+
one: muss mindestens eine Ziffer enthalten
|
10
|
+
other: muss mindestens %{count} Ziffern enthalten
|
11
|
+
lower:
|
12
|
+
one: muss mindestens einen Kleinbuchstaben enthalten
|
13
|
+
other: muss mindestens %{count} Kleinbuchstaben enthalten
|
14
|
+
symbol:
|
15
|
+
one: muss mindestens ein Sonderzeichen enthalten
|
16
|
+
other: muss mindestens %{count} Sonderzeichen enthalten
|
17
|
+
upper:
|
18
|
+
one: muss mindestens einen Großbuchstaben enthalten
|
19
|
+
other: muss mindestens %{count} Großbuchstaben enthalten
|
20
|
+
devise:
|
21
|
+
invalid_captcha: 'Die Captcha-Eingabe ist nicht gültig.'
|
22
|
+
paranoid_verify:
|
23
|
+
code_required: 'Bitte geben Sie den Code ein, den unser Support-Team zur Verfügung gestellt hat.'
|
24
|
+
show:
|
25
|
+
submit_verification_code: Bestätigungscode eingeben
|
26
|
+
verification_code: Bestätigungscode
|
27
|
+
submit: Bestätigen
|
28
|
+
password_expired:
|
29
|
+
updated: 'Das neue Passwort wurde übernommen.'
|
30
|
+
change_required: 'Ihr Passwort ist abgelaufen. Bitte vergeben Sie ein neues Passwort.'
|
31
|
+
show:
|
32
|
+
renew_your_password: Vergeben Sie ein neues Passwort
|
33
|
+
current_password: Aktuelles Passwort
|
34
|
+
new_password: Neues Passwort
|
35
|
+
new_password_confirmation: Passwort bestätigen
|
36
|
+
change_my_password: Passwort ändern
|
37
|
+
failure:
|
38
|
+
session_limited: 'Ihre Anmeldedaten wurden in einem anderen Browser genutzt. Bitte melden Sie sich erneut an, um in diesem Browser fortzufahren.'
|
39
|
+
expired: 'Ihr Account ist aufgrund zu langer Inaktivität abgelaufen. Bitte kontaktieren Sie den Administrator.'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
en:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken_in_past: 'was used previously.'
|
5
|
+
equal_to_current_password: 'must be different than the current password.'
|
6
|
+
equal_to_email: 'must be different than the email.'
|
7
|
+
password_complexity:
|
8
|
+
digit:
|
9
|
+
one: must contain at least one digit
|
10
|
+
other: must contain at least %{count} numerals
|
11
|
+
lower:
|
12
|
+
one: must contain at least one lower-case letter
|
13
|
+
other: must contain at least %{count} lower-case letters
|
14
|
+
symbol:
|
15
|
+
one: must contain at least one punctuation mark or symbol
|
16
|
+
other: must contain at least %{count} punctuation marks or symbols
|
17
|
+
upper:
|
18
|
+
one: must contain at least one upper-case letter
|
19
|
+
other: must contain at least %{count} upper-case letters
|
20
|
+
devise:
|
21
|
+
invalid_captcha: 'The captcha input was invalid.'
|
22
|
+
invalid_security_question: 'The security question answer was invalid.'
|
23
|
+
paranoid_verify:
|
24
|
+
code_required: 'Please enter the code our support team provided'
|
25
|
+
paranoid_verification_code:
|
26
|
+
show:
|
27
|
+
submit_verification_code: Submit verification code
|
28
|
+
verification_code: Verification code
|
29
|
+
submit: Submit
|
30
|
+
password_expired:
|
31
|
+
updated: 'Your new password is saved.'
|
32
|
+
change_required: 'Your password is expired. Please renew your password.'
|
33
|
+
show:
|
34
|
+
renew_your_password: Renew your password
|
35
|
+
current_password: Current password
|
36
|
+
new_password: New password
|
37
|
+
new_password_confirmation: Confirm new password
|
38
|
+
change_my_password: Change my password
|
39
|
+
failure:
|
40
|
+
session_limited: 'Your login credentials were used in another browser. Please sign in again to continue in this browser.'
|
41
|
+
expired: 'Your account has expired due to inactivity. Please contact the site administrator.'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
es:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken_in_past: 'la contraseña fue usada previamente, por favor elige otra.'
|
5
|
+
equal_to_current_password: 'tiene que ser diferente a la contraseña actual.'
|
6
|
+
equal_to_email: 'tiene que ser diferente al email'
|
7
|
+
password_complexity:
|
8
|
+
digit:
|
9
|
+
one: tiene que contener al menos un dígito
|
10
|
+
other: tiene que contener al menos %{count} dígitos
|
11
|
+
lower:
|
12
|
+
one: tiene que contener al menos una minúscula
|
13
|
+
other: tiene que contener al menos %{count} minúsculas
|
14
|
+
symbol:
|
15
|
+
one: tiene que contener al menos un signo de puntuación
|
16
|
+
other: tiene que contener al menos %{count} signos de puntuación
|
17
|
+
upper:
|
18
|
+
one: tiene que contener al menos una mayúscula
|
19
|
+
other: tiene que contener al menos %{count} mayúsculas
|
20
|
+
devise:
|
21
|
+
invalid_captcha: 'El captcha ingresado es inválido.'
|
22
|
+
invalid_security_question: 'La respuesta a la pregunta de seguridad fue incorrecta.'
|
23
|
+
paranoid_verify:
|
24
|
+
code_required: 'Por favor ingrese el código provisto por nuestro equipo de soporte'
|
25
|
+
password_expired:
|
26
|
+
updated: 'Su nueva contraseña ha sido guardada.'
|
27
|
+
change_required: 'Su contraseña ha expirado. Por favor renueve su contraseña.'
|
28
|
+
failure:
|
29
|
+
session_limited: 'Sus credenciales de inicio de sesión fueron usadas en otro navegador. Por favor inicie sesión nuevamente para continuar en este navegador.'
|
30
|
+
expired: 'Su cuenta ha expirado debido a inactividad. Por favor contacte al administrador de la aplicación.'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
fa:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken_in_past: 'قبلا استفاده شده است'
|
5
|
+
equal_to_current_password: 'باید متفاوت با رمز عبور فعلی باشد'
|
6
|
+
equal_to_email: 'باید متفاوت از ایمیل باشد'
|
7
|
+
password_complexity:
|
8
|
+
digit:
|
9
|
+
one: باید حداقل یک رقم داشته باشد
|
10
|
+
other: باید حداقل %{count} عدد داشته باشد
|
11
|
+
lower:
|
12
|
+
one: باید حداقل شامل یک حرف کوچک باشد
|
13
|
+
other: باید حداقل %{count} حروف کوچک داشته باشد
|
14
|
+
symbol:
|
15
|
+
one: باید حداقل دارای یک علامت یا کارکتر خاص باشد
|
16
|
+
other: باید حداقل دارای %{count} علائم یا کارکتر های خاص باشد
|
17
|
+
upper:
|
18
|
+
one: باید حداقل یک حرف بزرگ داشته باشد
|
19
|
+
other: باید حداقل %{count} حروف بزرگ داشته باشد
|
20
|
+
devise:
|
21
|
+
invalid_captcha: 'اطلاعات وارد شده در کپچا نامعتبر بود'
|
22
|
+
invalid_security_question: 'پاسخ سوال امنیتی نامعتبر بود'
|
23
|
+
paranoid_verify:
|
24
|
+
code_required: 'لطفاً کدی را که تیم پشتیبانی ما ارائه کرده است وارد کنید'
|
25
|
+
paranoid_verification_code:
|
26
|
+
show:
|
27
|
+
submit_verification_code: ارسال کد تاییدیه
|
28
|
+
verification_code: کد تاییدیه
|
29
|
+
submit: ارسال
|
30
|
+
password_expired:
|
31
|
+
updated: 'رمز جدید شما ذخیره شده است'
|
32
|
+
change_required: 'رمز عبور شما منقضی شده است ،لطفاً رمز خود را تمدید کنید'
|
33
|
+
show:
|
34
|
+
renew_your_password: ساختن رمز عبور جدید
|
35
|
+
current_password: رمز عبور جاری
|
36
|
+
new_password: رمز عبور جدید
|
37
|
+
new_password_confirmation: تکرار رمز جدید
|
38
|
+
change_my_password: تغییر رمز عبور
|
39
|
+
failure:
|
40
|
+
session_limited: 'از اطلاعات ورود شما در مرورگر دیگری استفاده شده است، برای ادامه در این مرورگر لطفاً دوباره وارد سیستم شوید'
|
41
|
+
expired: 'حساب شما به دلیل عدم فعالیت منقضی شده است، لطفاً با مدیر سایت تماس بگیرید.'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
fr:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken_in_past: a été utilisé trop récemment. Veuillez en choisir un autre
|
5
|
+
equal_to_current_password: doit être différent de l'actuel
|
6
|
+
equal_to_email: doit être différent de l'e-mail
|
7
|
+
password_complexity:
|
8
|
+
digit:
|
9
|
+
one: doit contenir au moins un chiffre
|
10
|
+
other: doit contenir au moins %{count} chiffres
|
11
|
+
lower:
|
12
|
+
one: doit contenir au moins une lettre miniscule
|
13
|
+
other: doit contenir au moins %{count} lettres miniscules
|
14
|
+
symbol:
|
15
|
+
one: doit contenir au moins un signe de ponctuation
|
16
|
+
other: doit contenir au moins %{count} signes de ponctuation
|
17
|
+
upper:
|
18
|
+
one: doit contenir au moins une lettre majuscule
|
19
|
+
other: doit contenir au moins %{count} lettres majuscules
|
20
|
+
devise:
|
21
|
+
invalid_captcha: Le captcha n'est pas valide
|
22
|
+
invalid_security_question: La réponse à la question de sécurité est invalide
|
23
|
+
paranoid_verify:
|
24
|
+
code_required: Veuillez entrer le code fourni par notre équipe de support
|
25
|
+
password_expired:
|
26
|
+
updated: Votre nouveau mot de passe est enregistré
|
27
|
+
change_required: Votre mot de passe a expiré. Veuillez en choisir un autre
|
28
|
+
failure:
|
29
|
+
session_limited: Vos identifiants de connexion ont été utilisés dans un autre navigateur. Veuillez vous reconnecter pour continuer dans ce navigateur
|
30
|
+
expired: Votre compte a expiré pour cause d'inactivité. Veuillez contacter l'administrateur du site
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
hi:
|
3
|
+
errors:
|
4
|
+
messages:
|
5
|
+
taken_in_past: यह पासवर्ड, आपके द्वारा पूर्व मे प्रयोग किया जा चुका है
|
6
|
+
equal_to_current_password: नया पासवर्ड, वर्तमान पासवर्ड से भिन्न होना चाहिए
|
7
|
+
equal_to_email: ईमेल से अलग होना चाहिए
|
8
|
+
password_complexity:
|
9
|
+
digit:
|
10
|
+
one: एक अंक होना चाहिए
|
11
|
+
other: कम से कम %{count} अंक होने चाहिए
|
12
|
+
lower:
|
13
|
+
one: एक लोअर-केस अक्षर होना चाहिए
|
14
|
+
other: कम से कम %{count} अक्षर होने चाहिए
|
15
|
+
symbol:
|
16
|
+
one: एक चिन्ह होना चाहिए
|
17
|
+
other: कम से कम %{count} चिन्ह होने चाहिए
|
18
|
+
upper:
|
19
|
+
one: एक अपर-केस अक्षर होना चाहिए
|
20
|
+
other: कम से कम %{count} अपर-केस अक्षर होने चाहिए
|
21
|
+
devise:
|
22
|
+
invalid_captcha: अमान्य कॅप्टचा
|
23
|
+
invalid_security_question: अमान्य सुरक्षा उत्तर
|
24
|
+
paranoid_verify:
|
25
|
+
code_required: सपोर्ट टीम द्वारा दिया गया कोड डाले
|
26
|
+
paranoid_verification_code:
|
27
|
+
show:
|
28
|
+
submit_verification_code: वेरिफिकेशन कोड डाले
|
29
|
+
verification_code: वेरिफिकेशन कोड
|
30
|
+
submit: सबमिट
|
31
|
+
password_expired:
|
32
|
+
updated: पासवर्ड अद्यतन किया गया
|
33
|
+
change_required: पासवर्ड अमान्य हो चुका, पासवर्ड बदले
|
34
|
+
show:
|
35
|
+
renew_your_password: पासवर्ड बदले
|
36
|
+
current_password: वर्तमान पासवर्ड
|
37
|
+
new_password: नया पासवर्ड
|
38
|
+
new_password_confirmation: नए पासवर्ड की पुष्टि करें
|
39
|
+
change_my_password: पासवर्ड बदले
|
40
|
+
failure:
|
41
|
+
session_limited: जानकारी, दूसरे ब्राउज़र में उपयोग की गयी थी जारी रखने फिर से साइन-इन करे
|
42
|
+
expired: कोई गतिविधि न होने के कारण खाता बंद हो गया, सिस्टम व्यवस्थापक से संपर्क करें
|
@@ -0,0 +1,41 @@
|
|
1
|
+
it:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
taken_in_past: "è stata gia' utilizzata in passato!"
|
5
|
+
equal_to_current_password: " deve essere differente dalla password corrente!"
|
6
|
+
equal_to_email: "deve essere differente dall'email"
|
7
|
+
password_complexity:
|
8
|
+
digit:
|
9
|
+
one: deve contenere almeno una cifra
|
10
|
+
other: deve contenere almeno %{count} cifre
|
11
|
+
lower:
|
12
|
+
one: deve contenere almeno una lettera minuscola
|
13
|
+
other: deve contenere almeno %{count} lettere minuscole
|
14
|
+
symbol:
|
15
|
+
one: deve contenere almeno un simbolo di punteggiatura o un simbolo speciale
|
16
|
+
other: deve contenere almeno %{count} tra simboli di punteggiatura e simboli speciali
|
17
|
+
upper:
|
18
|
+
one: deve contenere almeno una lettera maiuscola
|
19
|
+
other: deve contenere almeno %{count} lettere maiuscole
|
20
|
+
devise:
|
21
|
+
invalid_captcha: "Il captcha inserito non è valido!"
|
22
|
+
invalid_security_question: 'La risposta alla domanda di sicurezza non è valida.'
|
23
|
+
paranoid_verify:
|
24
|
+
code_required: 'Inserisci il codice fornito dal nostro team di supporto'
|
25
|
+
paranoid_verification_code:
|
26
|
+
show:
|
27
|
+
submit_verification_code: Invia codice di verifica
|
28
|
+
verification_code: Codice di verifica
|
29
|
+
submit: Invia
|
30
|
+
password_expired:
|
31
|
+
updated: "La tua nuova password è stata salvata."
|
32
|
+
change_required: "La tua password è scaduta. Si prega di rinnovarla!"
|
33
|
+
show:
|
34
|
+
renew_your_password: Rinnova la tua password
|
35
|
+
current_password: Password attuale
|
36
|
+
new_password: Nuova password
|
37
|
+
new_password_confirmation: Conferma nuova password
|
38
|
+
change_my_password: Cambia la mia password
|
39
|
+
failure:
|
40
|
+
session_limited: "Hai effettuato l accesso in un altro browser. Fai nuovamente l accesso per connetterti in questo."
|
41
|
+
expired: 'Il tuo account è stato bloccato per inattività. Contatta l amministratore del sito.'
|