devise-security 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -19
  3. data/app/controllers/devise/password_expired_controller.rb +1 -5
  4. data/config/locales/by.yml +1 -0
  5. data/config/locales/cs.yml +1 -0
  6. data/config/locales/de.yml +1 -0
  7. data/config/locales/en.yml +1 -0
  8. data/config/locales/es.yml +1 -0
  9. data/config/locales/fa.yml +1 -0
  10. data/config/locales/fr.yml +1 -0
  11. data/config/locales/hi.yml +21 -20
  12. data/config/locales/it.yml +1 -0
  13. data/config/locales/ja.yml +1 -0
  14. data/config/locales/nl.yml +1 -0
  15. data/config/locales/pt.yml +1 -0
  16. data/config/locales/ru.yml +1 -0
  17. data/config/locales/tr.yml +1 -0
  18. data/config/locales/uk.yml +1 -0
  19. data/config/locales/zh_CN.yml +1 -0
  20. data/config/locales/zh_TW.yml +1 -0
  21. data/lib/devise-security.rb +6 -3
  22. data/lib/devise-security/controllers/helpers.rb +2 -2
  23. data/lib/devise-security/hooks/session_limitable.rb +10 -6
  24. data/lib/devise-security/models/secure_validatable.rb +15 -1
  25. data/lib/devise-security/version.rb +1 -1
  26. data/lib/generators/devise_security/install_generator.rb +3 -3
  27. data/lib/generators/templates/{devise-security.rb → devise_security.rb} +3 -0
  28. data/test/controllers/test_password_expired_controller.rb +67 -98
  29. data/test/controllers/test_security_question_controller.rb +16 -40
  30. data/test/dummy/config/environments/test.rb +3 -13
  31. data/test/dummy/config/initializers/migration_class.rb +1 -8
  32. data/test/dummy/config/mongoid.yml +1 -1
  33. data/test/dummy/log/development.log +883 -0
  34. data/test/dummy/log/test.log +19890 -0
  35. data/test/integration/test_password_expirable_workflow.rb +0 -4
  36. data/test/orm/mongoid.rb +2 -1
  37. data/test/support/integration_helpers.rb +14 -32
  38. data/test/support/mongoid.yml +1 -1
  39. data/test/test_helper.rb +4 -4
  40. data/test/test_install_generator.rb +1 -1
  41. data/test/test_secure_validatable.rb +76 -0
  42. data/test/tmp/config/initializers/devise-security.rb +3 -0
  43. data/test/tmp/config/locales/devise.security_extension.by.yml +49 -0
  44. data/test/tmp/config/locales/devise.security_extension.cs.yml +41 -0
  45. data/test/tmp/config/locales/devise.security_extension.de.yml +1 -0
  46. data/test/tmp/config/locales/devise.security_extension.en.yml +1 -0
  47. data/test/tmp/config/locales/devise.security_extension.es.yml +10 -9
  48. data/test/tmp/config/locales/devise.security_extension.fa.yml +1 -0
  49. data/test/tmp/config/locales/devise.security_extension.fr.yml +1 -0
  50. data/test/tmp/config/locales/devise.security_extension.hi.yml +42 -0
  51. data/test/tmp/config/locales/devise.security_extension.it.yml +1 -0
  52. data/test/tmp/config/locales/devise.security_extension.ja.yml +1 -0
  53. data/test/tmp/config/locales/devise.security_extension.nl.yml +1 -0
  54. data/test/tmp/config/locales/devise.security_extension.pt.yml +1 -0
  55. data/test/tmp/config/locales/devise.security_extension.ru.yml +1 -0
  56. data/test/tmp/config/locales/devise.security_extension.tr.yml +1 -0
  57. data/test/tmp/config/locales/devise.security_extension.uk.yml +1 -0
  58. data/test/tmp/config/locales/devise.security_extension.zh_CN.yml +1 -0
  59. data/test/tmp/config/locales/devise.security_extension.zh_TW.yml +41 -0
  60. metadata +19 -40
  61. data/lib/devise-security/orm/active_record.rb +0 -20
  62. data/lib/devise-security/schema.rb +0 -66
@@ -17,8 +17,6 @@ class TestPasswordExpirableWorkflow < ActionDispatch::IntegrationTest
17
17
  end
18
18
 
19
19
  test 'sign in and change expired password' do
20
- skip("Does not work in Rails < 5.0") if Rails.gem_version < Gem::Version.new('5.0')
21
-
22
20
  sign_in(@user)
23
21
  assert_redirected_to(root_path)
24
22
  follow_redirect!
@@ -37,8 +35,6 @@ class TestPasswordExpirableWorkflow < ActionDispatch::IntegrationTest
37
35
  end
38
36
 
39
37
  test 'sign in and password is updated before redirect completes' do
40
- skip("Does not work in Rails < 5.0") if Rails.gem_version < Gem::Version.new('5.0')
41
-
42
38
  sign_in(@user)
43
39
  assert_redirected_to(root_path)
44
40
 
data/test/orm/mongoid.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'mongoid/version'
4
+ require 'database_cleaner-mongoid'
4
5
 
5
6
  Mongoid.configure do |config|
6
7
  config.load!('test/support/mongoid.yml', Rails.env)
@@ -8,5 +9,5 @@ Mongoid.configure do |config|
8
9
  config.include_root_in_json = true
9
10
  end
10
11
 
11
- DatabaseCleaner[:mongoid].strategy = :truncation
12
+ DatabaseCleaner[:mongoid].strategy = :deletion
12
13
  ORMInvalidRecordException = Mongoid::Errors::Validations
@@ -1,47 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module IntegrationHelpers
2
4
  # login the user. This will exercise all the Warden Hooks
3
5
  # @param user [User]
4
6
  # @param session [ActionDispatch::Integration::Session]
5
7
  # @return [void]
6
- # @note accounts for differences in the integration test API between rails versions
7
8
  def sign_in(user, session = integration_session)
8
- if Rails.gem_version > Gem::Version.new('5.0')
9
- session.post new_user_session_path, params: {
10
- user: {
11
- email: user.email,
12
- password: user.password
13
- }
14
- }
15
- else
16
- session.post new_user_session_path, {
17
- user: {
18
- email: user.email,
19
- password: user.password
20
- }
21
- }
22
- end
9
+ session.post new_user_session_path, params: {
10
+ user: {
11
+ email: user.email,
12
+ password: user.password,
13
+ },
14
+ }
23
15
  end
24
16
 
25
17
  # attempt to login the user with a bad password. This will exercise all the Warden Hooks
26
18
  # @param user [User]
27
19
  # @param session [ActionDispatch::Integration::Session]
28
20
  # @return [void]
29
- # @note accounts for differences in the integration test API between rails versions
30
21
  def failed_sign_in(user, session)
31
- if Rails.gem_version > Gem::Version.new('5.0')
32
- session.post new_user_session_path, params: {
33
- user: {
34
- email: user.email,
35
- password: 'bad-password'
36
- }
37
- }
38
- else
39
- session.post new_user_session_path, {
40
- user: {
41
- email: user.email,
42
- password: 'bad-password'
43
- }
44
- }
45
- end
22
+ session.post new_user_session_path, params: {
23
+ user: {
24
+ email: user.email,
25
+ password: 'bad-password',
26
+ },
27
+ }
46
28
  end
47
29
  end
@@ -1,5 +1,5 @@
1
1
  test:
2
- <%= Mongoid::VERSION.to_i > 4 ? 'clients' : 'sessions' %>:
2
+ clients:
3
3
  default:
4
4
  database: devise-test-suite
5
5
  hosts:
data/test/test_helper.rb CHANGED
@@ -34,10 +34,10 @@ require 'devise-security'
34
34
  require 'database_cleaner'
35
35
  require "orm/#{DEVISE_ORM}"
36
36
 
37
- if Rails.gem_version >= Gem::Version.new('5.0.0')
38
- require 'rails-controller-testing'
39
- Rails::Controller::Testing.install
40
- end
37
+ # Controller testing is the way that Devise itself tests the functionality of
38
+ # controller, even though it has been deprecated in favor of request tests.
39
+ require 'rails-controller-testing'
40
+ Rails::Controller::Testing.install
41
41
  require 'support/integration_helpers'
42
42
 
43
43
  class Minitest::Test
@@ -11,7 +11,7 @@ class TestInstallGenerator < Rails::Generators::TestCase
11
11
 
12
12
  test 'Assert all files are properly created' do
13
13
  run_generator
14
- assert_file 'config/initializers/devise-security.rb'
14
+ assert_file 'config/initializers/devise_security.rb'
15
15
  assert_file 'config/locales/devise.security_extension.by.yml'
16
16
  assert_file 'config/locales/devise.security_extension.cs.yml'
17
17
  assert_file 'config/locales/devise.security_extension.de.yml'
@@ -82,4 +82,80 @@ class TestSecureValidatable < ActiveSupport::TestCase
82
82
  refute user.valid?
83
83
  assert_equal DEVISE_ORM == :active_record ? ['Email has already been taken'] : ['Email is already taken'], user.errors.full_messages
84
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! }
160
+ end
85
161
  end
@@ -41,4 +41,7 @@ Devise.setup do |config|
41
41
 
42
42
  # Time period for account expiry from last_activity_at
43
43
  # config.expire_after = 90.days
44
+
45
+ # Allow password to equal the email
46
+ # config.allow_passwords_equal_to_email = false
44
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.
@@ -3,6 +3,7 @@ de:
3
3
  messages:
4
4
  taken_in_past: 'wurde bereits in der Vergangenheit verwendet.'
5
5
  equal_to_current_password: 'darf nicht dem aktuellen Passwort entsprechen.'
6
+ equal_to_email: 'darf nicht dem E-mail entsprechen.'
6
7
  password_complexity:
7
8
  digit:
8
9
  one: muss mindestens eine Ziffer enthalten
@@ -3,6 +3,7 @@ en:
3
3
  messages:
4
4
  taken_in_past: 'was used previously.'
5
5
  equal_to_current_password: 'must be different than the current password.'
6
+ equal_to_email: 'must be different than the email.'
6
7
  password_complexity:
7
8
  digit:
8
9
  one: must contain at least one digit
@@ -1,29 +1,30 @@
1
1
  es:
2
2
  errors:
3
3
  messages:
4
- taken_in_past: 'la contraseña fue usada previamente, favor elegir otra.'
4
+ taken_in_past: 'la contraseña fue usada previamente, por favor elige otra.'
5
5
  equal_to_current_password: 'tiene que ser diferente a la contraseña actual.'
6
+ equal_to_email: 'tiene que ser diferente al email'
6
7
  password_complexity:
7
8
  digit:
8
- one: tiene que contener al menos un digito
9
- other: tiene que contener al menos %{count} digitos
9
+ one: tiene que contener al menos un dígito
10
+ other: tiene que contener al menos %{count} dígitos
10
11
  lower:
11
- one: tiene que contener al menos un minúscula
12
+ one: tiene que contener al menos una minúscula
12
13
  other: tiene que contener al menos %{count} minúsculas
13
14
  symbol:
14
15
  one: tiene que contener al menos un signo de puntuación
15
16
  other: tiene que contener al menos %{count} signos de puntuación
16
17
  upper:
17
- one: tiene que contener al menos un mayúscula
18
+ one: tiene que contener al menos una mayúscula
18
19
  other: tiene que contener al menos %{count} mayúsculas
19
20
  devise:
20
21
  invalid_captcha: 'El captcha ingresado es inválido.'
21
- invalid_security_question: 'La respuesta a la pregunta de suguridad fue incorrecta.'
22
+ invalid_security_question: 'La respuesta a la pregunta de seguridad fue incorrecta.'
22
23
  paranoid_verify:
23
24
  code_required: 'Por favor ingrese el código provisto por nuestro equipo de soporte'
24
25
  password_expired:
25
- updated: 'Su nueva contraña ha sido guardada.'
26
- change_required: 'Su contraña ha expirado. Por favor renueve su contraseña.'
26
+ updated: 'Su nueva contraseña ha sido guardada.'
27
+ change_required: 'Su contraseña ha expirado. Por favor renueve su contraseña.'
27
28
  failure:
28
- session_limited: 'Sus credenciales de inicio de sesión fueron usadas en otro navegador. Por favor inicie sesión nuevamente para continuar en éste navegador.'
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.'
29
30
  expired: 'Su cuenta ha expirado debido a inactividad. Por favor contacte al administrador de la aplicación.'
@@ -3,6 +3,7 @@ fa:
3
3
  messages:
4
4
  taken_in_past: 'قبلا استفاده شده است'
5
5
  equal_to_current_password: 'باید متفاوت با رمز عبور فعلی باشد'
6
+ equal_to_email: 'باید متفاوت از ایمیل باشد'
6
7
  password_complexity:
7
8
  digit:
8
9
  one: باید حداقل یک رقم داشته باشد
@@ -3,6 +3,7 @@ fr:
3
3
  messages:
4
4
  taken_in_past: a été utilisé trop récemment. Veuillez en choisir un autre
5
5
  equal_to_current_password: doit être différent de l'actuel
6
+ equal_to_email: doit être différent de l'e-mail
6
7
  password_complexity:
7
8
  digit:
8
9
  one: doit contenir au moins un chiffre
@@ -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: कोई गतिविधि न होने के कारण खाता बंद हो गया, सिस्टम व्यवस्थापक से संपर्क करें
@@ -3,6 +3,7 @@ it:
3
3
  messages:
4
4
  taken_in_past: "è stata gia' utilizzata in passato!"
5
5
  equal_to_current_password: " deve essere differente dalla password corrente!"
6
+ equal_to_email: "deve essere differente dall'email"
6
7
  password_complexity:
7
8
  digit:
8
9
  one: deve contenere almeno una cifra
@@ -3,6 +3,7 @@ ja:
3
3
  messages:
4
4
  taken_in_past: 'は既に使われています。'
5
5
  equal_to_current_password: 'は現在のパスワードと異なるものである必要があります。'
6
+ equal_to_email: 'メールとは異なる必要があります'
6
7
  password_complexity:
7
8
  digit:
8
9
  one: は最低1つの数字を含む必要があります。