devise_security_extension 0.9.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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +39 -0
  3. data/.rubocop.yml +38 -0
  4. data/Gemfile +1 -5
  5. data/Gemfile.lock +144 -141
  6. data/README.md +37 -11
  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 +16 -7
  10. data/app/views/devise/paranoid_verification_code/show.html.erb +10 -0
  11. data/config/locales/de.yml +2 -0
  12. data/config/locales/en.yml +6 -4
  13. data/config/locales/it.yml +10 -0
  14. data/devise_security_extension.gemspec +24 -104
  15. data/lib/devise_security_extension.rb +18 -8
  16. data/lib/devise_security_extension/controllers/helpers.rb +39 -6
  17. data/lib/devise_security_extension/hooks/paranoid_verification.rb +5 -0
  18. data/lib/devise_security_extension/hooks/session_limitable.rb +1 -0
  19. data/lib/devise_security_extension/models/paranoid_verification.rb +35 -0
  20. data/lib/devise_security_extension/models/password_archivable.rb +3 -7
  21. data/lib/devise_security_extension/models/password_expirable.rb +9 -5
  22. data/lib/devise_security_extension/patches/confirmations_controller_captcha.rb +3 -1
  23. data/lib/devise_security_extension/patches/confirmations_controller_security_question.rb +3 -1
  24. data/lib/devise_security_extension/patches/passwords_controller_captcha.rb +3 -1
  25. data/lib/devise_security_extension/patches/passwords_controller_security_question.rb +3 -1
  26. data/lib/devise_security_extension/patches/registrations_controller_captcha.rb +5 -3
  27. data/lib/devise_security_extension/patches/sessions_controller_captcha.rb +5 -3
  28. data/lib/devise_security_extension/patches/unlocks_controller_captcha.rb +3 -1
  29. data/lib/devise_security_extension/patches/unlocks_controller_security_question.rb +3 -1
  30. data/lib/devise_security_extension/routes.rb +4 -0
  31. data/lib/devise_security_extension/version.rb +3 -0
  32. data/lib/generators/devise_security_extension/install_generator.rb +16 -33
  33. data/lib/generators/templates/devise_security_extension.rb +38 -0
  34. data/test/dummy/Rakefile +6 -0
  35. data/test/dummy/app/controllers/application_controller.rb +2 -0
  36. data/test/dummy/app/controllers/foos_controller.rb +0 -0
  37. data/test/dummy/app/models/user.rb +2 -1
  38. data/test/dummy/app/views/foos/index.html.erb +0 -0
  39. data/test/dummy/config/application.rb +4 -2
  40. data/test/dummy/config/boot.rb +1 -1
  41. data/test/dummy/config/environments/test.rb +4 -2
  42. data/test/dummy/config/initializers/devise.rb +4 -4
  43. data/test/dummy/config/routes.rb +6 -0
  44. data/test/dummy/config/secrets.yml +3 -0
  45. data/test/dummy/db/migrate/20120508165529_create_tables.rb +4 -4
  46. data/test/dummy/db/migrate/20150402165590_add_verification_columns.rb +11 -0
  47. data/test/dummy/db/migrate/20150407162345_add_verification_attempt_column.rb +9 -0
  48. data/test/test_helper.rb +10 -0
  49. data/test/test_install_generator.rb +16 -0
  50. data/test/test_paranoid_verification.rb +124 -0
  51. data/test/test_password_archivable.rb +35 -21
  52. data/test/test_password_expired_controller.rb +24 -0
  53. metadata +104 -34
  54. data/VERSION +0 -1
  55. data/lib/devise_security_extension/models/security_question.rb +0 -3
  56. data/test/helper.rb +0 -22
  57. data/test/test_devise_security_extension.rb +0 -6
@@ -0,0 +1,3 @@
1
+ test:
2
+ secret_token: 'fooooooooooo'
3
+ secret_key_base: 'fuuuuuuuuuuu'
@@ -5,15 +5,15 @@ class CreateTables < ActiveRecord::Migration
5
5
  t.string :facebook_token
6
6
 
7
7
  ## Database authenticatable
8
- t.string :email, :null => false, :default => ""
9
- t.string :encrypted_password, :null => false, :default => ""
8
+ t.string :email, null: false, default: ''
9
+ t.string :encrypted_password, null: false, default: ''
10
10
 
11
- t.timestamps
11
+ t.datetime :password_changed_at
12
+ t.timestamps null: false
12
13
  end
13
14
 
14
15
  create_table :old_passwords do |t|
15
16
  t.string :encrypted_password
16
- t.string :password_salt
17
17
 
18
18
  t.references :password_archivable, polymorphic: true
19
19
  end
@@ -0,0 +1,11 @@
1
+ class AddVerificationColumns < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :users, :paranoid_verification_code, :string
4
+ add_column :users, :paranoid_verified_at, :datetime
5
+ end
6
+
7
+ def self.down
8
+ remove_column :users, :paranoid_verification_code
9
+ remove_column :users, :paranoid_verified_at
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ class AddVerificationAttemptColumn < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :users, :paranoid_verification_attempt, :integer, default: 0
4
+ end
5
+
6
+ def self.down
7
+ remove_column :users, :paranoid_verification_attempt
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require 'dummy/config/environment'
4
+ require 'minitest/autorun'
5
+ require 'rails/test_help'
6
+ require 'devise_security_extension'
7
+
8
+ ActiveRecord::Migration.verbose = false
9
+ ActiveRecord::Base.logger = Logger.new(nil)
10
+ ActiveRecord::Migrator.migrate(File.expand_path('../dummy/db/migrate', __FILE__))
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+ require 'rails/generators/test_case'
3
+ require 'generators/devise_security_extension/install_generator'
4
+
5
+ class TestInstallGenerator < Rails::Generators::TestCase
6
+ tests DeviseSecurityExtension::Generators::InstallGenerator
7
+ destination File.expand_path('../tmp', __FILE__)
8
+ setup :prepare_destination
9
+
10
+ test 'Assert all files are properly created' do
11
+ run_generator
12
+ assert_file 'config/initializers/devise_security_extension.rb'
13
+ assert_file 'config/locales/devise.security_extension.en.yml'
14
+ assert_file 'config/locales/devise.security_extension.de.yml'
15
+ end
16
+ end
@@ -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
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require 'test_helper'
2
2
 
3
3
  class TestPasswordArchivable < ActiveSupport::TestCase
4
4
  setup do
@@ -9,15 +9,38 @@ class TestPasswordArchivable < ActiveSupport::TestCase
9
9
  Devise.password_archiving_count = 1
10
10
  end
11
11
 
12
- test "should respect maximum attempts configuration" do
13
- user = User.new
14
- user.password = 'password1'
15
- user.password_confirmation = 'password1'
12
+ def set_password(user, password)
13
+ user.password = password
14
+ user.password_confirmation = password
16
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
17
29
 
18
- user.password = 'password1'
19
- user.password_confirmation = 'password1'
20
- assert_raises(ActiveRecord::RecordInvalid) { user.save! }
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')
21
44
  end
22
45
 
23
46
  test 'the option should be dynamic during runtime' do
@@ -27,21 +50,12 @@ class TestPasswordArchivable < ActiveSupport::TestCase
27
50
  end
28
51
  end
29
52
 
30
- user = User.new
31
- user.password = 'password1'
32
- user.password_confirmation = 'password1'
33
- user.save!
53
+ user = User.create password: 'password1', password_confirmation: 'password1'
34
54
 
35
- user.password = 'password2'
36
- user.password_confirmation = 'password2'
37
- user.save!
55
+ assert set_password(user, 'password2')
38
56
 
39
- user.password = 'password2'
40
- user.password_confirmation = 'password2'
41
- assert_raises(ActiveRecord::RecordInvalid) { user.save! }
57
+ assert_raises(ActiveRecord::RecordInvalid) { set_password(user, 'password2') }
42
58
 
43
- user.password = 'password1'
44
- user.password_confirmation = 'password1'
45
- assert_raises(ActiveRecord::RecordInvalid) { user.save! }
59
+ assert_raises(ActiveRecord::RecordInvalid) { set_password(user, 'password1') }
46
60
  end
47
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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_security_extension
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marco Scholl
@@ -9,104 +9,136 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-02 00:00:00.000000000 Z
12
+ date: 2016-03-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rails
15
+ name: railties
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: 3.1.1
20
+ version: 3.2.6
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: '5.0'
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
24
27
  requirements:
25
28
  - - ">="
26
29
  - !ruby/object:Gem::Version
27
- version: 3.1.1
30
+ version: 3.2.6
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
28
34
  - !ruby/object:Gem::Dependency
29
35
  name: devise
30
36
  requirement: !ruby/object:Gem::Requirement
31
37
  requirements:
32
38
  - - ">="
33
39
  - !ruby/object:Gem::Version
34
- version: 2.0.0
40
+ version: 3.0.0
41
+ - - "<"
42
+ - !ruby/object:Gem::Version
43
+ version: '4.0'
35
44
  type: :runtime
36
45
  prerelease: false
37
46
  version_requirements: !ruby/object:Gem::Requirement
38
47
  requirements:
39
48
  - - ">="
40
49
  - !ruby/object:Gem::Version
41
- version: 2.0.0
50
+ version: 3.0.0
51
+ - - "<"
52
+ - !ruby/object:Gem::Version
53
+ version: '4.0'
42
54
  - !ruby/object:Gem::Dependency
43
- name: rails_email_validator
55
+ name: bundler
44
56
  requirement: !ruby/object:Gem::Requirement
45
57
  requirements:
46
58
  - - ">="
47
59
  - !ruby/object:Gem::Version
48
- version: '0'
60
+ version: 1.3.0
61
+ - - "<"
62
+ - !ruby/object:Gem::Version
63
+ version: '2.0'
49
64
  type: :development
50
65
  prerelease: false
51
66
  version_requirements: !ruby/object:Gem::Requirement
52
67
  requirements:
53
68
  - - ">="
54
69
  - !ruby/object:Gem::Version
55
- version: '0'
70
+ version: 1.3.0
71
+ - - "<"
72
+ - !ruby/object:Gem::Version
73
+ version: '2.0'
56
74
  - !ruby/object:Gem::Dependency
57
- name: easy_captcha
75
+ name: sqlite3
58
76
  requirement: !ruby/object:Gem::Requirement
59
77
  requirements:
60
- - - ">="
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
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
61
93
  - !ruby/object:Gem::Version
62
94
  version: '0'
63
95
  type: :development
64
96
  prerelease: false
65
97
  version_requirements: !ruby/object:Gem::Requirement
66
98
  requirements:
67
- - - ">="
99
+ - - "~>"
68
100
  - !ruby/object:Gem::Version
69
101
  version: '0'
70
102
  - !ruby/object:Gem::Dependency
71
- name: bundler
103
+ name: minitest
72
104
  requirement: !ruby/object:Gem::Requirement
73
105
  requirements:
74
106
  - - ">="
75
107
  - !ruby/object:Gem::Version
76
- version: 1.0.0
108
+ version: '0'
77
109
  type: :development
78
110
  prerelease: false
79
111
  version_requirements: !ruby/object:Gem::Requirement
80
112
  requirements:
81
113
  - - ">="
82
114
  - !ruby/object:Gem::Version
83
- version: 1.0.0
115
+ version: '0'
84
116
  - !ruby/object:Gem::Dependency
85
- name: jeweler
117
+ name: easy_captcha
86
118
  requirement: !ruby/object:Gem::Requirement
87
119
  requirements:
88
120
  - - "~>"
89
121
  - !ruby/object:Gem::Version
90
- version: 2.0.1
122
+ version: '0'
91
123
  type: :development
92
124
  prerelease: false
93
125
  version_requirements: !ruby/object:Gem::Requirement
94
126
  requirements:
95
127
  - - "~>"
96
128
  - !ruby/object:Gem::Version
97
- version: 2.0.1
129
+ version: '0'
98
130
  - !ruby/object:Gem::Dependency
99
- name: sqlite3
131
+ name: rails_email_validator
100
132
  requirement: !ruby/object:Gem::Requirement
101
133
  requirements:
102
- - - ">="
134
+ - - "~>"
103
135
  - !ruby/object:Gem::Version
104
136
  version: '0'
105
137
  type: :development
106
138
  prerelease: false
107
139
  version_requirements: !ruby/object:Gem::Requirement
108
140
  requirements:
109
- - - ">="
141
+ - - "~>"
110
142
  - !ruby/object:Gem::Version
111
143
  version: '0'
112
144
  description: An enterprise security extension for devise, trying to meet industrial
@@ -114,34 +146,37 @@ description: An enterprise security extension for devise, trying to meet industr
114
146
  email: team@phatworx.de
115
147
  executables: []
116
148
  extensions: []
117
- extra_rdoc_files:
118
- - LICENSE.txt
119
- - README.md
149
+ extra_rdoc_files: []
120
150
  files:
121
151
  - ".document"
152
+ - ".gitignore"
153
+ - ".rubocop.yml"
122
154
  - Gemfile
123
155
  - Gemfile.lock
124
156
  - LICENSE.txt
125
157
  - README.md
126
158
  - Rakefile
127
- - VERSION
159
+ - app/controllers/devise/paranoid_verification_code_controller.rb
128
160
  - app/controllers/devise/password_expired_controller.rb
161
+ - app/views/devise/paranoid_verification_code/show.html.erb
129
162
  - app/views/devise/password_expired/show.html.erb
130
163
  - config/locales/de.yml
131
164
  - config/locales/en.yml
165
+ - config/locales/it.yml
132
166
  - devise_security_extension.gemspec
133
167
  - lib/devise_security_extension.rb
134
168
  - lib/devise_security_extension/controllers/helpers.rb
135
169
  - lib/devise_security_extension/hooks/expirable.rb
170
+ - lib/devise_security_extension/hooks/paranoid_verification.rb
136
171
  - lib/devise_security_extension/hooks/password_expirable.rb
137
172
  - lib/devise_security_extension/hooks/session_limitable.rb
138
173
  - lib/devise_security_extension/models/database_authenticatable_patch.rb
139
174
  - lib/devise_security_extension/models/expirable.rb
140
175
  - lib/devise_security_extension/models/old_password.rb
176
+ - lib/devise_security_extension/models/paranoid_verification.rb
141
177
  - lib/devise_security_extension/models/password_archivable.rb
142
178
  - lib/devise_security_extension/models/password_expirable.rb
143
179
  - lib/devise_security_extension/models/secure_validatable.rb
144
- - lib/devise_security_extension/models/security_question.rb
145
180
  - lib/devise_security_extension/models/security_questionable.rb
146
181
  - lib/devise_security_extension/models/session_limitable.rb
147
182
  - lib/devise_security_extension/orm/active_record.rb
@@ -157,9 +192,15 @@ files:
157
192
  - lib/devise_security_extension/rails.rb
158
193
  - lib/devise_security_extension/routes.rb
159
194
  - lib/devise_security_extension/schema.rb
195
+ - lib/devise_security_extension/version.rb
160
196
  - lib/generators/devise_security_extension/install_generator.rb
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
161
201
  - test/dummy/app/models/.gitkeep
162
202
  - test/dummy/app/models/user.rb
203
+ - test/dummy/app/views/foos/index.html.erb
163
204
  - test/dummy/config.ru
164
205
  - test/dummy/config/application.rb
165
206
  - test/dummy/config/boot.rb
@@ -167,11 +208,17 @@ files:
167
208
  - test/dummy/config/environment.rb
168
209
  - test/dummy/config/environments/test.rb
169
210
  - test/dummy/config/initializers/devise.rb
211
+ - test/dummy/config/routes.rb
212
+ - test/dummy/config/secrets.yml
170
213
  - test/dummy/db/migrate/20120508165529_create_tables.rb
171
- - test/helper.rb
172
- - test/test_devise_security_extension.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
173
219
  - test/test_password_archivable.rb
174
- homepage: http://github.com/phatworx/devise_security_extension
220
+ - test/test_password_expired_controller.rb
221
+ homepage: https://github.com/phatworx/devise_security_extension
175
222
  licenses:
176
223
  - MIT
177
224
  metadata: {}
@@ -183,17 +230,40 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
230
  requirements:
184
231
  - - ">="
185
232
  - !ruby/object:Gem::Version
186
- version: '0'
233
+ version: 1.9.3
187
234
  required_rubygems_version: !ruby/object:Gem::Requirement
188
235
  requirements:
189
236
  - - ">="
190
237
  - !ruby/object:Gem::Version
191
238
  version: '0'
192
239
  requirements: []
193
- rubyforge_project:
194
- rubygems_version: 2.2.2
240
+ rubyforge_project: devise_security_extension
241
+ rubygems_version: 2.4.2
195
242
  signing_key:
196
243
  specification_version: 4
197
244
  summary: Security extension for devise
198
- 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
199
269
  has_rdoc: