~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_gpg.py

  • Committer: Max Bowsher
  • Date: 2011-08-23 09:29:27 UTC
  • mto: This revision was merged to the branch mainline in revision 6104.
  • Revision ID: _@maxb.eu-20110823092927-c7fnueriuunvv9mh
Per jam's review comments, get rid of features.meliae_feature, which is new in
2.5 and so will not be missed, assigning the corrected behaviour to the
features.meliae name.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2009, 2011 Canonical Ltd
2
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
18
18
"""Tests for signing and verifying blobs of data via gpg."""
19
19
 
20
20
# import system imports here
21
 
import os
22
21
import sys
23
22
 
24
23
from bzrlib import errors, ui
25
24
import bzrlib.gpg as gpg
26
 
from bzrlib.tests import TestCase, TestCaseInTempDir
 
25
from bzrlib.tests import TestCase
 
26
from bzrlib.tests import features
27
27
 
28
28
class FakeConfig(object):
29
29
 
 
30
    def gpg_signing_key(self):
 
31
        return "amy@example.com"
 
32
 
30
33
    def gpg_signing_command(self):
31
34
        return "false"
32
35
 
 
36
    def acceptable_keys(self):
 
37
        return None
 
38
 
33
39
 
34
40
class TestCommandLine(TestCase):
35
41
 
36
42
    def test_signing_command_line(self):
37
43
        my_gpg = gpg.GPGStrategy(FakeConfig())
38
 
        self.assertEqual(['false',  '--clearsign'],
 
44
        self.assertEqual(['false',  '--clearsign', '-u', 'amy@example.com'],
39
45
                         my_gpg._command_line())
40
46
 
41
47
    def test_checks_return_code(self):
85
91
        self.assertRaises(errors.BzrBadParameterUnicode,
86
92
                          self.assertProduces, u'foo')
87
93
 
 
94
    def import_keys(self):
 
95
        from StringIO import StringIO
 
96
        import gpgme
 
97
        context = gpgme.Context()
 
98
 
 
99
        key = StringIO("""-----BEGIN PGP PUBLIC KEY BLOCK-----
 
100
Version: GnuPG v1.4.11 (GNU/Linux)
 
101
 
 
102
mQENBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
 
103
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
 
104
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
 
105
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
 
106
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
 
107
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAG0JEJhemFhciBUZXN0IEtl
 
108
eSA8YmF6YWFyQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIG
 
109
FQgCCQoLBBYCAwECHgECF4AACgkQh2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys
 
110
2hZmXUq/tU+L92bjQoRY4fmsQpk/FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2
 
111
jj7UiJd8z9gTRxWTnYwfR/w5PGmxfJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswa
 
112
IOAZIwe5Vsfs36uSS7p8RQHAZXLXtTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO
 
113
2qEa0mYiAfDpz40CGtb8N/TQHF3Xcw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqW
 
114
o/r3RII3Ii3z2yARlg6D+5hVOrFBV8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtB
 
115
OrkBDQRN+NyIAQgArRZ2YGzUj5dXOVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2
 
116
V0dcVCqWwT0+a79Wbausv4bStD4SkwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr
 
117
6UUneB3UXX7MrEqVogVhRM0ORIaK/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEX
 
118
imBsN3GqoewBHYIneJKBtHE7uzdzw3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeX
 
119
P6ktvXbX2Iu7VDNoCvRXM9+ntyJtsXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCc
 
120
VtFjLTcbCqJqpoJWUtsLcNqDqMHOQDpe6KTNTQARAQABiQEfBBgBAgAJBQJN+NyI
 
121
AhsMAAoJEIdoGx7jCA5FrR8IANnOF3PUj1TbRcwV6RoWmHsFQHrPmM8ogXia1Lsv
 
122
jE1iEWoC+muvKh6Oydf90k6ZslS7rdDnp2qzYY8W/TiDkxP+fvsZ4mMi1Y0F+3ty
 
123
1jzWhcsnB2VrJSiavxEXk0tKPrNv4EUGWG6wHsC9TBj37If+nrMyim94VHvI0eHm
 
124
X8yMlN4O3HfmgD9CbJdUxueP3e31OIYuwh/6F7GII8TNEVHU/8vh/mQcCxppNbc+
 
125
boff+kIsoa/TAMLwtJoSrX1nXm0K3vZePRLnIgmwVzdkOIkaRJUG2tSQFvkfhvtE
 
126
LhnkL5l4MO0wrUds0UWRwa3d7j/P2ExrqXdlLmEzrifWyEQ=
 
127
=hUJn
 
128
-----END PGP PUBLIC KEY BLOCK-----
 
129
""")
 
130
 
 
131
        secret_key = StringIO("""-----BEGIN PGP PRIVATE KEY BLOCK-----
 
132
Version: GnuPG v1.4.11 (GNU/Linux)
 
133
 
 
134
lQOYBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
 
135
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
 
136
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
 
137
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
 
138
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
 
139
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAEAB/0RJTbV991SOtVfPQVu
 
140
LM+tD0SiOXJwIBIINlngsFHWVIiBSDb6uF8dneMR70IRnuEFHFyAUXA7PZDxvcSu
 
141
phAqIdKCWxQPkAULAS0o4U2K3ZFGh4uOqvfZ8eSnh1rETFv7Yf3u23K89cZiy99n
 
142
EtWgSqzC/2z5PaZ7/alsYCBqhHuyd4Phaud7qv7FTz8mFrCf+CCY+D08wbnZBu4g
 
143
N9tBwoxT/UKRfv3nghIh9v+3qWfBEFGhrYbt92XKFbHOQeATZz8AGIv1eqN/+ZQY
 
144
oYmvVfO3GkrWaRoPeJNLqSDEn/45O1Uh9MJ4mQclXqB0QzMShle8uusHxIeJSQsR
 
145
z//VBAD11WS7qSgCeiHR+4jDzrrlb2snnA2bfDToEomDxd/n8xm7nJWdkNfJ2BCw
 
146
KvnxYVxjFNAwkKJGRajzALBLzRVO+K9NtSLiddv5zv+UNdgsKuE8tD7Jqxd/IbWw
 
147
AimCtL8osnJ+r9dvL+NyjkAT6l/NdEbLXGrBaMeTfSgl2cBOOwQA+sJIh1R5PiCK
 
148
nLIs9pm3PSy3w92Peelq/x/+0aebTZaJUk2ou3oCvB3druDqrUeaopuuCc0drV7C
 
149
Ldoey8x/T2ZGzmT2af9qNaD6ScTimDodXcJdwlpobhZTKpsE4EyywpLXtlWte1x0
 
150
1Mq3llQsIdRdf3GLS+L207hWgKDiDosD/0SyOBO/IBDteeEzeN2hNE3A8oeVbvRS
 
151
XrS/3uj6oKmlWUBORYP8ptUrXPoVPmNz2y4GO+OysFtfct3Yqb+Sb/52SXMOHTox
 
152
2oLW08tkzfkDArU5aauMEPmyutGyJ+hGo7fsuLXzXR8OPw4yZJdzG1tRlP2TTKmq
 
153
Fx8G/Ik6bN4zTYK0JEJhemFhciBUZXN0IEtleSA8YmF6YWFyQGV4YW1wbGUuY29t
 
154
PokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
 
155
h2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys2hZmXUq/tU+L92bjQoRY4fmsQpk/
 
156
FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2jj7UiJd8z9gTRxWTnYwfR/w5PGmx
 
157
fJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswaIOAZIwe5Vsfs36uSS7p8RQHAZXLX
 
158
tTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO2qEa0mYiAfDpz40CGtb8N/TQHF3X
 
159
cw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqWo/r3RII3Ii3z2yARlg6D+5hVOrFB
 
160
V8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtBOp0DlwRN+NyIAQgArRZ2YGzUj5dX
 
161
OVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2V0dcVCqWwT0+a79Wbausv4bStD4S
 
162
kwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr6UUneB3UXX7MrEqVogVhRM0ORIaK
 
163
/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEXimBsN3GqoewBHYIneJKBtHE7uzdz
 
164
w3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeXP6ktvXbX2Iu7VDNoCvRXM9+ntyJt
 
165
sXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCcVtFjLTcbCqJqpoJWUtsLcNqDqMHO
 
166
QDpe6KTNTQARAQABAAf1EfceUlGLvoA/+yDTNTMjuPfzfKwbB/FOVfX44g3Za1eT
 
167
v7RvSuj4rFYIdE9UvZEei/pqPOSc+hhSsKZCulGXD5TUpf3AyG7ipWU/kID46Csp
 
168
0V08DPpFHnuw/N6+qNo5iSnhN9U1XMLjYT5d1HvKur26r2vWbmUTSJ1qIluHL2fT
 
169
R1pKYYLuoff4MIjZ01Hawq72jjor+dLBmMWveHpq4XNp+vQ4x8aFnY9ozufon0nM
 
170
uRSJRlQjDNB274tvUbmDFP+nzNbqF1nBTZ6FTdH/iKVNbytiYF7Hbat8GWVZqY1u
 
171
CZr7BklpIVWlk62ll0psMIPVyANi7YT332LLqYmBBADJKTx2dariG/kWU2W/9VEO
 
172
2VZpqsqazAxOoFEIOpcOlByhhyw5g0IKu0UyzHkhoCje0cWxpdSBFG432b8zL0AT
 
173
Z0RycfUG7Sgp9CpY1h8Cc/HbBa8xo1fSM7zplPQrHBqUzlVVBq6HOkUq+7qsPFWc
 
174
RRie95VsDmIMKQKPJHeYHQQA3EYGit+QHV0dccAInghEsf/mq8Gfnvo6HPYhWcDC
 
175
DTM39NhNlnl1WkTFCd2TWc+TWQ4KlRsh6bMjUpNa2qjrUl90fLekbogcxxMhcwa6
 
176
xgzEANZfwqdY0u3aB/CyZ6odfThwcAoeqoMpw34CfeKEroubpi2n8wKByrN2MQXJ
 
177
4vEEAJbXZOqgAcFAFBUVb5mVT0s2lJMagZFPdhRJz2bttz01s/B8aca6CrDpFRjT
 
178
03zRFUZjwDYqZDWBC181dCE9yla4OkWd5QyRKSS2EE02KEYqRzT0RngQn7s4AW2r
 
179
326up3Jhleln3hgD4Kk3V3KHmyK8zqZA0qWzry4Vl2jjkbnAPB2JAR8EGAECAAkF
 
180
Ak343IgCGwwACgkQh2gbHuMIDkWtHwgA2c4Xc9SPVNtFzBXpGhaYewVAes+YzyiB
 
181
eJrUuy+MTWIRagL6a68qHo7J1/3STpmyVLut0OenarNhjxb9OIOTE/5++xniYyLV
 
182
jQX7e3LWPNaFyycHZWslKJq/EReTS0o+s2/gRQZYbrAewL1MGPfsh/6eszKKb3hU
 
183
e8jR4eZfzIyU3g7cd+aAP0Jsl1TG54/d7fU4hi7CH/oXsYgjxM0RUdT/y+H+ZBwL
 
184
Gmk1tz5uh9/6Qiyhr9MAwvC0mhKtfWdebQre9l49EuciCbBXN2Q4iRpElQba1JAW
 
185
+R+G+0QuGeQvmXgw7TCtR2zRRZHBrd3uP8/YTGupd2UuYTOuJ9bIRA==
 
186
=LXn0
 
187
-----END PGP PRIVATE KEY BLOCK-----
 
188
""")
 
189
 
 
190
        context.import_(key)
 
191
        context.import_(secret_key)
 
192
 
 
193
    def test_verify_valid(self):
 
194
        self.requireFeature(features.gpgme)
 
195
        self.import_keys()
 
196
            
 
197
        content = """-----BEGIN PGP SIGNED MESSAGE-----
 
198
Hash: SHA1
 
199
 
 
200
bazaar-ng testament short form 1
 
201
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
202
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
203
-----BEGIN PGP SIGNATURE-----
 
204
Version: GnuPG v1.4.11 (GNU/Linux)
 
205
 
 
206
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
 
207
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
 
208
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
 
209
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
 
210
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
 
211
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
 
212
=iwsn
 
213
-----END PGP SIGNATURE-----
 
214
"""
 
215
        plain = """bazaar-ng testament short form 1
 
216
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
217
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
218
"""
 
219
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
220
        my_gpg.set_acceptable_keys("bazaar@example.com")
 
221
        self.assertEqual((gpg.SIGNATURE_VALID, None), my_gpg.verify(content,
 
222
                            plain))
 
223
 
 
224
    def test_verify_bad_testament(self):
 
225
        self.requireFeature(features.gpgme)
 
226
        self.import_keys()
 
227
            
 
228
        content = """-----BEGIN PGP SIGNED MESSAGE-----
 
229
Hash: SHA1
 
230
 
 
231
bazaar-ng testament short form 1
 
232
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
233
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
234
-----BEGIN PGP SIGNATURE-----
 
235
Version: GnuPG v1.4.11 (GNU/Linux)
 
236
 
 
237
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
 
238
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
 
239
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
 
240
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
 
241
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
 
242
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
 
243
=iwsn
 
244
-----END PGP SIGNATURE-----
 
245
"""
 
246
        plain = """bazaar-ng testament short form 1
 
247
revision-id: doctor@example.com-20110527185938-hluafawphszb8dl1
 
248
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
249
"""
 
250
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
251
        my_gpg.set_acceptable_keys("bazaar@example.com")
 
252
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
 
253
                            plain))
 
254
 
 
255
    def test_verify_invalid(self):
 
256
        self.requireFeature(features.gpgme)
 
257
        content = """-----BEGIN PGP SIGNED MESSAGE-----
 
258
Hash: SHA1
 
259
 
 
260
bazaar-ng testament short form 1
 
261
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
262
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
263
-----BEGIN PGP SIGNATURE-----
 
264
Version: GnuPG v1.4.11 (GNU/Linux)
 
265
 
 
266
iEYEARECAAYFAk33gYsACgkQpQbm1N1NUIhiDACglOuQDlnSF4NxfHSkN/zrmFy8
 
267
nswAoNGXAVuR9ONasAKIGBNUE0b+lols
 
268
=SOuC
 
269
-----END PGP SIGNATURE-----
 
270
"""
 
271
        plain = """bazaar-ng testament short form 1
 
272
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
273
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
274
"""
 
275
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
276
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None),
 
277
                            my_gpg.verify(content, plain))
 
278
 
 
279
    def test_set_acceptable_keys(self):
 
280
        self.requireFeature(features.gpgme)
 
281
        self.import_keys()
 
282
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
283
        my_gpg.set_acceptable_keys("bazaar@example.com")
 
284
        self.assertEqual(my_gpg.acceptable_keys,
 
285
                         [u'B5DEED5FCB15DAE6ECEF919587681B1EE3080E45'])
 
286
 
 
287
    def test_set_acceptable_keys_unknown(self):
 
288
        self.requireFeature(features.gpgme)
 
289
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
290
        my_gpg.set_acceptable_keys("unknown")
 
291
        self.assertEqual(my_gpg.acceptable_keys, [])
 
292
 
88
293
 
89
294
class TestDisabled(TestCase):
90
295
 
91
296
    def test_sign(self):
92
297
        self.assertRaises(errors.SigningFailed,
93
298
                          gpg.DisabledGPGStrategy(None).sign, 'content')
 
299
 
 
300
    def test_verify(self):
 
301
        self.assertRaises(errors.SignatureVerificationFailed,
 
302
                          gpg.DisabledGPGStrategy(None).verify, 'content',
 
303
                          'testament')