devise-security 0.14.3 → 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 +123 -59
- data/app/controllers/devise/password_expired_controller.rb +11 -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/by.yml +49 -0
- data/config/locales/cs.yml +41 -0
- data/config/locales/de.yml +13 -2
- data/config/locales/en.yml +13 -1
- 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.rb +6 -3
- 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/password_expirable.rb +5 -1
- data/lib/devise-security/models/secure_validatable.rb +15 -1
- data/lib/devise-security/models/session_limitable.rb +8 -1
- data/lib/devise-security/validators/password_complexity_validator.rb +4 -2
- data/lib/devise-security/version.rb +1 -1
- data/lib/generators/devise_security/install_generator.rb +3 -3
- data/lib/generators/templates/devise_security.rb +47 -0
- data/test/controllers/test_password_expired_controller.rb +83 -19
- data/test/controllers/test_security_question_controller.rb +16 -40
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/config/environments/test.rb +3 -13
- data/test/dummy/config/initializers/migration_class.rb +1 -8
- data/test/dummy/config/mongoid.yml +1 -1
- data/test/dummy/config/routes.rb +3 -3
- 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/orm/active_record.rb +4 -1
- 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_complexity_validator.rb +12 -0
- data/test/test_helper.rb +10 -3
- data/test/test_install_generator.rb +11 -1
- data/test/test_secure_validatable.rb +76 -0
- data/test/test_session_limitable.rb +17 -0
- data/{lib/generators/templates → test/tmp/config/initializers}/devise-security.rb +3 -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 +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 +145 -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/.gitkeep +0 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class TestPasswordExpirableWorkflow < ActionDispatch::IntegrationTest
|
6
|
+
include IntegrationHelpers
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@user = User.create!(password: 'passWord1',
|
10
|
+
password_confirmation: 'passWord1',
|
11
|
+
email: 'bob@microsoft.com',
|
12
|
+
password_changed_at: 4.months.ago) # the default expiration time is 3.months.ago
|
13
|
+
@user.confirm
|
14
|
+
|
15
|
+
assert @user.valid?
|
16
|
+
assert @user.need_change_password?
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'sign in and change expired password' do
|
20
|
+
sign_in(@user)
|
21
|
+
assert_redirected_to(root_path)
|
22
|
+
follow_redirect!
|
23
|
+
assert_redirected_to(user_password_expired_path)
|
24
|
+
# @note This is not the same controller used by Devise for password changes
|
25
|
+
put '/users/password_expired', params: {
|
26
|
+
user: {
|
27
|
+
current_password: 'passWord1',
|
28
|
+
password: 'Password12345!',
|
29
|
+
password_confirmation: 'Password12345!',
|
30
|
+
},
|
31
|
+
}
|
32
|
+
assert_redirected_to(root_path)
|
33
|
+
@user.reload
|
34
|
+
assert_not @user.need_change_password?
|
35
|
+
end
|
36
|
+
|
37
|
+
test 'sign in and password is updated before redirect completes' do
|
38
|
+
sign_in(@user)
|
39
|
+
assert_redirected_to(root_path)
|
40
|
+
|
41
|
+
# simulates an external process updating the password
|
42
|
+
@user.update(password_changed_at: Time.zone.now)
|
43
|
+
assert_not @user.need_change_password?
|
44
|
+
|
45
|
+
follow_redirect!
|
46
|
+
assert_response :success
|
47
|
+
|
48
|
+
# if the password is expired at this point they will be redirected to the
|
49
|
+
# password change controller.
|
50
|
+
get root_path
|
51
|
+
assert_response :success
|
52
|
+
end
|
53
|
+
end
|
data/test/orm/active_record.rb
CHANGED
@@ -2,7 +2,10 @@ require 'active_record'
|
|
2
2
|
|
3
3
|
ActiveRecord::Migration.verbose = false
|
4
4
|
ActiveRecord::Base.logger = Logger.new(nil)
|
5
|
-
|
5
|
+
case
|
6
|
+
when Rails.gem_version >= Gem::Version.new('6.0.0')
|
7
|
+
ActiveRecord::MigrationContext.new(File.expand_path('../../dummy/db/migrate', __FILE__), ActiveRecord::SchemaMigration).migrate
|
8
|
+
when Rails.gem_version >= Gem::Version.new('5.2.0')
|
6
9
|
ActiveRecord::MigrationContext.new(File.expand_path('../../dummy/db/migrate', __FILE__)).migrate
|
7
10
|
else
|
8
11
|
ActiveRecord::Migrator.migrate(File.expand_path('../../dummy/db/migrate', __FILE__))
|
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 = :
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
8
|
+
def sign_in(user, session = integration_session)
|
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
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
data/test/support/mongoid.yml
CHANGED
@@ -37,6 +37,12 @@ class PasswordComplexityValidatorTest < Minitest::Test
|
|
37
37
|
assert(ModelWithPassword.new('aaa1').valid?)
|
38
38
|
end
|
39
39
|
|
40
|
+
def test_enforces_digits
|
41
|
+
ModelWithPassword.validates :password, 'devise_security/password_complexity': { digits: 2 }
|
42
|
+
refute(ModelWithPassword.new('aaa1').valid?)
|
43
|
+
assert(ModelWithPassword.new('aa12').valid?)
|
44
|
+
end
|
45
|
+
|
40
46
|
def test_enforces_lower
|
41
47
|
ModelWithPassword.validates :password, 'devise_security/password_complexity': { lower: 1 }
|
42
48
|
refute(ModelWithPassword.new('AAAA').valid?)
|
@@ -49,6 +55,12 @@ class PasswordComplexityValidatorTest < Minitest::Test
|
|
49
55
|
assert(ModelWithPassword.new('aaa!').valid?)
|
50
56
|
end
|
51
57
|
|
58
|
+
def test_enforces_symbols
|
59
|
+
ModelWithPassword.validates :password, 'devise_security/password_complexity': { symbols: 2 }
|
60
|
+
refute(ModelWithPassword.new('aaa!').valid?)
|
61
|
+
assert(ModelWithPassword.new('aa!?').valid?)
|
62
|
+
end
|
63
|
+
|
52
64
|
def test_enforces_combination
|
53
65
|
ModelWithPassword.validates :password, 'devise_security/password_complexity': { lower: 1, upper: 1, digit: 1, symbol: 1 }
|
54
66
|
refute(ModelWithPassword.new('abcd').valid?)
|
data/test/test_helper.rb
CHANGED
@@ -19,9 +19,11 @@ SimpleCov.start do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
if ENV['CI']
|
22
|
-
require '
|
23
|
-
|
24
|
-
|
22
|
+
require 'simplecov'
|
23
|
+
require 'simplecov-lcov'
|
24
|
+
SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
|
25
|
+
SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
|
26
|
+
SimpleCov.start
|
25
27
|
end
|
26
28
|
|
27
29
|
require 'pry'
|
@@ -31,6 +33,11 @@ require 'rails/test_help'
|
|
31
33
|
require 'devise-security'
|
32
34
|
require 'database_cleaner'
|
33
35
|
require "orm/#{DEVISE_ORM}"
|
36
|
+
|
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
|
34
41
|
require 'support/integration_helpers'
|
35
42
|
|
36
43
|
class Minitest::Test
|
@@ -11,13 +11,23 @@ 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/
|
14
|
+
assert_file 'config/initializers/devise_security.rb'
|
15
|
+
assert_file 'config/locales/devise.security_extension.by.yml'
|
16
|
+
assert_file 'config/locales/devise.security_extension.cs.yml'
|
15
17
|
assert_file 'config/locales/devise.security_extension.de.yml'
|
16
18
|
assert_file 'config/locales/devise.security_extension.en.yml'
|
17
19
|
assert_file 'config/locales/devise.security_extension.es.yml'
|
20
|
+
assert_file 'config/locales/devise.security_extension.fa.yml'
|
18
21
|
assert_file 'config/locales/devise.security_extension.fr.yml'
|
22
|
+
assert_file 'config/locales/devise.security_extension.hi.yml'
|
19
23
|
assert_file 'config/locales/devise.security_extension.it.yml'
|
20
24
|
assert_file 'config/locales/devise.security_extension.ja.yml'
|
25
|
+
assert_file 'config/locales/devise.security_extension.nl.yml'
|
26
|
+
assert_file 'config/locales/devise.security_extension.pt.yml'
|
27
|
+
assert_file 'config/locales/devise.security_extension.ru.yml'
|
21
28
|
assert_file 'config/locales/devise.security_extension.tr.yml'
|
29
|
+
assert_file 'config/locales/devise.security_extension.uk.yml'
|
30
|
+
assert_file 'config/locales/devise.security_extension.zh_CN.yml'
|
31
|
+
assert_file 'config/locales/devise.security_extension.zh_TW.yml'
|
22
32
|
end
|
23
33
|
end
|
@@ -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
|
@@ -1,7 +1,24 @@
|
|
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
|
4
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
|
+
|
5
22
|
class SessionLimitableUser < User
|
6
23
|
devise :session_limitable
|
7
24
|
include ::Mongoid::Mappings if DEVISE_ORM == :mongoid
|
@@ -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.'
|