toolrack 0.9.0 → 0.9.1
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/lib/toolrack/password_utils.rb +291 -3
- data/lib/toolrack/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 571e36485e6a124ee83052bd40d53b1612973e3f7636bf8432ae5d4d4f641f35
|
4
|
+
data.tar.gz: 7042d576dec084cc3eccbbb49e74c2ff8e7175d4e69c3ddb2fe9027b7a65d0cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32a5ebec97858317a3a500db4e2bd315a80e67bee888b302fc45ff0aacd46749b77c25b9485d3faf6588fe0efbb1a72041a731366809dd8471fe73c1aa16437e
|
7
|
+
data.tar.gz: e76ec4875a11dbf84634e527a665492ec9665f55747ba6aaf5007b28cb92bd1ba682072c3186b218b87a8954f4623d64908ce0b4a406573b521fb62f36128b25
|
@@ -1,3 +1,18 @@
|
|
1
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
2
|
+
# Version 2, December 2004
|
3
|
+
#
|
4
|
+
# Copyright (C) 2021 Chris Liaw <chrisliaw@antrapol.com>
|
5
|
+
# Author: Chris Liaw <chrisliaw@antrapol.com>
|
6
|
+
#
|
7
|
+
# Everyone is permitted to copy and distribute verbatim or modified
|
8
|
+
# copies of this license document, and changing it is allowed as long
|
9
|
+
# as the name is changed.
|
10
|
+
#
|
11
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
12
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
13
|
+
#
|
14
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
15
|
+
|
1
16
|
|
2
17
|
require 'securerandom'
|
3
18
|
|
@@ -6,17 +21,290 @@ module Antrapol
|
|
6
21
|
module PasswordUtils
|
7
22
|
include Antrapol::ToolRack::ConditionUtils
|
8
23
|
|
9
|
-
|
24
|
+
# complexity
|
25
|
+
# 1 : lowercase alphabet
|
26
|
+
# 2 : lower + upper alphabet
|
27
|
+
# 3 : lower + upper + number
|
28
|
+
# 4 : lower + upper + number + symbol
|
29
|
+
def generate_random_password(length = 12, opts = { complexity: 4, enforce_quality: true })
|
30
|
+
|
10
31
|
length = 12 if is_empty?(length)
|
11
32
|
length = length.to_i
|
12
33
|
length = 12 if length <= 0
|
13
34
|
|
14
|
-
|
15
|
-
|
35
|
+
logger.debug "Length : #{length}"
|
36
|
+
|
37
|
+
if not_empty?(opts)
|
38
|
+
complexity = opts[:complexity] || 4
|
39
|
+
enforce_quality = opts[:enforce_quality] || true
|
40
|
+
end
|
41
|
+
|
42
|
+
complexity = 4 if is_empty?(complexity)
|
43
|
+
complexity = 4 if complexity > 4
|
44
|
+
complexity = 1 if complexity < 1
|
45
|
+
|
46
|
+
logger.debug "Complexity : #{complexity}"
|
47
|
+
|
48
|
+
enforce_quality = true if is_empty?(enforce_quality) or not is_bool?(enforce_quality)
|
49
|
+
|
50
|
+
res = []
|
51
|
+
antropy = [("a".."z"),("A".."Z"),(0..9),("!".."?")]
|
52
|
+
selection = antropy[0..complexity-1].map { |s| s.to_a }.flatten
|
53
|
+
|
54
|
+
fres = nil
|
55
|
+
loop do
|
56
|
+
|
57
|
+
len = length
|
58
|
+
processed = 0
|
59
|
+
loop do
|
60
|
+
#res += selection.sample(length)
|
61
|
+
res += selection.sort_by { SecureRandom.random_number }
|
62
|
+
break if res.length >= length
|
63
|
+
end
|
64
|
+
|
65
|
+
fres = res[0...length].join
|
66
|
+
|
67
|
+
if enforce_quality
|
68
|
+
case complexity
|
69
|
+
when 1
|
70
|
+
if all_lowercase_alpha?(fres)
|
71
|
+
break
|
72
|
+
else
|
73
|
+
logger.debug "Failed lowercase alpha quality check. #{fres} - Regenerating..."
|
74
|
+
res.clear
|
75
|
+
end
|
76
|
+
when 2
|
77
|
+
st, dst = all_alpha?(fres)
|
78
|
+
if st
|
79
|
+
break
|
80
|
+
else
|
81
|
+
logger.debug "Failed all alpha quality check. #{dst} - Regenerating..."
|
82
|
+
res.clear
|
83
|
+
end
|
84
|
+
when 3
|
85
|
+
st, dst = all_alpha_numeric?(fres)
|
86
|
+
if st
|
87
|
+
break
|
88
|
+
else
|
89
|
+
logger.debug "Failed alpha numeric quality check. #{dst} - Regenerating"
|
90
|
+
res.clear
|
91
|
+
end
|
92
|
+
when 4
|
93
|
+
st, dst = all_alpha_numeric_and_symbol?(fres)
|
94
|
+
if st
|
95
|
+
break
|
96
|
+
else
|
97
|
+
logger.debug "Failed alpha numeric + symbol quality check. #{fres} / #{dst} - Regenerating"
|
98
|
+
res.clear
|
99
|
+
end
|
100
|
+
else
|
101
|
+
logger.debug "Unknown complexity?? #{complexity}"
|
102
|
+
break
|
103
|
+
end
|
104
|
+
else
|
105
|
+
break
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
fres
|
111
|
+
|
112
|
+
#length = 12 if is_empty?(length)
|
113
|
+
#length = length.to_i
|
114
|
+
#length = 12 if length <= 0
|
115
|
+
|
116
|
+
#antropy = ('!'..'~').to_a
|
117
|
+
#antropy.sort_by { SecureRandom.random_number }.join[0...length]
|
16
118
|
end
|
17
119
|
alias_method :gen_rand_pass, :generate_random_password
|
18
120
|
alias_method :gen_pass, :generate_random_password
|
19
121
|
|
122
|
+
def all_lowercase_alpha?(str)
|
123
|
+
return false if is_empty?(str) or not str.is_a?(String)
|
124
|
+
|
125
|
+
s = str.split("")
|
126
|
+
lalpha = ('a'..'z').to_a
|
127
|
+
|
128
|
+
(s.difference(lalpha).length == 0)
|
129
|
+
end
|
130
|
+
|
131
|
+
def has_lowercase_alpha?(str)
|
132
|
+
return false if is_empty?(str) or not str.is_a?(String)
|
133
|
+
|
134
|
+
s = str.split("")
|
135
|
+
lalpha = ('a'..'z').to_a
|
136
|
+
|
137
|
+
(s & lalpha).length > 0
|
138
|
+
end
|
139
|
+
|
140
|
+
def all_uppercase_alpha?(str)
|
141
|
+
return false if is_empty?(str) or not str.is_a?(String)
|
142
|
+
|
143
|
+
s = str.split("")
|
144
|
+
ualpha = ('A'..'Z').to_a
|
145
|
+
|
146
|
+
s.difference(ualpha).length == 0
|
147
|
+
end
|
148
|
+
|
149
|
+
def has_uppercase_alpha?(str)
|
150
|
+
return false if is_empty?(str) or not str.is_a?(String)
|
151
|
+
|
152
|
+
s = str.split("")
|
153
|
+
ualpha = ('A'..'Z').to_a
|
154
|
+
|
155
|
+
(s & ualpha).length > 0
|
156
|
+
end
|
157
|
+
|
158
|
+
def all_alpha?(str)
|
159
|
+
return false if is_empty?(str) or not str.is_a?(String)
|
160
|
+
|
161
|
+
s = str.split("")
|
162
|
+
lalpha = ('a'..'z').to_a
|
163
|
+
ualpha = ('A'..'Z').to_a
|
164
|
+
num = ('0'..'9').to_a
|
165
|
+
sym = ('!'..'?').to_a
|
166
|
+
|
167
|
+
alpha = [lalpha, ualpha].flatten
|
168
|
+
|
169
|
+
t1 = (alpha.difference(s).length == 0)
|
170
|
+
t2 = (alpha.difference(s).length == 0)
|
171
|
+
|
172
|
+
t3 = (s & num).length > 0
|
173
|
+
t4 = (s & sym).length > 0
|
174
|
+
|
175
|
+
[!(t1 or t2 or t3 or t4), res = { has_lower_alpha: t1, has_upper_alpha: t2, has_num: t3, has_symbol: t4 }]
|
176
|
+
end
|
177
|
+
|
178
|
+
def has_alpha?(str)
|
179
|
+
return false if is_empty?(str) or not str.is_a?(String)
|
180
|
+
|
181
|
+
s = str.split("")
|
182
|
+
lalpha = ('a'..'z').to_a
|
183
|
+
ualpha = ('A'..'Z').to_a
|
184
|
+
alpha = [lalpha, ualpha].flatten
|
185
|
+
|
186
|
+
(alpha & s).length > 0
|
187
|
+
end
|
188
|
+
|
189
|
+
def has_number?(str)
|
190
|
+
return false if is_empty?(str)
|
191
|
+
|
192
|
+
str = str.to_s if not str.is_a?(String)
|
193
|
+
|
194
|
+
s = str.split("")
|
195
|
+
num = ('0'..'9').to_a
|
196
|
+
|
197
|
+
(s & num).length > 0
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
def all_number?(str)
|
202
|
+
return false if is_empty?(str)
|
203
|
+
|
204
|
+
str = str.to_s if not str.is_a?(String)
|
205
|
+
|
206
|
+
s = str.split("")
|
207
|
+
num = ('0'..'9').to_a
|
208
|
+
|
209
|
+
!(s.difference(num).length > 0)
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
def all_symbol?(str)
|
214
|
+
return false if is_empty?(str)
|
215
|
+
|
216
|
+
s = str.split("")
|
217
|
+
sym = ('!'..'?').to_a
|
218
|
+
!(s.difference(sym).length > 0)
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
def has_symbol?(str)
|
223
|
+
return false if is_empty?(str)
|
224
|
+
|
225
|
+
s = str.split("")
|
226
|
+
sym = ('!'..'?').to_a
|
227
|
+
|
228
|
+
p (s & sym)
|
229
|
+
(s & sym).length > 0
|
230
|
+
end
|
231
|
+
|
232
|
+
|
233
|
+
def all_alpha_numeric?(str)
|
234
|
+
return false if is_empty?(str)
|
235
|
+
|
236
|
+
s = str.split("")
|
237
|
+
lalpha = ('a'..'z').to_a
|
238
|
+
ualpha = ('A'..'Z').to_a
|
239
|
+
num = ('0'..'9').to_a
|
240
|
+
sym = ('!'..'?').to_a
|
241
|
+
sym = sym.difference(num)
|
242
|
+
|
243
|
+
t1 = ((s & lalpha).length > 0)
|
244
|
+
t2 = ((s & ualpha).length > 0)
|
245
|
+
t3 = ((s & num).length > 0)
|
246
|
+
|
247
|
+
t4 = ((s & sym).length > 0)
|
248
|
+
|
249
|
+
[(t1 and t2 and t3 and !t4), res = { has_lower_alpha: t1, has_upper_alpha: t2, has_num: t3, has_symbol: t4 }]
|
250
|
+
end
|
251
|
+
|
252
|
+
def has_alpha_numeric?(str)
|
253
|
+
return false if is_empty?(str)
|
254
|
+
|
255
|
+
s = str.split("")
|
256
|
+
lalpha = ('a'..'z').to_a
|
257
|
+
ualpha = ('A'..'Z').to_a
|
258
|
+
num = ('0'..'9').to_a
|
259
|
+
alphanum = [lalpha, ualpha, num].flatten
|
260
|
+
|
261
|
+
(s & alphanum).length > 0
|
262
|
+
|
263
|
+
end
|
264
|
+
|
265
|
+
def all_alpha_numeric_and_symbol?(str)
|
266
|
+
return false if is_empty?(str)
|
267
|
+
|
268
|
+
s = str.split("")
|
269
|
+
lalpha = ('a'..'z').to_a
|
270
|
+
ualpha = ('A'..'Z').to_a
|
271
|
+
num = ('0'..'9').to_a
|
272
|
+
sym = ('!'..'?').to_a
|
273
|
+
sym = sym.difference(num)
|
274
|
+
|
275
|
+
t1 = ((s & lalpha).length > 0)
|
276
|
+
t2 = ((s & ualpha).length > 0)
|
277
|
+
t3 = ((s & num).length > 0)
|
278
|
+
t4 = ((s & sym).length > 0)
|
279
|
+
|
280
|
+
[(t1 and t2 and t3 and t4), res = { has_lower_alpha: t1, has_upper_alpha: t2, has_num: t3, has_symbol: t4 }]
|
281
|
+
end
|
282
|
+
|
283
|
+
def has_alpha_numeric_or_symbol?(str)
|
284
|
+
return false if is_empty?(str)
|
285
|
+
|
286
|
+
s = str.split("")
|
287
|
+
lalpha = ('a'..'z').to_a
|
288
|
+
ualpha = ('A'..'Z').to_a
|
289
|
+
num = ('0'..'9').to_a
|
290
|
+
sym = ('!'..'?').to_a
|
291
|
+
sym = sym.difference(num)
|
292
|
+
|
293
|
+
t1 = ((s & lalpha).length > 0)
|
294
|
+
t2 = ((s & ualpha).length > 0)
|
295
|
+
t3 = ((s & num).length > 0)
|
296
|
+
t4 = ((s & sym).length > 0)
|
297
|
+
|
298
|
+
[(t1 or t2 or t3 or t4), res = { has_lower_alpha: t1, has_upper_alpha: t2, has_num: t3, has_symbol: t4 }]
|
299
|
+
end
|
300
|
+
|
301
|
+
private
|
302
|
+
def logger
|
303
|
+
logger = Antrapol::ToolRack::Logger.instance.glogger
|
304
|
+
logger.tag = :pass_utils
|
305
|
+
logger
|
306
|
+
end
|
307
|
+
|
20
308
|
end
|
21
309
|
end
|
22
310
|
end
|
data/lib/toolrack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toolrack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-09-
|
11
|
+
date: 2021-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tlogger
|