devise-security 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
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