class OnePass::Password

Fork out to `pinentry` for password

Constants

DEFAULT
DESCRIPTION

Public Class Methods

new(opts = {}) click to toggle source
# File lib/OnePass/password.rb, line 12
def initialize(opts = {})
  @config = OpenStruct.new DEFAULT.merge(opts)
  if @config.vault_path
    @config.description ||= "#{DESCRIPTION}%0a#{@config.vault_path}"
  end
end

Public Instance Methods

done() click to toggle source
# File lib/OnePass/password.rb, line 28
def done
  send 'BYE'
  @pipe.close
end
prompt(error_message = nil) click to toggle source
# File lib/OnePass/password.rb, line 19
def prompt(error_message = nil)
  @config.error = error_message
  @pipe = IO.popen 'pinentry', 'r+'
  check
  send_settings
  fetch_password
  @password
end

Private Instance Methods

check() click to toggle source
# File lib/OnePass/password.rb, line 75
def check
  response = @pipe.gets
  raise 'bad response' unless response.start_with? 'OK'
end
command(command, option = nil) click to toggle source
# File lib/OnePass/password.rb, line 62
def command(command, option = nil)
  send command, option
  check
end
fetch_password() click to toggle source
# File lib/OnePass/password.rb, line 46
def fetch_password
  @password = ''
  send 'GETPIN'
  loop do
    case response = @pipe.gets
    when /^D .*/ then @password = response[2..-1].chomp
    when /^OK/ then break
    else
      @password = nil
      break
    end
  end
rescue Interrupt
  @password = nil
end
option(name, value) click to toggle source
# File lib/OnePass/password.rb, line 67
def option(name, value)
  command 'OPTION', "#{name}=#{value}"
end
send(command, option = nil) click to toggle source
# File lib/OnePass/password.rb, line 71
def send(command, option = nil)
  @pipe.puts "#{command}#{option ? ' ' + option : ''}"
end
send_settings() click to toggle source
# File lib/OnePass/password.rb, line 35
def send_settings
  command 'SETTITLE', @config.title
  command 'SETPROMPT', @config.prompt
  command 'SETERROR', @config.error if @config.error
  command 'SETDESC', @config.description

  option 'ttytype', ENV['TERM']
  option 'ttyname', $stdin.ttyname
  option 'display', ENV['DISPLAY']
end