jameswilding-passgen 1.3.0 → 2.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.
@@ -1,36 +1,32 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'optparse'
3
-
4
- # Try for the gem version, fallback on the development version.
5
- begin
6
- require 'passgen'
7
- rescue LoadError
8
- require File.join(File.dirname(__FILE__), '..', 'lib', 'passgen')
9
- end
3
+ require 'rubygems'
4
+ require 'passgen'
10
5
 
11
6
  options = {}
12
7
 
13
- # Command line switches
14
- OptionParser.new do |opts|
15
- opts.banner = "Usage: passgen [options]"
8
+ begin
9
+ # Command line switches
10
+ OptionParser.new do |opts|
11
+ opts.banner = "Usage: passgen [options]"
16
12
 
17
- opts.on('-l', '--length n', Integer, 'Make a password of length n (default is 10)') do |n|
18
- options[:length] = n
19
- end
20
-
21
- opts.on('-H', '--hex', 'Output both plain text and hexdigest-encrypted versions of the password') do |hex|
22
- options[:hex] = hex
23
- end
24
-
25
- end.parse!
13
+ opts.on('-l', '--length N', Integer, 'Make a password of length N (default is 10)') do |n|
14
+ options[:length] = n
15
+ end
26
16
 
27
- # New password according to options
28
- password = PassGen::Password.new(options)
17
+ opts.on('--memorable', 'Create a more memorable (but less secure) password using real words. Ignores --length') do
18
+ options[:memorable] = true
19
+ end
29
20
 
30
- # Show hexed password if requested
31
- if options[:hex]
32
- puts "Plain: #{password}"
33
- puts "Hexed: #{password.hexed}"
21
+ opts.on('-H', '--hexed', 'Output both plain text and hexdigest-encrypted versions of the password') do
22
+ options[:hex] = true
23
+ end
24
+
25
+ end.parse!
26
+ rescue OptionParser::InvalidOption, OptionParser::InvalidArgument
27
+ puts "Usage: passgen [--length N | --memorable] [--hexed]"
28
+ puts
29
+ puts "Try passgen --help for more information."
34
30
  else
35
- puts password
31
+ PassGen::CLI.execute(options)
36
32
  end
@@ -1,5 +1,7 @@
1
- require File.join(File.dirname(__FILE__), 'passgen', 'password')
1
+ require 'passgen/password'
2
+ require 'passgen/memorable'
3
+ require 'passgen/cli'
2
4
 
3
5
  module PassGen
4
- VERSION = '1.3.0'
6
+ VERSION = '2.0.0'
5
7
  end
@@ -0,0 +1,39 @@
1
+ module PassGen
2
+ module CLI
3
+
4
+ class << self
5
+ def execute(options)
6
+ @@options = options
7
+
8
+ if options[:hex]
9
+ execute_with_hexing
10
+ else
11
+ execute_without_hexing
12
+ end
13
+ end
14
+
15
+ private
16
+ def execute_without_hexing
17
+ say normal_or_memorable_password
18
+ end
19
+
20
+ def execute_with_hexing
21
+ password = normal_or_memorable_password
22
+ say "plain: #{password}", "hexed: #{password.hexed}"
23
+ end
24
+
25
+ def normal_or_memorable_password
26
+ if @@options[:memorable]
27
+ PassGen::Memorable::Password.new
28
+ else
29
+ PassGen::Password.new(@@options)
30
+ end
31
+ end
32
+
33
+ def say(*things)
34
+ STDOUT.puts things.join("\n")
35
+ end
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,54 @@
1
+ require 'digest/sha1'
2
+
3
+ module PassGen
4
+ module Memorable
5
+ class Password < String
6
+
7
+ SYMBOLS = %w(% & $ £ @ !)
8
+
9
+ def initialize
10
+ @dictionary = Dictionary.new
11
+ super(random_words_symbols_and_numbers)
12
+ end
13
+
14
+ def hexed
15
+ Digest::SHA1.hexdigest(self)
16
+ end
17
+
18
+ private
19
+ def random_words_symbols_and_numbers
20
+ (random_words.join random_symbols_and_numbers).downcase
21
+ end
22
+
23
+ def random_words
24
+ [@dictionary.random, @dictionary.random]
25
+ end
26
+
27
+ def random_symbols_and_numbers
28
+ SYMBOLS[rand(SYMBOLS.length)] + random_numbers
29
+ end
30
+
31
+ def random_numbers
32
+ rand(10).to_s + rand(10).to_s
33
+ end
34
+ end
35
+
36
+ # Inspired by http://stephencelis.com/2009/03/29/whats-the-password-haddock.html
37
+ class Dictionary
38
+
39
+ PATHS = %w(/usr/share/dict/words /usr/share/words)
40
+
41
+ def random
42
+ words = get_words
43
+ words[rand(words.length)].chomp
44
+ end
45
+
46
+ def get_words
47
+ File.readlines(PATHS.first).select { |word| word.length < 6 }
48
+ rescue Errno::ENOENT
49
+ File.readlines(PATHS.last).select { |word| word.length < 6 }
50
+ end
51
+
52
+ end
53
+ end
54
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jameswilding-passgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Wilding
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-12 00:00:00 -07:00
12
+ date: 2009-06-17 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: Passgen quickly generates random, alphanumeric passwords of up to twenty characters.
16
+ description: Passgen generates random, alphanumeric passwords of up to twenty characters, which can be made memorable if you don't mind the security tradeoff.
17
17
  email:
18
18
  executables:
19
19
  - passgen
@@ -24,6 +24,8 @@ extra_rdoc_files: []
24
24
  files:
25
25
  - bin/passgen
26
26
  - lib/passgen.rb
27
+ - lib/passgen/cli.rb
28
+ - lib/passgen/memorable.rb
27
29
  - lib/passgen/password.rb
28
30
  has_rdoc: false
29
31
  homepage:
@@ -50,6 +52,6 @@ rubyforge_project:
50
52
  rubygems_version: 1.2.0
51
53
  signing_key:
52
54
  specification_version: 2
53
- summary: random password generator
55
+ summary: random password generator with command-line utility
54
56
  test_files: []
55
57