devise-security 0.11.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 (87) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +38 -0
  4. data/.rubocop.yml +42 -0
  5. data/.travis.yml +14 -0
  6. data/Gemfile +2 -0
  7. data/Gemfile.lock +199 -0
  8. data/LICENSE.txt +20 -0
  9. data/README.md +263 -0
  10. data/Rakefile +26 -0
  11. data/app/controllers/devise/paranoid_verification_code_controller.rb +42 -0
  12. data/app/controllers/devise/password_expired_controller.rb +48 -0
  13. data/app/views/devise/paranoid_verification_code/show.html.erb +10 -0
  14. data/app/views/devise/password_expired/show.html.erb +16 -0
  15. data/config/locales/de.yml +16 -0
  16. data/config/locales/en.yml +17 -0
  17. data/config/locales/es.yml +17 -0
  18. data/config/locales/it.yml +10 -0
  19. data/devise-security.gemspec +34 -0
  20. data/lib/devise-security.rb +106 -0
  21. data/lib/devise-security/controllers/helpers.rb +96 -0
  22. data/lib/devise-security/hooks/expirable.rb +10 -0
  23. data/lib/devise-security/hooks/paranoid_verification.rb +5 -0
  24. data/lib/devise-security/hooks/password_expirable.rb +5 -0
  25. data/lib/devise-security/hooks/session_limitable.rb +27 -0
  26. data/lib/devise-security/models/database_authenticatable_patch.rb +26 -0
  27. data/lib/devise-security/models/expirable.rb +120 -0
  28. data/lib/devise-security/models/old_password.rb +4 -0
  29. data/lib/devise-security/models/paranoid_verification.rb +35 -0
  30. data/lib/devise-security/models/password_archivable.rb +80 -0
  31. data/lib/devise-security/models/password_expirable.rb +67 -0
  32. data/lib/devise-security/models/secure_validatable.rb +100 -0
  33. data/lib/devise-security/models/security_questionable.rb +18 -0
  34. data/lib/devise-security/models/session_limitable.rb +21 -0
  35. data/lib/devise-security/orm/active_record.rb +20 -0
  36. data/lib/devise-security/patches.rb +21 -0
  37. data/lib/devise-security/patches/confirmations_controller_captcha.rb +21 -0
  38. data/lib/devise-security/patches/confirmations_controller_security_question.rb +25 -0
  39. data/lib/devise-security/patches/controller_captcha.rb +17 -0
  40. data/lib/devise-security/patches/controller_security_question.rb +20 -0
  41. data/lib/devise-security/patches/passwords_controller_captcha.rb +20 -0
  42. data/lib/devise-security/patches/passwords_controller_security_question.rb +24 -0
  43. data/lib/devise-security/patches/registrations_controller_captcha.rb +33 -0
  44. data/lib/devise-security/patches/sessions_controller_captcha.rb +24 -0
  45. data/lib/devise-security/patches/unlocks_controller_captcha.rb +20 -0
  46. data/lib/devise-security/patches/unlocks_controller_security_question.rb +24 -0
  47. data/lib/devise-security/rails.rb +17 -0
  48. data/lib/devise-security/routes.rb +17 -0
  49. data/lib/devise-security/schema.rb +59 -0
  50. data/lib/devise-security/version.rb +3 -0
  51. data/lib/generators/devise-security/install_generator.rb +26 -0
  52. data/lib/generators/templates/devise-security.rb +38 -0
  53. data/test/dummy/Rakefile +6 -0
  54. data/test/dummy/app/controllers/application_controller.rb +2 -0
  55. data/test/dummy/app/controllers/captcha/sessions_controller.rb +3 -0
  56. data/test/dummy/app/controllers/foos_controller.rb +0 -0
  57. data/test/dummy/app/controllers/security_question/unlocks_controller.rb +3 -0
  58. data/test/dummy/app/models/.gitkeep +0 -0
  59. data/test/dummy/app/models/captcha_user.rb +5 -0
  60. data/test/dummy/app/models/secure_user.rb +3 -0
  61. data/test/dummy/app/models/security_question_user.rb +6 -0
  62. data/test/dummy/app/models/user.rb +5 -0
  63. data/test/dummy/app/views/foos/index.html.erb +0 -0
  64. data/test/dummy/config.ru +4 -0
  65. data/test/dummy/config/application.rb +24 -0
  66. data/test/dummy/config/boot.rb +6 -0
  67. data/test/dummy/config/database.yml +7 -0
  68. data/test/dummy/config/environment.rb +5 -0
  69. data/test/dummy/config/environments/test.rb +27 -0
  70. data/test/dummy/config/initializers/devise.rb +9 -0
  71. data/test/dummy/config/initializers/migration_class.rb +6 -0
  72. data/test/dummy/config/routes.rb +10 -0
  73. data/test/dummy/config/secrets.yml +3 -0
  74. data/test/dummy/db/migrate/20120508165529_create_tables.rb +33 -0
  75. data/test/dummy/db/migrate/20150402165590_add_verification_columns.rb +11 -0
  76. data/test/dummy/db/migrate/20150407162345_add_verification_attempt_column.rb +9 -0
  77. data/test/dummy/db/migrate/20160320162345_add_security_questions_fields.rb +8 -0
  78. data/test/test_captcha_controller.rb +58 -0
  79. data/test/test_helper.rb +13 -0
  80. data/test/test_install_generator.rb +16 -0
  81. data/test/test_paranoid_verification.rb +124 -0
  82. data/test/test_password_archivable.rb +61 -0
  83. data/test/test_password_expirable.rb +32 -0
  84. data/test/test_password_expired_controller.rb +29 -0
  85. data/test/test_secure_validatable.rb +85 -0
  86. data/test/test_security_question_controller.rb +60 -0
  87. metadata +315 -0
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+ class TestPasswordArchivable < ActiveSupport::TestCase
4
+ setup do
5
+ Devise.password_archiving_count = 2
6
+ end
7
+
8
+ teardown do
9
+ Devise.password_archiving_count = 1
10
+ end
11
+
12
+ def set_password(user, password)
13
+ user.password = password
14
+ user.password_confirmation = password
15
+ user.save!
16
+ end
17
+
18
+ test 'cannot use same password' do
19
+ user = User.create password: 'password1', password_confirmation: 'password1'
20
+
21
+ assert_raises(ActiveRecord::RecordInvalid) { set_password(user, 'password1') }
22
+ end
23
+
24
+ test 'cannot use archived passwords' do
25
+ assert_equal 2, Devise.password_archiving_count
26
+
27
+ user = User.create password: 'password1', password_confirmation: 'password1'
28
+ assert_equal 0, OldPassword.count
29
+
30
+ set_password(user, 'password2')
31
+ assert_equal 1, OldPassword.count
32
+
33
+ assert_raises(ActiveRecord::RecordInvalid) { set_password(user, 'password1') }
34
+
35
+ set_password(user, 'password3')
36
+ assert_equal 2, OldPassword.count
37
+
38
+ # rotate first password out of archive
39
+ assert set_password(user, 'password4')
40
+
41
+ # archive count was 2, so first password should work again
42
+ assert set_password(user, 'password1')
43
+ assert set_password(user, 'password2')
44
+ end
45
+
46
+ test 'the option should be dynamic during runtime' do
47
+ class ::User
48
+ def archive_count
49
+ 1
50
+ end
51
+ end
52
+
53
+ user = User.create password: 'password1', password_confirmation: 'password1'
54
+
55
+ assert set_password(user, 'password2')
56
+
57
+ assert_raises(ActiveRecord::RecordInvalid) { set_password(user, 'password2') }
58
+
59
+ assert_raises(ActiveRecord::RecordInvalid) { set_password(user, 'password1') }
60
+ end
61
+ end
@@ -0,0 +1,32 @@
1
+ require 'test_helper'
2
+
3
+ class TestPasswordArchivable < ActiveSupport::TestCase
4
+ setup do
5
+ Devise.expire_password_after = 2.month
6
+ end
7
+
8
+ teardown do
9
+ Devise.expire_password_after = 90.days
10
+ end
11
+
12
+ test 'password expires' do
13
+ user = User.create password: 'password1', password_confirmation: 'password1'
14
+ refute user.need_change_password?
15
+
16
+ user.update(password_changed_at: Time.now.ago(3.month))
17
+ assert user.need_change_password?
18
+ end
19
+
20
+ test 'override expire after at runtime' do
21
+ user = User.new password: 'password1', password_confirmation: 'password1'
22
+ user.instance_eval do
23
+ def expire_password_after
24
+ 4.month
25
+ end
26
+ end
27
+ user.password_changed_at = Time.now.ago(3.month)
28
+ refute user.need_change_password?
29
+ user.password_changed_at = Time.now.ago(5.month)
30
+ assert user.need_change_password?
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ class Devise::PasswordExpiredControllerTest < ActionController::TestCase
4
+ include Devise::Test::ControllerHelpers
5
+
6
+ setup do
7
+ @request.env["devise.mapping"] = Devise.mappings[:user]
8
+ @user = User.create(username: 'hello', email: 'hello@path.travel',
9
+ password: '1234', password_changed_at: 3.months.ago)
10
+
11
+ sign_in(@user)
12
+ end
13
+
14
+ test 'should render show' do
15
+ get :show
16
+ assert_includes @response.body, 'Renew your password'
17
+ end
18
+
19
+ test 'shold update password' do
20
+ put :update, params: {
21
+ user: {
22
+ current_password: '1234',
23
+ password: '12345',
24
+ password_confirmation: '12345'
25
+ }
26
+ }
27
+ assert_redirected_to root_path
28
+ end
29
+ end
@@ -0,0 +1,85 @@
1
+ require 'test_helper'
2
+ require 'rails_email_validator'
3
+
4
+ class TestSecureValidatable < ActiveSupport::TestCase
5
+ class User < ActiveRecord::Base
6
+ devise :database_authenticatable, :password_archivable,
7
+ :paranoid_verification, :password_expirable, :secure_validatable
8
+ end
9
+
10
+ setup do
11
+ Devise.password_regex = /(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/
12
+ end
13
+
14
+ test 'email cannot be blank' do
15
+ msg = "Email can't be blank"
16
+ user = User.create password: 'passWord1', password_confirmation: 'passWord1'
17
+ assert_equal(false, user.valid?)
18
+ assert_equal([msg], user.errors.full_messages)
19
+ assert_raises(ActiveRecord::RecordInvalid) do
20
+ user.save!
21
+ end
22
+ end
23
+
24
+ test 'email must be valid' do
25
+ msg = 'Email is invalid'
26
+ user = User.create email: 'bob', password: 'passWord1', password_confirmation: 'passWord1'
27
+ assert_equal(false, user.valid?)
28
+ assert_equal([msg], user.errors.full_messages)
29
+ assert_raises(ActiveRecord::RecordInvalid) do
30
+ user.save!
31
+ end
32
+ end
33
+
34
+ test 'valid both email and password' do
35
+ msgs = ['Email is invalid', 'Password must contain big, small letters and digits']
36
+ user = User.create email: 'bob@foo.tv', password: 'password1', password_confirmation: 'password1'
37
+ assert_equal(false, user.valid?)
38
+ assert_equal(msgs, user.errors.full_messages)
39
+ assert_raises(ActiveRecord::RecordInvalid) { user.save! }
40
+ end
41
+
42
+ test 'password must have capital letter' do
43
+ msgs = ['Email is invalid', 'Password must contain big, small letters and digits']
44
+ user = User.create email: 'bob@example.org', password: 'password1', password_confirmation: 'password1'
45
+ assert_equal(false, user.valid?)
46
+ assert_equal(msgs, user.errors.full_messages)
47
+ assert_raises(ActiveRecord::RecordInvalid) { user.save! }
48
+ end
49
+
50
+ test 'password must have lowercase letter' do
51
+ msg = 'Password must contain big, small letters and digits'
52
+ user = User.create email: 'bob@microsoft.com', password: 'PASSWORD1', password_confirmation: 'PASSWORD1'
53
+ assert_equal(false, user.valid?)
54
+ assert_equal([msg], user.errors.full_messages)
55
+ assert_raises(ActiveRecord::RecordInvalid) { user.save! }
56
+ end
57
+
58
+ test 'password must have number' do
59
+ msg = 'Password must contain big, small letters and digits'
60
+ user = User.create email: 'bob@microsoft.com', password: 'PASSword', password_confirmation: 'PASSword'
61
+ assert_equal(false, user.valid?)
62
+ assert_equal([msg], user.errors.full_messages)
63
+ assert_raises(ActiveRecord::RecordInvalid) { user.save! }
64
+ end
65
+
66
+ test 'password must have minimum length' do
67
+ msg = 'Password is too short (minimum is 6 characters)'
68
+ user = User.create email: 'bob@microsoft.com', password: 'Pa3zZ', password_confirmation: 'Pa3zZ'
69
+ assert_equal(false, user.valid?)
70
+ assert_equal([msg], user.errors.full_messages)
71
+ assert_raises(ActiveRecord::RecordInvalid) { user.save! }
72
+ end
73
+
74
+ test 'duplicate email validation message is added only once' do
75
+ options = {
76
+ email: 'test@example.org',
77
+ password: 'Test12345',
78
+ password_confirmation: 'Test12345',
79
+ }
80
+ SecureUser.create!(options)
81
+ user = SecureUser.new(options)
82
+ refute user.valid?
83
+ assert_equal ['Email has already been taken'], user.errors.full_messages
84
+ end
85
+ end
@@ -0,0 +1,60 @@
1
+ require 'test_helper'
2
+
3
+ class TestWithSecurityQuestion < ActionController::TestCase
4
+ include Devise::Test::ControllerHelpers
5
+ tests SecurityQuestion::UnlocksController
6
+
7
+ setup do
8
+ @user = User.create(username: 'hello', email: 'hello@path.travel',
9
+ password: '1234', security_question_answer: "Right Answer")
10
+ @user.lock_access!
11
+
12
+ @request.env["devise.mapping"] = Devise.mappings[:security_question_user]
13
+ end
14
+
15
+ test 'When security question is enabled, it is inserted correctly' do
16
+ post :create, params: {
17
+ security_question_user: {
18
+ email: @user.email
19
+ }, security_question_answer: "wrong answer"
20
+ }
21
+
22
+ assert_equal "The security question answer was invalid.", flash[:alert]
23
+ assert_redirected_to new_security_question_user_unlock_path
24
+ end
25
+
26
+ test 'When security_question is valid, it runs as normal' do
27
+ post :create, params: {
28
+ security_question_user: {
29
+ email: @user.email
30
+ }, security_question_answer: @user.security_question_answer
31
+ }
32
+
33
+ assert_equal "You will receive an email with instructions for how to unlock your account in a few minutes.", flash[:notice]
34
+ assert_redirected_to new_security_question_user_session_path
35
+ end
36
+ end
37
+
38
+ class TestWithoutSecurityQuestion < ActionController::TestCase
39
+ include Devise::Test::ControllerHelpers
40
+ tests Devise::UnlocksController
41
+
42
+ setup do
43
+ @user = User.create(username: 'hello', email: 'hello@path.travel',
44
+ password: '1234', security_question_answer: "Right Answer")
45
+ @user.lock_access!
46
+
47
+ @request.env["devise.mapping"] = Devise.mappings[:user]
48
+ end
49
+
50
+ test 'When security question is not enabled it is not inserted' do
51
+ post :create, params: {
52
+ user: {
53
+ email: @user.email
54
+ }
55
+ }
56
+
57
+ assert_equal "You will receive an email with instructions for how to unlock your account in a few minutes.", flash[:notice]
58
+ assert_redirected_to new_user_session_path
59
+ end
60
+ end
metadata ADDED
@@ -0,0 +1,315 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise-security
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.11.0
5
+ platform: ruby
6
+ authors:
7
+ - Marco Scholl
8
+ - Alexander Dreher
9
+ - Nate Bird
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2017-10-13 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: railties
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.6
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '6.0'
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 3.2.6
32
+ - - "<"
33
+ - !ruby/object:Gem::Version
34
+ version: '6.0'
35
+ - !ruby/object:Gem::Dependency
36
+ name: devise
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 3.0.0
42
+ - - "<"
43
+ - !ruby/object:Gem::Version
44
+ version: '5.0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 3.0.0
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 1.3.0
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '2.0'
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 1.3.0
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: sqlite3
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.3'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 1.3.10
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '1.3'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.3.10
95
+ - !ruby/object:Gem::Dependency
96
+ name: rubocop
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: minitest
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '5.0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '5.0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: easy_captcha
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ - !ruby/object:Gem::Dependency
138
+ name: rails_email_validator
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ - !ruby/object:Gem::Dependency
152
+ name: coveralls
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '0.8'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - "~>"
163
+ - !ruby/object:Gem::Version
164
+ version: '0.8'
165
+ description: An enterprise security extension for devise, trying to meet industrial
166
+ standard security demands for web applications.
167
+ email: natebird@gmail.com
168
+ executables: []
169
+ extensions: []
170
+ extra_rdoc_files: []
171
+ files:
172
+ - ".document"
173
+ - ".gitignore"
174
+ - ".rubocop.yml"
175
+ - ".travis.yml"
176
+ - Gemfile
177
+ - Gemfile.lock
178
+ - LICENSE.txt
179
+ - README.md
180
+ - Rakefile
181
+ - app/controllers/devise/paranoid_verification_code_controller.rb
182
+ - app/controllers/devise/password_expired_controller.rb
183
+ - app/views/devise/paranoid_verification_code/show.html.erb
184
+ - app/views/devise/password_expired/show.html.erb
185
+ - config/locales/de.yml
186
+ - config/locales/en.yml
187
+ - config/locales/es.yml
188
+ - config/locales/it.yml
189
+ - devise-security.gemspec
190
+ - lib/devise-security.rb
191
+ - lib/devise-security/controllers/helpers.rb
192
+ - lib/devise-security/hooks/expirable.rb
193
+ - lib/devise-security/hooks/paranoid_verification.rb
194
+ - lib/devise-security/hooks/password_expirable.rb
195
+ - lib/devise-security/hooks/session_limitable.rb
196
+ - lib/devise-security/models/database_authenticatable_patch.rb
197
+ - lib/devise-security/models/expirable.rb
198
+ - lib/devise-security/models/old_password.rb
199
+ - lib/devise-security/models/paranoid_verification.rb
200
+ - lib/devise-security/models/password_archivable.rb
201
+ - lib/devise-security/models/password_expirable.rb
202
+ - lib/devise-security/models/secure_validatable.rb
203
+ - lib/devise-security/models/security_questionable.rb
204
+ - lib/devise-security/models/session_limitable.rb
205
+ - lib/devise-security/orm/active_record.rb
206
+ - lib/devise-security/patches.rb
207
+ - lib/devise-security/patches/confirmations_controller_captcha.rb
208
+ - lib/devise-security/patches/confirmations_controller_security_question.rb
209
+ - lib/devise-security/patches/controller_captcha.rb
210
+ - lib/devise-security/patches/controller_security_question.rb
211
+ - lib/devise-security/patches/passwords_controller_captcha.rb
212
+ - lib/devise-security/patches/passwords_controller_security_question.rb
213
+ - lib/devise-security/patches/registrations_controller_captcha.rb
214
+ - lib/devise-security/patches/sessions_controller_captcha.rb
215
+ - lib/devise-security/patches/unlocks_controller_captcha.rb
216
+ - lib/devise-security/patches/unlocks_controller_security_question.rb
217
+ - lib/devise-security/rails.rb
218
+ - lib/devise-security/routes.rb
219
+ - lib/devise-security/schema.rb
220
+ - lib/devise-security/version.rb
221
+ - lib/generators/devise-security/install_generator.rb
222
+ - lib/generators/templates/devise-security.rb
223
+ - test/dummy/Rakefile
224
+ - test/dummy/app/controllers/application_controller.rb
225
+ - test/dummy/app/controllers/captcha/sessions_controller.rb
226
+ - test/dummy/app/controllers/foos_controller.rb
227
+ - test/dummy/app/controllers/security_question/unlocks_controller.rb
228
+ - test/dummy/app/models/.gitkeep
229
+ - test/dummy/app/models/captcha_user.rb
230
+ - test/dummy/app/models/secure_user.rb
231
+ - test/dummy/app/models/security_question_user.rb
232
+ - test/dummy/app/models/user.rb
233
+ - test/dummy/app/views/foos/index.html.erb
234
+ - test/dummy/config.ru
235
+ - test/dummy/config/application.rb
236
+ - test/dummy/config/boot.rb
237
+ - test/dummy/config/database.yml
238
+ - test/dummy/config/environment.rb
239
+ - test/dummy/config/environments/test.rb
240
+ - test/dummy/config/initializers/devise.rb
241
+ - test/dummy/config/initializers/migration_class.rb
242
+ - test/dummy/config/routes.rb
243
+ - test/dummy/config/secrets.yml
244
+ - test/dummy/db/migrate/20120508165529_create_tables.rb
245
+ - test/dummy/db/migrate/20150402165590_add_verification_columns.rb
246
+ - test/dummy/db/migrate/20150407162345_add_verification_attempt_column.rb
247
+ - test/dummy/db/migrate/20160320162345_add_security_questions_fields.rb
248
+ - test/test_captcha_controller.rb
249
+ - test/test_helper.rb
250
+ - test/test_install_generator.rb
251
+ - test/test_paranoid_verification.rb
252
+ - test/test_password_archivable.rb
253
+ - test/test_password_expirable.rb
254
+ - test/test_password_expired_controller.rb
255
+ - test/test_secure_validatable.rb
256
+ - test/test_security_question_controller.rb
257
+ homepage: https://github.com/devise-security/devise-security
258
+ licenses:
259
+ - MIT
260
+ metadata: {}
261
+ post_install_message:
262
+ rdoc_options: []
263
+ require_paths:
264
+ - lib
265
+ required_ruby_version: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: 2.1.0
270
+ required_rubygems_version: !ruby/object:Gem::Requirement
271
+ requirements:
272
+ - - ">="
273
+ - !ruby/object:Gem::Version
274
+ version: '0'
275
+ requirements: []
276
+ rubyforge_project:
277
+ rubygems_version: 2.6.13
278
+ signing_key:
279
+ specification_version: 4
280
+ summary: Security extension for devise
281
+ test_files:
282
+ - test/dummy/Rakefile
283
+ - test/dummy/app/controllers/application_controller.rb
284
+ - test/dummy/app/controllers/captcha/sessions_controller.rb
285
+ - test/dummy/app/controllers/foos_controller.rb
286
+ - test/dummy/app/controllers/security_question/unlocks_controller.rb
287
+ - test/dummy/app/models/.gitkeep
288
+ - test/dummy/app/models/captcha_user.rb
289
+ - test/dummy/app/models/secure_user.rb
290
+ - test/dummy/app/models/security_question_user.rb
291
+ - test/dummy/app/models/user.rb
292
+ - test/dummy/app/views/foos/index.html.erb
293
+ - test/dummy/config.ru
294
+ - test/dummy/config/application.rb
295
+ - test/dummy/config/boot.rb
296
+ - test/dummy/config/database.yml
297
+ - test/dummy/config/environment.rb
298
+ - test/dummy/config/environments/test.rb
299
+ - test/dummy/config/initializers/devise.rb
300
+ - test/dummy/config/initializers/migration_class.rb
301
+ - test/dummy/config/routes.rb
302
+ - test/dummy/config/secrets.yml
303
+ - test/dummy/db/migrate/20120508165529_create_tables.rb
304
+ - test/dummy/db/migrate/20150402165590_add_verification_columns.rb
305
+ - test/dummy/db/migrate/20150407162345_add_verification_attempt_column.rb
306
+ - test/dummy/db/migrate/20160320162345_add_security_questions_fields.rb
307
+ - test/test_captcha_controller.rb
308
+ - test/test_helper.rb
309
+ - test/test_install_generator.rb
310
+ - test/test_paranoid_verification.rb
311
+ - test/test_password_archivable.rb
312
+ - test/test_password_expirable.rb
313
+ - test/test_password_expired_controller.rb
314
+ - test/test_secure_validatable.rb
315
+ - test/test_security_question_controller.rb