devise-security 0.15.0 → 0.18.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/LICENSE.txt +3 -1
- data/README.md +43 -24
- data/app/controllers/devise/paranoid_verification_code_controller.rb +26 -12
- data/app/controllers/devise/password_expired_controller.rb +23 -10
- data/config/locales/bg.yml +42 -0
- data/config/locales/by.yml +2 -0
- data/config/locales/cs.yml +6 -0
- data/config/locales/de.yml +4 -0
- data/config/locales/en.yml +3 -1
- data/config/locales/es.yml +13 -0
- data/config/locales/fa.yml +2 -0
- data/config/locales/fr.yml +15 -2
- data/config/locales/hi.yml +22 -20
- data/config/locales/it.yml +2 -0
- data/config/locales/ja.yml +13 -0
- data/config/locales/nl.yml +2 -0
- data/config/locales/pt.yml +2 -0
- data/config/locales/ru.yml +2 -0
- data/config/locales/tr.yml +26 -1
- data/config/locales/uk.yml +2 -0
- data/config/locales/zh_CN.yml +2 -0
- data/config/locales/zh_TW.yml +2 -0
- data/lib/devise-security/controllers/helpers.rb +25 -13
- data/lib/devise-security/hooks/expirable.rb +3 -3
- data/lib/devise-security/hooks/paranoid_verification.rb +1 -3
- data/lib/devise-security/hooks/password_expirable.rb +1 -3
- data/lib/devise-security/hooks/session_limitable.rb +10 -6
- data/lib/devise-security/models/compatibility/active_record_patch.rb +4 -3
- data/lib/devise-security/models/compatibility/mongoid_patch.rb +3 -2
- data/lib/devise-security/models/database_authenticatable_patch.rb +18 -10
- data/lib/devise-security/models/expirable.rb +6 -5
- data/lib/devise-security/models/paranoid_verification.rb +2 -2
- data/lib/devise-security/models/password_archivable.rb +3 -3
- data/lib/devise-security/models/secure_validatable.rb +62 -11
- data/lib/devise-security/orm/mongoid.rb +1 -1
- data/lib/devise-security/patches.rb +14 -8
- data/lib/devise-security/routes.rb +2 -3
- data/lib/devise-security/validators/password_complexity_validator.rb +53 -26
- data/lib/devise-security/version.rb +1 -1
- data/lib/devise-security.rb +15 -6
- data/lib/generators/devise_security/install_generator.rb +4 -6
- data/{test/tmp/config/initializers/devise-security.rb → lib/generators/templates/devise_security.rb} +9 -1
- data/test/controllers/test_paranoid_verification_code_controller.rb +133 -0
- data/test/controllers/test_password_expired_controller.rb +122 -99
- data/test/controllers/test_security_question_controller.rb +19 -37
- data/test/dummy/app/controllers/overrides/paranoid_verification_code_controller.rb +7 -0
- data/test/dummy/app/controllers/overrides/password_expired_controller.rb +17 -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 +5 -5
- 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 +7 -4
- data/test/dummy/config/application.rb +3 -7
- data/test/dummy/config/boot.rb +1 -1
- data/test/dummy/config/environment.rb +1 -1
- data/test/dummy/config/environments/test.rb +4 -13
- data/test/dummy/config/initializers/devise.rb +1 -5
- 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 +3 -1
- data/test/dummy/config.ru +1 -1
- data/test/dummy/db/migrate/20120508165529_create_tables.rb +5 -5
- 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_omniauth.rb +12 -3
- data/test/dummy/lib/shared_verification_fields.rb +1 -0
- data/test/dummy/log/test.log +44592 -1151
- data/test/i18n_test.rb +22 -0
- data/test/integration/test_paranoid_verification_code_workflow.rb +53 -0
- data/test/integration/test_password_expirable_workflow.rb +2 -6
- data/test/integration/test_session_limitable_workflow.rb +5 -3
- data/test/orm/active_record.rb +7 -7
- data/test/orm/mongoid.rb +2 -1
- data/test/support/integration_helpers.rb +10 -22
- data/test/support/mongoid.yml +1 -1
- data/test/test_compatibility.rb +2 -0
- data/test/test_complexity_validator.rb +247 -37
- data/test/test_database_authenticatable_patch.rb +146 -0
- data/test/test_helper.rb +11 -12
- data/test/test_install_generator.rb +2 -2
- data/test/test_paranoid_verification.rb +8 -9
- data/test/test_password_archivable.rb +34 -11
- data/test/test_password_expirable.rb +27 -27
- data/test/test_secure_validatable.rb +284 -50
- data/test/test_secure_validatable_overrides.rb +185 -0
- data/test/test_session_limitable.rb +9 -9
- data/{lib/generators/templates/devise-security.rb → test/tmp/config/initializers/devise_security.rb} +9 -1
- data/test/tmp/config/locales/devise.security_extension.by.yml +50 -0
- data/test/tmp/config/locales/devise.security_extension.cs.yml +46 -0
- data/test/tmp/config/locales/devise.security_extension.de.yml +4 -0
- data/test/tmp/config/locales/devise.security_extension.en.yml +3 -1
- data/test/tmp/config/locales/devise.security_extension.es.yml +22 -9
- data/test/tmp/config/locales/devise.security_extension.fa.yml +2 -0
- data/test/tmp/config/locales/devise.security_extension.fr.yml +15 -2
- data/test/tmp/config/locales/devise.security_extension.hi.yml +43 -0
- data/test/tmp/config/locales/devise.security_extension.it.yml +2 -0
- data/test/tmp/config/locales/devise.security_extension.ja.yml +13 -0
- data/test/tmp/config/locales/devise.security_extension.nl.yml +2 -0
- data/test/tmp/config/locales/devise.security_extension.pt.yml +2 -0
- data/test/tmp/config/locales/devise.security_extension.ru.yml +2 -0
- data/test/tmp/config/locales/devise.security_extension.tr.yml +26 -1
- data/test/tmp/config/locales/devise.security_extension.uk.yml +2 -0
- data/test/tmp/config/locales/devise.security_extension.zh_CN.yml +2 -0
- data/test/tmp/config/locales/devise.security_extension.zh_TW.yml +42 -0
- metadata +65 -45
- data/lib/devise-security/orm/active_record.rb +0 -20
- data/lib/devise-security/patches/confirmations_controller_captcha.rb +0 -23
- data/lib/devise-security/patches/confirmations_controller_security_question.rb +0 -26
- data/lib/devise-security/patches/passwords_controller_captcha.rb +0 -22
- data/lib/devise-security/patches/passwords_controller_security_question.rb +0 -25
- data/lib/devise-security/patches/registrations_controller_captcha.rb +0 -35
- data/lib/devise-security/patches/sessions_controller_captcha.rb +0 -26
- data/lib/devise-security/patches/unlocks_controller_captcha.rb +0 -22
- data/lib/devise-security/patches/unlocks_controller_security_question.rb +0 -25
- data/lib/devise-security/schema.rb +0 -66
- data/test/dummy/app/controllers/foos_controller.rb +0 -0
- data/test/dummy/app/models/secure_user.rb +0 -9
- data/test/dummy/lib/shared_user_without_email.rb +0 -28
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 30c17693a3331769b786cf6925dcce0b62087a894960309ad316189613b62291
|
|
4
|
+
data.tar.gz: defa2b29a2d67e7615062ab6bea7518b37b6f24ed4735016a4fca4ef860ffbd0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 54fa56d5e200c73e329d1f07eb1845ce2be695ffb4afa20f475d624fb6615f1583a161c8eec8fa5f84643b957a0d9e4d4d653d5f5071f7b73784bf843a520a70
|
|
7
|
+
data.tar.gz: 891fcf2b29571ee6fca9d667ddbc211cf27a5ba64e6048b33d3f63a6f395e02ef88d51a6c35da3bfe761b42c04bf1a57e118ae9bb46ebb22212eb85f9a0b3179
|
data/LICENSE.txt
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
Copyright (c)
|
|
1
|
+
Copyright (c) 2017-2022 Dillon Welch & Kevin Olbrich.
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2011-2017 Marco Scholl
|
|
2
4
|
|
|
3
5
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
6
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Devise Security
|
|
2
2
|
|
|
3
|
-
[](https://github.com/devise-security/devise-security/actions/workflows/test_suite.yml)
|
|
4
4
|
[](https://coveralls.io/github/devise-security/devise-security?branch=master)
|
|
5
5
|
[](https://codeclimate.com/github/devise-security/devise-security/maintainability)
|
|
6
6
|
|
|
7
|
-
A [Devise](https://github.com/
|
|
7
|
+
A [Devise](https://github.com/heartcombo/devise) extension to add additional
|
|
8
8
|
security features required by modern web applications. Forked from
|
|
9
9
|
[Devise Security Extension](https://github.com/phatworx/devise_security_extension)
|
|
10
10
|
|
|
@@ -37,9 +37,9 @@ automated mass creation and brute forcing of accounts harder)
|
|
|
37
37
|
|
|
38
38
|
## Getting started
|
|
39
39
|
|
|
40
|
-
Devise Security works with Devise on Rails
|
|
40
|
+
Devise Security works with Devise on Rails >= 5.2. You can add it to your
|
|
41
41
|
Gemfile after you successfully set up Devise (see
|
|
42
|
-
[Devise documentation](https://github.com/
|
|
42
|
+
[Devise documentation](https://github.com/heartcombo/devise)) with:
|
|
43
43
|
|
|
44
44
|
```ruby
|
|
45
45
|
gem 'devise-security'
|
|
@@ -54,7 +54,7 @@ rails generate devise_security:install
|
|
|
54
54
|
```
|
|
55
55
|
|
|
56
56
|
The generator adds optional configurations to
|
|
57
|
-
`config/initializers/
|
|
57
|
+
`config/initializers/devise_security.rb`. Enable the modules you wish to use in
|
|
58
58
|
the initializer you are ready to add Devise Security modules on top of Devise
|
|
59
59
|
modules to any of your Devise models:
|
|
60
60
|
|
|
@@ -89,6 +89,8 @@ Devise.setup do |config|
|
|
|
89
89
|
# config.expire_password_after = 3.months | true | false
|
|
90
90
|
|
|
91
91
|
# Need 1 char each of: A-Z, a-z, 0-9, and a punctuation mark or symbol
|
|
92
|
+
# You may use "digits" in place of "digit" and "symbols" in place of
|
|
93
|
+
# "symbol" based on your preference
|
|
92
94
|
# config.password_complexity = { digit: 1, lower: 1, symbol: 1, upper: 1 }
|
|
93
95
|
|
|
94
96
|
# Number of old passwords in archive
|
|
@@ -124,6 +126,12 @@ Devise.setup do |config|
|
|
|
124
126
|
# ==> Configuration for :expirable
|
|
125
127
|
# Time period for account expiry from last_activity_at
|
|
126
128
|
# config.expire_after = 90.days
|
|
129
|
+
|
|
130
|
+
# Allow passwords to be equal to email (false, true)
|
|
131
|
+
# config.allow_passwords_equal_to_email = false
|
|
132
|
+
|
|
133
|
+
# paranoid_verification will regenerate verification code after failed attempt
|
|
134
|
+
# config.paranoid_code_regenerate_after_attempt = 10
|
|
127
135
|
end
|
|
128
136
|
```
|
|
129
137
|
|
|
@@ -187,10 +195,10 @@ documentation there.
|
|
|
187
195
|
4. Add the captcha in the generated devise views for each controller you have
|
|
188
196
|
activated.
|
|
189
197
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
198
|
+
```erb
|
|
199
|
+
<p><%= captcha_tag %></p>
|
|
200
|
+
<p><%= text_field_tag :captcha %></p>
|
|
201
|
+
```
|
|
194
202
|
|
|
195
203
|
## Schema
|
|
196
204
|
|
|
@@ -231,6 +239,20 @@ create_table :the_resources do |t|
|
|
|
231
239
|
end
|
|
232
240
|
```
|
|
233
241
|
|
|
242
|
+
#### Bypassing session limitable
|
|
243
|
+
|
|
244
|
+
Sometimes it's useful to impersonate a user without authentication (e.g.
|
|
245
|
+
[administrator impersonating a user](https://github.com/heartcombo/devise/wiki/How-To:-Sign-in-as-another-user-if-you-are-an-admin)),
|
|
246
|
+
in this case the `session_limitable` strategy will log out the user, and if the
|
|
247
|
+
user logs in while the administrator is still logged in, the administrator will
|
|
248
|
+
be logged out.
|
|
249
|
+
|
|
250
|
+
For such cases the following can be used:
|
|
251
|
+
|
|
252
|
+
```ruby
|
|
253
|
+
sign_in(User.find(params[:id]), scope: :user, skip_session_limitable: true)
|
|
254
|
+
```
|
|
255
|
+
|
|
234
256
|
### Expirable
|
|
235
257
|
|
|
236
258
|
```ruby
|
|
@@ -303,8 +325,8 @@ end
|
|
|
303
325
|
|
|
304
326
|
## Requirements
|
|
305
327
|
|
|
306
|
-
- Devise (<https://github.com/
|
|
307
|
-
- Rails
|
|
328
|
+
- Devise (<https://github.com/heartcombo/devise>)
|
|
329
|
+
- Rails 5.2 onwards (<http://github.com/rails/rails>)
|
|
308
330
|
- recommendations:
|
|
309
331
|
- `autocomplete-off` (<http://github.com/phatworx/autocomplete-off>)
|
|
310
332
|
- `easy_captcha` (<http://github.com/phatworx/easy_captcha>)
|
|
@@ -356,28 +378,25 @@ See also
|
|
|
356
378
|
Standard tests can be invoked using `rake`. To run the tests against the
|
|
357
379
|
`mongoid` ORM, use `DEVISE_ORM=mongoid rake` while `mongodb` is running.
|
|
358
380
|
|
|
359
|
-
To locally simulate what travis-ci will run when you push code use:
|
|
360
|
-
|
|
361
|
-
```bash
|
|
362
|
-
gem install bundler -v '1.17.3'
|
|
363
|
-
BUNDLER_VERSION=1.17.3 wwtd
|
|
364
|
-
```
|
|
365
|
-
|
|
366
381
|
## Maintenance Policy
|
|
367
382
|
|
|
368
|
-
We are committed to
|
|
383
|
+
We are committed to maintaining support for `devise-security` for all normal or
|
|
369
384
|
security maintenance versions of the Ruby language
|
|
370
385
|
[as listed here](https://www.ruby-lang.org/en/downloads/branches/), and for the
|
|
371
386
|
Ruby on Rails framework
|
|
372
387
|
[as per their maintenance policy](https://rubyonrails.org/maintenance/).
|
|
373
388
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
In order to avoid introducing bugs caused by backwardly incompatible Ruby
|
|
389
|
+
To avoid introducing bugs caused by backwardly incompatible Ruby
|
|
377
390
|
language features, it is highly recommended that all development work be done
|
|
378
|
-
using the oldest supported
|
|
391
|
+
using the oldest supported Ruby version. The contents of the `.ruby-version`
|
|
379
392
|
file should reflect this.
|
|
380
393
|
|
|
381
394
|
## Copyright
|
|
382
395
|
|
|
383
|
-
Copyright (c)
|
|
396
|
+
Copyright (c) 2017-2023 Dillon Welch & Kevin Olbrich.
|
|
397
|
+
|
|
398
|
+
Copyright (c) 2011-2017 Marco Scholl as the project [`devise_security_extension`](https://github.com/phatworx/devise_security_extension).
|
|
399
|
+
|
|
400
|
+
This repo was created as a fork from [b2ee978a](https://github.com/phatworx/devise_security_extension/commit/b2ee978af7d49f0fb0e7271c6ac074dfb4d39353).
|
|
401
|
+
|
|
402
|
+
See LICENSE.txt for further details.
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class Devise::ParanoidVerificationCodeController < DeviseController
|
|
4
|
+
before_action :verify_requested_format!
|
|
4
5
|
skip_before_action :handle_paranoid_verification
|
|
5
|
-
|
|
6
|
+
before_action :skip_paranoid_verification, only: %i[show update]
|
|
7
|
+
prepend_before_action :authenticate_scope!, only: %i[show update]
|
|
6
8
|
|
|
7
9
|
def show
|
|
8
|
-
|
|
9
|
-
respond_with(resource)
|
|
10
|
-
else
|
|
11
|
-
redirect_to :root
|
|
12
|
-
end
|
|
10
|
+
respond_with(resource)
|
|
13
11
|
end
|
|
14
12
|
|
|
15
13
|
def update
|
|
@@ -17,20 +15,36 @@ class Devise::ParanoidVerificationCodeController < DeviseController
|
|
|
17
15
|
warden.session(scope)['paranoid_verify'] = false
|
|
18
16
|
set_flash_message :notice, :updated
|
|
19
17
|
bypass_sign_in resource, scope: scope
|
|
20
|
-
|
|
18
|
+
respond_with({}, location: after_paranoid_verification_code_update_path_for(resource))
|
|
21
19
|
else
|
|
22
20
|
respond_with(resource, action: :show)
|
|
23
21
|
end
|
|
24
22
|
end
|
|
25
23
|
|
|
24
|
+
# Allows you to customize where the user is redirected to after the update action
|
|
25
|
+
# successfully completes.
|
|
26
|
+
#
|
|
27
|
+
# Defaults to the request's original path, and then `root` if that is `nil`.
|
|
28
|
+
#
|
|
29
|
+
# @param resource [ActiveModel::Model] Devise `resource` model for logged in user.
|
|
30
|
+
#
|
|
31
|
+
# @return [String, Symbol] The path that the user will be redirected to.
|
|
32
|
+
def after_paranoid_verification_code_update_path_for(_resource)
|
|
33
|
+
stored_location_for(scope) || :root
|
|
34
|
+
end
|
|
35
|
+
|
|
26
36
|
private
|
|
27
37
|
|
|
38
|
+
def skip_paranoid_verification
|
|
39
|
+
return if !resource.nil? && resource.need_paranoid_verification?
|
|
40
|
+
|
|
41
|
+
redirect_to :root
|
|
42
|
+
end
|
|
43
|
+
|
|
28
44
|
def resource_params
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
params[scope].slice(:paranoid_verification_code)
|
|
33
|
-
end
|
|
45
|
+
permitted_params = %i[paranoid_verification_code]
|
|
46
|
+
|
|
47
|
+
params.require(resource_name).permit(*permitted_params)
|
|
34
48
|
end
|
|
35
49
|
|
|
36
50
|
def scope
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
class Devise::PasswordExpiredController < DeviseController
|
|
4
4
|
before_action :verify_requested_format!
|
|
5
5
|
skip_before_action :handle_password_change
|
|
6
|
-
before_action :skip_password_change, only: [
|
|
7
|
-
prepend_before_action :authenticate_scope!, only: [
|
|
6
|
+
before_action :skip_password_change, only: %i[show update]
|
|
7
|
+
prepend_before_action :authenticate_scope!, only: %i[show update]
|
|
8
8
|
|
|
9
9
|
def show
|
|
10
10
|
respond_with(resource)
|
|
@@ -20,32 +20,45 @@ class Devise::PasswordExpiredController < DeviseController
|
|
|
20
20
|
# @see https://github.com/devise-security/devise-security/pull/111
|
|
21
21
|
def update
|
|
22
22
|
resource.extend(Devise::Models::DatabaseAuthenticatablePatch)
|
|
23
|
-
|
|
23
|
+
resource.update_with_password(resource_params)
|
|
24
|
+
|
|
25
|
+
yield resource if block_given?
|
|
26
|
+
|
|
27
|
+
if resource.errors.empty?
|
|
24
28
|
warden.session(scope)['password_expired'] = false
|
|
25
29
|
set_flash_message :notice, :updated
|
|
26
30
|
bypass_sign_in resource, scope: scope
|
|
27
|
-
respond_with({}, location:
|
|
31
|
+
respond_with({}, location: after_password_expired_update_path_for(resource))
|
|
28
32
|
else
|
|
29
33
|
clean_up_passwords(resource)
|
|
30
34
|
respond_with(resource, action: :show)
|
|
31
35
|
end
|
|
32
36
|
end
|
|
33
37
|
|
|
38
|
+
# Allows you to customize where the user is sent to after the update action
|
|
39
|
+
# successfully completes.
|
|
40
|
+
#
|
|
41
|
+
# Defaults to the request's original path, and then `root` if that is `nil`.
|
|
42
|
+
#
|
|
43
|
+
# @param resource [ActiveModel::Model] Devise `resource` model for logged in user.
|
|
44
|
+
#
|
|
45
|
+
# @return [String, Symbol] The path that the user will be sent to.
|
|
46
|
+
def after_password_expired_update_path_for(_resource)
|
|
47
|
+
stored_location_for(scope) || :root
|
|
48
|
+
end
|
|
49
|
+
|
|
34
50
|
private
|
|
35
51
|
|
|
36
52
|
def skip_password_change
|
|
37
53
|
return if !resource.nil? && resource.need_change_password?
|
|
54
|
+
|
|
38
55
|
redirect_to :root
|
|
39
56
|
end
|
|
40
57
|
|
|
41
58
|
def resource_params
|
|
42
|
-
permitted_params = [
|
|
59
|
+
permitted_params = %i[current_password password password_confirmation]
|
|
43
60
|
|
|
44
|
-
|
|
45
|
-
params.require(resource_name).permit(*permitted_params)
|
|
46
|
-
else
|
|
47
|
-
params[scope].slice(*permitted_params)
|
|
48
|
-
end
|
|
61
|
+
params.require(resource_name).permit(*permitted_params)
|
|
49
62
|
end
|
|
50
63
|
|
|
51
64
|
def scope
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
bg:
|
|
2
|
+
errors:
|
|
3
|
+
messages:
|
|
4
|
+
taken_in_past: 'е използвана и преди.'
|
|
5
|
+
equal_to_current_password: 'трябва да е различна от настоящата парола.'
|
|
6
|
+
equal_to_email: 'трябва да е различна от e-mail адреса.'
|
|
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
|
+
updated: Кодът за потвърждение е приет
|
|
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: 'Вашия акаунт е затворен поради неактивност. Моля свържете се с администратор.'
|
data/config/locales/by.yml
CHANGED
|
@@ -3,6 +3,7 @@ by:
|
|
|
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: 'павінен утрымліваць хоць адну лічбу'
|
|
@@ -30,6 +31,7 @@ by:
|
|
|
30
31
|
paranoid_verify:
|
|
31
32
|
code_required: 'Калі ласка, увядзіце код, атрыманы ад нашай каманды падтрымкі'
|
|
32
33
|
paranoid_verification_code:
|
|
34
|
+
updated: Код спраўджання прыняты
|
|
33
35
|
show:
|
|
34
36
|
submit_verification_code: 'Увод кода пацверджання'
|
|
35
37
|
verification_code: 'Код пацверджання'
|
data/config/locales/cs.yml
CHANGED
|
@@ -3,18 +3,23 @@ cs:
|
|
|
3
3
|
messages:
|
|
4
4
|
taken_in_past: bylo již použito v minulosti.
|
|
5
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.
|
|
6
7
|
password_complexity:
|
|
7
8
|
digit:
|
|
8
9
|
one: musí obsahovat alespoň jednu číslici
|
|
10
|
+
few: musí obsahovat alespoň %{count} číslice
|
|
9
11
|
other: musí obsahovat alespoň %{count} číslice
|
|
10
12
|
lower:
|
|
11
13
|
one: musí obsahovat alespoň jedno malé písmeno
|
|
14
|
+
few: musí obsahovat alespoň %{count} malé písmena
|
|
12
15
|
other: musí obsahovat alespoň %{count} malé písmena
|
|
13
16
|
symbol:
|
|
14
17
|
one: musí obsahovat alespoň jedno interpunkční znaménko nebo symbol
|
|
18
|
+
few: musí obsahovat alespoň %{count} interpunkční znaménka nebo symboly
|
|
15
19
|
other: musí obsahovat alespoň %{count} interpunkční znaménka nebo symboly
|
|
16
20
|
upper:
|
|
17
21
|
one: musí obsahovat alespoň jedno velké písmeno
|
|
22
|
+
few: musí obsahovat alespoň %{count} velké písmena
|
|
18
23
|
other: musí obsahovat alespoň %{count} velké písmena
|
|
19
24
|
devise:
|
|
20
25
|
invalid_captcha: Chybná captcha.
|
|
@@ -22,6 +27,7 @@ cs:
|
|
|
22
27
|
paranoid_verify:
|
|
23
28
|
code_required: Zadejte kód, který poskytla naše podpora
|
|
24
29
|
paranoid_verification_code:
|
|
30
|
+
updated: Ověřovací kód přijat
|
|
25
31
|
show:
|
|
26
32
|
submit_verification_code: Odeslat ověřovací kód
|
|
27
33
|
verification_code: Ověřovací kód
|
data/config/locales/de.yml
CHANGED
|
@@ -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
|
|
@@ -18,8 +19,11 @@ de:
|
|
|
18
19
|
other: muss mindestens %{count} Großbuchstaben enthalten
|
|
19
20
|
devise:
|
|
20
21
|
invalid_captcha: 'Die Captcha-Eingabe ist nicht gültig.'
|
|
22
|
+
invalid_security_question: 'Die Antwort auf die Sicherheitsfrage war ungültig.'
|
|
21
23
|
paranoid_verify:
|
|
22
24
|
code_required: 'Bitte geben Sie den Code ein, den unser Support-Team zur Verfügung gestellt hat.'
|
|
25
|
+
paranoid_verification_code:
|
|
26
|
+
updated: Bestätigungscode akzeptiert
|
|
23
27
|
show:
|
|
24
28
|
submit_verification_code: Bestätigungscode eingeben
|
|
25
29
|
verification_code: Bestätigungscode
|
data/config/locales/en.yml
CHANGED
|
@@ -3,10 +3,11 @@ 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
|
|
9
|
-
other: must contain at least %{count}
|
|
10
|
+
other: must contain at least %{count} digits
|
|
10
11
|
lower:
|
|
11
12
|
one: must contain at least one lower-case letter
|
|
12
13
|
other: must contain at least %{count} lower-case letters
|
|
@@ -22,6 +23,7 @@ en:
|
|
|
22
23
|
paranoid_verify:
|
|
23
24
|
code_required: 'Please enter the code our support team provided'
|
|
24
25
|
paranoid_verification_code:
|
|
26
|
+
updated: Verification code accepted
|
|
25
27
|
show:
|
|
26
28
|
submit_verification_code: Submit verification code
|
|
27
29
|
verification_code: Verification code
|
data/config/locales/es.yml
CHANGED
|
@@ -3,6 +3,7 @@ es:
|
|
|
3
3
|
messages:
|
|
4
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
9
|
one: tiene que contener al menos un dígito
|
|
@@ -21,9 +22,21 @@ es:
|
|
|
21
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'
|
|
25
|
+
paranoid_verification_code:
|
|
26
|
+
updated: Se acepta el código de verificación
|
|
27
|
+
show:
|
|
28
|
+
submit_verification_code: Envíe el código de verificación
|
|
29
|
+
verification_code: Código de verificación
|
|
30
|
+
submit: Entregar
|
|
24
31
|
password_expired:
|
|
25
32
|
updated: 'Su nueva contraseña ha sido guardada.'
|
|
26
33
|
change_required: 'Su contraseña ha expirado. Por favor renueve su contraseña.'
|
|
34
|
+
show:
|
|
35
|
+
renew_your_password: Renueve su contraseña
|
|
36
|
+
current_password: Actual contraseña
|
|
37
|
+
new_password: Nueva contraseña
|
|
38
|
+
new_password_confirmation: Confirmar nueva contraseña
|
|
39
|
+
change_my_password: Cambiar mi contraseña
|
|
27
40
|
failure:
|
|
28
41
|
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
42
|
expired: 'Su cuenta ha expirado debido a inactividad. Por favor contacte al administrador de la aplicación.'
|
data/config/locales/fa.yml
CHANGED
|
@@ -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: باید حداقل یک رقم داشته باشد
|
|
@@ -22,6 +23,7 @@ fa:
|
|
|
22
23
|
paranoid_verify:
|
|
23
24
|
code_required: 'لطفاً کدی را که تیم پشتیبانی ما ارائه کرده است وارد کنید'
|
|
24
25
|
paranoid_verification_code:
|
|
26
|
+
updated: کد تأیید پذیرفته شد
|
|
25
27
|
show:
|
|
26
28
|
submit_verification_code: ارسال کد تاییدیه
|
|
27
29
|
verification_code: کد تاییدیه
|
data/config/locales/fr.yml
CHANGED
|
@@ -3,13 +3,14 @@ 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
|
|
9
10
|
other: doit contenir au moins %{count} chiffres
|
|
10
11
|
lower:
|
|
11
|
-
one: doit contenir au moins une lettre
|
|
12
|
-
other: doit contenir au moins %{count} lettres
|
|
12
|
+
one: doit contenir au moins une lettre minuscule
|
|
13
|
+
other: doit contenir au moins %{count} lettres minuscules
|
|
13
14
|
symbol:
|
|
14
15
|
one: doit contenir au moins un signe de ponctuation
|
|
15
16
|
other: doit contenir au moins %{count} signes de ponctuation
|
|
@@ -21,9 +22,21 @@ fr:
|
|
|
21
22
|
invalid_security_question: La réponse à la question de sécurité est invalide
|
|
22
23
|
paranoid_verify:
|
|
23
24
|
code_required: Veuillez entrer le code fourni par notre équipe de support
|
|
25
|
+
paranoid_verification_code:
|
|
26
|
+
updated: Code de vérification accepté
|
|
27
|
+
show:
|
|
28
|
+
submit_verification_code: Soumettre le code de vérification
|
|
29
|
+
verification_code: Code de vérification
|
|
30
|
+
submit: Soumettre
|
|
24
31
|
password_expired:
|
|
25
32
|
updated: Votre nouveau mot de passe est enregistré
|
|
26
33
|
change_required: Votre mot de passe a expiré. Veuillez en choisir un autre
|
|
34
|
+
show:
|
|
35
|
+
renew_your_password: Renouveler votre mot de passe
|
|
36
|
+
current_password: Mot de passe actuel
|
|
37
|
+
new_password: Nouveau mot de passe
|
|
38
|
+
new_password_confirmation: Confirmer le nouveau mot de passe
|
|
39
|
+
change_my_password: Changer mon mot de passe
|
|
27
40
|
failure:
|
|
28
41
|
session_limited: Vos identifiants de connexion ont été utilisés dans un autre navigateur. Veuillez vous reconnecter pour continuer dans ce navigateur
|
|
29
42
|
expired: Votre compte a expiré pour cause d'inactivité. Veuillez contacter l'administrateur du site
|
data/config/locales/hi.yml
CHANGED
|
@@ -2,40 +2,42 @@
|
|
|
2
2
|
hi:
|
|
3
3
|
errors:
|
|
4
4
|
messages:
|
|
5
|
-
taken_in_past: यह पासवर्ड, आपके द्वारा पूर्व मे प्रयोग किया जा चुका है
|
|
6
|
-
equal_to_current_password: नया पासवर्ड, वर्तमान पासवर्ड से भिन्न होना चाहिए
|
|
5
|
+
taken_in_past: यह पासवर्ड, आपके द्वारा पूर्व मे प्रयोग किया जा चुका है
|
|
6
|
+
equal_to_current_password: नया पासवर्ड, वर्तमान पासवर्ड से भिन्न होना चाहिए
|
|
7
|
+
equal_to_email: ईमेल से अलग होना चाहिए
|
|
7
8
|
password_complexity:
|
|
8
9
|
digit:
|
|
9
|
-
one: एक अंक होना चाहिए
|
|
10
|
-
other: कम से कम %{count} अंक होने चाहिए
|
|
10
|
+
one: एक अंक होना चाहिए
|
|
11
|
+
other: कम से कम %{count} अंक होने चाहिए
|
|
11
12
|
lower:
|
|
12
|
-
one: एक लोअर-केस अक्षर होना चाहिए
|
|
13
|
-
other: कम से कम %{count} अक्षर होने चाहिए
|
|
13
|
+
one: एक लोअर-केस अक्षर होना चाहिए
|
|
14
|
+
other: कम से कम %{count} अक्षर होने चाहिए
|
|
14
15
|
symbol:
|
|
15
|
-
one: एक चिन्ह होना चाहिए
|
|
16
|
-
other: कम से कम %{count} चिन्ह होने चाहिए
|
|
16
|
+
one: एक चिन्ह होना चाहिए
|
|
17
|
+
other: कम से कम %{count} चिन्ह होने चाहिए
|
|
17
18
|
upper:
|
|
18
|
-
one: एक अपर-केस अक्षर होना चाहिए
|
|
19
|
-
other: कम से कम %{count} अपर-केस अक्षर होने चाहिए
|
|
19
|
+
one: एक अपर-केस अक्षर होना चाहिए
|
|
20
|
+
other: कम से कम %{count} अपर-केस अक्षर होने चाहिए
|
|
20
21
|
devise:
|
|
21
22
|
invalid_captcha: अमान्य कॅप्टचा
|
|
22
23
|
invalid_security_question: अमान्य सुरक्षा उत्तर
|
|
23
24
|
paranoid_verify:
|
|
24
|
-
code_required: सपोर्ट टीम द्वारा दिया गया कोड डाले
|
|
25
|
+
code_required: सपोर्ट टीम द्वारा दिया गया कोड डाले
|
|
25
26
|
paranoid_verification_code:
|
|
27
|
+
updated: सत्यापन कोड स्वीकार किया गया
|
|
26
28
|
show:
|
|
27
|
-
submit_verification_code: वेरिफिकेशन कोड डाले
|
|
28
|
-
verification_code: वेरिफिकेशन कोड
|
|
29
|
-
submit: सबमिट
|
|
29
|
+
submit_verification_code: वेरिफिकेशन कोड डाले
|
|
30
|
+
verification_code: वेरिफिकेशन कोड
|
|
31
|
+
submit: सबमिट
|
|
30
32
|
password_expired:
|
|
31
33
|
updated: पासवर्ड अद्यतन किया गया
|
|
32
|
-
change_required: पासवर्ड अमान्य हो चुका, पासवर्ड बदले
|
|
34
|
+
change_required: पासवर्ड अमान्य हो चुका, पासवर्ड बदले
|
|
33
35
|
show:
|
|
34
|
-
renew_your_password: पासवर्ड बदले
|
|
36
|
+
renew_your_password: पासवर्ड बदले
|
|
35
37
|
current_password: वर्तमान पासवर्ड
|
|
36
|
-
new_password: नया पासवर्ड
|
|
37
|
-
new_password_confirmation: नए पासवर्ड की पुष्टि करें
|
|
38
|
-
change_my_password: पासवर्ड बदले
|
|
38
|
+
new_password: नया पासवर्ड
|
|
39
|
+
new_password_confirmation: नए पासवर्ड की पुष्टि करें
|
|
40
|
+
change_my_password: पासवर्ड बदले
|
|
39
41
|
failure:
|
|
40
|
-
session_limited: जानकारी, दूसरे ब्राउज़र में उपयोग की गयी थी जारी रखने फिर से साइन-इन करे
|
|
42
|
+
session_limited: जानकारी, दूसरे ब्राउज़र में उपयोग की गयी थी जारी रखने फिर से साइन-इन करे
|
|
41
43
|
expired: कोई गतिविधि न होने के कारण खाता बंद हो गया, सिस्टम व्यवस्थापक से संपर्क करें
|
data/config/locales/it.yml
CHANGED
|
@@ -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
|
|
@@ -22,6 +23,7 @@ it:
|
|
|
22
23
|
paranoid_verify:
|
|
23
24
|
code_required: 'Inserisci il codice fornito dal nostro team di supporto'
|
|
24
25
|
paranoid_verification_code:
|
|
26
|
+
updated: Codice di verifica accettato
|
|
25
27
|
show:
|
|
26
28
|
submit_verification_code: Invia codice di verifica
|
|
27
29
|
verification_code: Codice di verifica
|
data/config/locales/ja.yml
CHANGED
|
@@ -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つの数字を含む必要があります。
|
|
@@ -21,9 +22,21 @@ ja:
|
|
|
21
22
|
invalid_security_question: 'セキュリティ質問に対する回答が不正です。'
|
|
22
23
|
paranoid_verify:
|
|
23
24
|
code_required: 'サポートチームに提供された認証コードを入力してください。'
|
|
25
|
+
paranoid_verification_code:
|
|
26
|
+
updated: 確認コードを受け入れました
|
|
27
|
+
show:
|
|
28
|
+
submit_verification_code: 確認コードを送信する
|
|
29
|
+
verification_code: 検証コード
|
|
30
|
+
submit: 参加する
|
|
24
31
|
password_expired:
|
|
25
32
|
updated: '新しいパスワードが保存されました。'
|
|
26
33
|
change_required: 'パスワードが期限切れです。パスワードを新しく設定してください。'
|
|
34
|
+
show:
|
|
35
|
+
renew_your_password: パスワードを更新する
|
|
36
|
+
current_password: 現在のパスワード
|
|
37
|
+
new_password: 新しいパスワード
|
|
38
|
+
new_password_confirmation: 新しいパスワードを確認
|
|
39
|
+
change_my_password: パスワードを変更する
|
|
27
40
|
failure:
|
|
28
41
|
session_limited: '他のブラウザでログインされました。このブラウザで続ける場合は、もう一度サインインしてください。'
|
|
29
42
|
expired: '活動がなかったため、あなたのアカウントは期限切れとなりました。サイト管理者に連絡してください。'
|
data/config/locales/nl.yml
CHANGED
|
@@ -3,6 +3,7 @@ nl:
|
|
|
3
3
|
messages:
|
|
4
4
|
taken_in_past: is eerder gebruikt.
|
|
5
5
|
equal_to_current_password: moet verschillen van het huidige wachtwoord.
|
|
6
|
+
equal_to_email: moet anders zijn dan de e-mail
|
|
6
7
|
password_complexity:
|
|
7
8
|
digit:
|
|
8
9
|
one: moet minimaal 1 cijfer bevatten
|
|
@@ -22,6 +23,7 @@ nl:
|
|
|
22
23
|
paranoid_verify:
|
|
23
24
|
code_required: Voer de aangeleverde code in
|
|
24
25
|
paranoid_verification_code:
|
|
26
|
+
updated: Verificatiecode geaccepteerd
|
|
25
27
|
show:
|
|
26
28
|
submit_verification_code: Verstuur verificatie code
|
|
27
29
|
verification_code: Verificatie code
|
data/config/locales/pt.yml
CHANGED
|
@@ -3,6 +3,7 @@ pt:
|
|
|
3
3
|
messages:
|
|
4
4
|
taken_in_past: 'foi usada anteriormente.'
|
|
5
5
|
equal_to_current_password: 'deve ser diferente da senha atual.'
|
|
6
|
+
equal_to_email: 'deve ser diferente do e-mail.'
|
|
6
7
|
password_complexity:
|
|
7
8
|
digit:
|
|
8
9
|
one: deve conter ao menos um dígito
|
|
@@ -22,6 +23,7 @@ pt:
|
|
|
22
23
|
paranoid_verify:
|
|
23
24
|
code_required: 'Por favor entre o código que a equipe de suporte enviou'
|
|
24
25
|
paranoid_verification_code:
|
|
26
|
+
updated: Código de verificação aceito
|
|
25
27
|
show:
|
|
26
28
|
submit_verification_code: Enviar código de verificação
|
|
27
29
|
verification_code: Código de verificação
|