lib/sym/app/private_key/detector.rb
require 'sym/app/private_key/base64_decoder'
require 'sym/app/private_key/decryptor'
require 'sym/app/private_key/key_source_check'
require 'sym/app/input/handler'
module Sym
module App
module PrivateKey
class Detector < Struct.new(:opts, :input_handler, :password_cache)
attr_accessor :key, :key_source
def initialize(*args)
super(*args)
read
end
def read
return key if key
self.key, self.key_source = read!
end
# Returns the first valid 32-bit key obtained by running the above
# procs on a given string.
def read!
KeySourceCheck::CHECKS.each do |source_check|
next unless result = source_check.detect(self) rescue nil
if key_ = normalize_key(result.key)
key_source_ = result.to_s
return key_, key_source_
end
end
nil
end
private
def normalize_key(key)
return nil if key.nil?
if key && key.length > 45
key = Decryptor.new(Base64Decoder.new(key).key, input_handler, password_cache).key
end
validate(key)
end
def validate(key)
if key
begin
decoded = Base64Decoder.new(key).key
decoded.length == 32 ? key : nil
rescue
nil
end
end
end
end
end
end
end