devise-secure_password 1.0.4 → 1.0.5
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.
- checksums.yaml +4 -4
- data/Changelog.md +59 -0
- data/Gemfile.lock +230 -29
- data/README.md +38 -8
- data/coverage/index.html +18 -30
- data/gemfiles/rails-5_0_6.gemfile.lock +1 -1
- data/gemfiles/rails-5_1_4.gemfile.lock +1 -1
- data/lib/devise/secure_password.rb +7 -7
- data/lib/devise/secure_password/models/previous_password.rb +3 -3
- data/lib/devise/secure_password/version.rb +1 -1
- data/lib/generators/devise/templates/secure_password.rb +7 -7
- data/pkg/devise-secure_password-1.0.4.gem +0 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1c68e938643943a1eb93719ef84ee969b350a12b
|
|
4
|
+
data.tar.gz: 897e40fb6a73452cbfa6fb9b39dc8990a76c65f9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1a1d93997de4b2dd7dc8fe6c4495c2956f5cb17b9eeb474e1e30e022c16e5f9b20e76ff826b027e4a43d4d200246ed11b112d2d809278808d34434c3c2c2c23d
|
|
7
|
+
data.tar.gz: 4c1e883be6167375195bdcf3487d959163ba425a5d1cb3aca3e34036e6a2d682569e5d6760e59a3bcb48fc9b422c2bd7dd6e476f624c7bb3ee3e5db74ed40754
|
data/Changelog.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Changelog: devise-secure_password
|
|
2
|
+
|
|
3
|
+
## 1.0.5 / 2018-04-30
|
|
4
|
+
|
|
5
|
+
* Update rails-app-5_1_4 config for SQLite3Adapter changes.
|
|
6
|
+
* Update previous_password default_scope to be based on id.
|
|
7
|
+
* Configure more reasonable defaults.
|
|
8
|
+
* Update README regarding defaults and a users need to verify.
|
|
9
|
+
* Update README to include section on Displaying errors.
|
|
10
|
+
* Revert password freshness algorithm from 1.0.4.
|
|
11
|
+
|
|
12
|
+
## v1.0.4 / 2018-04-28
|
|
13
|
+
|
|
14
|
+
* Fix for ignored redirect on expired passwords.
|
|
15
|
+
* Change password freshness algorithm to consider updated records.
|
|
16
|
+
|
|
17
|
+
## v1.0.3 / 2018-04-23
|
|
18
|
+
|
|
19
|
+
* Skip enforcement checks unless User model requires a password.
|
|
20
|
+
* Update migration code to accomodate changes in underlying ActiveRecord.
|
|
21
|
+
|
|
22
|
+
## v1.0.2 / 2018-03-14
|
|
23
|
+
|
|
24
|
+
* Update the default configuration to be less strict - users can enable individual features.
|
|
25
|
+
* Do not override global timeago strings.
|
|
26
|
+
|
|
27
|
+
## v1.0.1 / 2018-03-14
|
|
28
|
+
|
|
29
|
+
* Fix the special character configuration parameter name and add specs.
|
|
30
|
+
|
|
31
|
+
## v1.0.0 / 2018-03-07
|
|
32
|
+
|
|
33
|
+
* Update license.
|
|
34
|
+
* [VME-1693] Refactor to simplify install and test commands.
|
|
35
|
+
|
|
36
|
+
## v0.9.4 / 2018-01-24
|
|
37
|
+
|
|
38
|
+
* [VME-1661] Fix typos in README.
|
|
39
|
+
* [VME-1646] Update circleci badge token.
|
|
40
|
+
* [VME-1646] Rename modules according to convention for Rails concerns.
|
|
41
|
+
* Implement code coverage.
|
|
42
|
+
* Support multiple rails versions for testing.
|
|
43
|
+
* Rename password_regular_update_enforcement_controller to dppe_passwords_controller.
|
|
44
|
+
|
|
45
|
+
## v0.9.3 / 2018-01-09
|
|
46
|
+
|
|
47
|
+
* Implement password regular update
|
|
48
|
+
|
|
49
|
+
## v0.9.2 / 2018-01-02
|
|
50
|
+
|
|
51
|
+
* Implement password frequent change enforcement.
|
|
52
|
+
|
|
53
|
+
## v0.9.1 / 2017-12-29
|
|
54
|
+
|
|
55
|
+
* Implement password frequent reuse enforcement.
|
|
56
|
+
|
|
57
|
+
## v0.9.0 / 2017-12-26
|
|
58
|
+
|
|
59
|
+
* Implement password content enforcement.
|
data/Gemfile.lock
CHANGED
|
@@ -1,87 +1,288 @@
|
|
|
1
|
+
GIT
|
|
2
|
+
remote: https://github.com/thoughtbot/shoulda-matchers.git
|
|
3
|
+
revision: 4b160bd19ecca7f97d7ac22dccd5fde9b0da5a9f
|
|
4
|
+
branch: rails-5
|
|
5
|
+
specs:
|
|
6
|
+
shoulda-matchers (3.1.2)
|
|
7
|
+
activesupport (>= 4.2.0)
|
|
8
|
+
|
|
1
9
|
PATH
|
|
2
10
|
remote: .
|
|
3
11
|
specs:
|
|
4
|
-
devise-secure_password (0.
|
|
12
|
+
devise-secure_password (1.0.5)
|
|
5
13
|
devise (>= 4.0.0, < 5.0.0)
|
|
6
14
|
railties (>= 5.0.0, < 6.0.0)
|
|
7
15
|
|
|
8
16
|
GEM
|
|
9
17
|
remote: https://rubygems.org/
|
|
10
18
|
specs:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
19
|
+
actioncable (5.2.0)
|
|
20
|
+
actionpack (= 5.2.0)
|
|
21
|
+
nio4r (~> 2.0)
|
|
22
|
+
websocket-driver (>= 0.6.1)
|
|
23
|
+
actionmailer (5.2.0)
|
|
24
|
+
actionpack (= 5.2.0)
|
|
25
|
+
actionview (= 5.2.0)
|
|
26
|
+
activejob (= 5.2.0)
|
|
27
|
+
mail (~> 2.5, >= 2.5.4)
|
|
28
|
+
rails-dom-testing (~> 2.0)
|
|
29
|
+
actionpack (5.2.0)
|
|
30
|
+
actionview (= 5.2.0)
|
|
31
|
+
activesupport (= 5.2.0)
|
|
14
32
|
rack (~> 2.0)
|
|
15
33
|
rack-test (>= 0.6.3)
|
|
16
34
|
rails-dom-testing (~> 2.0)
|
|
17
35
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
18
|
-
actionview (5.
|
|
19
|
-
activesupport (= 5.
|
|
36
|
+
actionview (5.2.0)
|
|
37
|
+
activesupport (= 5.2.0)
|
|
20
38
|
builder (~> 3.1)
|
|
21
39
|
erubi (~> 1.4)
|
|
22
40
|
rails-dom-testing (~> 2.0)
|
|
23
41
|
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
|
24
|
-
|
|
42
|
+
activejob (5.2.0)
|
|
43
|
+
activesupport (= 5.2.0)
|
|
44
|
+
globalid (>= 0.3.6)
|
|
45
|
+
activemodel (5.2.0)
|
|
46
|
+
activesupport (= 5.2.0)
|
|
47
|
+
activerecord (5.2.0)
|
|
48
|
+
activemodel (= 5.2.0)
|
|
49
|
+
activesupport (= 5.2.0)
|
|
50
|
+
arel (>= 9.0)
|
|
51
|
+
activestorage (5.2.0)
|
|
52
|
+
actionpack (= 5.2.0)
|
|
53
|
+
activerecord (= 5.2.0)
|
|
54
|
+
marcel (~> 0.3.1)
|
|
55
|
+
activesupport (5.2.0)
|
|
25
56
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
26
|
-
i18n (
|
|
57
|
+
i18n (>= 0.7, < 2)
|
|
27
58
|
minitest (~> 5.1)
|
|
28
59
|
tzinfo (~> 1.1)
|
|
60
|
+
addressable (2.5.2)
|
|
61
|
+
public_suffix (>= 2.0.2, < 4.0)
|
|
62
|
+
ansi (1.5.0)
|
|
63
|
+
arel (9.0.0)
|
|
64
|
+
ast (2.4.0)
|
|
29
65
|
bcrypt (3.1.11)
|
|
30
66
|
builder (3.2.3)
|
|
67
|
+
capybara (2.18.0)
|
|
68
|
+
addressable
|
|
69
|
+
mini_mime (>= 0.1.3)
|
|
70
|
+
nokogiri (>= 1.3.3)
|
|
71
|
+
rack (>= 1.0.0)
|
|
72
|
+
rack-test (>= 0.5.4)
|
|
73
|
+
xpath (>= 2.0, < 4.0)
|
|
74
|
+
capybara-screenshot (1.0.19)
|
|
75
|
+
capybara (>= 1.0, < 4)
|
|
76
|
+
launchy
|
|
77
|
+
childprocess (0.9.0)
|
|
78
|
+
ffi (~> 1.0, >= 1.0.11)
|
|
79
|
+
coffee-rails (4.2.2)
|
|
80
|
+
coffee-script (>= 2.2.0)
|
|
81
|
+
railties (>= 4.0.0)
|
|
82
|
+
coffee-script (2.4.1)
|
|
83
|
+
coffee-script-source
|
|
84
|
+
execjs
|
|
85
|
+
coffee-script-source (1.12.2)
|
|
31
86
|
concurrent-ruby (1.0.5)
|
|
32
|
-
crass (1.0.
|
|
33
|
-
|
|
87
|
+
crass (1.0.4)
|
|
88
|
+
database_cleaner (1.7.0)
|
|
89
|
+
devise (4.4.3)
|
|
34
90
|
bcrypt (~> 3.0)
|
|
35
91
|
orm_adapter (~> 0.1)
|
|
36
|
-
railties (>= 4.1.0, <
|
|
92
|
+
railties (>= 4.1.0, < 6.0)
|
|
37
93
|
responders
|
|
38
94
|
warden (~> 1.2.3)
|
|
39
|
-
|
|
40
|
-
|
|
95
|
+
diff-lcs (1.3)
|
|
96
|
+
docile (1.1.5)
|
|
97
|
+
erubi (1.7.1)
|
|
98
|
+
erubis (2.7.0)
|
|
99
|
+
execjs (2.7.0)
|
|
100
|
+
ffi (1.9.23)
|
|
101
|
+
flay (2.11.0)
|
|
102
|
+
erubis (~> 2.7.0)
|
|
103
|
+
path_expander (~> 1.0)
|
|
104
|
+
ruby_parser (~> 3.0)
|
|
105
|
+
sexp_processor (~> 4.0)
|
|
106
|
+
globalid (0.4.1)
|
|
107
|
+
activesupport (>= 4.2.0)
|
|
108
|
+
hirb (0.7.3)
|
|
109
|
+
i18n (1.0.1)
|
|
41
110
|
concurrent-ruby (~> 1.0)
|
|
42
|
-
|
|
111
|
+
json (2.1.0)
|
|
112
|
+
launchy (2.4.3)
|
|
113
|
+
addressable (~> 2.3)
|
|
114
|
+
libv8 (3.16.14.19)
|
|
115
|
+
loofah (2.2.2)
|
|
43
116
|
crass (~> 1.0.2)
|
|
44
117
|
nokogiri (>= 1.5.9)
|
|
118
|
+
mail (2.7.0)
|
|
119
|
+
mini_mime (>= 0.1.1)
|
|
120
|
+
marcel (0.3.2)
|
|
121
|
+
mimemagic (~> 0.3.2)
|
|
45
122
|
method_source (0.9.0)
|
|
123
|
+
mimemagic (0.3.2)
|
|
124
|
+
mini_mime (1.0.0)
|
|
46
125
|
mini_portile2 (2.3.0)
|
|
47
|
-
minitest (5.11.
|
|
48
|
-
|
|
126
|
+
minitest (5.11.3)
|
|
127
|
+
nio4r (2.3.0)
|
|
128
|
+
nokogiri (1.8.2)
|
|
49
129
|
mini_portile2 (~> 2.3.0)
|
|
50
130
|
orm_adapter (0.5.0)
|
|
51
|
-
|
|
52
|
-
|
|
131
|
+
parallel (1.12.1)
|
|
132
|
+
parser (2.5.1.0)
|
|
133
|
+
ast (~> 2.4.0)
|
|
134
|
+
path_expander (1.0.3)
|
|
135
|
+
powerpack (0.1.1)
|
|
136
|
+
public_suffix (3.0.2)
|
|
137
|
+
rack (2.0.5)
|
|
138
|
+
rack-test (1.0.0)
|
|
53
139
|
rack (>= 1.0, < 3)
|
|
140
|
+
rails (5.2.0)
|
|
141
|
+
actioncable (= 5.2.0)
|
|
142
|
+
actionmailer (= 5.2.0)
|
|
143
|
+
actionpack (= 5.2.0)
|
|
144
|
+
actionview (= 5.2.0)
|
|
145
|
+
activejob (= 5.2.0)
|
|
146
|
+
activemodel (= 5.2.0)
|
|
147
|
+
activerecord (= 5.2.0)
|
|
148
|
+
activestorage (= 5.2.0)
|
|
149
|
+
activesupport (= 5.2.0)
|
|
150
|
+
bundler (>= 1.3.0)
|
|
151
|
+
railties (= 5.2.0)
|
|
152
|
+
sprockets-rails (>= 2.0.0)
|
|
54
153
|
rails-dom-testing (2.0.3)
|
|
55
154
|
activesupport (>= 4.2.0)
|
|
56
155
|
nokogiri (>= 1.6)
|
|
57
|
-
rails-html-sanitizer (1.0.
|
|
58
|
-
loofah (~> 2.
|
|
59
|
-
railties (5.
|
|
60
|
-
actionpack (= 5.
|
|
61
|
-
activesupport (= 5.
|
|
156
|
+
rails-html-sanitizer (1.0.4)
|
|
157
|
+
loofah (~> 2.2, >= 2.2.2)
|
|
158
|
+
railties (5.2.0)
|
|
159
|
+
actionpack (= 5.2.0)
|
|
160
|
+
activesupport (= 5.2.0)
|
|
62
161
|
method_source
|
|
63
162
|
rake (>= 0.8.7)
|
|
64
163
|
thor (>= 0.18.1, < 2.0)
|
|
65
|
-
|
|
164
|
+
rainbow (3.0.0)
|
|
165
|
+
rake (12.3.1)
|
|
166
|
+
rb-fsevent (0.10.3)
|
|
167
|
+
rb-inotify (0.9.10)
|
|
168
|
+
ffi (>= 0.5.0, < 2)
|
|
169
|
+
ref (2.0.0)
|
|
66
170
|
responders (2.4.0)
|
|
67
171
|
actionpack (>= 4.2.0, < 5.3)
|
|
68
172
|
railties (>= 4.2.0, < 5.3)
|
|
173
|
+
rspec (3.7.0)
|
|
174
|
+
rspec-core (~> 3.7.0)
|
|
175
|
+
rspec-expectations (~> 3.7.0)
|
|
176
|
+
rspec-mocks (~> 3.7.0)
|
|
177
|
+
rspec-core (3.7.1)
|
|
178
|
+
rspec-support (~> 3.7.0)
|
|
179
|
+
rspec-expectations (3.7.0)
|
|
180
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
181
|
+
rspec-support (~> 3.7.0)
|
|
182
|
+
rspec-mocks (3.7.0)
|
|
183
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
184
|
+
rspec-support (~> 3.7.0)
|
|
185
|
+
rspec-rails (3.7.2)
|
|
186
|
+
actionpack (>= 3.0)
|
|
187
|
+
activesupport (>= 3.0)
|
|
188
|
+
railties (>= 3.0)
|
|
189
|
+
rspec-core (~> 3.7.0)
|
|
190
|
+
rspec-expectations (~> 3.7.0)
|
|
191
|
+
rspec-mocks (~> 3.7.0)
|
|
192
|
+
rspec-support (~> 3.7.0)
|
|
193
|
+
rspec-support (3.7.1)
|
|
194
|
+
rspec_junit_formatter (0.3.0)
|
|
195
|
+
rspec-core (>= 2, < 4, != 2.12.0)
|
|
196
|
+
rubocop (0.55.0)
|
|
197
|
+
parallel (~> 1.10)
|
|
198
|
+
parser (>= 2.5)
|
|
199
|
+
powerpack (~> 0.1)
|
|
200
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
201
|
+
ruby-progressbar (~> 1.7)
|
|
202
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
|
203
|
+
ruby-progressbar (1.9.0)
|
|
204
|
+
ruby2ruby (2.4.1)
|
|
205
|
+
ruby_parser (~> 3.1)
|
|
206
|
+
sexp_processor (~> 4.6)
|
|
207
|
+
ruby_parser (3.11.0)
|
|
208
|
+
sexp_processor (~> 4.9)
|
|
209
|
+
rubyzip (1.2.1)
|
|
210
|
+
sass (3.5.6)
|
|
211
|
+
sass-listen (~> 4.0.0)
|
|
212
|
+
sass-listen (4.0.0)
|
|
213
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
|
214
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
|
215
|
+
sass-rails (5.0.7)
|
|
216
|
+
railties (>= 4.0.0, < 6)
|
|
217
|
+
sass (~> 3.1)
|
|
218
|
+
sprockets (>= 2.8, < 4.0)
|
|
219
|
+
sprockets-rails (>= 2.0, < 4.0)
|
|
220
|
+
tilt (>= 1.1, < 3)
|
|
221
|
+
selenium-webdriver (3.11.0)
|
|
222
|
+
childprocess (~> 0.5)
|
|
223
|
+
rubyzip (~> 1.2)
|
|
224
|
+
sexp_processor (4.11.0)
|
|
225
|
+
simplecov (0.15.1)
|
|
226
|
+
docile (~> 1.1.0)
|
|
227
|
+
json (>= 1.8, < 3)
|
|
228
|
+
simplecov-html (~> 0.10.0)
|
|
229
|
+
simplecov-console (0.4.2)
|
|
230
|
+
ansi
|
|
231
|
+
hirb
|
|
232
|
+
simplecov
|
|
233
|
+
simplecov-html (0.10.2)
|
|
234
|
+
sprockets (3.7.1)
|
|
235
|
+
concurrent-ruby (~> 1.0)
|
|
236
|
+
rack (> 1, < 3)
|
|
237
|
+
sprockets-rails (3.2.1)
|
|
238
|
+
actionpack (>= 4.0)
|
|
239
|
+
activesupport (>= 4.0)
|
|
240
|
+
sprockets (>= 3.0.0)
|
|
241
|
+
sqlite3 (1.3.13)
|
|
242
|
+
therubyracer (0.12.3)
|
|
243
|
+
libv8 (~> 3.16.14.15)
|
|
244
|
+
ref
|
|
69
245
|
thor (0.20.0)
|
|
70
246
|
thread_safe (0.3.6)
|
|
71
|
-
|
|
247
|
+
tilt (2.0.8)
|
|
248
|
+
tzinfo (1.2.5)
|
|
72
249
|
thread_safe (~> 0.1)
|
|
250
|
+
unicode-display_width (1.3.2)
|
|
73
251
|
warden (1.2.7)
|
|
74
252
|
rack (>= 1.0)
|
|
75
|
-
|
|
253
|
+
websocket-driver (0.7.0)
|
|
254
|
+
websocket-extensions (>= 0.1.0)
|
|
255
|
+
websocket-extensions (0.1.3)
|
|
256
|
+
xpath (3.0.0)
|
|
257
|
+
nokogiri (~> 1.8)
|
|
76
258
|
|
|
77
259
|
PLATFORMS
|
|
78
260
|
ruby
|
|
79
261
|
|
|
80
262
|
DEPENDENCIES
|
|
81
|
-
bundler (~> 1.16.1)
|
|
263
|
+
bundler (~> 1.16, >= 1.16.1)
|
|
264
|
+
capybara (~> 2.16, >= 2.16.1)
|
|
265
|
+
capybara-screenshot (~> 1.0, >= 1.0.18)
|
|
266
|
+
coffee-rails (~> 4.2)
|
|
267
|
+
database_cleaner (~> 1.6, >= 1.6.2)
|
|
268
|
+
devise (~> 4.0)
|
|
82
269
|
devise-secure_password!
|
|
83
|
-
|
|
84
|
-
|
|
270
|
+
flay (~> 2.10, >= 2.10.0)
|
|
271
|
+
launchy (~> 2.4, >= 2.4.3)
|
|
272
|
+
rails (~> 5.1, >= 5.1.4)
|
|
273
|
+
rake (~> 12.3)
|
|
274
|
+
rspec (~> 3.7)
|
|
275
|
+
rspec-rails (~> 3.7)
|
|
276
|
+
rspec_junit_formatter (~> 0.3)
|
|
277
|
+
rubocop (>= 0.49.0)
|
|
278
|
+
ruby2ruby (~> 2.4, >= 2.4.0)
|
|
279
|
+
sass-rails (~> 5.0)
|
|
280
|
+
selenium-webdriver (~> 3.7, >= 3.7.0)
|
|
281
|
+
shoulda-matchers!
|
|
282
|
+
simplecov (~> 0.15.1)
|
|
283
|
+
simplecov-console (~> 0.4.2)
|
|
284
|
+
sqlite3 (~> 1.3, >= 1.3.13)
|
|
285
|
+
therubyracer (~> 0.12.3)
|
|
85
286
|
|
|
86
287
|
BUNDLED WITH
|
|
87
288
|
1.16.1
|
data/README.md
CHANGED
|
@@ -41,7 +41,7 @@ Add this line to your application's Gemfile:
|
|
|
41
41
|
|
|
42
42
|
```ruby
|
|
43
43
|
gem 'devise', '~> 4.2'
|
|
44
|
-
gem 'devise-secure_password', '~> 1.0.
|
|
44
|
+
gem 'devise-secure_password', '~> 1.0.5'
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
And then execute:
|
|
@@ -80,39 +80,44 @@ Devise.setup do |config|
|
|
|
80
80
|
# standard configuration parameter.
|
|
81
81
|
|
|
82
82
|
# The number of uppercase letters (latin A-Z) required in a password:
|
|
83
|
-
# config.password_required_uppercase_count =
|
|
83
|
+
# config.password_required_uppercase_count = 1
|
|
84
84
|
|
|
85
85
|
# The number of lowercase letters (latin A-Z) required in a password:
|
|
86
|
-
# config.password_required_lowercase_count =
|
|
86
|
+
# config.password_required_lowercase_count = 1
|
|
87
87
|
|
|
88
88
|
# The number of numbers (0-9) required in a password:
|
|
89
|
-
# config.password_required_number_count =
|
|
89
|
+
# config.password_required_number_count = 1
|
|
90
90
|
|
|
91
91
|
# The number of special characters (!@#$%^&*()_+-=[]{}|') required in a password:
|
|
92
|
-
# config.password_required_special_character_count =
|
|
92
|
+
# config.password_required_special_character_count = 1
|
|
93
93
|
|
|
94
94
|
# ==> Configuration for the Devise Secure Password extension
|
|
95
95
|
# Module: password_disallows_frequent_reuse
|
|
96
96
|
#
|
|
97
97
|
# The number of previously used passwords that can not be reused:
|
|
98
|
-
# config.password_previously_used_count =
|
|
98
|
+
# config.password_previously_used_count = 8
|
|
99
99
|
|
|
100
100
|
# ==> Configuration for the Devise Secure Password extension
|
|
101
101
|
# Module: password_disallows_frequent_changes
|
|
102
102
|
# *Requires* password_disallows_frequent_reuse
|
|
103
103
|
#
|
|
104
104
|
# The minimum time that must pass between password changes:
|
|
105
|
-
# config.password_minimum_age =
|
|
105
|
+
# config.password_minimum_age = 1.days
|
|
106
106
|
|
|
107
107
|
# ==> Configuration for the Devise Secure Password extension
|
|
108
108
|
# Module: password_requires_regular_updates
|
|
109
109
|
# *Requires* password_disallows_frequent_reuse
|
|
110
110
|
#
|
|
111
111
|
# The maximum allowed age of a password:
|
|
112
|
-
# config.password_maximum_age =
|
|
112
|
+
# config.password_maximum_age = 180.days
|
|
113
113
|
end
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
+
>NOTE: Password policy defaults have been selected as a middle-of-the-road combination based on published
|
|
117
|
+
recommendations by [Microsoft](https://technet.microsoft.com/en-us/library/ff741764.aspx) and
|
|
118
|
+
[Carnegie Mellon University](https://www.cmu.edu/iso/governance/guidelines/password-management.html). It is up to
|
|
119
|
+
__YOU__ to verify the default settings and make adjustments where necessary.
|
|
120
|
+
|
|
116
121
|
Enable the __Devise Secure Password Extension__ enforcement in your Devise model(s):
|
|
117
122
|
|
|
118
123
|
```ruby
|
|
@@ -174,6 +179,31 @@ And then:
|
|
|
174
179
|
prompt> bundle exec rake db:migrate
|
|
175
180
|
```
|
|
176
181
|
|
|
182
|
+
### Displaying errors
|
|
183
|
+
|
|
184
|
+
You will likely want to display errors, produced as a result of secure password enforcement violations, to your users.
|
|
185
|
+
Errors are available via the `User.errors` array and via the `devise_error_messages!` method. An example usage follows
|
|
186
|
+
and is taken from the default password `edit.html.erb` page:
|
|
187
|
+
|
|
188
|
+
```erb
|
|
189
|
+
<%= form_for(resource, as: resource_name, url: [resource_name, :password_with_policy], html: { method: :put }) do |f| %>
|
|
190
|
+
<% if resource.errors.full_messages.count.positive? %>
|
|
191
|
+
<%= devise_error_messages! %>
|
|
192
|
+
<% end %>
|
|
193
|
+
|
|
194
|
+
<p><%= f.label :current_password, 'Current password' %><br />
|
|
195
|
+
<%= f.password_field :current_password %></p>
|
|
196
|
+
|
|
197
|
+
<p><%= f.label :password, 'New password' %><br />
|
|
198
|
+
<%= f.password_field :password %></p>
|
|
199
|
+
|
|
200
|
+
<p><%= f.label :password_confirmation, 'Password confirmation' %><br />
|
|
201
|
+
<%= f.password_field :password_confirmation %></p>
|
|
202
|
+
|
|
203
|
+
<p><%= f.submit 'Update' %></p>
|
|
204
|
+
<% end %>
|
|
205
|
+
```
|
|
206
|
+
|
|
177
207
|
<a name="running-tests"></a>
|
|
178
208
|
|
|
179
209
|
## Running Tests
|
data/coverage/index.html
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<img src="./assets/0.10.2/loading.gif" alt="loading"/>
|
|
15
15
|
</div>
|
|
16
16
|
<div id="wrapper" style="display:none;">
|
|
17
|
-
<div class="timestamp">Generated <abbr class="timeago" title="2018-04-
|
|
17
|
+
<div class="timestamp">Generated <abbr class="timeago" title="2018-04-29T19:21:42-07:00">2018-04-29T19:21:42-07:00</abbr></div>
|
|
18
18
|
<ul class="group_tabs"></ul>
|
|
19
19
|
|
|
20
20
|
<div id="content">
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<tr>
|
|
134
134
|
<td class="strong"><a href="#610c7e3624991293372156293eb507f0b5546b94" class="src_link" title="lib/devise/secure_password/models/previous_password.rb">lib/devise/secure_password/models/previous_password.rb</a></td>
|
|
135
135
|
<td class="green strong">100.0 %</td>
|
|
136
|
-
<td>
|
|
136
|
+
<td>20</td>
|
|
137
137
|
<td>13</td>
|
|
138
138
|
<td>13</td>
|
|
139
139
|
<td>0</td>
|
|
@@ -281,7 +281,7 @@
|
|
|
281
281
|
<tr>
|
|
282
282
|
<td class="strong"><a href="#610c7e3624991293372156293eb507f0b5546b94" class="src_link" title="lib/devise/secure_password/models/previous_password.rb">lib/devise/secure_password/models/previous_password.rb</a></td>
|
|
283
283
|
<td class="green strong">100.0 %</td>
|
|
284
|
-
<td>
|
|
284
|
+
<td>20</td>
|
|
285
285
|
<td>13</td>
|
|
286
286
|
<td>13</td>
|
|
287
287
|
<td>0</td>
|
|
@@ -2293,8 +2293,8 @@
|
|
|
2293
2293
|
<code class="ruby"> if Rails.version > '5.1'</code>
|
|
2294
2294
|
</li>
|
|
2295
2295
|
|
|
2296
|
-
<li class="
|
|
2297
|
-
|
|
2296
|
+
<li class="covered" data-hits="41" data-linenumber="58">
|
|
2297
|
+
<span class="hits">41</span>
|
|
2298
2298
|
|
|
2299
2299
|
<code class="ruby"> saved_change_to_encrypted_password?</code>
|
|
2300
2300
|
</li>
|
|
@@ -2305,8 +2305,8 @@
|
|
|
2305
2305
|
<code class="ruby"> else</code>
|
|
2306
2306
|
</li>
|
|
2307
2307
|
|
|
2308
|
-
<li class="
|
|
2309
|
-
|
|
2308
|
+
<li class="missed" data-hits="0" data-linenumber="60">
|
|
2309
|
+
|
|
2310
2310
|
|
|
2311
2311
|
<code class="ruby"> encrypted_password_changed?</code>
|
|
2312
2312
|
</li>
|
|
@@ -3628,67 +3628,55 @@
|
|
|
3628
3628
|
<code class="ruby"> def fresh?(minimum_age_duration, now = ::Time.zone.now)</code>
|
|
3629
3629
|
</li>
|
|
3630
3630
|
|
|
3631
|
-
<li class="
|
|
3632
|
-
|
|
3633
|
-
|
|
3634
|
-
<code class="ruby"> # @NOTE fix for history = 1, use updated_at</code>
|
|
3635
|
-
</li>
|
|
3636
|
-
|
|
3637
|
-
<li class="covered" data-hits="10" data-linenumber="13">
|
|
3631
|
+
<li class="covered" data-hits="10" data-linenumber="12">
|
|
3638
3632
|
<span class="hits">10</span>
|
|
3639
3633
|
|
|
3640
|
-
<code class="ruby"> now <= (
|
|
3634
|
+
<code class="ruby"> now <= (created_at + minimum_age_duration)</code>
|
|
3641
3635
|
</li>
|
|
3642
3636
|
|
|
3643
|
-
<li class="never" data-hits="" data-linenumber="
|
|
3637
|
+
<li class="never" data-hits="" data-linenumber="13">
|
|
3644
3638
|
|
|
3645
3639
|
|
|
3646
3640
|
<code class="ruby"> end</code>
|
|
3647
3641
|
</li>
|
|
3648
3642
|
|
|
3649
|
-
<li class="never" data-hits="" data-linenumber="
|
|
3643
|
+
<li class="never" data-hits="" data-linenumber="14">
|
|
3650
3644
|
|
|
3651
3645
|
|
|
3652
3646
|
<code class="ruby"></code>
|
|
3653
3647
|
</li>
|
|
3654
3648
|
|
|
3655
|
-
<li class="covered" data-hits="1" data-linenumber="
|
|
3649
|
+
<li class="covered" data-hits="1" data-linenumber="15">
|
|
3656
3650
|
<span class="hits">1</span>
|
|
3657
3651
|
|
|
3658
3652
|
<code class="ruby"> def stale?(maximum_age_duration, now = ::Time.zone.now)</code>
|
|
3659
3653
|
</li>
|
|
3660
3654
|
|
|
3661
|
-
<li class="
|
|
3662
|
-
|
|
3663
|
-
|
|
3664
|
-
<code class="ruby"> # @NOTE fix for history = 1, use updated_at</code>
|
|
3665
|
-
</li>
|
|
3666
|
-
|
|
3667
|
-
<li class="covered" data-hits="8" data-linenumber="18">
|
|
3655
|
+
<li class="covered" data-hits="8" data-linenumber="16">
|
|
3668
3656
|
<span class="hits">8</span>
|
|
3669
3657
|
|
|
3670
|
-
<code class="ruby"> now > (
|
|
3658
|
+
<code class="ruby"> now > (created_at + maximum_age_duration)</code>
|
|
3671
3659
|
</li>
|
|
3672
3660
|
|
|
3673
|
-
<li class="never" data-hits="" data-linenumber="
|
|
3661
|
+
<li class="never" data-hits="" data-linenumber="17">
|
|
3674
3662
|
|
|
3675
3663
|
|
|
3676
3664
|
<code class="ruby"> end</code>
|
|
3677
3665
|
</li>
|
|
3678
3666
|
|
|
3679
|
-
<li class="never" data-hits="" data-linenumber="
|
|
3667
|
+
<li class="never" data-hits="" data-linenumber="18">
|
|
3680
3668
|
|
|
3681
3669
|
|
|
3682
3670
|
<code class="ruby"> end</code>
|
|
3683
3671
|
</li>
|
|
3684
3672
|
|
|
3685
|
-
<li class="never" data-hits="" data-linenumber="
|
|
3673
|
+
<li class="never" data-hits="" data-linenumber="19">
|
|
3686
3674
|
|
|
3687
3675
|
|
|
3688
3676
|
<code class="ruby"> end</code>
|
|
3689
3677
|
</li>
|
|
3690
3678
|
|
|
3691
|
-
<li class="never" data-hits="" data-linenumber="
|
|
3679
|
+
<li class="never" data-hits="" data-linenumber="20">
|
|
3692
3680
|
|
|
3693
3681
|
|
|
3694
3682
|
<code class="ruby">end</code>
|
|
@@ -12,19 +12,19 @@ require 'devise/secure_password/models/password_requires_regular_updates'
|
|
|
12
12
|
|
|
13
13
|
module Devise
|
|
14
14
|
# password_content_enforcement configuration parameters
|
|
15
|
-
@password_required_uppercase_count =
|
|
16
|
-
@password_required_lowercase_count =
|
|
17
|
-
@password_required_number_count =
|
|
18
|
-
@password_required_special_character_count =
|
|
15
|
+
@password_required_uppercase_count = 1
|
|
16
|
+
@password_required_lowercase_count = 1
|
|
17
|
+
@password_required_number_count = 1
|
|
18
|
+
@password_required_special_character_count = 1
|
|
19
19
|
|
|
20
20
|
# password_frequent_reuse_prevention configuration parameters
|
|
21
|
-
@password_previously_used_count =
|
|
21
|
+
@password_previously_used_count = 8
|
|
22
22
|
|
|
23
23
|
# password_frequent_change_prevention configuration parameters
|
|
24
|
-
@password_minimum_age =
|
|
24
|
+
@password_minimum_age = 1.day
|
|
25
25
|
|
|
26
26
|
# password_regular_update_enforcement configuration parameters
|
|
27
|
-
@password_maximum_age =
|
|
27
|
+
@password_maximum_age = 180.days
|
|
28
28
|
|
|
29
29
|
class << self
|
|
30
30
|
attr_accessor :password_required_uppercase_count
|
|
@@ -3,17 +3,17 @@ module Devise
|
|
|
3
3
|
class PreviousPassword < ::ActiveRecord::Base
|
|
4
4
|
self.table_name = 'previous_passwords'
|
|
5
5
|
belongs_to :user
|
|
6
|
-
default_scope -> { order(
|
|
6
|
+
default_scope -> { order(id: :desc) }
|
|
7
7
|
validates :user_id, presence: true
|
|
8
8
|
validates :salt, presence: true
|
|
9
9
|
validates :encrypted_password, presence: true
|
|
10
10
|
|
|
11
11
|
def fresh?(minimum_age_duration, now = ::Time.zone.now)
|
|
12
|
-
now <= (
|
|
12
|
+
now <= (created_at + minimum_age_duration)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def stale?(maximum_age_duration, now = ::Time.zone.now)
|
|
16
|
-
now > (
|
|
16
|
+
now > (created_at + maximum_age_duration)
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -10,34 +10,34 @@ Devise.setup do |config|
|
|
|
10
10
|
# standard configuration parameter.
|
|
11
11
|
|
|
12
12
|
# The number of uppercase letters (latin A-Z) required in a password:
|
|
13
|
-
# config.password_required_uppercase_count =
|
|
13
|
+
# config.password_required_uppercase_count = 1
|
|
14
14
|
|
|
15
15
|
# The number of lowercase letters (latin A-Z) required in a password:
|
|
16
|
-
# config.password_required_lowercase_count =
|
|
16
|
+
# config.password_required_lowercase_count = 1
|
|
17
17
|
|
|
18
18
|
# The number of numbers (0-9) required in a password:
|
|
19
|
-
# config.password_required_number_count =
|
|
19
|
+
# config.password_required_number_count = 1
|
|
20
20
|
|
|
21
21
|
# The number of special characters (!@#$%^&*()_+-=[]{}|') required in a password:
|
|
22
|
-
# config.password_required_special_character_count =
|
|
22
|
+
# config.password_required_special_character_count = 1
|
|
23
23
|
|
|
24
24
|
# ==> Configuration for the Devise Secure Password extension
|
|
25
25
|
# Module: password_disallows_frequent_reuse
|
|
26
26
|
#
|
|
27
27
|
# The number of previously used passwords that can not be reused:
|
|
28
|
-
# config.password_previously_used_count =
|
|
28
|
+
# config.password_previously_used_count = 8
|
|
29
29
|
|
|
30
30
|
# ==> Configuration for the Devise Secure Password extension
|
|
31
31
|
# Module: password_disallows_frequent_changes
|
|
32
32
|
# *Requires* password_disallows_frequent_reuse
|
|
33
33
|
#
|
|
34
34
|
# The minimum time that must pass between password changes:
|
|
35
|
-
# config.password_minimum_age =
|
|
35
|
+
# config.password_minimum_age = 1.days
|
|
36
36
|
|
|
37
37
|
# ==> Configuration for the Devise Secure Password extension
|
|
38
38
|
# Module: password_requires_regular_updates
|
|
39
39
|
# *Requires* password_disallows_frequent_reuse
|
|
40
40
|
#
|
|
41
41
|
# The maximum allowed age of a password:
|
|
42
|
-
# config.password_maximum_age =
|
|
42
|
+
# config.password_maximum_age = 180.days
|
|
43
43
|
end
|
|
Binary file
|
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.
|
|
4
|
+
version: 1.0.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mark Eissler
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-04-
|
|
11
|
+
date: 2018-04-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: devise
|
|
@@ -412,6 +412,7 @@ extensions: []
|
|
|
412
412
|
extra_rdoc_files: []
|
|
413
413
|
files:
|
|
414
414
|
- "./CODE_OF_CONDUCT.md"
|
|
415
|
+
- "./Changelog.md"
|
|
415
416
|
- "./Dockerfile"
|
|
416
417
|
- "./Dockerfile.prev"
|
|
417
418
|
- "./Gemfile"
|
|
@@ -472,6 +473,7 @@ files:
|
|
|
472
473
|
- "./lib/generators/devise/templates/secure_password.rb"
|
|
473
474
|
- "./lib/support/string/character_counter.rb"
|
|
474
475
|
- "./pkg/devise-secure_password-1.0.3.gem"
|
|
476
|
+
- "./pkg/devise-secure_password-1.0.4.gem"
|
|
475
477
|
homepage: https://github.com/valimail/devise-secure_password
|
|
476
478
|
licenses:
|
|
477
479
|
- MIT
|