class Trustworthy::Prompt

Public Class Methods

new(config_file, terminal = HighLine.new) click to toggle source
# File lib/trustworthy/prompt.rb, line 5
def initialize(config_file, terminal = HighLine.new)
  @config_file = config_file
  @terminal = terminal
end

Public Instance Methods

_ask(question) click to toggle source
# File lib/trustworthy/prompt.rb, line 97
def _ask(question)
  @terminal.ask(question).to_s
end
_ask_password(question) click to toggle source
# File lib/trustworthy/prompt.rb, line 101
def _ask_password(question)
  @terminal.ask(question) { |q| q.echo = false }.to_s
end
_ask_password_with_strength_requirements(question) click to toggle source
# File lib/trustworthy/prompt.rb, line 105
def _ask_password_with_strength_requirements(question)
  loop do
    password = @terminal.ask(question) { |q| q.echo = false }.to_s
    return password if _strong_password?(password)
    _error('Password is too weak')
  end
end
_error(message) click to toggle source
# File lib/trustworthy/prompt.rb, line 125
def _error(message)
  colored_message = @terminal.color(message, :error)
  _say(colored_message)
end
_say(message) click to toggle source
# File lib/trustworthy/prompt.rb, line 113
def _say(message)
  @terminal.say(message)
end
_strong_password?(password) click to toggle source
# File lib/trustworthy/prompt.rb, line 117
def _strong_password?(password)
  return false unless password =~ /.{8,}/
  return false unless password =~ /[0-9]/
  return false unless password =~ /[A-Za-z]/
  return false unless password =~ /\W/
  true
end
_unlock_key(settings, usernames_in_use) click to toggle source
# File lib/trustworthy/prompt.rb, line 70
def _unlock_key(settings, usernames_in_use) # rubocop:disable Metrics/MethodLength
  username = nil
  loop do
    username = _ask('Username: ')
    if usernames_in_use.include?(username)
      _error("Key #{username} is already in use")
    elsif settings.find_key(username).nil?
      _error("Key #{username} does not exist")
    else
      break
    end
  end

  key = nil
  begin
    password = _ask_password('Password: ')
    key = settings.unlock_key(username, password)
  rescue ArgumentError
    _error("Password incorrect for #{username}")
    retry
  end

  _say("Unlocked #{username}")

  [username, key]
end
add_user_key(key) click to toggle source
# File lib/trustworthy/prompt.rb, line 10
def add_user_key(key)
  Trustworthy::Settings.open(@config_file) do |settings|
    username = nil
    loop do
      username = _ask('Username: ')
      break unless settings.key?(username)
      _error("Key #{username} is already in use")
    end

    loop do
      password = _ask_password_with_strength_requirements('Password: ')
      password_confirm = _ask_password('Password (again): ')
      if password == password_confirm
        settings.add_key(key, username, password)
        break
      else
        _error('Passwords do not match.')
      end
    end

    username
  end
end
change_user_password() click to toggle source
# File lib/trustworthy/prompt.rb, line 34
def change_user_password
  Trustworthy::Settings.open(@config_file) do |settings|
    username, key = _unlock_key(settings, [])

    loop do
      password = _ask_password_with_strength_requirements('Password: ')
      password_confirm = _ask_password('Password (again): ')
      if password == password_confirm
        settings.add_key(key, username, password)
        break
      else
        _error('Passwords do not match.')
      end
    end

    username
  end
end
unlock_master_key() click to toggle source
# File lib/trustworthy/prompt.rb, line 53
def unlock_master_key
  usernames_in_use = []
  Trustworthy::Settings.open(@config_file) do |settings|
    raise 'must have two keys to unlock master key' unless settings.recoverable?

    username1, key1 = _unlock_key(settings, usernames_in_use)
    usernames_in_use << username1

    _, key2 = _unlock_key(settings, usernames_in_use)

    master_key = Trustworthy::MasterKey.create_from_keys(key1, key2)
    _say('Reconstructed master key')

    master_key
  end
end