class FunWith::Passwords::FileStore

The FileStore knows only where to save itself, and how to encrypt and decrypt the file. The contents of a file are a mystery for Keychain to deal with

Constants

DEFAULT_DIR
DEFAULT_EXT
DEFAULT_FILENAME

Attributes

key_chain[RW]
password_file[RW]

Public Class Methods

default_file() click to toggle source
# File lib/fun_with/passwords/file_store.rb, line 14
def self.default_file
  DEFAULT_DIR.join( "#{DEFAULT_FILENAME}.#{DEFAULT_EXT}" )
end
new( filename = nil ) click to toggle source

if the key is nil, waits until a password is requested or added to decrypt password file

# File lib/fun_with/passwords/file_store.rb, line 19
def initialize( filename = nil )
  @password_file = expand_filepath( filename )
  @password_file.touch
end

Public Instance Methods

save( yaml, master_key ) click to toggle source

def initialize_key_chain_if_needed( keychain_keys, master_key )

unless @key_chain
  @key_chain = Keychain.new( :keys => keychain_keys, :master_key => master_key )
  @key_chain.file_store = self
end

end

# File lib/fun_with/passwords/file_store.rb, line 40
def save( yaml, master_key )
  encrypted_message = Crypt.encrypt( yaml, master_key )
  @password_file.write( encrypted_message )
  true
rescue Exception => e
  false
end
unlock( master_key ) click to toggle source

sends back a Keychain that knows where its store is

# File lib/fun_with/passwords/file_store.rb, line 25
def unlock( master_key )
  if @password_file.file? && !@password_file.empty?
    YAML.load( Crypt.decrypt( @password_file.read, master_key ) )
  else
    {}
  end
end

Protected Instance Methods

expand_filepath( filename = nil ) click to toggle source

Just the filename? Send it to the default directory. nil? Use the default filename and default directory. Only a directory given? append default filename It’s an existing file? Overwrite, I suppose. doesn’t exist? Assume filename if a dot is included

# File lib/fun_with/passwords/file_store.rb, line 54
def expand_filepath( filename = nil )
  if filename.nil?
    return DEFAULT_DIR.join( "#{DEFAULT_FILENAME}.#{DEFAULT_EXT}" )
  end
  
  file = filename.fwf_filepath
  
  if file.directory?
    return file.join( "#{DEFAULT_FILENAME}.#{DEFAULT_EXT}" )
  elsif file.file?
    return file 
  end
  
  file = file.expand
  
  if file.directory?
    return file.join( "#{DEFAULT_FILENAME}.#{DEFAULT_EXT}" )
  else
    file.touch
    return file
  end
end