~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_gpg.py

  • Committer: John Arbash Meinel
  • Date: 2005-11-30 15:43:57 UTC
  • mto: (1185.50.1 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1518.
  • Revision ID: john@arbash-meinel.com-20051130154357-614206b3a7b83cd0
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2009, 2011 Canonical Ltd
 
1
# Copyright (C) 2005 by 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
13
13
#
14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
18
"""Tests for signing and verifying blobs of data via gpg."""
19
19
 
20
20
# import system imports here
 
21
import os
21
22
import sys
22
23
 
23
 
from bzrlib import errors, ui
 
24
import bzrlib.errors as errors
24
25
import bzrlib.gpg as gpg
25
 
from bzrlib.tests import TestCase
26
 
from bzrlib.tests import features
 
26
from bzrlib.tests import TestCase, TestCaseInTempDir
27
27
 
28
28
class FakeConfig(object):
29
29
 
30
30
    def gpg_signing_command(self):
31
31
        return "false"
32
 
 
33
 
    def acceptable_keys(self):
34
 
        return None
35
 
 
 
32
        
36
33
 
37
34
class TestCommandLine(TestCase):
38
35
 
47
44
        my_gpg = gpg.GPGStrategy(FakeConfig())
48
45
        self.assertRaises(errors.SigningFailed, my_gpg.sign, 'content')
49
46
 
50
 
    def assertProduces(self, content):
51
 
        # This needs a 'cat' command or similar to work.
52
 
        my_gpg = gpg.GPGStrategy(FakeConfig())
53
 
        if sys.platform == 'win32':
54
 
            # Windows doesn't come with cat, and we don't require it
55
 
            # so lets try using python instead.
56
 
            # But stupid windows and line-ending conversions.
57
 
            # It is too much work to make sys.stdout be in binary mode.
58
 
            # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443
59
 
            my_gpg._command_line = lambda:[sys.executable, '-c',
60
 
                    'import sys; sys.stdout.write(sys.stdin.read())']
61
 
            new_content = content.replace('\n', '\r\n')
62
 
 
63
 
            self.assertEqual(new_content, my_gpg.sign(content))
64
 
        else:
65
 
            my_gpg._command_line = lambda:['cat', '-']
66
 
            self.assertEqual(content, my_gpg.sign(content))
67
 
 
68
47
    def test_returns_output(self):
69
 
        content = "some content\nwith newlines\n"
70
 
        self.assertProduces(content)
71
 
 
72
 
    def test_clears_progress(self):
73
 
        content = "some content\nwith newlines\n"
74
 
        old_clear_term = ui.ui_factory.clear_term
75
 
        clear_term_called = []
76
 
        def clear_term():
77
 
            old_clear_term()
78
 
            clear_term_called.append(True)
79
 
        ui.ui_factory.clear_term = clear_term
80
 
        try:
81
 
            self.assertProduces(content)
82
 
        finally:
83
 
            ui.ui_factory.clear_term = old_clear_term
84
 
        self.assertEqual([True], clear_term_called)
85
 
 
86
 
    def test_aborts_on_unicode(self):
87
 
        """You can't sign Unicode text; it must be encoded first."""
88
 
        self.assertRaises(errors.BzrBadParameterUnicode,
89
 
                          self.assertProduces, u'foo')
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, [])
 
48
        # This test needs a 'cat' command or similar to work.
 
49
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
50
        my_gpg._command_line = lambda:["cat", "-"]
 
51
        self.assertEqual("some content\nwith newlines\n",
 
52
                         my_gpg.sign("some content\nwith newlines\n"))
289
53
 
290
54
 
291
55
class TestDisabled(TestCase):
293
57
    def test_sign(self):
294
58
        self.assertRaises(errors.SigningFailed,
295
59
                          gpg.DisabledGPGStrategy(None).sign, 'content')
296
 
 
297
 
    def test_verify(self):
298
 
        self.assertRaises(errors.SignatureVerificationFailed,
299
 
                          gpg.DisabledGPGStrategy(None).verify, 'content',
300
 
                          'testament')