password_generate 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 +7 -0
- data/lib/password_generate.rb +133 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d2da48eb146ee09d2349e32caa8cf504a3832155
|
4
|
+
data.tar.gz: d9da177ddd8ee2680dbdd8cadc3cb15f2c893223
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9cba1cff8c9e5bbb328c76d94abc7e14a2ccb0131a8048e6b67d9100d04879ce4c0fea12b683fb2bacea544cf2378680e9fcdb23fa29d0db5869fe6408d0cfa3
|
7
|
+
data.tar.gz: 1a8bc211053d052a452438f54119fd96b4efaffad6af7a13237f3c8969eba414457dbbbaccea326175f8970c39175a34ce1dcd9600d9547600439568a0812bf6
|
@@ -0,0 +1,133 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
##
|
4
|
+
# usage:
|
5
|
+
# ./password_generate.rb mode length
|
6
|
+
# ./password_generate.rb mode
|
7
|
+
# ./password_generate.rb length
|
8
|
+
# ./password_generate.rb
|
9
|
+
#
|
10
|
+
# mode = m[ixed]|a[lphanum]|n[um] ; default mixed
|
11
|
+
# length = (integer >= 3) ; default = 12
|
12
|
+
#
|
13
|
+
# ----- as package -----
|
14
|
+
# require 'password_generate'
|
15
|
+
# p PasswordGenerate.generate mode, length
|
16
|
+
# p PasswordGenerate.generate mode
|
17
|
+
# p PasswordGenerate.generate length
|
18
|
+
# p PasswordGenerate.generate
|
19
|
+
##
|
20
|
+
|
21
|
+
class Object
|
22
|
+
def is_number?
|
23
|
+
self.to_f.to_s == self.to_s || self.to_i.to_s == self.to_s
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module PasswordGenerate
|
28
|
+
|
29
|
+
## setup chars pool
|
30
|
+
|
31
|
+
# no Ii Ll Oo 0 1
|
32
|
+
ALPHA = 'ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz'
|
33
|
+
NUM = '23456789'
|
34
|
+
SYMBOL = '_'
|
35
|
+
|
36
|
+
def self.generate mode = nil, length = nil
|
37
|
+
|
38
|
+
## normalize args
|
39
|
+
|
40
|
+
mode = case mode.to_s[0]
|
41
|
+
when 'm' then 'mixed'
|
42
|
+
when 'a' then 'alphanum'
|
43
|
+
when 'n' then 'num'
|
44
|
+
else 'mixed'
|
45
|
+
end
|
46
|
+
|
47
|
+
length = 12 unless length.is_number?
|
48
|
+
length = 3 if length.to_i < 3
|
49
|
+
length = length.to_i
|
50
|
+
|
51
|
+
pool = case mode
|
52
|
+
when 'num' then NUM
|
53
|
+
when 'alphanum' then ALPHA + NUM
|
54
|
+
when 'mixed' then SYMBOL + ALPHA + NUM
|
55
|
+
end
|
56
|
+
|
57
|
+
## fill in password places
|
58
|
+
|
59
|
+
password = {}
|
60
|
+
spots = (0..length-1).to_a
|
61
|
+
|
62
|
+
# first select a random non-first place to put a symbol in
|
63
|
+
if mode == 'mixed'
|
64
|
+
bit = pick SYMBOL
|
65
|
+
key = pick (0..spots.size-1).to_a
|
66
|
+
pos = spots[key]
|
67
|
+
pos = 1 if pos == 0
|
68
|
+
fill password, bit, spots, pos, key
|
69
|
+
end
|
70
|
+
|
71
|
+
# put first as alpha
|
72
|
+
if mode == 'alphanum' || mode == 'mixed'
|
73
|
+
bit = pick ALPHA
|
74
|
+
fill password, bit, spots, 0, 0
|
75
|
+
end
|
76
|
+
|
77
|
+
# ensure at least one num present
|
78
|
+
bit = pick NUM
|
79
|
+
key = pick (0..spots.size-1).to_a
|
80
|
+
pos = spots[key]
|
81
|
+
fill password, bit, spots, pos, key
|
82
|
+
|
83
|
+
# fill remaining
|
84
|
+
spots.each do |v|
|
85
|
+
# disallow adjacent same char
|
86
|
+
loop do
|
87
|
+
bit = pick pool
|
88
|
+
break if v == 0 || bit != password[v-1]
|
89
|
+
end
|
90
|
+
|
91
|
+
fill password, bit, spots, v
|
92
|
+
end
|
93
|
+
|
94
|
+
## format password into a string
|
95
|
+
|
96
|
+
password.sort.map { |v| v[1] }.join('')
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.pick pool
|
100
|
+
v = nil
|
101
|
+
v = pool.split('').sample if pool.respond_to? :split
|
102
|
+
v = pool.sample if pool.respond_to? :sample
|
103
|
+
v
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.fill password, bit, spots, pos, key = nil
|
107
|
+
password[pos] = bit
|
108
|
+
spots.delete_at key unless key == nil
|
109
|
+
end
|
110
|
+
|
111
|
+
end # module
|
112
|
+
|
113
|
+
## main
|
114
|
+
|
115
|
+
if __FILE__ == $0 # run as script
|
116
|
+
|
117
|
+
mode = nil
|
118
|
+
length = nil
|
119
|
+
|
120
|
+
if ARGV.size > 0
|
121
|
+
arg = ARGV[0]
|
122
|
+
if arg.is_number? # this is a number, parse as [length]
|
123
|
+
length = arg
|
124
|
+
else # else parse as [mode]
|
125
|
+
mode = arg
|
126
|
+
end
|
127
|
+
|
128
|
+
length = ARGV[1] if ARGV.size > 1 # parse a possible 2nd [length]
|
129
|
+
end
|
130
|
+
|
131
|
+
puts PasswordGenerate.generate mode, length
|
132
|
+
|
133
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: password_generate
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yulij Andreevich Lesov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-07-03 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Password generator
|
14
|
+
email:
|
15
|
+
- yalesov@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/password_generate.rb
|
21
|
+
homepage:
|
22
|
+
licenses:
|
23
|
+
- ISC
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.5.1
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Password generator
|
45
|
+
test_files: []
|