devise_security_extension 0.9.2 → 0.10.0

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