devise_security_extension 0.7.2 → 0.10.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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +39 -0
  3. data/.rubocop.yml +38 -0
  4. data/Gemfile +2 -15
  5. data/Gemfile.lock +157 -112
  6. data/README.md +264 -0
  7. data/Rakefile +13 -29
  8. data/app/controllers/devise/paranoid_verification_code_controller.rb +42 -0
  9. data/app/controllers/devise/password_expired_controller.rb +20 -7
  10. data/app/views/devise/paranoid_verification_code/show.html.erb +10 -0
  11. data/config/locales/de.yml +3 -0
  12. data/config/locales/en.yml +7 -4
  13. data/config/locales/it.yml +10 -0
  14. data/devise_security_extension.gemspec +24 -88
  15. data/lib/devise_security_extension/controllers/helpers.rb +40 -7
  16. data/lib/devise_security_extension/hooks/paranoid_verification.rb +5 -0
  17. data/lib/devise_security_extension/hooks/password_expirable.rb +1 -1
  18. data/lib/devise_security_extension/hooks/session_limitable.rb +3 -2
  19. data/lib/devise_security_extension/models/database_authenticatable_patch.rb +26 -0
  20. data/lib/devise_security_extension/models/expirable.rb +1 -2
  21. data/lib/devise_security_extension/models/old_password.rb +1 -2
  22. data/lib/devise_security_extension/models/paranoid_verification.rb +35 -0
  23. data/lib/devise_security_extension/models/password_archivable.rb +11 -11
  24. data/lib/devise_security_extension/models/password_expirable.rb +9 -5
  25. data/lib/devise_security_extension/models/secure_validatable.rb +35 -9
  26. data/lib/devise_security_extension/models/security_questionable.rb +4 -1
  27. data/lib/devise_security_extension/patches/confirmations_controller_captcha.rb +3 -1
  28. data/lib/devise_security_extension/patches/confirmations_controller_security_question.rb +3 -1
  29. data/lib/devise_security_extension/patches/passwords_controller_captcha.rb +3 -1
  30. data/lib/devise_security_extension/patches/passwords_controller_security_question.rb +3 -1
  31. data/lib/devise_security_extension/patches/registrations_controller_captcha.rb +11 -8
  32. data/lib/devise_security_extension/patches/sessions_controller_captcha.rb +8 -5
  33. data/lib/devise_security_extension/patches/unlocks_controller_captcha.rb +3 -1
  34. data/lib/devise_security_extension/patches/unlocks_controller_security_question.rb +3 -1
  35. data/lib/devise_security_extension/routes.rb +4 -0
  36. data/lib/devise_security_extension/version.rb +3 -0
  37. data/lib/devise_security_extension.rb +20 -10
  38. data/lib/generators/devise_security_extension/install_generator.rb +16 -33
  39. data/lib/generators/templates/devise_security_extension.rb +38 -0
  40. data/test/dummy/Rakefile +6 -0
  41. data/test/dummy/app/controllers/application_controller.rb +2 -0
  42. data/test/dummy/app/controllers/foos_controller.rb +0 -0
  43. data/test/dummy/app/models/.gitkeep +0 -0
  44. data/test/dummy/app/models/user.rb +4 -0
  45. data/test/dummy/app/views/foos/index.html.erb +0 -0
  46. data/test/dummy/config/application.rb +24 -0
  47. data/test/dummy/config/boot.rb +6 -0
  48. data/test/dummy/config/database.yml +7 -0
  49. data/test/dummy/config/environment.rb +5 -0
  50. data/test/dummy/config/environments/test.rb +21 -0
  51. data/test/dummy/config/initializers/devise.rb +9 -0
  52. data/test/dummy/config/routes.rb +6 -0
  53. data/test/dummy/config/secrets.yml +3 -0
  54. data/test/dummy/config.ru +4 -0
  55. data/test/dummy/db/migrate/20120508165529_create_tables.rb +26 -0
  56. data/test/dummy/db/migrate/20150402165590_add_verification_columns.rb +11 -0
  57. data/test/dummy/db/migrate/20150407162345_add_verification_attempt_column.rb +9 -0
  58. data/test/test_helper.rb +10 -0
  59. data/test/test_install_generator.rb +16 -0
  60. data/test/test_paranoid_verification.rb +124 -0
  61. data/test/test_password_archivable.rb +61 -0
  62. data/test/test_password_expired_controller.rb +24 -0
  63. metadata +142 -62
  64. data/README.rdoc +0 -193
  65. data/VERSION +0 -1
  66. data/lib/devise_security_extension/models/security_question.rb +0 -3
  67. data/test/helper.rb +0 -17
  68. data/test/test_devise_security_extension.rb +0 -7
@@ -0,0 +1,124 @@
1
+ require 'test_helper'
2
+
3
+ class TestPasswordVerifiable < ActiveSupport::TestCase
4
+ test 'need to paranoid verify if code present' do
5
+ user = User.new
6
+ user.generate_paranoid_code
7
+ assert_equal(true, user.need_paranoid_verification?)
8
+ end
9
+
10
+ test 'no need to paranoid verify if no code' do
11
+ user = User.new
12
+ assert_equal(false, user.need_paranoid_verification?)
13
+ end
14
+
15
+ test 'generate code' do
16
+ user = User.new
17
+ user.generate_paranoid_code
18
+ assert_equal(0, user.paranoid_verification_attempt)
19
+ user.verify_code('wrong')
20
+ assert_equal(1, user.paranoid_verification_attempt)
21
+ user.generate_paranoid_code
22
+ assert_equal(0, user.paranoid_verification_attempt)
23
+ end
24
+
25
+ test "generate code must reset attempt counter" do
26
+ user = User.new
27
+ user.generate_paranoid_code
28
+ # default generator generates 5 char string
29
+ assert_equal(user.paranoid_verification_code.class, String)
30
+ assert_equal(user.paranoid_verification_code.length, 5)
31
+ end
32
+
33
+ test "when code match upon verify code, should mark record that it's no loger needed to verify" do
34
+ user = User.new(paranoid_verification_code: 'abcde')
35
+
36
+ assert_equal(true, user.need_paranoid_verification?)
37
+ user.verify_code('abcde')
38
+ assert_equal(false, user.need_paranoid_verification?)
39
+ end
40
+
41
+ test 'when code match upon verify code, should no longer need verification' do
42
+ user = User.new(paranoid_verification_code: 'abcde')
43
+
44
+ assert_equal(true, user.need_paranoid_verification?)
45
+ user.verify_code('abcde')
46
+ assert_equal(false, user.need_paranoid_verification?)
47
+ end
48
+
49
+ test 'when code match upon verification code, should set when verification was accepted' do
50
+ user = User.new(paranoid_verification_code: 'abcde')
51
+ user.verify_code('abcde')
52
+ assert_in_delta(4, Time.now.to_i, user.paranoid_verified_at.to_i)
53
+ end
54
+
55
+ test 'when code not match upon verify code, should still need verification' do
56
+ user = User.new(paranoid_verification_code: 'abcde')
57
+ user.verify_code('wrong')
58
+ assert_equal(true, user.need_paranoid_verification?)
59
+ end
60
+
61
+ test 'when code not match upon verification code, should not set paranoid_verified_at' do
62
+ user = User.new(paranoid_verification_code: 'abcde')
63
+ user.verify_code('wrong')
64
+ assert_equal(nil, user.paranoid_verified_at)
65
+ end
66
+
67
+ test 'when code not match upon verification code too many attempts should generate new code' do
68
+ original_regenerate = Devise.paranoid_code_regenerate_after_attempt
69
+ Devise.paranoid_code_regenerate_after_attempt = 2
70
+
71
+ user = User.create(paranoid_verification_code: 'abcde')
72
+ user.verify_code('wrong')
73
+ assert_equal 'abcde', user.paranoid_verification_code
74
+ user.verify_code('wrong-again')
75
+ assert_not_equal 'abcde', user.paranoid_verification_code
76
+
77
+ Devise.paranoid_code_regenerate_after_attempt = original_regenerate
78
+ end
79
+
80
+ test 'upon generating new code due to too many attempts reset attempt counter' do
81
+ original_regenerate = Devise.paranoid_code_regenerate_after_attempt
82
+ Devise.paranoid_code_regenerate_after_attempt = 3
83
+
84
+ user = User.create(paranoid_verification_code: 'abcde')
85
+ user.verify_code('wrong')
86
+ assert_equal 1, user.paranoid_verification_attempt
87
+ user.verify_code('wrong-again')
88
+ assert_equal 2, user.paranoid_verification_attempt
89
+ user.verify_code('WRONG!')
90
+ assert_equal 0, user.paranoid_verification_attempt
91
+
92
+ Devise.paranoid_code_regenerate_after_attempt = original_regenerate
93
+ end
94
+
95
+
96
+ test 'by default paranoid code regenerate should have 10 attempts' do
97
+ user = User.new(paranoid_verification_code: 'abcde')
98
+ assert_equal 10, user.paranoid_attempts_remaining
99
+ end
100
+
101
+ test 'paranoid_attempts_remaining should re-callculate how many attemps remains after each wrong attempt' do
102
+ original_regenerate = Devise.paranoid_code_regenerate_after_attempt
103
+ Devise.paranoid_code_regenerate_after_attempt = 2
104
+
105
+ user = User.create(paranoid_verification_code: 'abcde')
106
+ assert_equal 2, user.paranoid_attempts_remaining
107
+
108
+ user.verify_code('WRONG!')
109
+ assert_equal 1, user.paranoid_attempts_remaining
110
+
111
+ Devise.paranoid_code_regenerate_after_attempt = original_regenerate
112
+ end
113
+
114
+ test 'when code not match upon verification code too many times, reset paranoid_attempts_remaining' do
115
+ original_regenerate = Devise.paranoid_code_regenerate_after_attempt
116
+ Devise.paranoid_code_regenerate_after_attempt = 1
117
+
118
+ user = User.create(paranoid_verification_code: 'abcde')
119
+ user.verify_code('wrong') # at this point code was regenerated
120
+ assert_equal Devise.paranoid_code_regenerate_after_attempt, user.paranoid_attempts_remaining
121
+
122
+ Devise.paranoid_code_regenerate_after_attempt = original_regenerate
123
+ end
124
+ end
@@ -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,24 @@
1
+ require 'test_helper'
2
+
3
+ class Devise::PasswordExpiredControllerTest < ActionController::TestCase
4
+ include Devise::TestHelpers
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_template :show
17
+ end
18
+
19
+ test 'shold update password' do
20
+ put :update, user: { current_password: '1234', password: '12345',
21
+ password_confirmation: '12345' }
22
+ assert_redirected_to root_path
23
+ end
24
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_security_extension
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
5
- prerelease:
4
+ version: 0.10.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Marco Scholl
@@ -10,136 +9,174 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2012-11-22 00:00:00.000000000 Z
12
+ date: 2016-03-10 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
- name: rails
15
+ name: railties
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - ">="
21
19
  - !ruby/object:Gem::Version
22
- version: 3.1.1
20
+ version: 3.2.6
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: '5.0'
23
24
  type: :runtime
24
25
  prerelease: false
25
26
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
27
  requirements:
28
- - - ! '>='
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: 3.2.6
31
+ - - "<"
29
32
  - !ruby/object:Gem::Version
30
- version: 3.1.1
33
+ version: '5.0'
31
34
  - !ruby/object:Gem::Dependency
32
35
  name: devise
33
36
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
37
  requirements:
36
- - - ! '>='
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.0.0
41
+ - - "<"
37
42
  - !ruby/object:Gem::Version
38
- version: 2.0.0
43
+ version: '4.0'
39
44
  type: :runtime
40
45
  prerelease: false
41
46
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
47
  requirements:
44
- - - ! '>='
48
+ - - ">="
45
49
  - !ruby/object:Gem::Version
46
- version: 2.0.0
50
+ version: 3.0.0
51
+ - - "<"
52
+ - !ruby/object:Gem::Version
53
+ version: '4.0'
47
54
  - !ruby/object:Gem::Dependency
48
- name: rails_email_validator
55
+ name: bundler
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.3.0
61
+ - - "<"
62
+ - !ruby/object:Gem::Version
63
+ version: '2.0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.3.0
71
+ - - "<"
72
+ - !ruby/object:Gem::Version
73
+ version: '2.0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: sqlite3
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 1.3.10
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: 1.3.10
88
+ - !ruby/object:Gem::Dependency
89
+ name: rubocop
49
90
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
91
  requirements:
52
- - - ! '>='
92
+ - - "~>"
53
93
  - !ruby/object:Gem::Version
54
94
  version: '0'
55
95
  type: :development
56
96
  prerelease: false
57
97
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
98
  requirements:
60
- - - ! '>='
99
+ - - "~>"
61
100
  - !ruby/object:Gem::Version
62
101
  version: '0'
63
102
  - !ruby/object:Gem::Dependency
64
- name: easy_captcha
103
+ name: minitest
65
104
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
105
  requirements:
68
- - - ! '>='
106
+ - - ">="
69
107
  - !ruby/object:Gem::Version
70
108
  version: '0'
71
109
  type: :development
72
110
  prerelease: false
73
111
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
112
  requirements:
76
- - - ! '>='
113
+ - - ">="
77
114
  - !ruby/object:Gem::Version
78
115
  version: '0'
79
116
  - !ruby/object:Gem::Dependency
80
- name: bundler
117
+ name: easy_captcha
81
118
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
119
  requirements:
84
- - - ! '>='
120
+ - - "~>"
85
121
  - !ruby/object:Gem::Version
86
- version: 1.0.0
122
+ version: '0'
87
123
  type: :development
88
124
  prerelease: false
89
125
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
126
  requirements:
92
- - - ! '>='
127
+ - - "~>"
93
128
  - !ruby/object:Gem::Version
94
- version: 1.0.0
129
+ version: '0'
95
130
  - !ruby/object:Gem::Dependency
96
- name: jeweler
131
+ name: rails_email_validator
97
132
  requirement: !ruby/object:Gem::Requirement
98
- none: false
99
133
  requirements:
100
- - - ~>
134
+ - - "~>"
101
135
  - !ruby/object:Gem::Version
102
- version: 1.8.4
136
+ version: '0'
103
137
  type: :development
104
138
  prerelease: false
105
139
  version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
140
  requirements:
108
- - - ~>
141
+ - - "~>"
109
142
  - !ruby/object:Gem::Version
110
- version: 1.8.4
143
+ version: '0'
111
144
  description: An enterprise security extension for devise, trying to meet industrial
112
145
  standard security demands for web applications.
113
146
  email: team@phatworx.de
114
147
  executables: []
115
148
  extensions: []
116
- extra_rdoc_files:
117
- - LICENSE.txt
118
- - README.rdoc
149
+ extra_rdoc_files: []
119
150
  files:
120
- - .document
151
+ - ".document"
152
+ - ".gitignore"
153
+ - ".rubocop.yml"
121
154
  - Gemfile
122
155
  - Gemfile.lock
123
156
  - LICENSE.txt
124
- - README.rdoc
157
+ - README.md
125
158
  - Rakefile
126
- - VERSION
159
+ - app/controllers/devise/paranoid_verification_code_controller.rb
127
160
  - app/controllers/devise/password_expired_controller.rb
161
+ - app/views/devise/paranoid_verification_code/show.html.erb
128
162
  - app/views/devise/password_expired/show.html.erb
129
163
  - config/locales/de.yml
130
164
  - config/locales/en.yml
165
+ - config/locales/it.yml
131
166
  - devise_security_extension.gemspec
132
167
  - lib/devise_security_extension.rb
133
168
  - lib/devise_security_extension/controllers/helpers.rb
134
169
  - lib/devise_security_extension/hooks/expirable.rb
170
+ - lib/devise_security_extension/hooks/paranoid_verification.rb
135
171
  - lib/devise_security_extension/hooks/password_expirable.rb
136
172
  - lib/devise_security_extension/hooks/session_limitable.rb
173
+ - lib/devise_security_extension/models/database_authenticatable_patch.rb
137
174
  - lib/devise_security_extension/models/expirable.rb
138
175
  - lib/devise_security_extension/models/old_password.rb
176
+ - lib/devise_security_extension/models/paranoid_verification.rb
139
177
  - lib/devise_security_extension/models/password_archivable.rb
140
178
  - lib/devise_security_extension/models/password_expirable.rb
141
179
  - lib/devise_security_extension/models/secure_validatable.rb
142
- - lib/devise_security_extension/models/security_question.rb
143
180
  - lib/devise_security_extension/models/security_questionable.rb
144
181
  - lib/devise_security_extension/models/session_limitable.rb
145
182
  - lib/devise_security_extension/orm/active_record.rb
@@ -155,35 +192,78 @@ files:
155
192
  - lib/devise_security_extension/rails.rb
156
193
  - lib/devise_security_extension/routes.rb
157
194
  - lib/devise_security_extension/schema.rb
195
+ - lib/devise_security_extension/version.rb
158
196
  - lib/generators/devise_security_extension/install_generator.rb
159
- - test/helper.rb
160
- - test/test_devise_security_extension.rb
161
- homepage: http://github.com/phatworx/devise_security_extension
197
+ - lib/generators/templates/devise_security_extension.rb
198
+ - test/dummy/Rakefile
199
+ - test/dummy/app/controllers/application_controller.rb
200
+ - test/dummy/app/controllers/foos_controller.rb
201
+ - test/dummy/app/models/.gitkeep
202
+ - test/dummy/app/models/user.rb
203
+ - test/dummy/app/views/foos/index.html.erb
204
+ - test/dummy/config.ru
205
+ - test/dummy/config/application.rb
206
+ - test/dummy/config/boot.rb
207
+ - test/dummy/config/database.yml
208
+ - test/dummy/config/environment.rb
209
+ - test/dummy/config/environments/test.rb
210
+ - test/dummy/config/initializers/devise.rb
211
+ - test/dummy/config/routes.rb
212
+ - test/dummy/config/secrets.yml
213
+ - test/dummy/db/migrate/20120508165529_create_tables.rb
214
+ - test/dummy/db/migrate/20150402165590_add_verification_columns.rb
215
+ - test/dummy/db/migrate/20150407162345_add_verification_attempt_column.rb
216
+ - test/test_helper.rb
217
+ - test/test_install_generator.rb
218
+ - test/test_paranoid_verification.rb
219
+ - test/test_password_archivable.rb
220
+ - test/test_password_expired_controller.rb
221
+ homepage: https://github.com/phatworx/devise_security_extension
162
222
  licenses:
163
223
  - MIT
224
+ metadata: {}
164
225
  post_install_message:
165
226
  rdoc_options: []
166
227
  require_paths:
167
228
  - lib
168
229
  required_ruby_version: !ruby/object:Gem::Requirement
169
- none: false
170
230
  requirements:
171
- - - ! '>='
231
+ - - ">="
172
232
  - !ruby/object:Gem::Version
173
- version: '0'
174
- segments:
175
- - 0
176
- hash: 2180026344185734924
233
+ version: 1.9.3
177
234
  required_rubygems_version: !ruby/object:Gem::Requirement
178
- none: false
179
235
  requirements:
180
- - - ! '>='
236
+ - - ">="
181
237
  - !ruby/object:Gem::Version
182
238
  version: '0'
183
239
  requirements: []
184
- rubyforge_project:
185
- rubygems_version: 1.8.24
240
+ rubyforge_project: devise_security_extension
241
+ rubygems_version: 2.4.2
186
242
  signing_key:
187
- specification_version: 3
243
+ specification_version: 4
188
244
  summary: Security extension for devise
189
- test_files: []
245
+ test_files:
246
+ - test/dummy/Rakefile
247
+ - test/dummy/app/controllers/application_controller.rb
248
+ - test/dummy/app/controllers/foos_controller.rb
249
+ - test/dummy/app/models/.gitkeep
250
+ - test/dummy/app/models/user.rb
251
+ - test/dummy/app/views/foos/index.html.erb
252
+ - test/dummy/config.ru
253
+ - test/dummy/config/application.rb
254
+ - test/dummy/config/boot.rb
255
+ - test/dummy/config/database.yml
256
+ - test/dummy/config/environment.rb
257
+ - test/dummy/config/environments/test.rb
258
+ - test/dummy/config/initializers/devise.rb
259
+ - test/dummy/config/routes.rb
260
+ - test/dummy/config/secrets.yml
261
+ - test/dummy/db/migrate/20120508165529_create_tables.rb
262
+ - test/dummy/db/migrate/20150402165590_add_verification_columns.rb
263
+ - test/dummy/db/migrate/20150407162345_add_verification_attempt_column.rb
264
+ - test/test_helper.rb
265
+ - test/test_install_generator.rb
266
+ - test/test_paranoid_verification.rb
267
+ - test/test_password_archivable.rb
268
+ - test/test_password_expired_controller.rb
269
+ has_rdoc: