devise-secure_password 1.0.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +5 -5
  2. data/Changelog.md +43 -4
  3. data/Dockerfile +1 -1
  4. data/Dockerfile.prev +3 -3
  5. data/Gemfile +1 -0
  6. data/Gemfile.lock +215 -205
  7. data/README.md +33 -10
  8. data/app/controllers/devise/passwords_with_policy_controller.rb +55 -14
  9. data/app/views/devise/passwords_with_policy/edit.html.erb +5 -1
  10. data/config/locales/en.yml +50 -0
  11. data/devise-secure_password.gemspec +22 -23
  12. data/gemfiles/rails_6_0.gemfile +57 -0
  13. data/gemfiles/rails_6_0.gemfile.lock +347 -0
  14. data/gemfiles/rails_6_1.gemfile +57 -0
  15. data/gemfiles/rails_6_1.gemfile.lock +352 -0
  16. data/lib/devise/secure_password.rb +4 -9
  17. data/lib/devise/secure_password/controllers/devise_helpers.rb +4 -50
  18. data/lib/devise/secure_password/controllers/helpers.rb +58 -0
  19. data/lib/devise/secure_password/grammar.rb +13 -0
  20. data/lib/devise/secure_password/models/password_disallows_frequent_changes.rb +4 -2
  21. data/lib/devise/secure_password/models/password_disallows_frequent_reuse.rb +1 -0
  22. data/lib/devise/secure_password/models/password_has_required_content.rb +53 -15
  23. data/lib/devise/secure_password/models/password_requires_regular_updates.rb +1 -3
  24. data/lib/devise/secure_password/version.rb +1 -1
  25. data/lib/support/string/character_counter.rb +3 -1
  26. data/pkg/devise-secure_password-2.0.0.gem +0 -0
  27. metadata +66 -168
  28. data/coverage/assets/0.10.2/application.css +0 -799
  29. data/coverage/assets/0.10.2/application.js +0 -1707
  30. data/coverage/assets/0.10.2/colorbox/border.png +0 -0
  31. data/coverage/assets/0.10.2/colorbox/controls.png +0 -0
  32. data/coverage/assets/0.10.2/colorbox/loading.gif +0 -0
  33. data/coverage/assets/0.10.2/colorbox/loading_background.png +0 -0
  34. data/coverage/assets/0.10.2/favicon_green.png +0 -0
  35. data/coverage/assets/0.10.2/favicon_red.png +0 -0
  36. data/coverage/assets/0.10.2/favicon_yellow.png +0 -0
  37. data/coverage/assets/0.10.2/loading.gif +0 -0
  38. data/coverage/assets/0.10.2/magnify.png +0 -0
  39. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  40. data/coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  41. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  42. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  43. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  44. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  45. data/coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  46. data/coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  47. data/coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png +0 -0
  48. data/coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  49. data/coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png +0 -0
  50. data/coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png +0 -0
  51. data/coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  52. data/coverage/index.html +0 -4115
  53. data/devise-secure_password-1.0.0.gem +0 -0
  54. data/gemfiles/rails-5_0_6.gemfile +0 -17
  55. data/gemfiles/rails-5_0_6.gemfile.lock +0 -286
  56. data/gemfiles/rails-5_1_4.gemfile +0 -16
  57. data/gemfiles/rails-5_1_4.gemfile.lock +0 -282
  58. data/lib/devise/secure_password/controllers/active_helpers.rb +0 -45
  59. data/lib/devise/secure_password/hooks/password_requires_regular_updates.rb +0 -5
  60. data/pkg/devise-secure_password-1.0.3.gem +0 -0
  61. data/pkg/devise-secure_password-1.0.4.gem +0 -0
@@ -0,0 +1,58 @@
1
+ module Devise
2
+ module SecurePassword
3
+ module Controllers
4
+ module Helpers
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include Devise::SecurePassword::Grammar
9
+
10
+ before_action :authenticate_secure_password!, unless: :devise_controller?
11
+ end
12
+
13
+ def authenticate_secure_password_expired?
14
+ return false if devise_controller?
15
+
16
+ session[:devise_secure_password_expired] == true
17
+ end
18
+
19
+ def authenticate_secure_password!
20
+ return unless authenticate_secure_password_expired?
21
+
22
+ redirect_to authenticate_secure_password_path, alert: "#{error_string_for_password_expired}."
23
+ end
24
+
25
+ def authenticate_secure_password_path
26
+ return unless warden.user
27
+
28
+ :"edit_#{devise_secure_password_scope}_password_with_policy"
29
+ end
30
+
31
+ private
32
+
33
+ def devise_secure_password_scope
34
+ Devise::Mapping.find_scope!(warden.user)
35
+ end
36
+
37
+ def error_string_for_password_expired
38
+ I18n.t(
39
+ 'secure_password.password_requires_regular_updates.errors.messages.password_expired',
40
+ timeframe: precise_distance_of_time_in_words(warden.user.class.password_maximum_age)
41
+ )
42
+ end
43
+
44
+ def set_devise_secure_password_expired!
45
+ session[:devise_secure_password_expired] = warden.user.password_expired?
46
+ end
47
+
48
+ def unset_devise_secure_password_expired!
49
+ session.delete(:devise_secure_password_expired)
50
+ end
51
+
52
+ def warden_user_has_password_expiration?
53
+ warden&.user&.respond_to?(:password_expired?)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,13 @@
1
+ # lib/support/string/grammar.rb
2
+ #
3
+ module Devise
4
+ module SecurePassword
5
+ module Grammar
6
+ # distance_in_words without determiner words: about, almost, over, etc.
7
+ def precise_distance_of_time_in_words(from_time, to_time = 0, options = {})
8
+ precise_options = { scope: :'secure_password.datetime.precise_distance_in_words' }
9
+ distance_of_time_in_words(from_time, to_time, options.merge!(precise_options))
10
+ end
11
+ end
12
+ end
13
+ end
@@ -7,6 +7,8 @@ module Devise
7
7
 
8
8
  included do
9
9
  include ActionView::Helpers::DateHelper
10
+ include Devise::SecurePassword::Grammar
11
+
10
12
  validate :validate_password_frequent_change, if: :password_required?
11
13
 
12
14
  set_callback(:initialize, :before, :before_resource_initialized)
@@ -17,7 +19,7 @@ module Devise
17
19
  if encrypted_password_changed? && password_recent?
18
20
  error_string = I18n.t(
19
21
  'secure_password.password_disallows_frequent_changes.errors.messages.password_is_recent',
20
- timeframe: distance_of_time_in_words(self.class.password_minimum_age)
22
+ timeframe: precise_distance_of_time_in_words(self.class.password_minimum_age)
21
23
  )
22
24
  errors.add(:base, error_string)
23
25
  end
@@ -26,7 +28,7 @@ module Devise
26
28
  end
27
29
 
28
30
  def password_recent?
29
- last_password = previous_passwords.unscoped.last
31
+ last_password = previous_passwords.first
30
32
  last_password&.fresh?(self.class.password_minimum_age)
31
33
  end
32
34
 
@@ -54,6 +54,7 @@ module Devise
54
54
 
55
55
  def dirty_password?
56
56
  return false unless password_required?
57
+
57
58
  if Rails.version > '5.1'
58
59
  saved_change_to_encrypted_password?
59
60
  else
@@ -10,24 +10,40 @@ module Devise
10
10
  included do
11
11
  validate :validate_password_content, if: :password_required?
12
12
  validate :validate_password_confirmation_content, if: :password_required?
13
+ validate :validate_password_confirmation, if: :password_required?
13
14
  end
14
15
 
15
16
  def validate_password_content
16
17
  self.password ||= ''
18
+ errors.delete(:password)
17
19
  validate_password_content_for(:password)
18
20
  errors[:password].count.zero?
19
21
  end
20
22
 
21
23
  def validate_password_confirmation_content
22
- self.password_confirmation ||= ''
24
+ return true if password_confirmation.nil? # rails skips password_confirmation validation if nil!
25
+
26
+ errors.delete(:password_confirmation)
23
27
  validate_password_content_for(:password_confirmation)
24
28
  errors[:password_confirmation].count.zero?
25
29
  end
26
30
 
31
+ def validate_password_confirmation
32
+ return true if password_confirmation.nil? # rails skips password_confirmation validation if nil!
33
+
34
+ unless password == password_confirmation
35
+ human_attribute_name = self.class.human_attribute_name(:password)
36
+ errors.add(:password_confirmation, :confirmation, attribute: human_attribute_name)
37
+ end
38
+ errors[:password_confirmation].count.zero?
39
+ end
40
+
27
41
  def validate_password_content_for(attr)
28
42
  return unless respond_to?(attr) && !(password_obj = send(attr)).nil?
43
+
29
44
  ::Support::String::CharacterCounter.new.count(password_obj).each do |type, dict|
30
45
  error_string = case type
46
+ when :length then validate_length(dict[:count])
31
47
  when :unknown then validate_unknown(dict)
32
48
  else validate_type(type, dict)
33
49
  end
@@ -46,15 +62,33 @@ module Devise
46
62
 
47
63
  def validate_type(type, dict)
48
64
  type_total = dict.values.reduce(0, :+)
49
- error_string = if type_total < required_char_counts_for_type(type)[:min]
50
- error_string_for_length(type, :min)
51
- elsif type_total > required_char_counts_for_type(type)[:max]
52
- error_string_for_length(type, :max)
53
- end
54
- error_string
65
+ if type_total < required_char_counts_for_type(type)[:min]
66
+ error_string_for_type_length(type, :min)
67
+ elsif type_total > required_char_counts_for_type(type)[:max]
68
+ error_string_for_type_length(type, :max)
69
+ end
70
+ end
71
+
72
+ def validate_length(dict)
73
+ if dict < Devise.password_length.min
74
+ error_string_for_length(:min)
75
+ elsif dict > Devise.password_length.max
76
+ error_string_for_length(:max)
77
+ end
55
78
  end
56
79
 
57
- def error_string_for_length(type, threshold = :min)
80
+ def error_string_for_length(threshold = :min)
81
+ lang_key = case threshold
82
+ when :min then 'secure_password.password_has_required_content.errors.messages.minimum_length'
83
+ when :max then 'secure_password.password_has_required_content.errors.messages.maximum_length'
84
+ else return ''
85
+ end
86
+
87
+ count = required_char_counts_for_type(:length)[threshold]
88
+ I18n.t(lang_key, count: count, subject: I18n.t('secure_password.character', count: count))
89
+ end
90
+
91
+ def error_string_for_type_length(type, threshold = :min)
58
92
  lang_key = case threshold
59
93
  when :min then 'secure_password.password_has_required_content.errors.messages.minimum_characters'
60
94
  when :max then 'secure_password.password_has_required_content.errors.messages.maximum_characters'
@@ -62,23 +96,23 @@ module Devise
62
96
  end
63
97
 
64
98
  count = required_char_counts_for_type(type)[threshold]
65
- error_string = I18n.t(lang_key, count: count, type: type.to_s, subject: 'character'.pluralize(count))
66
- error_string + ' ' + dict_for_type(type)
99
+ error_string = I18n.t(lang_key, count: count, type: I18n.t("secure_password.types.#{type}"), subject: I18n.t('secure_password.character', count: count))
100
+ "#{error_string} #{dict_for_type(type)}"
67
101
  end
68
102
 
69
- def error_string_for_unknown_chars(total, chars = [])
103
+ def error_string_for_unknown_chars(count, chars = [])
70
104
  I18n.t(
71
105
  'secure_password.password_has_required_content.errors.messages.unknown_characters',
72
- count: total,
73
- subject: 'character'.pluralize(total)
74
- ) + " (#{chars.join('')})"
106
+ count: count,
107
+ subject: I18n.t('secure_password.character', count: count)
108
+ ) + " (#{chars.join})"
75
109
  end
76
110
 
77
111
  def dict_for_type(type)
78
112
  character_counter = ::Support::String::CharacterCounter.new
79
113
 
80
114
  case type
81
- when :special, :unknown then "(#{character_counter.count_hash[type].keys.join('')})"
115
+ when :special, :unknown then "(#{character_counter.count_hash[type].keys.join})"
82
116
  else
83
117
  "(#{character_counter.count_hash[type].keys.first}..#{character_counter.count_hash[type].keys.last})"
84
118
  end
@@ -101,6 +135,10 @@ module Devise
101
135
  def config
102
136
  {
103
137
  REQUIRED_CHAR_COUNTS: {
138
+ length: {
139
+ min: Devise.password_length.min,
140
+ max: Devise.password_length.max
141
+ },
104
142
  uppercase: {
105
143
  min: password_required_uppercase_count,
106
144
  max: LENGTH_MAX
@@ -3,8 +3,6 @@ module Devise
3
3
  module PasswordRequiresRegularUpdates
4
4
  extend ActiveSupport::Concern
5
5
 
6
- require 'devise/secure_password/hooks/password_requires_regular_updates'
7
-
8
6
  class ConfigurationError < RuntimeError; end
9
7
 
10
8
  included do
@@ -13,7 +11,7 @@ module Devise
13
11
  end
14
12
 
15
13
  def password_expired?
16
- last_password = previous_passwords.unscoped.last
14
+ last_password = previous_passwords.first
17
15
  inconsistent_password?(last_password) || last_password.stale?(self.class.password_maximum_age)
18
16
  end
19
17
 
@@ -1,5 +1,5 @@
1
1
  module Devise
2
2
  module SecurePassword
3
- VERSION = '1.0.5'.freeze
3
+ VERSION = '2.0.0'.freeze
4
4
  end
5
5
  end
@@ -7,6 +7,7 @@ module Support
7
7
 
8
8
  def initialize
9
9
  @count_hash = {
10
+ length: { count: 0 },
10
11
  uppercase: characters_to_dictionary(('A'..'Z').to_a),
11
12
  lowercase: characters_to_dictionary(('a'..'z').to_a),
12
13
  number: characters_to_dictionary(('0'..'9').to_a),
@@ -18,7 +19,8 @@ module Support
18
19
  def count(string)
19
20
  raise ArgumentError, "Invalid value for string: #{string}" if string.nil?
20
21
 
21
- string.split('').each { |c| tally_character(c) }
22
+ string.chars.each { |c| tally_character(c) }
23
+ @count_hash[:length][:count] = string.length
22
24
 
23
25
  @count_hash
24
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise-secure_password
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Eissler
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-30 00:00:00.000000000 Z
11
+ date: 2021-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: devise
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: 5.0.0
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: 6.0.0
42
+ version: 7.0.0
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,54 +49,39 @@ dependencies:
49
49
  version: 5.0.0
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: 6.0.0
52
+ version: 7.0.0
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: bundler
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '1.16'
60
57
  - - ">="
61
58
  - !ruby/object:Gem::Version
62
- version: 1.16.1
59
+ version: 2.2.14
63
60
  type: :development
64
61
  prerelease: false
65
62
  version_requirements: !ruby/object:Gem::Requirement
66
63
  requirements:
67
- - - "~>"
68
- - !ruby/object:Gem::Version
69
- version: '1.16'
70
64
  - - ">="
71
65
  - !ruby/object:Gem::Version
72
- version: 1.16.1
66
+ version: 2.2.14
73
67
  - !ruby/object:Gem::Dependency
74
68
  name: capybara
75
69
  requirement: !ruby/object:Gem::Requirement
76
70
  requirements:
77
- - - "~>"
78
- - !ruby/object:Gem::Version
79
- version: '2.16'
80
71
  - - ">="
81
72
  - !ruby/object:Gem::Version
82
- version: 2.16.1
73
+ version: 3.35.3
83
74
  type: :development
84
75
  prerelease: false
85
76
  version_requirements: !ruby/object:Gem::Requirement
86
77
  requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '2.16'
90
78
  - - ">="
91
79
  - !ruby/object:Gem::Version
92
- version: 2.16.1
80
+ version: 3.35.3
93
81
  - !ruby/object:Gem::Dependency
94
82
  name: capybara-screenshot
95
83
  requirement: !ruby/object:Gem::Requirement
96
84
  requirements:
97
- - - "~>"
98
- - !ruby/object:Gem::Version
99
- version: '1.0'
100
85
  - - ">="
101
86
  - !ruby/object:Gem::Version
102
87
  version: 1.0.18
@@ -104,46 +89,23 @@ dependencies:
104
89
  prerelease: false
105
90
  version_requirements: !ruby/object:Gem::Requirement
106
91
  requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '1.0'
110
92
  - - ">="
111
93
  - !ruby/object:Gem::Version
112
94
  version: 1.0.18
113
- - !ruby/object:Gem::Dependency
114
- name: coffee-rails
115
- requirement: !ruby/object:Gem::Requirement
116
- requirements:
117
- - - "~>"
118
- - !ruby/object:Gem::Version
119
- version: '4.2'
120
- type: :development
121
- prerelease: false
122
- version_requirements: !ruby/object:Gem::Requirement
123
- requirements:
124
- - - "~>"
125
- - !ruby/object:Gem::Version
126
- version: '4.2'
127
95
  - !ruby/object:Gem::Dependency
128
96
  name: database_cleaner
129
97
  requirement: !ruby/object:Gem::Requirement
130
98
  requirements:
131
- - - "~>"
132
- - !ruby/object:Gem::Version
133
- version: '1.6'
134
99
  - - ">="
135
100
  - !ruby/object:Gem::Version
136
- version: 1.6.2
101
+ version: 2.0.1
137
102
  type: :development
138
103
  prerelease: false
139
104
  version_requirements: !ruby/object:Gem::Requirement
140
105
  requirements:
141
- - - "~>"
142
- - !ruby/object:Gem::Version
143
- version: '1.6'
144
106
  - - ">="
145
107
  - !ruby/object:Gem::Version
146
- version: 1.6.2
108
+ version: 2.0.1
147
109
  - !ruby/object:Gem::Dependency
148
110
  name: devise
149
111
  requirement: !ruby/object:Gem::Requirement
@@ -162,9 +124,6 @@ dependencies:
162
124
  name: flay
163
125
  requirement: !ruby/object:Gem::Requirement
164
126
  requirements:
165
- - - "~>"
166
- - !ruby/object:Gem::Version
167
- version: '2.10'
168
127
  - - ">="
169
128
  - !ruby/object:Gem::Version
170
129
  version: 2.10.0
@@ -172,9 +131,6 @@ dependencies:
172
131
  prerelease: false
173
132
  version_requirements: !ruby/object:Gem::Requirement
174
133
  requirements:
175
- - - "~>"
176
- - !ruby/object:Gem::Version
177
- version: '2.10'
178
134
  - - ">="
179
135
  - !ruby/object:Gem::Version
180
136
  version: 2.10.0
@@ -182,9 +138,6 @@ dependencies:
182
138
  name: launchy
183
139
  requirement: !ruby/object:Gem::Requirement
184
140
  requirements:
185
- - - "~>"
186
- - !ruby/object:Gem::Version
187
- version: '2.4'
188
141
  - - ">="
189
142
  - !ruby/object:Gem::Version
190
143
  version: 2.4.3
@@ -192,9 +145,6 @@ dependencies:
192
145
  prerelease: false
193
146
  version_requirements: !ruby/object:Gem::Requirement
194
147
  requirements:
195
- - - "~>"
196
- - !ruby/object:Gem::Version
197
- version: '2.4'
198
148
  - - ">="
199
149
  - !ruby/object:Gem::Version
200
150
  version: 2.4.3
@@ -202,133 +152,132 @@ dependencies:
202
152
  name: rails
203
153
  requirement: !ruby/object:Gem::Requirement
204
154
  requirements:
205
- - - "~>"
206
- - !ruby/object:Gem::Version
207
- version: '5.1'
208
155
  - - ">="
209
156
  - !ruby/object:Gem::Version
210
- version: 5.1.4
157
+ version: 5.2.0
211
158
  type: :development
212
159
  prerelease: false
213
160
  version_requirements: !ruby/object:Gem::Requirement
214
161
  requirements:
215
- - - "~>"
216
- - !ruby/object:Gem::Version
217
- version: '5.1'
218
162
  - - ">="
219
163
  - !ruby/object:Gem::Version
220
- version: 5.1.4
164
+ version: 5.2.0
221
165
  - !ruby/object:Gem::Dependency
222
166
  name: rake
223
167
  requirement: !ruby/object:Gem::Requirement
224
168
  requirements:
225
- - - "~>"
169
+ - - ">="
226
170
  - !ruby/object:Gem::Version
227
171
  version: '12.3'
228
172
  type: :development
229
173
  prerelease: false
230
174
  version_requirements: !ruby/object:Gem::Requirement
231
175
  requirements:
232
- - - "~>"
176
+ - - ">="
233
177
  - !ruby/object:Gem::Version
234
178
  version: '12.3'
235
179
  - !ruby/object:Gem::Dependency
236
180
  name: rspec
237
181
  requirement: !ruby/object:Gem::Requirement
238
182
  requirements:
239
- - - "~>"
183
+ - - ">="
240
184
  - !ruby/object:Gem::Version
241
185
  version: '3.7'
242
186
  type: :development
243
187
  prerelease: false
244
188
  version_requirements: !ruby/object:Gem::Requirement
245
189
  requirements:
246
- - - "~>"
190
+ - - ">="
247
191
  - !ruby/object:Gem::Version
248
192
  version: '3.7'
193
+ - !ruby/object:Gem::Dependency
194
+ name: rspec_junit_formatter
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0.3'
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0.3'
249
207
  - !ruby/object:Gem::Dependency
250
208
  name: rspec-rails
251
209
  requirement: !ruby/object:Gem::Requirement
252
210
  requirements:
253
- - - "~>"
211
+ - - ">="
254
212
  - !ruby/object:Gem::Version
255
213
  version: '3.7'
256
214
  type: :development
257
215
  prerelease: false
258
216
  version_requirements: !ruby/object:Gem::Requirement
259
217
  requirements:
260
- - - "~>"
218
+ - - ">="
261
219
  - !ruby/object:Gem::Version
262
220
  version: '3.7'
263
221
  - !ruby/object:Gem::Dependency
264
- name: rspec_junit_formatter
222
+ name: rubocop
265
223
  requirement: !ruby/object:Gem::Requirement
266
224
  requirements:
267
- - - "~>"
225
+ - - ">="
268
226
  - !ruby/object:Gem::Version
269
- version: '0.3'
227
+ version: 1.0.0
270
228
  type: :development
271
229
  prerelease: false
272
230
  version_requirements: !ruby/object:Gem::Requirement
273
231
  requirements:
274
- - - "~>"
232
+ - - ">="
275
233
  - !ruby/object:Gem::Version
276
- version: '0.3'
234
+ version: 1.0.0
277
235
  - !ruby/object:Gem::Dependency
278
- name: rubocop
236
+ name: rubocop-rails
279
237
  requirement: !ruby/object:Gem::Requirement
280
238
  requirements:
281
239
  - - ">="
282
240
  - !ruby/object:Gem::Version
283
- version: 0.49.0
241
+ version: 2.3.2
284
242
  type: :development
285
243
  prerelease: false
286
244
  version_requirements: !ruby/object:Gem::Requirement
287
245
  requirements:
288
246
  - - ">="
289
247
  - !ruby/object:Gem::Version
290
- version: 0.49.0
248
+ version: 2.3.2
291
249
  - !ruby/object:Gem::Dependency
292
- name: ruby2ruby
250
+ name: rubocop-rspec
293
251
  requirement: !ruby/object:Gem::Requirement
294
252
  requirements:
295
- - - "~>"
296
- - !ruby/object:Gem::Version
297
- version: '2.4'
298
253
  - - ">="
299
254
  - !ruby/object:Gem::Version
300
- version: 2.4.0
255
+ version: 1.35.0
301
256
  type: :development
302
257
  prerelease: false
303
258
  version_requirements: !ruby/object:Gem::Requirement
304
259
  requirements:
305
- - - "~>"
306
- - !ruby/object:Gem::Version
307
- version: '2.4'
308
260
  - - ">="
309
261
  - !ruby/object:Gem::Version
310
- version: 2.4.0
262
+ version: 1.35.0
311
263
  - !ruby/object:Gem::Dependency
312
- name: sass-rails
264
+ name: ruby2ruby
313
265
  requirement: !ruby/object:Gem::Requirement
314
266
  requirements:
315
- - - "~>"
267
+ - - ">="
316
268
  - !ruby/object:Gem::Version
317
- version: '5.0'
269
+ version: 2.4.0
318
270
  type: :development
319
271
  prerelease: false
320
272
  version_requirements: !ruby/object:Gem::Requirement
321
273
  requirements:
322
- - - "~>"
274
+ - - ">="
323
275
  - !ruby/object:Gem::Version
324
- version: '5.0'
276
+ version: 2.4.0
325
277
  - !ruby/object:Gem::Dependency
326
278
  name: selenium-webdriver
327
279
  requirement: !ruby/object:Gem::Requirement
328
280
  requirements:
329
- - - "~>"
330
- - !ruby/object:Gem::Version
331
- version: '3.7'
332
281
  - - ">="
333
282
  - !ruby/object:Gem::Version
334
283
  version: 3.7.0
@@ -336,9 +285,6 @@ dependencies:
336
285
  prerelease: false
337
286
  version_requirements: !ruby/object:Gem::Requirement
338
287
  requirements:
339
- - - "~>"
340
- - !ruby/object:Gem::Version
341
- version: '3.7'
342
288
  - - ">="
343
289
  - !ruby/object:Gem::Version
344
290
  version: 3.7.0
@@ -346,37 +292,34 @@ dependencies:
346
292
  name: simplecov
347
293
  requirement: !ruby/object:Gem::Requirement
348
294
  requirements:
349
- - - "~>"
295
+ - - ">="
350
296
  - !ruby/object:Gem::Version
351
- version: 0.15.1
297
+ version: 0.18.2
352
298
  type: :development
353
299
  prerelease: false
354
300
  version_requirements: !ruby/object:Gem::Requirement
355
301
  requirements:
356
- - - "~>"
302
+ - - ">="
357
303
  - !ruby/object:Gem::Version
358
- version: 0.15.1
304
+ version: 0.18.2
359
305
  - !ruby/object:Gem::Dependency
360
306
  name: simplecov-console
361
307
  requirement: !ruby/object:Gem::Requirement
362
308
  requirements:
363
- - - "~>"
309
+ - - ">="
364
310
  - !ruby/object:Gem::Version
365
311
  version: 0.4.2
366
312
  type: :development
367
313
  prerelease: false
368
314
  version_requirements: !ruby/object:Gem::Requirement
369
315
  requirements:
370
- - - "~>"
316
+ - - ">="
371
317
  - !ruby/object:Gem::Version
372
318
  version: 0.4.2
373
319
  - !ruby/object:Gem::Dependency
374
320
  name: sqlite3
375
321
  requirement: !ruby/object:Gem::Requirement
376
322
  requirements:
377
- - - "~>"
378
- - !ruby/object:Gem::Version
379
- version: '1.3'
380
323
  - - ">="
381
324
  - !ruby/object:Gem::Version
382
325
  version: 1.3.13
@@ -384,26 +327,9 @@ dependencies:
384
327
  prerelease: false
385
328
  version_requirements: !ruby/object:Gem::Requirement
386
329
  requirements:
387
- - - "~>"
388
- - !ruby/object:Gem::Version
389
- version: '1.3'
390
330
  - - ">="
391
331
  - !ruby/object:Gem::Version
392
332
  version: 1.3.13
393
- - !ruby/object:Gem::Dependency
394
- name: therubyracer
395
- requirement: !ruby/object:Gem::Requirement
396
- requirements:
397
- - - "~>"
398
- - !ruby/object:Gem::Version
399
- version: 0.12.3
400
- type: :development
401
- prerelease: false
402
- version_requirements: !ruby/object:Gem::Requirement
403
- requirements:
404
- - - "~>"
405
- - !ruby/object:Gem::Version
406
- version: 0.12.3
407
333
  description: Adds configurable password policy enforcement to devise.
408
334
  email:
409
335
  - mark.eissler@valimail.com
@@ -425,42 +351,16 @@ files:
425
351
  - "./bin/console"
426
352
  - "./bin/setup"
427
353
  - "./config/locales/en.yml"
428
- - "./coverage/assets/0.10.2/application.css"
429
- - "./coverage/assets/0.10.2/application.js"
430
- - "./coverage/assets/0.10.2/colorbox/border.png"
431
- - "./coverage/assets/0.10.2/colorbox/controls.png"
432
- - "./coverage/assets/0.10.2/colorbox/loading.gif"
433
- - "./coverage/assets/0.10.2/colorbox/loading_background.png"
434
- - "./coverage/assets/0.10.2/favicon_green.png"
435
- - "./coverage/assets/0.10.2/favicon_red.png"
436
- - "./coverage/assets/0.10.2/favicon_yellow.png"
437
- - "./coverage/assets/0.10.2/loading.gif"
438
- - "./coverage/assets/0.10.2/magnify.png"
439
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png"
440
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png"
441
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png"
442
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png"
443
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png"
444
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png"
445
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png"
446
- - "./coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png"
447
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png"
448
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png"
449
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png"
450
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png"
451
- - "./coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png"
452
- - "./coverage/index.html"
453
- - "./devise-secure_password-1.0.0.gem"
454
354
  - "./devise-secure_password.gemspec"
455
355
  - "./docker-entrypoint.sh"
456
- - "./gemfiles/rails-5_0_6.gemfile"
457
- - "./gemfiles/rails-5_0_6.gemfile.lock"
458
- - "./gemfiles/rails-5_1_4.gemfile"
459
- - "./gemfiles/rails-5_1_4.gemfile.lock"
356
+ - "./gemfiles/rails_6_0.gemfile"
357
+ - "./gemfiles/rails_6_0.gemfile.lock"
358
+ - "./gemfiles/rails_6_1.gemfile"
359
+ - "./gemfiles/rails_6_1.gemfile.lock"
460
360
  - "./lib/devise/secure_password.rb"
461
- - "./lib/devise/secure_password/controllers/active_helpers.rb"
462
361
  - "./lib/devise/secure_password/controllers/devise_helpers.rb"
463
- - "./lib/devise/secure_password/hooks/password_requires_regular_updates.rb"
362
+ - "./lib/devise/secure_password/controllers/helpers.rb"
363
+ - "./lib/devise/secure_password/grammar.rb"
464
364
  - "./lib/devise/secure_password/models/password_disallows_frequent_changes.rb"
465
365
  - "./lib/devise/secure_password/models/password_disallows_frequent_reuse.rb"
466
366
  - "./lib/devise/secure_password/models/password_has_required_content.rb"
@@ -472,13 +372,12 @@ files:
472
372
  - "./lib/generators/devise/templates/README.txt"
473
373
  - "./lib/generators/devise/templates/secure_password.rb"
474
374
  - "./lib/support/string/character_counter.rb"
475
- - "./pkg/devise-secure_password-1.0.3.gem"
476
- - "./pkg/devise-secure_password-1.0.4.gem"
375
+ - "./pkg/devise-secure_password-2.0.0.gem"
477
376
  homepage: https://github.com/valimail/devise-secure_password
478
377
  licenses:
479
378
  - MIT
480
379
  metadata: {}
481
- post_install_message:
380
+ post_install_message:
482
381
  rdoc_options: []
483
382
  require_paths:
484
383
  - lib
@@ -486,16 +385,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
486
385
  requirements:
487
386
  - - ">="
488
387
  - !ruby/object:Gem::Version
489
- version: '2.4'
388
+ version: '2.7'
490
389
  required_rubygems_version: !ruby/object:Gem::Requirement
491
390
  requirements:
492
391
  - - ">="
493
392
  - !ruby/object:Gem::Version
494
393
  version: '0'
495
394
  requirements: []
496
- rubyforge_project:
497
- rubygems_version: 2.6.14
498
- signing_key:
395
+ rubygems_version: 3.2.16
396
+ signing_key:
499
397
  specification_version: 4
500
398
  summary: A devise password policy enforcement extension.
501
399
  test_files: []