class Pass

Constants

MIN_NUM_CHARACTERS
NUM_CHARACTERS
VERSION

Public Class Methods

generate(num = NUM_CHARACTERS) click to toggle source
# File lib/pass.rb, line 48
def Pass.generate(num = NUM_CHARACTERS)
  Pass.new.generate(num)
end
new() click to toggle source
# File lib/pass.rb, line 10
def initialize
  @list_carachters = ('a'..'z').to_a + ('A'..'Z').to_a + ('1'..'9').to_a - %w[l o I O 1]
  @num_iteration = 100

  # Password must include digit, upper case, and lower case.
  @validation_regexps = [/\d/, /[a-z]/, /[A-Z]/]
end

Public Instance Methods

exec(argv) click to toggle source
# File lib/pass.rb, line 52
  def exec(argv)
    num_characters = NUM_CHARACTERS
    opts = OptionParser.new
    opts.on('-c NUM', 'specify password length') do |value|
      num_characters = value
    end
    opts.on_tail('-v', '--version', 'show version') do
      puts "#{self.class.name} #{version}"
      exit 0
    end
    opts.banner = <<END
Usage: pass [options] [number of passwords]

Description:
  Generates random passwords.

Options:
END
    begin
      res_argv = opts.parse!(argv)
      num_times = res_argv[0] || 1
      puts multi_generate(num_times.to_i, num_characters.to_i)
    rescue SystemExit
    rescue Exception => e
      $stderr.puts "Error: #{e.message}"
      exit 1
    end
    exit 0
  end
generate(num = NUM_CHARACTERS) click to toggle source
# File lib/pass.rb, line 18
def generate(num = NUM_CHARACTERS)
  if !integer?(num) || num < MIN_NUM_CHARACTERS
    raise Pass::Error, "Invalid Argument: number of characters should be more than #{MIN_NUM_CHARACTERS}."
  end

  @num_iteration.times do
    rest_num = num
    pass = ""
    while rest_num > list_size do
      pass += generate_password(list_size)
      rest_num -= list_size
    end
    pass += generate_password(rest_num)
    return pass if valid?(pass)
  end
  raise Pass::Error, "Not Converged: #{@num_iteration} times"
end
multi_generate(num_password, num_character = NUM_CHARACTERS) click to toggle source
# File lib/pass.rb, line 40
def multi_generate(num_password, num_character = NUM_CHARACTERS)
  passwords = []
  num_password.times do
    passwords << generate(num_character)
  end
  passwords
end
num_iteration() click to toggle source
# File lib/pass.rb, line 82
def num_iteration
  @num_iteration
end
num_iteration=(value) click to toggle source
# File lib/pass.rb, line 86
def num_iteration=(value)
  raise(Error, "Invalid Argument: num_iteration #{value}") if !integer?(value) || value <= 0
  @num_iteration = value
end
valid?(pass) click to toggle source
# File lib/pass.rb, line 36
def valid?(pass)
  @validation_regexps.all?{|reg| reg =~ pass}
end
version() click to toggle source
# File lib/pass.rb, line 91
def version
  VERSION
end

Private Instance Methods

generate_password(num) click to toggle source
# File lib/pass.rb, line 104
def generate_password(num)
  raise ArgumentError, "argument must be less than #{list_size}" if num > list_size
  @list_carachters.sample(num).join
end
integer?(value) click to toggle source
# File lib/pass.rb, line 96
def integer?(value)
  value.kind_of?(Integer)
end
list_size() click to toggle source
# File lib/pass.rb, line 100
def list_size
  @list_carachters.size
end