~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_gpg.py

Move all features to bzrlib.tests.features in 2.5

Show diffs side-by-side

added added

removed removed

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