class GPGME::KeyExtractor

Public Class Methods

extract_by_email_address(email_address, keydata) click to toggle source

This takes key material and returns those keys from it, that have a UID matching the given email address, stripped by all other UIDs.

# File lib/schleuder/gpgme/key_extractor.rb, line 5
def self.extract_by_email_address(email_address, keydata)
  orig_gnupghome = ENV['GNUPGHOME']
  ENV['GNUPGHOME'] = Dir.mktmpdir
  gpg = GPGME::Ctx.new(armor: true)
  gpg_arg = %{ --import-filter keep-uid='mbox = #{email_address}'}
  gpg.import_filtered(keydata, gpg_arg)
  # Return the fingerprint and the exported, filtered keydata, because
  # passing the key objects around led to strange problems with some keys,
  # which produced only a blank string as return value of export().
  result = {}
  gpg.keys.each do |tmp_key|
    # Skip this key if it has
    # * no UID – because none survived the import-filter,
    # * more than one UID – which means the import-filtering failed or
    #   something else went wrong during import.
    if tmp_key.uids.size == 1
      result[tmp_key.fingerprint] = tmp_key.armored
    end
  end
  result
ensure
  FileUtils.remove_entry(ENV['GNUPGHOME'])
  ENV['GNUPGHOME'] = orig_gnupghome
end