class Schleuder::EmailKeyImporter
Public Class Methods
add_key(mail, keydata)
click to toggle source
# File lib/schleuder/email_key_importer.rb, line 44 def add_key(mail, keydata) fingerprint, import_states = import_to_list(mail, keydata) return if ! fingerprint if ! import_states.include?(I18n.t('import_states.new_key')) mail.list.logger.error "Importing key failed! Fingerprint: #{fingerprint.inspect} -- Import-states: #{import_states.inspect}" mail.add_pseudoheader('Note', I18n.t('email_key_importer.import_error', fingerprint: fingerprint.inspect, import_states: import_states.inspect)) return end key = mail.list.keys(fingerprint).first mail.add_pseudoheader('Note', I18n.t('email_key_importer.key_added', key_summary: key.summary)) fingerprint end
filter_and_maybe_import_keys(mail, keydata)
click to toggle source
# File lib/schleuder/email_key_importer.rb, line 25 def filter_and_maybe_import_keys(mail, keydata) extracted_keys = GPGME::KeyExtractor.extract_by_email_address(mail.from.first, keydata) extracted_keys.map do |fingerprint, filtered_keydata| maybe_import_key(mail, fingerprint, filtered_keydata) end.compact end
import_from_attachments(list, mail)
click to toggle source
# File lib/schleuder/email_key_importer.rb, line 4 def import_from_attachments(list, mail) # Shouldn't happen, but who knows... return if ! mail.from.first.match(Conf::EMAIL_REGEXP) mail.attachments.map do |part| if part.content_type == 'application/pgp-keys' filter_and_maybe_import_keys(mail, part.body.decoded) end end.compact end
import_from_autocrypt_header(list, mail)
click to toggle source
# File lib/schleuder/email_key_importer.rb, line 14 def import_from_autocrypt_header(list, mail) # Shouldn't happen, but who knows... return if ! mail.from.first.match(Conf::EMAIL_REGEXP) return if mail.header['Autocrypt'].blank? keydata_base64 = mail.header['Autocrypt'].to_s.split('keydata=', 2)[1] return if keydata_base64.blank? keydata = Base64.decode64(keydata_base64) return if keydata.blank? filter_and_maybe_import_keys(mail, keydata) end
import_to_list(mail, keydata)
click to toggle source
# File lib/schleuder/email_key_importer.rb, line 78 def import_to_list(mail, keydata) result = mail.list.gpg.import_filtered(keydata) # At this point we expect the keydata to only contain one key, and thus # only one key and value in the result. if ! result.is_a?(Hash) || result.keys.size != 1 || ! result.values.first.is_a?(Array) mail.list.logger.error "Unexpected result when importing key from temporary keyring => #{result.inspect}" mail.add_pseudoheader('Note', I18n.t('email_key_importer.technical_error')) return false end [result.keys.first, result.values.first] end
maybe_import_key(mail, fingerprint, filtered_keydata)
click to toggle source
# File lib/schleuder/email_key_importer.rb, line 32 def maybe_import_key(mail, fingerprint, filtered_keydata) if mail.list.keys(fingerprint).size == 1 return update_key(mail, filtered_keydata) end if mail.list.keys(mail.from.first).size > 0 mail.add_pseudoheader('Note', I18n.t('email_key_importer.key_already_present')) return end add_key(mail, filtered_keydata) end
update_key(mail, keydata)
click to toggle source
# File lib/schleuder/email_key_importer.rb, line 61 def update_key(mail, keydata) fingerprint, import_states = import_to_list(mail, keydata) return if ! fingerprint key = mail.list.keys(fingerprint).first if import_states == ['unchanged'] mail.add_pseudoheader('Note', I18n.t('email_key_importer.key_unchanged', key_summary: key.summary)) return end key = mail.list.keys(fingerprint).first mail.add_pseudoheader('Note', I18n.t('email_key_importer.key_updated', key_summary: key.summary)) fingerprint end