devise-security 0.14.2 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +125 -59
- data/app/controllers/devise/paranoid_verification_code_controller.rb +13 -1
- data/app/controllers/devise/password_expired_controller.rb +24 -6
- 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 +41 -0
- data/config/locales/by.yml +49 -0
- data/config/locales/cs.yml +41 -0
- data/config/locales/de.yml +15 -2
- data/config/locales/en.yml +15 -2
- data/config/locales/es.yml +10 -9
- data/config/locales/fa.yml +41 -0
- data/config/locales/fr.yml +1 -0
- data/config/locales/hi.yml +42 -0
- data/config/locales/it.yml +35 -4
- data/config/locales/ja.yml +2 -1
- 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 +1 -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 +59 -50
- data/lib/devise-security/hooks/password_expirable.rb +2 -0
- data/lib/devise-security/hooks/session_limitable.rb +21 -11
- data/lib/devise-security/models/database_authenticatable_patch.rb +15 -5
- data/lib/devise-security/models/password_archivable.rb +2 -2
- data/lib/devise-security/models/password_expirable.rb +5 -1
- data/lib/devise-security/models/secure_validatable.rb +56 -6
- data/lib/devise-security/models/session_limitable.rb +10 -1
- data/lib/devise-security/validators/password_complexity_validator.rb +53 -24
- data/lib/devise-security/version.rb +1 -1
- data/lib/devise-security.rb +13 -5
- data/lib/generators/devise_security/install_generator.rb +3 -3
- data/lib/generators/templates/{devise-security.rb → devise_security.rb} +6 -1
- data/test/controllers/test_paranoid_verification_code_controller.rb +68 -0
- data/test/controllers/test_password_expired_controller.rb +121 -19
- data/test/controllers/test_security_question_controller.rb +16 -40
- 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 +7 -0
- data/test/dummy/app/controllers/widgets_controller.rb +3 -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 +1 -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 +3 -3
- data/test/dummy/config/application.rb +4 -4
- data/test/dummy/config/boot.rb +1 -1
- data/test/dummy/config/environment.rb +1 -1
- data/test/dummy/config/environments/test.rb +3 -13
- 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 +5 -3
- data/test/dummy/db/migrate/20120508165529_create_tables.rb +3 -3
- 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_email.rb +2 -1
- data/test/dummy/lib/shared_user_without_omniauth.rb +12 -3
- data/test/dummy/lib/shared_verification_fields.rb +1 -0
- data/test/dummy/{app/models/.gitkeep → log/development.log} +0 -0
- data/test/dummy/log/test.log +101533 -0
- data/test/integration/test_password_expirable_workflow.rb +53 -0
- data/test/integration/test_session_limitable_workflow.rb +2 -0
- data/test/orm/active_record.rb +7 -4
- data/test/orm/mongoid.rb +2 -1
- data/test/support/integration_helpers.rb +15 -33
- data/test/support/mongoid.yml +1 -1
- data/test/test_compatibility.rb +2 -0
- data/test/test_complexity_validator.rb +250 -29
- data/test/test_database_authenticatable_patch.rb +146 -0
- data/test/test_helper.rb +12 -6
- data/test/test_install_generator.rb +12 -2
- data/test/test_paranoid_verification.rb +0 -1
- data/test/test_password_archivable.rb +34 -11
- data/test/test_password_expirable.rb +26 -26
- data/test/test_secure_validatable.rb +292 -50
- data/test/test_secure_validatable_overrides.rb +185 -0
- data/test/test_session_limitable.rb +27 -1
- data/test/tmp/config/initializers/devise_security.rb +49 -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 +41 -0
- data/test/tmp/config/locales/devise.security_extension.en.yml +42 -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 +168 -132
- 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/schema.rb +0 -66
- data/test/dummy/app/models/secure_user.rb +0 -9
@@ -0,0 +1,185 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class TestSecureValidatableOverrides < ActiveSupport::TestCase
|
6
|
+
class ::CustomClassPasswordValidator < DeviseSecurity::PasswordComplexityValidator
|
7
|
+
def patterns
|
8
|
+
super.merge(letter: /\p{Alpha}/)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class ::CustomInstancePasswordValidator < DeviseSecurity::PasswordComplexityValidator
|
13
|
+
# Add a pattern for alphanumeric characters. See
|
14
|
+
# [en.yml](file:///./test/dummy/config/locales/en.yml) for translations used in
|
15
|
+
# tests.
|
16
|
+
def patterns
|
17
|
+
super.merge(alnum: /\p{Alnum}/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class User < ApplicationRecord
|
22
|
+
devise :database_authenticatable, :secure_validatable
|
23
|
+
include ::Mongoid::Mappings if DEVISE_ORM == :mongoid
|
24
|
+
end
|
25
|
+
|
26
|
+
class ClassLevelOverrideUser < User
|
27
|
+
self.allow_passwords_equal_to_email = true
|
28
|
+
self.email_validation = false
|
29
|
+
self.password_complexity = { symbol: 1, letter: 1 }
|
30
|
+
self.password_complexity_validator = 'custom_class_password_validator'
|
31
|
+
self.password_length = 10..100
|
32
|
+
end
|
33
|
+
|
34
|
+
class InstanceLevelOverrideUser < ClassLevelOverrideUser
|
35
|
+
def allow_passwords_equal_to_email
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def email_validation
|
40
|
+
false
|
41
|
+
end
|
42
|
+
|
43
|
+
def password_complexity
|
44
|
+
{ symbol: 2, alnum: 1 }
|
45
|
+
end
|
46
|
+
|
47
|
+
def password_length
|
48
|
+
11..100
|
49
|
+
end
|
50
|
+
|
51
|
+
def password_complexity_validator
|
52
|
+
'CustomInstancePasswordValidator'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'email equal to password can be overridden at the class level' do
|
57
|
+
user = ClassLevelOverrideUser.new(
|
58
|
+
email: 'bob1!@microsoft.com',
|
59
|
+
password: 'bob1!@microsoft.com',
|
60
|
+
password_confirmation: 'bob1!@microsoft.com'
|
61
|
+
)
|
62
|
+
|
63
|
+
assert user.valid?
|
64
|
+
end
|
65
|
+
|
66
|
+
test 'email equal to password can be overridden at the instance level' do
|
67
|
+
user = InstanceLevelOverrideUser.new(
|
68
|
+
email: 'bob1!@microsoft.com',
|
69
|
+
password: 'bob1!@microsoft.com',
|
70
|
+
password_confirmation: 'bob1!@microsoft.com'
|
71
|
+
)
|
72
|
+
|
73
|
+
assert user.valid?
|
74
|
+
end
|
75
|
+
|
76
|
+
test 'email validation can be overridden at the class level' do
|
77
|
+
user = ClassLevelOverrideUser.new(
|
78
|
+
email: 'bob1!@f.com',
|
79
|
+
password: 'Pa3zZ1!!aaaaaa',
|
80
|
+
password_confirmation: 'Pa3zZ1!!aaaaaa'
|
81
|
+
)
|
82
|
+
|
83
|
+
assert user.valid?
|
84
|
+
end
|
85
|
+
|
86
|
+
test 'email validation can be overridden at the instance level' do
|
87
|
+
user = InstanceLevelOverrideUser.new(
|
88
|
+
email: 'bob1!@f.com',
|
89
|
+
password: 'Pa3zZ1!!aaaaaa',
|
90
|
+
password_confirmation: 'Pa3zZ1!!aaaaaa'
|
91
|
+
)
|
92
|
+
|
93
|
+
assert user.valid?
|
94
|
+
end
|
95
|
+
|
96
|
+
test 'password complexity can be overridden at the class level' do
|
97
|
+
user = ClassLevelOverrideUser.new(
|
98
|
+
email: 'bob@microsoft.com',
|
99
|
+
password: 'PASSwordddd',
|
100
|
+
password_confirmation: 'PASSwordddd'
|
101
|
+
)
|
102
|
+
|
103
|
+
assert user.invalid?
|
104
|
+
assert_equal(
|
105
|
+
['Password must contain at least one punctuation mark or symbol'],
|
106
|
+
user.errors.full_messages
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
test 'password complexity can be overridden at the instance level' do
|
111
|
+
user = InstanceLevelOverrideUser.new(
|
112
|
+
email: 'bob@microsoft.com',
|
113
|
+
password: 'PASSwordddd',
|
114
|
+
password_confirmation: 'PASSwordddd'
|
115
|
+
)
|
116
|
+
|
117
|
+
assert user.invalid?
|
118
|
+
assert_equal(
|
119
|
+
['Password must contain at least 2 punctuation marks or symbols'],
|
120
|
+
user.errors.full_messages
|
121
|
+
)
|
122
|
+
end
|
123
|
+
|
124
|
+
test 'password length can be overridden at the class level' do
|
125
|
+
user = ClassLevelOverrideUser.new(
|
126
|
+
email: 'bob@microsoft.com',
|
127
|
+
password: 'Pa3zZ1!',
|
128
|
+
password_confirmation: 'Pa3zZ1!'
|
129
|
+
)
|
130
|
+
|
131
|
+
assert user.invalid?
|
132
|
+
assert_equal(
|
133
|
+
['Password is too short (minimum is 10 characters)'],
|
134
|
+
user.errors.full_messages
|
135
|
+
)
|
136
|
+
end
|
137
|
+
|
138
|
+
test 'password length can be overridden at the instance level' do
|
139
|
+
user = InstanceLevelOverrideUser.new(
|
140
|
+
email: 'bob@microsoft.com',
|
141
|
+
password: 'Pa3zZ1!!',
|
142
|
+
password_confirmation: 'Pa3zZ1!!'
|
143
|
+
)
|
144
|
+
|
145
|
+
assert user.invalid?
|
146
|
+
assert_equal(
|
147
|
+
['Password is too short (minimum is 11 characters)'],
|
148
|
+
user.errors.full_messages
|
149
|
+
)
|
150
|
+
end
|
151
|
+
|
152
|
+
test 'password validator can be overridden at the instance level' do
|
153
|
+
password = '!' * 11 # 11 characters, all symbols
|
154
|
+
user = InstanceLevelOverrideUser.new(
|
155
|
+
email: 'bob@microsoft.com',
|
156
|
+
password: password,
|
157
|
+
password_confirmation: password
|
158
|
+
)
|
159
|
+
|
160
|
+
assert user.invalid?
|
161
|
+
# This validation error only occurs when the CustomInstancePasswordValidator
|
162
|
+
# is used.
|
163
|
+
assert_equal(
|
164
|
+
['Password must contain at least one letter or number'],
|
165
|
+
user.errors.full_messages
|
166
|
+
)
|
167
|
+
end
|
168
|
+
|
169
|
+
test 'password validator can be overridden at the class level' do
|
170
|
+
password = '!' * 10 # 10 characters, all symbols
|
171
|
+
user = ClassLevelOverrideUser.new(
|
172
|
+
email: 'bob@microsoft.com',
|
173
|
+
password: password,
|
174
|
+
password_confirmation: password
|
175
|
+
)
|
176
|
+
|
177
|
+
assert user.invalid?
|
178
|
+
# This validation error only occurs when the CustomClassPasswordValidator
|
179
|
+
# is used.
|
180
|
+
assert_equal(
|
181
|
+
['Password must contain at least one letter'],
|
182
|
+
user.errors.full_messages
|
183
|
+
)
|
184
|
+
end
|
185
|
+
end
|
@@ -1,6 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
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
|
4
30
|
|
5
31
|
test '#update_unique_session_id!(value) updates valid record' do
|
6
32
|
user = User.create! password: 'passWord1', password_confirmation: 'passWord1', email: 'bob@microsoft.com'
|
@@ -25,7 +51,7 @@ class TestSessionLimitable < ActiveSupport::TestCase
|
|
25
51
|
|
26
52
|
test '#update_unique_session_id!(value) raises an exception on an unpersisted record' do
|
27
53
|
user = User.create
|
28
|
-
|
54
|
+
assert_not user.persisted?
|
29
55
|
assert_raises(Devise::Models::Compatibility::NotPersistedError) { user.update_unique_session_id!('unique_value') }
|
30
56
|
end
|
31
57
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Devise.setup do |config|
|
4
|
+
# ==> Security Extension
|
5
|
+
# Configure security extension for devise
|
6
|
+
|
7
|
+
# Should the password expire (e.g 3.months)
|
8
|
+
# config.expire_password_after = false
|
9
|
+
|
10
|
+
# Need 1 char each of: A-Z, a-z, 0-9, and a punctuation mark or symbol
|
11
|
+
# You may use "digits" in place of "digit" and "symbols" in place of
|
12
|
+
# "symbol" based on your preference
|
13
|
+
# config.password_complexity = { digit: 1, lower: 1, symbol: 1, upper: 1 }
|
14
|
+
|
15
|
+
# How many passwords to keep in archive
|
16
|
+
# config.password_archiving_count = 5
|
17
|
+
|
18
|
+
# Deny old passwords (true, false, number_of_old_passwords_to_check)
|
19
|
+
# Examples:
|
20
|
+
# config.deny_old_passwords = false # allow old passwords
|
21
|
+
# config.deny_old_passwords = true # will deny all the old passwords
|
22
|
+
# config.deny_old_passwords = 3 # will deny new passwords that matches with the last 3 passwords
|
23
|
+
# config.deny_old_passwords = true
|
24
|
+
|
25
|
+
# enable email validation for :secure_validatable. (true, false, validation_options)
|
26
|
+
# dependency: see https://github.com/devise-security/devise-security/blob/master/README.md#e-mail-validation
|
27
|
+
# config.email_validation = true
|
28
|
+
|
29
|
+
# captcha integration for recover form
|
30
|
+
# config.captcha_for_recover = true
|
31
|
+
|
32
|
+
# captcha integration for sign up form
|
33
|
+
# config.captcha_for_sign_up = true
|
34
|
+
|
35
|
+
# captcha integration for sign in form
|
36
|
+
# config.captcha_for_sign_in = true
|
37
|
+
|
38
|
+
# captcha integration for unlock form
|
39
|
+
# config.captcha_for_unlock = true
|
40
|
+
|
41
|
+
# captcha integration for confirmation form
|
42
|
+
# config.captcha_for_confirmation = true
|
43
|
+
|
44
|
+
# Time period for account expiry from last_activity_at
|
45
|
+
# config.expire_after = 90.days
|
46
|
+
|
47
|
+
# Allow password to equal the email
|
48
|
+
# config.allow_passwords_equal_to_email = false
|
49
|
+
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,41 @@
|
|
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
|
+
invalid_security_question: 'Die Antwort auf die Sicherheitsfrage war ungültig.'
|
23
|
+
paranoid_verify:
|
24
|
+
code_required: 'Bitte geben Sie den Code ein, den unser Support-Team zur Verfügung gestellt hat.'
|
25
|
+
paranoid_verification_code:
|
26
|
+
show:
|
27
|
+
submit_verification_code: Bestätigungscode eingeben
|
28
|
+
verification_code: Bestätigungscode
|
29
|
+
submit: Bestätigen
|
30
|
+
password_expired:
|
31
|
+
updated: 'Das neue Passwort wurde übernommen.'
|
32
|
+
change_required: 'Ihr Passwort ist abgelaufen. Bitte vergeben Sie ein neues Passwort.'
|
33
|
+
show:
|
34
|
+
renew_your_password: Vergeben Sie ein neues Passwort
|
35
|
+
current_password: Aktuelles Passwort
|
36
|
+
new_password: Neues Passwort
|
37
|
+
new_password_confirmation: Passwort bestätigen
|
38
|
+
change_my_password: Passwort ändern
|
39
|
+
failure:
|
40
|
+
session_limited: 'Ihre Anmeldedaten wurden in einem anderen Browser genutzt. Bitte melden Sie sich erneut an, um in diesem Browser fortzufahren.'
|
41
|
+
expired: 'Ihr Account ist aufgrund zu langer Inaktivität abgelaufen. Bitte kontaktieren Sie den Administrator.'
|
@@ -0,0 +1,42 @@
|
|
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} digits
|
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
|
+
updated: Verification code accepted
|
27
|
+
show:
|
28
|
+
submit_verification_code: Submit verification code
|
29
|
+
verification_code: Verification code
|
30
|
+
submit: Submit
|
31
|
+
password_expired:
|
32
|
+
updated: 'Your new password is saved.'
|
33
|
+
change_required: 'Your password is expired. Please renew your password.'
|
34
|
+
show:
|
35
|
+
renew_your_password: Renew your password
|
36
|
+
current_password: Current password
|
37
|
+
new_password: New password
|
38
|
+
new_password_confirmation: Confirm new password
|
39
|
+
change_my_password: Change my password
|
40
|
+
failure:
|
41
|
+
session_limited: 'Your login credentials were used in another browser. Please sign in again to continue in this browser.'
|
42
|
+
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.'
|