1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
require 'test_helper'
class GpgmeHelperTest < MailGpgTestCase
def check_key_list(keys)
assert_equal 1, keys.size
assert_equal GPGME::Key, keys.first.class
assert_equal 'jane@foo.bar', keys.first.email
end
context 'GpgmeHelper' do
should 'handle empty email list' do
assert_equal [], Mail::Gpg::GpgmeHelper.send(:keys_for_data, nil)
assert_equal [], Mail::Gpg::GpgmeHelper.send(:keys_for_data, [])
end
# no keys given, assuming they are already in the keychain
context 'with email address' do
setup do
@email = 'jane@foo.bar'
end
should 'resolve email to gpg keys' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @email)
check_key_list keys
end
should 'resolve emails to gpg keys' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, [@email])
check_key_list keys
end
end
# this is a use case we do not really need but it works due to the way
# Gpgme looks up keys
context 'with key id' do
setup do
@key_id = GPGME::Key.find(:public, 'jane@foo.bar').first.sha
end
should 'resolve single id gpg keys' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @key_id)
check_key_list keys
end
should 'resolve id list to gpg keys' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, [@key_id])
check_key_list keys
end
end
# this is a use case we do not really need but it works due to the way
# Gpgme looks up keys
context 'with key fingerprint' do
setup do
@key_fpr = GPGME::Key.find(:public, 'jane@foo.bar').first.fingerprint
end
should 'resolve single id gpg keys' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @key_fpr)
check_key_list keys
end
should 'resolve id list to gpg keys' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, [@key_fpr])
check_key_list keys
end
end
context 'with email addresses' do
setup do
@key = GPGME::Key.find(:public, 'jane@foo.bar').first
@emails = ['jane@foo.bar']
end
# probably the most common use case - one or more recipient addresses and a
# hash mapping them to public key data that the user pasted into a text
# field at some point
context 'and key data' do
setup do
@key = @key.export(armor: true).to_s
@key_data = { 'jane@foo.bar' => @key }
end
should 'resolve to gpg key for single address' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @emails.first, @key_data)
check_key_list keys
end
should 'resolve to gpg keys' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @emails, @key_data)
check_key_list keys
end
should 'ignore unknown addresses' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, ['john@doe.com'], @key_data)
assert keys.blank?
end
should 'ignore invalid key data and not use existing key' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, ['jane@foo.bar'], { 'jane@foo.bar' => "-----BEGIN PGP\ninvalid key data" })
assert keys.blank?
end
end
context 'and key id or fpr' do
setup do
@key_id = @key.sha
@key_fpr = @key.fingerprint
@email = @emails.first
end
should 'resolve id to gpg key for single address' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @emails.first, { @email => @key_id })
check_key_list keys
end
should 'resolve id to gpg key' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @emails, { @email => @key_id })
check_key_list keys
end
should 'resolve fpr to gpg key' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @emails, { @email => @key_fpr })
check_key_list keys
end
should 'ignore unknown addresses' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, ['john@doe.com'], { @email => @key_fpr })
assert keys.blank?
end
should 'ignore invalid key id and not use existing key' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @emails, { @email => "invalid key id" })
assert keys.blank?
end
end
# mapping email addresses to already retrieved key objects or
# key fingerprints is also possible.
context 'and key object' do
setup do
@key_data = { 'jane@foo.bar' => @key }
end
should 'resolve to gpg keys for these addresses' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, @emails, @key_data)
check_key_list keys
end
should 'ignore unknown addresses' do
assert keys = Mail::Gpg::GpgmeHelper.send(:keys_for_data, ['john@doe.com'], @key_data)
assert keys.blank?
end
end
end
end
end
|