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.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +3 -1
  3. data/README.md +43 -24
  4. data/app/controllers/devise/paranoid_verification_code_controller.rb +26 -12
  5. data/app/controllers/devise/password_expired_controller.rb +23 -10
  6. data/config/locales/bg.yml +42 -0
  7. data/config/locales/by.yml +2 -0
  8. data/config/locales/cs.yml +6 -0
  9. data/config/locales/de.yml +4 -0
  10. data/config/locales/en.yml +3 -1
  11. data/config/locales/es.yml +13 -0
  12. data/config/locales/fa.yml +2 -0
  13. data/config/locales/fr.yml +15 -2
  14. data/config/locales/hi.yml +22 -20
  15. data/config/locales/it.yml +2 -0
  16. data/config/locales/ja.yml +13 -0
  17. data/config/locales/nl.yml +2 -0
  18. data/config/locales/pt.yml +2 -0
  19. data/config/locales/ru.yml +2 -0
  20. data/config/locales/tr.yml +26 -1
  21. data/config/locales/uk.yml +2 -0
  22. data/config/locales/zh_CN.yml +2 -0
  23. data/config/locales/zh_TW.yml +2 -0
  24. data/lib/devise-security/controllers/helpers.rb +25 -13
  25. data/lib/devise-security/hooks/expirable.rb +3 -3
  26. data/lib/devise-security/hooks/paranoid_verification.rb +1 -3
  27. data/lib/devise-security/hooks/password_expirable.rb +1 -3
  28. data/lib/devise-security/hooks/session_limitable.rb +10 -6
  29. data/lib/devise-security/models/compatibility/active_record_patch.rb +4 -3
  30. data/lib/devise-security/models/compatibility/mongoid_patch.rb +3 -2
  31. data/lib/devise-security/models/database_authenticatable_patch.rb +18 -10
  32. data/lib/devise-security/models/expirable.rb +6 -5
  33. data/lib/devise-security/models/paranoid_verification.rb +2 -2
  34. data/lib/devise-security/models/password_archivable.rb +3 -3
  35. data/lib/devise-security/models/secure_validatable.rb +62 -11
  36. data/lib/devise-security/orm/mongoid.rb +1 -1
  37. data/lib/devise-security/patches.rb +14 -8
  38. data/lib/devise-security/routes.rb +2 -3
  39. data/lib/devise-security/validators/password_complexity_validator.rb +53 -26
  40. data/lib/devise-security/version.rb +1 -1
  41. data/lib/devise-security.rb +15 -6
  42. data/lib/generators/devise_security/install_generator.rb +4 -6
  43. data/{test/tmp/config/initializers/devise-security.rb → lib/generators/templates/devise_security.rb} +9 -1
  44. data/test/controllers/test_paranoid_verification_code_controller.rb +133 -0
  45. data/test/controllers/test_password_expired_controller.rb +122 -99
  46. data/test/controllers/test_security_question_controller.rb +19 -37
  47. data/test/dummy/app/controllers/overrides/paranoid_verification_code_controller.rb +7 -0
  48. data/test/dummy/app/controllers/overrides/password_expired_controller.rb +17 -0
  49. data/test/dummy/app/controllers/widgets_controller.rb +3 -0
  50. data/test/dummy/app/models/application_user_record.rb +2 -1
  51. data/test/dummy/app/models/mongoid/confirmable_fields.rb +2 -0
  52. data/test/dummy/app/models/mongoid/database_authenticable_fields.rb +4 -3
  53. data/test/dummy/app/models/mongoid/expirable_fields.rb +2 -0
  54. data/test/dummy/app/models/mongoid/lockable_fields.rb +2 -0
  55. data/test/dummy/app/models/mongoid/mappings.rb +4 -2
  56. data/test/dummy/app/models/mongoid/omniauthable_fields.rb +2 -0
  57. data/test/dummy/app/models/mongoid/paranoid_verification_fields.rb +2 -0
  58. data/test/dummy/app/models/mongoid/password_archivable_fields.rb +2 -0
  59. data/test/dummy/app/models/mongoid/password_expirable_fields.rb +2 -0
  60. data/test/dummy/app/models/mongoid/recoverable_fields.rb +2 -0
  61. data/test/dummy/app/models/mongoid/registerable_fields.rb +4 -2
  62. data/test/dummy/app/models/mongoid/rememberable_fields.rb +2 -0
  63. data/test/dummy/app/models/mongoid/secure_validatable_fields.rb +2 -0
  64. data/test/dummy/app/models/mongoid/security_questionable_fields.rb +2 -0
  65. data/test/dummy/app/models/mongoid/session_limitable_fields.rb +2 -0
  66. data/test/dummy/app/models/mongoid/timeoutable_fields.rb +2 -0
  67. data/test/dummy/app/models/mongoid/trackable_fields.rb +2 -0
  68. data/test/dummy/app/models/mongoid/validatable_fields.rb +2 -0
  69. data/test/dummy/app/models/paranoid_verification_user.rb +26 -0
  70. data/test/dummy/app/models/password_expired_user.rb +26 -0
  71. data/test/dummy/app/models/user.rb +5 -5
  72. data/test/dummy/app/models/widget.rb +1 -3
  73. data/test/dummy/app/mongoid/one_user.rb +5 -5
  74. data/test/dummy/app/mongoid/user_on_engine.rb +2 -2
  75. data/test/dummy/app/mongoid/user_on_main_app.rb +2 -2
  76. data/test/dummy/app/mongoid/user_with_validations.rb +3 -3
  77. data/test/dummy/app/mongoid/user_without_email.rb +7 -4
  78. data/test/dummy/config/application.rb +3 -7
  79. data/test/dummy/config/boot.rb +1 -1
  80. data/test/dummy/config/environment.rb +1 -1
  81. data/test/dummy/config/environments/test.rb +4 -13
  82. data/test/dummy/config/initializers/devise.rb +1 -5
  83. data/test/dummy/config/initializers/migration_class.rb +1 -8
  84. data/test/dummy/config/locales/en.yml +10 -0
  85. data/test/dummy/config/mongoid.yml +1 -1
  86. data/test/dummy/config/routes.rb +3 -1
  87. data/test/dummy/config.ru +1 -1
  88. data/test/dummy/db/migrate/20120508165529_create_tables.rb +5 -5
  89. data/test/dummy/lib/shared_expirable_columns.rb +1 -0
  90. data/test/dummy/lib/shared_security_questions_fields.rb +1 -0
  91. data/test/dummy/lib/shared_user.rb +17 -6
  92. data/test/dummy/lib/shared_user_without_omniauth.rb +12 -3
  93. data/test/dummy/lib/shared_verification_fields.rb +1 -0
  94. data/test/dummy/log/test.log +44592 -1151
  95. data/test/i18n_test.rb +22 -0
  96. data/test/integration/test_paranoid_verification_code_workflow.rb +53 -0
  97. data/test/integration/test_password_expirable_workflow.rb +2 -6
  98. data/test/integration/test_session_limitable_workflow.rb +5 -3
  99. data/test/orm/active_record.rb +7 -7
  100. data/test/orm/mongoid.rb +2 -1
  101. data/test/support/integration_helpers.rb +10 -22
  102. data/test/support/mongoid.yml +1 -1
  103. data/test/test_compatibility.rb +2 -0
  104. data/test/test_complexity_validator.rb +247 -37
  105. data/test/test_database_authenticatable_patch.rb +146 -0
  106. data/test/test_helper.rb +11 -12
  107. data/test/test_install_generator.rb +2 -2
  108. data/test/test_paranoid_verification.rb +8 -9
  109. data/test/test_password_archivable.rb +34 -11
  110. data/test/test_password_expirable.rb +27 -27
  111. data/test/test_secure_validatable.rb +284 -50
  112. data/test/test_secure_validatable_overrides.rb +185 -0
  113. data/test/test_session_limitable.rb +9 -9
  114. data/{lib/generators/templates/devise-security.rb → test/tmp/config/initializers/devise_security.rb} +9 -1
  115. data/test/tmp/config/locales/devise.security_extension.by.yml +50 -0
  116. data/test/tmp/config/locales/devise.security_extension.cs.yml +46 -0
  117. data/test/tmp/config/locales/devise.security_extension.de.yml +4 -0
  118. data/test/tmp/config/locales/devise.security_extension.en.yml +3 -1
  119. data/test/tmp/config/locales/devise.security_extension.es.yml +22 -9
  120. data/test/tmp/config/locales/devise.security_extension.fa.yml +2 -0
  121. data/test/tmp/config/locales/devise.security_extension.fr.yml +15 -2
  122. data/test/tmp/config/locales/devise.security_extension.hi.yml +43 -0
  123. data/test/tmp/config/locales/devise.security_extension.it.yml +2 -0
  124. data/test/tmp/config/locales/devise.security_extension.ja.yml +13 -0
  125. data/test/tmp/config/locales/devise.security_extension.nl.yml +2 -0
  126. data/test/tmp/config/locales/devise.security_extension.pt.yml +2 -0
  127. data/test/tmp/config/locales/devise.security_extension.ru.yml +2 -0
  128. data/test/tmp/config/locales/devise.security_extension.tr.yml +26 -1
  129. data/test/tmp/config/locales/devise.security_extension.uk.yml +2 -0
  130. data/test/tmp/config/locales/devise.security_extension.zh_CN.yml +2 -0
  131. data/test/tmp/config/locales/devise.security_extension.zh_TW.yml +42 -0
  132. metadata +65 -45
  133. data/lib/devise-security/orm/active_record.rb +0 -20
  134. data/lib/devise-security/patches/confirmations_controller_captcha.rb +0 -23
  135. data/lib/devise-security/patches/confirmations_controller_security_question.rb +0 -26
  136. data/lib/devise-security/patches/passwords_controller_captcha.rb +0 -22
  137. data/lib/devise-security/patches/passwords_controller_security_question.rb +0 -25
  138. data/lib/devise-security/patches/registrations_controller_captcha.rb +0 -35
  139. data/lib/devise-security/patches/sessions_controller_captcha.rb +0 -26
  140. data/lib/devise-security/patches/unlocks_controller_captcha.rb +0 -22
  141. data/lib/devise-security/patches/unlocks_controller_security_question.rb +0 -25
  142. data/lib/devise-security/schema.rb +0 -66
  143. data/test/dummy/app/controllers/foos_controller.rb +0 -0
  144. data/test/dummy/app/models/secure_user.rb +0 -9
  145. data/test/dummy/lib/shared_user_without_email.rb +0 -28
@@ -7,45 +7,38 @@ class TestWithSecurityQuestion < ActionController::TestCase
7
7
  tests SecurityQuestion::UnlocksController
8
8
 
9
9
  setup do
10
- @user = SecurityQuestionUser.create!(username: 'hello', email: 'hello@microsoft.com',
11
- password: 'A1234567z!', security_question_answer: 'Right Answer')
10
+ @user = SecurityQuestionUser.create!(
11
+ username: 'hello', email: 'hello@microsoft.com', password: 'A1234567z!', security_question_answer: 'Right Answer'
12
+ )
12
13
  @user.lock_access!
13
14
  assert @user.locked_at.present?
14
15
  @request.env['devise.mapping'] = Devise.mappings[:security_question_user]
15
16
  end
16
17
 
17
18
  test 'When security question is enabled, it is inserted correctly' do
18
- if Rails.gem_version.release <= Gem::Version.new('5.0')
19
- post :create, {
19
+ post(
20
+ :create,
21
+ params: {
22
+ security_question_answer: 'wrong answer',
20
23
  security_question_user: {
21
24
  email: @user.email
22
- }, security_question_answer: "wrong answer"
23
- }
24
- else
25
- post :create, params: {
26
- security_question_user: {
27
- email: @user.email
28
- }, security_question_answer: "wrong answer"
25
+ }
29
26
  }
30
- end
27
+ )
31
28
  assert_equal I18n.t('devise.invalid_security_question'), flash[:alert]
32
29
  assert_redirected_to new_security_question_user_unlock_path
33
30
  end
34
31
 
35
32
  test 'When security_question is valid, it runs as normal' do
36
- if Rails.gem_version.release <= Gem::Version.new('5.0')
37
- post :create, {
38
- security_question_user: {
39
- email: @user.email
40
- }, security_question_answer: @user.security_question_answer
41
- }
42
- else
43
- post :create, params: {
33
+ post(
34
+ :create,
35
+ params: {
36
+ security_question_answer: @user.security_question_answer,
44
37
  security_question_user: {
45
38
  email: @user.email
46
- }, security_question_answer: @user.security_question_answer
39
+ }
47
40
  }
48
- end
41
+ )
49
42
 
50
43
  assert_equal I18n.t('devise.unlocks.send_instructions'), flash[:notice]
51
44
  assert_redirected_to new_security_question_user_session_path
@@ -57,26 +50,15 @@ class TestWithoutSecurityQuestion < ActionController::TestCase
57
50
  tests Devise::UnlocksController
58
51
 
59
52
  setup do
60
- @user = User.create(username: 'hello', email: 'hello@path.travel',
61
- password: '1234', security_question_answer: 'Right Answer')
53
+ @user = User.create(
54
+ username: 'hello', email: 'hello@path.travel', password: '1234', security_question_answer: 'Right Answer'
55
+ )
62
56
  @user.lock_access!
63
57
  @request.env['devise.mapping'] = Devise.mappings[:user]
64
58
  end
65
59
 
66
60
  test 'When security question is not enabled it is not inserted' do
67
- if Rails.gem_version.release <= Gem::Version.new('5.0')
68
- post :create, {
69
- user: {
70
- email: @user.email
71
- }
72
- }
73
- else
74
- post :create, params: {
75
- user: {
76
- email: @user.email
77
- }
78
- }
79
- end
61
+ post :create, params: { user: { email: @user.email } }
80
62
 
81
63
  assert_equal I18n.t('devise.unlocks.send_instructions'), flash[:notice]
82
64
  assert_redirected_to new_user_session_path
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Overrides::ParanoidVerificationCodeController < Devise::ParanoidVerificationCodeController
4
+ def after_paranoid_verification_code_update_path_for(_)
5
+ '/cats'
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Overrides::PasswordExpiredController < Devise::PasswordExpiredController
4
+ def update
5
+ super do |resource|
6
+ @update_block_called = true
7
+ end
8
+ end
9
+
10
+ def after_password_expired_update_path_for(_)
11
+ '/cookies'
12
+ end
13
+
14
+ def update_block_called?
15
+ @update_block_called == true
16
+ end
17
+ end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class WidgetsController < ApplicationController
2
4
  before_action :authenticate_user!
5
+
3
6
  def show
4
7
  render plain: 'success'
5
8
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  if DEVISE_ORM == :active_record
3
- class ApplicationUserRecord < ActiveRecord::Base
4
+ class ApplicationUserRecord < ApplicationRecord
4
5
  self.table_name = 'users'
5
6
  end
6
7
  else
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ConfirmableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DatabaseAuthenticatableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -6,10 +8,9 @@ module DatabaseAuthenticatableFields
6
8
 
7
9
  ## Database authenticatable
8
10
  field :username, type: String
9
- field :email, type: String, default: ""
10
- #validates_presence_of :email
11
+ field :email, type: String, default: ''
11
12
 
12
- field :encrypted_password, type: String, default: ""
13
+ field :encrypted_password, type: String, default: ''
13
14
  validates_presence_of :encrypted_password
14
15
 
15
16
  include Mongoid::Timestamps
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ExpirableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LockableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,11 +1,13 @@
1
- Dir[File.expand_path("*_fields.rb", __dir__)].each { |f| require_relative f }
1
+ # frozen_string_literal: true
2
+
3
+ Dir[File.expand_path('*_fields.rb', __dir__)].each { |f| require_relative f }
2
4
 
3
5
  module Mongoid
4
6
  module Mappings
5
7
  extend ::ActiveSupport::Concern
6
8
 
7
9
  included do
8
- self.devise_modules.each do |devise_module_name|
10
+ devise_modules.each do |devise_module_name|
9
11
  include "#{devise_module_name.to_s.classify}Fields".constantize
10
12
  end
11
13
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OmniauthableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ParanoidVerificationFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PasswordArchivableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PasswordExpirableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RecoverableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RegisterableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -5,10 +7,10 @@ module RegisterableFields
5
7
  include Mongoid::Document
6
8
 
7
9
  ## Database authenticatable
8
- field :email, type: String, default: ""
10
+ field :email, type: String, default: ''
9
11
  validates_presence_of :email
10
12
 
11
- field :encrypted_password, type: String, default: ""
13
+ field :encrypted_password, type: String, default: ''
12
14
  validates_presence_of :encrypted_password
13
15
 
14
16
  field :password_changed_at, type: Time
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RememberableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SecureValidatableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SecurityQuestionableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SessionLimitableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TimeoutableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TrackableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ValidatableFields
2
4
  extend ::ActiveSupport::Concern
3
5
 
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ParanoidVerificationUser < ApplicationUserRecord
4
+ devise :database_authenticatable,
5
+ :confirmable,
6
+ :expirable,
7
+ :lockable,
8
+ :omniauthable,
9
+ :paranoid_verification,
10
+ :password_archivable,
11
+ :password_expirable,
12
+ :recoverable,
13
+ :registerable,
14
+ :rememberable,
15
+ :secure_validatable,
16
+ :security_questionable,
17
+ :session_limitable,
18
+ :timeoutable,
19
+ :trackable,
20
+ :validatable
21
+
22
+ if DEVISE_ORM == :mongoid
23
+ require './test/dummy/app/models/mongoid/mappings'
24
+ include ::Mongoid::Mappings
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PasswordExpiredUser < ApplicationUserRecord
4
+ devise :database_authenticatable,
5
+ :confirmable,
6
+ :expirable,
7
+ :lockable,
8
+ :omniauthable,
9
+ :paranoid_verification,
10
+ :password_archivable,
11
+ :password_expirable,
12
+ :recoverable,
13
+ :registerable,
14
+ :rememberable,
15
+ :secure_validatable,
16
+ :security_questionable,
17
+ :session_limitable,
18
+ :timeoutable,
19
+ :trackable,
20
+ :validatable
21
+
22
+ if DEVISE_ORM == :mongoid
23
+ require './test/dummy/app/models/mongoid/mappings'
24
+ include ::Mongoid::Mappings
25
+ end
26
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class User < ApplicationRecord
4
-
5
4
  devise :database_authenticatable,
6
5
  :confirmable,
7
6
  :expirable,
@@ -22,16 +21,17 @@ class User < ApplicationRecord
22
21
 
23
22
  has_many :widgets
24
23
 
25
- if DEVISE_ORM == :mongoid
24
+ case DEVISE_ORM
25
+ when :mongoid
26
26
  require './test/dummy/app/models/mongoid/mappings'
27
27
  include ::Mongoid::Mappings
28
-
28
+
29
29
  def some_method_calling_mongoid
30
30
  Mongoid.logger
31
31
  end
32
- elsif DEVISE_ORM == :active_record
32
+ when :active_record
33
33
  def some_method_calling_active_record
34
- ActiveRecord::Base.transaction {}
34
+ ActiveRecord::Base.transaction { break; }
35
35
  end
36
36
  end
37
37
  end
@@ -4,7 +4,5 @@ class Widget < ApplicationRecord
4
4
  belongs_to :user
5
5
  validates_associated :user
6
6
 
7
- if DEVISE_ORM == :mongoid
8
- field :name, type: String
9
- end
7
+ field :name, type: String if DEVISE_ORM == :mongoid
10
8
  end
@@ -11,16 +11,16 @@ class OneUser
11
11
  field :password_changed_at, type: Time
12
12
  index({ password_changed_at: 1 }, {})
13
13
 
14
- #field :paranoid_verification_code, type: String
15
- #field :paranoid_verified_at, type: Time
16
- #field :paranoid_verification_attempt, type: Integer, default: 0
14
+ field :paranoid_verification_code, type: String
15
+ field :paranoid_verified_at, type: Time
16
+ field :paranoid_verification_attempt, type: Integer, default: 0
17
17
 
18
18
  field :username, type: String
19
19
  field :facebook_token, type: String
20
20
 
21
21
  ## Database authenticatable
22
- field :email, type: String, default: ""
23
- field :encrypted_password, type: String, default: ""
22
+ field :email, type: String, default: ''
23
+ field :encrypted_password, type: String, default: ''
24
24
 
25
25
  ## Recoverable
26
26
  field :reset_password_token, type: String
@@ -11,8 +11,8 @@ class UserOnEngine
11
11
  field :facebook_token, type: String
12
12
 
13
13
  ## Database authenticatable
14
- field :email, type: String, default: ""
15
- field :encrypted_password, type: String, default: ""
14
+ field :email, type: String, default: ''
15
+ field :encrypted_password, type: String, default: ''
16
16
 
17
17
  ## Recoverable
18
18
  field :reset_password_token, type: String
@@ -11,8 +11,8 @@ class UserOnMainApp
11
11
  field :facebook_token, type: String
12
12
 
13
13
  ## Database authenticatable
14
- field :email, type: String, default: ""
15
- field :encrypted_password, type: String, default: ""
14
+ field :email, type: String, default: ''
15
+ field :encrypted_password, type: String, default: ''
16
16
 
17
17
  ## Recoverable
18
18
  field :reset_password_token, type: String
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "shared_user"
3
+ require 'shared_user'
4
4
 
5
5
  class UserWithValidations
6
6
  include Mongoid::Document
@@ -11,8 +11,8 @@ class UserWithValidations
11
11
  field :facebook_token, type: String
12
12
 
13
13
  ## Database authenticatable
14
- field :email, type: String, default: ""
15
- field :encrypted_password, type: String, default: ""
14
+ field :email, type: String, default: ''
15
+ field :encrypted_password, type: String, default: ''
16
16
 
17
17
  ## Recoverable
18
18
  field :reset_password_token, type: String
@@ -1,18 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "shared_user_without_email"
3
+ require 'shared_user_without_email'
4
4
 
5
5
  class UserWithoutEmail
6
6
  include Mongoid::Document
7
7
  include Shim
8
- include SharedUserWithoutEmail
8
+
9
+ devise :database_authenticatable, :lockable, :recoverable,
10
+ :registerable, :rememberable, :timeoutable,
11
+ :trackable
9
12
 
10
13
  field :username, type: String
11
14
  field :facebook_token, type: String
12
15
 
13
16
  ## Database authenticatable
14
- field :email, type: String, default: ""
15
- field :encrypted_password, type: String, default: ""
17
+ field :email, type: String, default: ''
18
+ field :encrypted_password, type: String, default: ''
16
19
 
17
20
  ## Recoverable
18
21
  field :reset_password_token, type: String
@@ -1,10 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../boot', __FILE__)
3
+ require File.expand_path('boot', __dir__)
4
4
 
5
5
  require 'action_mailer/railtie'
6
- require "action_mailer/railtie"
7
- require "rails/test_unit/railtie"
6
+ require 'rails/test_unit/railtie'
8
7
  DEVISE_ORM = ENV.fetch('DEVISE_ORM', 'active_record').to_sym
9
8
 
10
9
  Bundler.require :default, DEVISE_ORM
@@ -22,9 +21,6 @@ module RailsApp
22
21
  config.autoload_paths += ["#{config.root}/app/#{DEVISE_ORM}"]
23
22
  config.autoload_paths += ["#{config.root}/lib"]
24
23
 
25
- config.assets.enabled = true
26
-
27
- config.assets.version = '1.0'
28
- config.secret_key_base = 'fuuuuuuuuuuu'
24
+ config.secret_key_base = 'foobar'
29
25
  end
30
26
  end
@@ -3,6 +3,6 @@
3
3
  require 'rubygems'
4
4
 
5
5
  # Set up gems listed in the Gemfile.
6
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
6
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
7
7
 
8
8
  require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Load the rails application
4
- require File.expand_path('../application', __FILE__)
4
+ require File.expand_path('application', __dir__)
5
5
 
6
6
  # Initialize the rails application
7
7
  RailsApp::Application.initialize!
@@ -4,13 +4,8 @@ RailsApp::Application.configure do
4
4
  config.cache_classes = true
5
5
  config.eager_load = false
6
6
 
7
- if Rails.version > '5'
8
- config.public_file_server.enabled = true
9
- config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
10
- else
11
- config.serve_static_files = true
12
- config.static_cache_control = 'public, max-age=3600'
13
- end
7
+ config.public_file_server.enabled = true
8
+ config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
14
9
 
15
10
  config.consider_all_requests_local = true
16
11
  config.action_controller.perform_caching = false
@@ -27,11 +22,7 @@ RailsApp::Application.configure do
27
22
 
28
23
  config.active_support.test_order = :sorted
29
24
  config.log_level = :debug
30
- if Rails.gem_version >= Gem::Version.new('4.2') && Rails.gem_version.release < Gem::Version.new('5.0')
31
- config.active_record.raise_in_transactional_callbacks = true
32
- end
33
- if Rails.gem_version.release >= Gem::Version.new('5.2') && Rails.gem_version.release < Gem::Version.new('6.0')
34
- config.active_record.sqlite3.represent_boolean_as_integer = true
35
- end
25
+ config.active_record.sqlite3.represent_boolean_as_integer = true if Rails.gem_version.release >= Gem::Version.new('5.2') && Rails.gem_version.release < Gem::Version.new('6.0')
26
+ config.active_record.legacy_connection_handling = false if Rails.gem_version.release >= Gem::Version.new('6.1')
36
27
  end
37
28
  ActiveSupport::Deprecation.debug = true
@@ -8,10 +8,6 @@ Devise.setup do |config|
8
8
  config.secret_key = 'f08cf11a38906f531d2dfc9a2c2d671aa0021be806c21255d4'
9
9
  config.case_insensitive_keys = [:email]
10
10
  config.strip_whitespace_keys = [:email]
11
- config.password_complexity = {
12
- digit: 1,
13
- lower: 1,
14
- upper: 1,
15
- }
11
+ config.password_complexity = { digit: 1, lower: 1, upper: 1 }
16
12
  config.password_length = 7..128
17
13
  end
@@ -1,10 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if DEVISE_ORM == :active_record
4
- MIGRATION_CLASS =
5
- if Rails.gem_version >= Gem::Version.new('5.0')
6
- ActiveRecord::Migration[Rails.version.to_f]
7
- else
8
- ActiveRecord::Migration
9
- end
10
- end
3
+ MIGRATION_CLASS = ActiveRecord::Migration[Rails.version.to_f] if DEVISE_ORM == :active_record
@@ -0,0 +1,10 @@
1
+ en:
2
+ errors:
3
+ messages:
4
+ password_complexity:
5
+ letter:
6
+ one: must contain at least one letter
7
+ other: must contain at least %{count} letters
8
+ alnum:
9
+ one: must contain at least one letter or number
10
+ other: must contain at least %{count} letters or numbers
@@ -1,5 +1,5 @@
1
1
  test:
2
- <%= Mongoid::VERSION.to_i > 4 ? 'clients' : 'sessions' %>:
2
+ clients:
3
3
  default:
4
4
  database: devise_security_test
5
5
  hosts:
@@ -4,7 +4,9 @@ RailsApp::Application.routes.draw do
4
4
  devise_for :users
5
5
 
6
6
  devise_for :captcha_users, only: [:sessions], controllers: { sessions: 'captcha/sessions' }
7
- devise_for :security_question_users, only: [:sessions, :unlocks], controllers: { unlocks: 'security_question/unlocks' }
7
+ devise_for :password_expired_users, only: [:password_expired], controllers: { password_expired: 'overrides/password_expired' }
8
+ devise_for :paranoid_verification_users, only: [:verification_code], controllers: { paranoid_verification_code: 'overrides/paranoid_verification_code' }
9
+ devise_for :security_question_users, only: %i[sessions unlocks], controllers: { unlocks: 'security_question/unlocks' }
8
10
 
9
11
  resources :foos
10
12
  resource :widgets
data/test/dummy/config.ru CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  # This file is used by Rack-based servers to start the application.
4
4
 
5
- require ::File.expand_path('../config/environment', __FILE__)
5
+ require ::File.expand_path('config/environment', __dir__)
6
6
  run RailsApp::Application