password_list_generator 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: af7c818191d93f55e126cd9ae899e1b73ff6bd7d
4
+ data.tar.gz: 8c4d0d2c5eada6099f0c18b5a2b0c94d2bfbf86f
5
+ SHA512:
6
+ metadata.gz: a3347e6ea74db08b3714c916e901626fd4f31856623b5cc5484228379eb8f5bbab11daeb87e69dee8494fc35793749b2677cdd91d44e0271ed38a3eb0a0cec45
7
+ data.tar.gz: e9c10812f9e29024af45bb5507e7e91ca179747b2546fa158612391e754184cb43b78db897181bfc461a3faab74e9df5e01100288227388bc1a9da67207e7285
data/bin/pwgen ADDED
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'etc'
4
+ require 'password_list_generator'
5
+ require 'optparse'
6
+ require 'ostruct'
7
+
8
+ # To use without rubygem: ruby -Ilib ./bin/genpw
9
+
10
+ user = Etc.getlogin
11
+ default_output = Dir.home(user) + "/password.txt"
12
+
13
+ options = OpenStruct.new
14
+ options.output_file = default_output
15
+ options.count = 100
16
+ options.uppercase = true
17
+ options.numeric = true
18
+ options.symbol = true
19
+ options.min = 14
20
+ options.max = 32
21
+
22
+ opts = OptionParser.new do |opts|
23
+ opts.banner = "Usage: genpw [options]"
24
+ opts.separator ""
25
+ opts.separator "Examples:"
26
+ opts.separator " pwgen --o /tmp/password.txt"
27
+ opts.separator " pwgen --uppercase false"
28
+ opts.separator "Options:"
29
+
30
+ opts.on("-o", "--output-file [#{default_output}]", "Ouput password file") do |output|
31
+ options.output_file = output
32
+ end
33
+
34
+ opts.on("-c", "--count [#{options.count}]", "Number of passwords to create") do |count|
35
+ options.count = count.to_i
36
+
37
+ if options.count == 0
38
+ puts "Count must be greater than 0"
39
+ exit
40
+ end
41
+ end
42
+
43
+ opts.on("--min [#{options.min}]", "Minimum length of password") do |min|
44
+ options.min = min.to_i
45
+
46
+ if min_gte_max?(options.min, options.max)
47
+ puts "Minimum number of characters (#{options.min}) must be less than maximum (#{options.max})"
48
+ exit
49
+ end
50
+ end
51
+
52
+ opts.on("--max [#{options.max}]", "Maximum length of password") do |max|
53
+ options.max = max.to_i
54
+
55
+ if min_gte_max?(options.min, options.max)
56
+ puts "Minimum number of characters (#{options.min}) must be less than maximum (#{options.max})"
57
+ exit
58
+ end
59
+ end
60
+
61
+ opts.on("-u", "--uppercase [#{options.uppercase}]", "Include uppercase characters in password") do |upper|
62
+ options.uppercase = true_values.include? upper
63
+ end
64
+
65
+ opts.on("-n", "--numeric [#{options.numeric}]", "Include numerical characters in password") do |numeric|
66
+ options.numeric = true_values.include? numeric
67
+ end
68
+
69
+ opts.on("-s", "--symbol [#{options.symbol}]", "Include symbol (!@#$%) characters in password") do |symbol|
70
+ options.symbol = true_values.include? symbol
71
+ end
72
+
73
+ opts.on_tail("-h", "--help", "Show this message") do
74
+ puts opts
75
+ exit
76
+ end
77
+
78
+ opts.on_tail("--version", "Show version") do
79
+ puts "Not yet implemented"
80
+ exit
81
+ end
82
+ end
83
+
84
+ def min_gte_max?(min, max)
85
+ min >= max
86
+ end
87
+
88
+ def true_values
89
+ ["1", "true", "t", "yes", "y"]
90
+ end
91
+
92
+ opts.parse!
93
+
94
+ passwords = PasswordListGenerator::Generator.new(options).generate
95
+ file = options.output_file
96
+
97
+ system "echo ' ' > #{file} \n\n"
98
+ system "echo 'Generated passwords meet the following requirements: ' >> #{file}"
99
+ system "echo 'Must have at least one lower case alphabetic character (a - z)' >> #{file}"
100
+ system "echo 'Must have at least one special character (!@#\$\%^&*())' >> #{file}" if options.symbol
101
+ system "echo 'Must have at least one numeric character (0 -9)' >> #{file}" if options.numeric
102
+ system "echo 'Must have at least one upper case alphabetic character (A - Z)' >> #{file}" if options.uppercase
103
+ system "echo 'Must have at least #{options.min} characters' >> #{file}"
104
+ system "echo 'Must have no more than #{options.max} characters' >> #{file}"
105
+ system "echo ' ' >> #{file}"
106
+ system "echo '" + passwords.map(&:to_s).join("\n\n") + "' >> #{file}"
107
+ puts "#{options.count} random passwords were generated into #{file}"
@@ -0,0 +1,48 @@
1
+ require 'securerandom'
2
+
3
+ module PasswordListGenerator
4
+ class Generator
5
+ attr_accessor :characters_set, :config
6
+
7
+ def initialize(config)
8
+ @config = config
9
+ build_characters_set
10
+ end
11
+
12
+ def generate
13
+ passwords = []
14
+
15
+ 1.upto(config.count) do
16
+ valid = false
17
+ random = ''
18
+
19
+ until valid
20
+ random_size = (config.min..config.max).to_a.shuffle.first
21
+ random = (1..random_size).map {|a| characters_set[SecureRandom.random_number(characters_set.size)]}.join
22
+ password = Password.new(random, config)
23
+
24
+ if password.valid?
25
+ passwords << password
26
+ valid = true
27
+ end
28
+ end
29
+ end
30
+
31
+ passwords
32
+ end
33
+
34
+ private
35
+
36
+ def build_characters_set
37
+ @characters_set = ('a'..'z').to_a
38
+ @characters_set += ('A'..'Z').to_a if config.uppercase
39
+ @characters_set += ('0'..'9').to_a if config.numeric
40
+ @characters_set += %w(! @ # $ % ^ & * _ +) if config.symbol
41
+ remove_ambiguous_characters
42
+ end
43
+
44
+ def remove_ambiguous_characters
45
+ @characters_set -= %w(i o O 1 l 0 I)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,40 @@
1
+ module PasswordListGenerator
2
+ class Password
3
+ attr_accessor :password, :config
4
+
5
+ def initialize(password, config)
6
+ @password = password
7
+ @config = config
8
+ end
9
+
10
+ def valid?
11
+ has_special? and has_numeric? and has_lowercase? and has_uppercase? and correct_length?
12
+ end
13
+
14
+ def to_s
15
+ password
16
+ end
17
+
18
+ private
19
+
20
+ def has_special?
21
+ config.symbol ? /\W/ === password : true
22
+ end
23
+
24
+ def has_numeric?
25
+ config.numeric ? /\d/ === password : true
26
+ end
27
+
28
+ def has_lowercase?
29
+ /[a-z]/ === password
30
+ end
31
+
32
+ def has_uppercase?
33
+ config.uppercase ? /[A-Z]/ === password : true
34
+ end
35
+
36
+ def correct_length?
37
+ password.size >= config.min and password.size <= config.max
38
+ end
39
+ end
40
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: password_list_generator
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Stephane Liu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-24 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Generate a list of passwords from command line with options for length
14
+ and complexity into a file of your choice.
15
+ email: sliu@sjliu.com
16
+ executables:
17
+ - pwgen
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/password_list_generator/password.rb
22
+ - lib/password_list_generator/generator.rb
23
+ - bin/pwgen
24
+ homepage: https://github.com/stephaneliu/password_generator
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.0.6
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Generate list of passwords easily from command line
48
+ test_files: []