leetpassword 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6626d55c70b424ed0b42650cfbe73d9b375dbe93
4
- data.tar.gz: 93773ec00c5da1c4deb4568f1e57d23a1bd4f91b
2
+ SHA256:
3
+ metadata.gz: 525ed07cdf7cb955fea1468d151e39b33493e8382e5243702f8601606f897206
4
+ data.tar.gz: 77ce5322708ffb6a0295988e3049d619a855ab09434d83cd6dc5bef73ce16f43
5
5
  SHA512:
6
- metadata.gz: ca5eddc7bcef6521e1ccd56e813ae955796243a598dbdf2a66774cda7d0e6cdb930da4671bf7e6bc3759a5bb6abbf42bb94487385f99f0324d6e9155170a7423
7
- data.tar.gz: f974049afa1240fa46b4ffe3585cb785f7b8567d298c0aa91067cdeeca92f70f233ad06d94865fd0f0e9be288d53777ca44fe135ea90b0680d3de19c3a873edf
6
+ metadata.gz: e670eaa8346bc1b380a0644f4d4797c945ee51cbf5a79c7667943581c4d5691f0f88b0ad50c61131181a3ec7f9ab14f78fcfb61e01592b51d598dab09520c650
7
+ data.tar.gz: 318377588112f117415b5cbbc56c368afd4e0fb16c29179dc54ea2d38536efa1a6299c820312ac2f81ed550c51fdf144b5a167772816f67f0a975d65920f57dd
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/leetpassword.rb CHANGED
@@ -6,42 +6,124 @@ require 'random_word'
6
6
 
7
7
  class LeetPassword
8
8
 
9
- def self.generate(max_len=nil, subs={i: '1', o: '0', e: '3'})
9
+ # note: nowadays it's typical for passwords to be required to
10
+ # contain at least 1 symbol, 2 uppercase characters and 2 numerals
11
+ #
12
+ def self.generate(max_len=nil, subs: {i: '1', o: '0', e: '3'},
13
+ symlist: ['@'], upcase: 2, symchar: 1, debug: false,
14
+ verbose: true)
15
+
16
+ max_len += symchar if max_len
10
17
 
11
18
  if max_len and max_len <= 6 then
12
19
  raise "max length must be greater than 6 characters"
13
20
  end
14
21
 
15
- noun = RandomWord.nouns.next.gsub(/_/,'')
22
+ rawnoun = RandomWord.nouns.next
23
+ hint1 = rawnoun.clone
24
+ noun = rawnoun.gsub(/_/,'')
16
25
  if max_len then
17
26
  until noun.length >= 6 and noun.length <= max_len
18
- noun = RandomWord.nouns.next.gsub(/_/,'')
27
+ rawnoun = RandomWord.nouns.next
28
+ hint1 = rawnoun.clone
29
+ noun = rawnoun.gsub(/_/,'')
19
30
  end
20
31
  end
21
32
 
33
+
22
34
  subs.each{|k,v| noun.gsub!(k.to_s,v)}
23
- return noun if noun.length > 7
24
35
 
25
- adj = RandomWord.adjs.next.gsub(/_/,'')
36
+ if noun.length > 7 then
37
+
38
+ n = upcase / 2
39
+ r = upcase - n
40
+ noun.sub!(/[a-z]{#{n}}/) {|x| x.upcase}
41
+ noun.sub!(/[a-z]{#{r}}/) {|x| x.upcase}
42
+
43
+ noun += symlist.sample
44
+ puts 'returning a noun' if debug
45
+ puts 'hint: ' + hint1 if verbose
46
+ return [noun, :noun, hint1]
47
+ end
48
+
49
+ rawadj = RandomWord.adjs.next
50
+ hint2 = rawadj.clone
51
+ adj = rawadj.gsub(/_/,'')
52
+
26
53
  if max_len then
27
54
  until adj.length >= 6 and adj.length <= max_len
28
- adj = RandomWord.adjs.next.gsub(/_/,'')
55
+ rawadj = RandomWord.adjs.next
56
+ hint2 = rawadj.clone
57
+ adj = rawadj.gsub(/_/,'')
29
58
  end
30
59
  end
31
60
 
61
+
32
62
  subs.each{|k,v| adj.gsub!(k.to_s,v)}
33
63
 
34
- return adj if adj.length > 7
64
+ if adj.length > 7 then
65
+ n = upcase / 2
66
+ r = upcase - n
67
+ adj.sub!(/[a-z]{#{n}}/) {|x| x.upcase}
68
+ adj.sub!(/[a-z]{#{r}}/) {|x| x.upcase}
69
+ adj += symlist.sample
70
+ puts 'returning an adjective' if debug
71
+ puts 'hint: ' + hint2 if verbose
72
+ return [adj, :adj, hint2]
73
+ end
74
+
75
+ hint = hint1 + ' ' + hint2
35
76
 
36
77
  if max_len then
37
- if (adj+noun).length <= max_len then
38
- return adj + noun
78
+
79
+ words = [noun, adj]
80
+
81
+ n = upcase / 2
82
+ r = upcase - n
83
+ words[0].sub!(/.{#{n}}/) {|x| x.upcase}
84
+ words[-1].sub!(/.{#{r}}/) {|x| x.upcase}
85
+ words.insert 1, symlist.sample(symchar)
86
+
87
+ if (words.join).length <= max_len then
88
+ puts 'returning a maxlen word' if debug
89
+ puts 'hint: ' + hint if verbose
90
+ return [words.join, :maxlen, hint]
39
91
  else
40
- LeetPassword.generate(max_len,subs)
92
+ LeetPassword.generate(max_len, verbose: verbose)
41
93
  end
94
+
42
95
  else
43
- return adj + noun
96
+
97
+ words = [noun, adj]
98
+ n = upcase / 2
99
+ r = upcase - n
100
+
101
+ words[0].sub!(/.{#{n}}/) {|x| x.upcase}
102
+ words[-1].sub!(/.{#{r}}/) {|x| x.upcase}
103
+ words.insert 1, symlist.sample(symchar)
104
+ puts 'words: ' + words.inspect if debug
105
+ puts 'returning a variable length' if debug
106
+ puts 'hint: ' + hint if verbose
107
+ return [words.join, :varlen, hint]
108
+
44
109
  end
110
+
111
+ end
112
+
113
+ # This method makes it easier to remember the password since it consists of
114
+ # the following:
115
+ #
116
+ # * 2 words
117
+ # * each word is capitalized
118
+ # * the letters i, e, o are replaced with the numbers 1, 3, and
119
+ # 0 respectively
120
+ # * the words are separated by the @ symbol
121
+ # * a password never longer than 12 characters
122
+ #
123
+ def self.easygen()
124
+ pwd, type, hint = self.generate(12, verbose: false) until type == :maxlen
125
+ puts 'hint: ' + hint
126
+ return pwd
45
127
  end
46
128
  end
47
129
 
data.tar.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- H������9��`4�a��$�U/�/Gs��D*�k~�2�#Dl�X����a4��\903�ݝ+��ќd-Ϸ�sG!����d�*��
2
- �]���̍^� �� 1�I��3�͠d�P�)�YZh�la�G"��n�3����\^��j�/l�,1�*�ո
1
+ V^DCH���h�73�� y���ߦ`������8 +!�O�`����~�?=�"�8i�#Z�0�K6@�SKa#=��=�V� 6�7A���- UUq]��'J��T ��|���@��Qւ@d��a17E���MA�����f���KK��x�q�˙���^�P5�����iZW�:B���{qB��S�+#�`@�����
2
+ �ً�r��@m�>���Y2A��J.k�SJ�לs���[t��P#�c���f̃�o���Ƣ*P�Θ^C[�Ж ޢ�8��: ����g���
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leetpassword
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,28 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRIwEAYDVQQDDAlnZW1t
14
- YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
- 8ixkARkWAmV1MB4XDTE3MTAxMzIyMTAyMFoXDTE4MTAxMzIyMTAyMFowSDESMBAG
16
- A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
- EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
- ggEBAKqVTZvRIo/S/lyFXVRQgCvmHcU035W6icbD71kiSBYf1ZCMpPMhytT712XN
19
- MQuAoH2W5nhia64cBh65J+KgZXpk+/Jn7Lr61/n5cXnyJdRDshlhA2IA4lNwCwfC
20
- X/6ExonxYBP5fGeLwnT18A/zsR9KG6MjLXz7lN2vnE59YpUKNtqOXfs3LFGhhTIw
21
- /lXv68UJqh9NdPojkYd6/4KxPNNTjURHn/8DXn7/LX3nOlNIzh6CWf26vOwcgl5y
22
- qB0qO0M7U1FFcxVEw2+C6LpU9n45vPfRUncO/tc4Yd6gMh4BQisfrizCwx+FCKlD
23
- w5NkIZQRkVbjBQj7zbdf1WnORnkCAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
- DwQEAwIEsDAdBgNVHQ4EFgQUaXe2QgBdxJMUNWkB6EX9OccT9fQwJgYDVR0RBB8w
25
- HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
26
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEAjcbBRL+O
27
- ZucXPylPska2k1dfg7Qi6C7DIS+GHdctLtr3Ai5yqc6vqwox8CXuRKsCfjugmO37
28
- Gbn9y5YN1uNzdSnQUzDySQXFtZkX0/iBG1AqXtJaPnQf9UQIdLAGE/WfRYDJoTLk
29
- bwLRO4s7Ni8Z68Lq+U6B7jspDwRLKYTiakxI3xXx80fgI1b+15prJ3q+tTe1L5fO
30
- J12SdMO/1GtUVI59iw9RuELsvDPhhtIcTPF/nyR0zNPW66piTatSem8/0IhDVejQ
31
- mxNWhqgDe+TwUqGUPFXFThzDq9ZGsAJC1zhOsoQXgujX+G1UZLqHvm2X3gT8j4HC
32
- 8G9hoiuQAkRL4A==
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwNTI2MDcyNjI5WhcN
15
+ MjMwNTI2MDcyNjI5WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDjaDKP
17
+ VUyQS52JKpSAbbWga2HvFbGxoe5AkMT05MJCeCYOZeK9jWn/UNUoTQQKvQbUf/+G
18
+ KdAsnMfKN4J0ZDvZcT6F1/+xQfX1y96ZOYC2LpEFNXEZYgEEr6Nys7SZ7wwmCpLj
19
+ sT03cQmNboZSlx2To60hYVkEXweFwabUzciuRUURCvnqTG2aTQ5NCMYImhkbisY+
20
+ 6ZFnZyluumfZCo2XkF24X8J2KJvwaH76JE4e1JsvhYbx29ozp/1orSfZOs8ExWM9
21
+ sVpCWb92iuT0nCqDxkGR6tWuCnltnlL3zrhkT2FsKThzPyCoU+iIfruIrUbG65zG
22
+ 11UZ7o82YBz6VF9L2cm/c4LKIxiBplH4wvWy5T4xNmqwOHoubhV+br4abzOE4U/9
23
+ RChvKpn9nw+nUZupLZE53BSG80pPh+bPXpYGjw+7wSFfhwPmakD65v1UEECjbsQt
24
+ NiJWqmGqR2UPL4dGLej46xTSuQpsaot8TLac/h9l0RnE0FBY+7sW/xSIaBkCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUSPoELqlZ
26
+ Pxh1xm67yjd/p2ZNbwkwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAZAvMNWQmxsY7o1CzPoUSA3HUm/BXSbt7EyFr2e9u
29
+ KTgr0wHUsgh9Svu51fOG9w/+BsFd3yS9VEnJUztDWEPnX/OnXKrdlQMKPWSsAo9c
30
+ 8HG+KcXJjAgqG2C0+5yUCQXzej0wIWU0n3L1/6e5V8+2Xu1EyOKvC5A9I+oCc+P6
31
+ LJqaMufUX9Qefm34ZBdgvqzn0AftvMjYIUOvbIU5uem017NSHD00bmH1xO4+Dxhh
32
+ ve3J+5FvPjgE54S29bbfgvMJRPNPpRf1kAxpHNmm4d+5QJRoIkFgwqr83jFW1w+l
33
+ 5wuteMtb63Rh60vdtkMRexdlSWF0Tbns/otn0oLNTGDEjptmskS9Tt9asV+vy+38
34
+ gB5hvm0ZVOhWTupZAzI90V0KfVnVqfeBrXD+e+2LhQZPur7DKW6hJ7atyXoKnPGQ
35
+ wsJoMv/2Pxome92q2iZQ0ZEEV4DYM6tpetiC3sLMT70W5dBAck6YkUBfDlbRlrU1
36
+ a48r2r3b5G9dmbtyJVaowaxo
33
37
  -----END CERTIFICATE-----
34
- date: 2017-10-13 00:00:00.000000000 Z
38
+ date: 2022-05-26 00:00:00.000000000 Z
35
39
  dependencies:
36
40
  - !ruby/object:Gem::Dependency
37
41
  name: random_word
@@ -39,22 +43,22 @@ dependencies:
39
43
  requirements:
40
44
  - - "~>"
41
45
  - !ruby/object:Gem::Version
42
- version: '0.1'
46
+ version: '2.1'
43
47
  - - ">="
44
48
  - !ruby/object:Gem::Version
45
- version: 0.1.0
49
+ version: 2.1.1
46
50
  type: :runtime
47
51
  prerelease: false
48
52
  version_requirements: !ruby/object:Gem::Requirement
49
53
  requirements:
50
54
  - - "~>"
51
55
  - !ruby/object:Gem::Version
52
- version: '0.1'
56
+ version: '2.1'
53
57
  - - ">="
54
58
  - !ruby/object:Gem::Version
55
- version: 0.1.0
59
+ version: 2.1.1
56
60
  description:
57
- email: james@jamesrobertson.eu
61
+ email: digital.robertson@gmail.com
58
62
  executables: []
59
63
  extensions: []
60
64
  extra_rdoc_files: []
@@ -79,8 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
83
  - !ruby/object:Gem::Version
80
84
  version: '0'
81
85
  requirements: []
82
- rubyforge_project:
83
- rubygems_version: 2.6.13
86
+ rubygems_version: 3.2.22
84
87
  signing_key:
85
88
  specification_version: 4
86
89
  summary: leetpassword creates a password with 1 or 2 random leet words.
metadata.gz.sig CHANGED
Binary file