File: gpgme_helper_test.rb

package info (click to toggle)
ruby-mail-gpg 0.4.4-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 328 kB
  • sloc: ruby: 2,289; makefile: 6
file content (160 lines) | stat: -rw-r--r-- 5,179 bytes parent folder | download
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