module Pwss::Password

some functions to manage password generation and clipboard

Constants

DEFAULT_PASSWORD_LENGTH

Public Class Methods

ask_password(prompt="Enter master password: ") click to toggle source

Ask for a password fom the command line

# File lib/pwss/password.rb, line 37
def self.ask_password prompt="Enter master password: "
  printf prompt
  system "stty -echo"
  password = $stdin.gets.chomp
  system "stty echo"
  puts ""
  password
end
ask_password_twice(prompt="master password") click to toggle source

Ask for a password twice and make sure it is entered the same

# File lib/pwss/password.rb, line 47
def self.ask_password_twice prompt="master password"
  match = false
  while ! match
    password = ask_password "Enter #{prompt}: "
    repeat = ask_password "Repeat #{prompt}: "
    match = (password == repeat)

    if match == false then
      puts "Error! Password do not match.  Please enter them again."
    end
  end
  password
end
password(arguments = {}) click to toggle source

generate a password

optional hash arguments allows to define a strategy for generating a password and the password length of automatically generated passwords)

# File lib/pwss/password.rb, line 15
def self.password arguments = {}
  length = arguments[:length] || DEFAULT_PASSWORD_LENGTH
  strategy = arguments[:strategy] || 'random'

  case strategy
  when 'random', 'strong', 'alpha'
    return Pwss::Password.random_password(length, strategy)
  when 'ask'
    return Pwss::Password.ask_password_twice "new password for entry"
  when 'pwgen'
    begin
      password = %x(pwgen -N1 #{length}).chomp
      return password
    rescue
      raise "Error: pwgen not found.  Use one of random, strong, alpha, or ask."
    end
  else
    raise "Error: password generation strategy #{strategy} not understood."
  end
end
random_password(length=DEFAULT_PASSWORD_LENGTH, strategy="random") click to toggle source

Generate a random password (Adapted from: randompasswordsgenerator.net/tutorials/ruby-random-password-generator.html)

# File lib/pwss/password.rb, line 63
def self.random_password length=DEFAULT_PASSWORD_LENGTH, strategy="random"
  lower = 'abcdefghijkmnpqrstuvwxyz'
  upper = 'ABCDEFGHJKLMNPQRSTUVWXYZ'
  digits = '123456789'
  ambiguous = '0oOlI' 
  safe_symbols = '~!@#$%^-+_.,;:'
  difficult_symbols = '&*()={}[]|\\\"\'`<>?/'

  case strategy
  when 'random'
    chars = lower + upper + digits + safe_symbols + difficult_symbols + ambiguous
  when 'strong'
    chars = lower + upper + digits + safe_symbols
  when 'alpha'
    chars = lower + upper + digits
  else
    raise "Error: password generation strategy #{strategy} is not understood."
  end        

  Array.new(length) { chars[rand(chars.length)].chr }.join
end
to_clipboard(field_name, value, counter = 30) click to toggle source

make a field available to the clipboard for a given time (in seconds).

# File lib/pwss/password.rb, line 88
def self.to_clipboard field_name, value, counter = 30
  old_clipboard = Clipboard.paste
  Clipboard.copy value

  begin
    if counter <= 0
      STDIN.flush
      puts "\n#{field_name.capitalize} available in clipboard: press enter when you are done."
      STDIN.getc
    else
      puts "\n#{field_name.capitalize} available in clipboard for #{counter} seconds."
      sleep(counter)
    end
    Clipboard.copy old_clipboard
  rescue Exception => e
    Clipboard.copy old_clipboard
    puts "Clipboard restored"
  end
end