devise-security 0.14.2 → 0.17.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.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +125 -59
  3. data/app/controllers/devise/paranoid_verification_code_controller.rb +13 -1
  4. data/app/controllers/devise/password_expired_controller.rb +24 -6
  5. data/app/views/devise/paranoid_verification_code/show.html.erb +3 -3
  6. data/app/views/devise/password_expired/show.html.erb +5 -5
  7. data/config/locales/bg.yml +41 -0
  8. data/config/locales/by.yml +49 -0
  9. data/config/locales/cs.yml +41 -0
  10. data/config/locales/de.yml +15 -2
  11. data/config/locales/en.yml +15 -2
  12. data/config/locales/es.yml +10 -9
  13. data/config/locales/fa.yml +41 -0
  14. data/config/locales/fr.yml +1 -0
  15. data/config/locales/hi.yml +42 -0
  16. data/config/locales/it.yml +35 -4
  17. data/config/locales/ja.yml +2 -1
  18. data/config/locales/nl.yml +41 -0
  19. data/config/locales/pt.yml +41 -0
  20. data/config/locales/ru.yml +49 -0
  21. data/config/locales/tr.yml +1 -0
  22. data/config/locales/uk.yml +49 -0
  23. data/config/locales/zh_CN.yml +41 -0
  24. data/config/locales/zh_TW.yml +41 -0
  25. data/lib/devise-security/controllers/helpers.rb +59 -50
  26. data/lib/devise-security/hooks/password_expirable.rb +2 -0
  27. data/lib/devise-security/hooks/session_limitable.rb +21 -11
  28. data/lib/devise-security/models/database_authenticatable_patch.rb +15 -5
  29. data/lib/devise-security/models/password_archivable.rb +2 -2
  30. data/lib/devise-security/models/password_expirable.rb +5 -1
  31. data/lib/devise-security/models/secure_validatable.rb +56 -6
  32. data/lib/devise-security/models/session_limitable.rb +10 -1
  33. data/lib/devise-security/validators/password_complexity_validator.rb +53 -24
  34. data/lib/devise-security/version.rb +1 -1
  35. data/lib/devise-security.rb +13 -5
  36. data/lib/generators/devise_security/install_generator.rb +3 -3
  37. data/lib/generators/templates/{devise-security.rb → devise_security.rb} +6 -1
  38. data/test/controllers/test_paranoid_verification_code_controller.rb +68 -0
  39. data/test/controllers/test_password_expired_controller.rb +121 -19
  40. data/test/controllers/test_security_question_controller.rb +16 -40
  41. data/test/dummy/app/assets/config/manifest.js +3 -0
  42. data/test/dummy/app/controllers/overrides/paranoid_verification_code_controller.rb +7 -0
  43. data/test/dummy/app/controllers/overrides/password_expired_controller.rb +7 -0
  44. data/test/dummy/app/controllers/widgets_controller.rb +3 -0
  45. data/test/dummy/app/models/application_user_record.rb +2 -1
  46. data/test/dummy/app/models/mongoid/confirmable_fields.rb +2 -0
  47. data/test/dummy/app/models/mongoid/database_authenticable_fields.rb +4 -3
  48. data/test/dummy/app/models/mongoid/expirable_fields.rb +2 -0
  49. data/test/dummy/app/models/mongoid/lockable_fields.rb +2 -0
  50. data/test/dummy/app/models/mongoid/mappings.rb +4 -2
  51. data/test/dummy/app/models/mongoid/omniauthable_fields.rb +2 -0
  52. data/test/dummy/app/models/mongoid/paranoid_verification_fields.rb +2 -0
  53. data/test/dummy/app/models/mongoid/password_archivable_fields.rb +2 -0
  54. data/test/dummy/app/models/mongoid/password_expirable_fields.rb +2 -0
  55. data/test/dummy/app/models/mongoid/recoverable_fields.rb +2 -0
  56. data/test/dummy/app/models/mongoid/registerable_fields.rb +4 -2
  57. data/test/dummy/app/models/mongoid/rememberable_fields.rb +2 -0
  58. data/test/dummy/app/models/mongoid/secure_validatable_fields.rb +2 -0
  59. data/test/dummy/app/models/mongoid/security_questionable_fields.rb +2 -0
  60. data/test/dummy/app/models/mongoid/session_limitable_fields.rb +2 -0
  61. data/test/dummy/app/models/mongoid/timeoutable_fields.rb +2 -0
  62. data/test/dummy/app/models/mongoid/trackable_fields.rb +2 -0
  63. data/test/dummy/app/models/mongoid/validatable_fields.rb +2 -0
  64. data/test/dummy/app/models/paranoid_verification_user.rb +26 -0
  65. data/test/dummy/app/models/password_expired_user.rb +26 -0
  66. data/test/dummy/app/models/user.rb +1 -2
  67. data/test/dummy/app/models/widget.rb +1 -3
  68. data/test/dummy/app/mongoid/one_user.rb +5 -5
  69. data/test/dummy/app/mongoid/user_on_engine.rb +2 -2
  70. data/test/dummy/app/mongoid/user_on_main_app.rb +2 -2
  71. data/test/dummy/app/mongoid/user_with_validations.rb +3 -3
  72. data/test/dummy/app/mongoid/user_without_email.rb +3 -3
  73. data/test/dummy/config/application.rb +4 -4
  74. data/test/dummy/config/boot.rb +1 -1
  75. data/test/dummy/config/environment.rb +1 -1
  76. data/test/dummy/config/environments/test.rb +3 -13
  77. data/test/dummy/config/initializers/migration_class.rb +1 -8
  78. data/test/dummy/config/locales/en.yml +10 -0
  79. data/test/dummy/config/mongoid.yml +1 -1
  80. data/test/dummy/config/routes.rb +5 -3
  81. data/test/dummy/db/migrate/20120508165529_create_tables.rb +3 -3
  82. data/test/dummy/lib/shared_expirable_columns.rb +1 -0
  83. data/test/dummy/lib/shared_security_questions_fields.rb +1 -0
  84. data/test/dummy/lib/shared_user.rb +17 -6
  85. data/test/dummy/lib/shared_user_without_email.rb +2 -1
  86. data/test/dummy/lib/shared_user_without_omniauth.rb +12 -3
  87. data/test/dummy/lib/shared_verification_fields.rb +1 -0
  88. data/test/dummy/{app/models/.gitkeep → log/development.log} +0 -0
  89. data/test/dummy/log/test.log +101533 -0
  90. data/test/integration/test_password_expirable_workflow.rb +53 -0
  91. data/test/integration/test_session_limitable_workflow.rb +2 -0
  92. data/test/orm/active_record.rb +7 -4
  93. data/test/orm/mongoid.rb +2 -1
  94. data/test/support/integration_helpers.rb +15 -33
  95. data/test/support/mongoid.yml +1 -1
  96. data/test/test_compatibility.rb +2 -0
  97. data/test/test_complexity_validator.rb +250 -29
  98. data/test/test_database_authenticatable_patch.rb +146 -0
  99. data/test/test_helper.rb +12 -6
  100. data/test/test_install_generator.rb +12 -2
  101. data/test/test_paranoid_verification.rb +0 -1
  102. data/test/test_password_archivable.rb +34 -11
  103. data/test/test_password_expirable.rb +26 -26
  104. data/test/test_secure_validatable.rb +292 -50
  105. data/test/test_secure_validatable_overrides.rb +185 -0
  106. data/test/test_session_limitable.rb +27 -1
  107. data/test/tmp/config/initializers/devise_security.rb +49 -0
  108. data/test/tmp/config/locales/devise.security_extension.by.yml +49 -0
  109. data/test/tmp/config/locales/devise.security_extension.cs.yml +41 -0
  110. data/test/tmp/config/locales/devise.security_extension.de.yml +41 -0
  111. data/test/tmp/config/locales/devise.security_extension.en.yml +42 -0
  112. data/test/tmp/config/locales/devise.security_extension.es.yml +30 -0
  113. data/test/tmp/config/locales/devise.security_extension.fa.yml +41 -0
  114. data/test/tmp/config/locales/devise.security_extension.fr.yml +30 -0
  115. data/test/tmp/config/locales/devise.security_extension.hi.yml +42 -0
  116. data/test/tmp/config/locales/devise.security_extension.it.yml +41 -0
  117. data/test/tmp/config/locales/devise.security_extension.ja.yml +30 -0
  118. data/test/tmp/config/locales/devise.security_extension.nl.yml +41 -0
  119. data/test/tmp/config/locales/devise.security_extension.pt.yml +41 -0
  120. data/test/tmp/config/locales/devise.security_extension.ru.yml +49 -0
  121. data/test/tmp/config/locales/devise.security_extension.tr.yml +18 -0
  122. data/test/tmp/config/locales/devise.security_extension.uk.yml +49 -0
  123. data/test/tmp/config/locales/devise.security_extension.zh_CN.yml +41 -0
  124. data/test/tmp/config/locales/devise.security_extension.zh_TW.yml +41 -0
  125. metadata +168 -132
  126. data/.codeclimate.yml +0 -63
  127. data/.document +0 -5
  128. data/.gitignore +0 -43
  129. data/.mdlrc +0 -1
  130. data/.rubocop.yml +0 -64
  131. data/.ruby-version +0 -1
  132. data/.travis.yml +0 -39
  133. data/Appraisals +0 -35
  134. data/Gemfile +0 -10
  135. data/Rakefile +0 -27
  136. data/devise-security.gemspec +0 -50
  137. data/gemfiles/rails_4.2_stable.gemfile +0 -16
  138. data/gemfiles/rails_5.0_stable.gemfile +0 -15
  139. data/gemfiles/rails_5.1_stable.gemfile +0 -15
  140. data/gemfiles/rails_5.2_stable.gemfile +0 -15
  141. data/gemfiles/rails_6.0_beta.gemfile +0 -15
  142. data/lib/devise-security/orm/active_record.rb +0 -20
  143. data/lib/devise-security/schema.rb +0 -66
  144. 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
- assert !user.persisted?
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.'