/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2005, 2006, 2007, 2009, 2011 Canonical Ltd
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
17
18
"""Tests for signing and verifying blobs of data via gpg."""
19
20
# import system imports here
21
import sys
22
1551.8.12 by Aaron Bentley
Add test case for clearing PB
23
from bzrlib import errors, ui
1442.1.57 by Robert Collins
check that we get the right command line from the default gpg strategy.
24
import bzrlib.gpg as gpg
5579.3.1 by Jelmer Vernooij
Remove unused imports.
25
from bzrlib.tests import TestCase
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
26
from bzrlib.tests import features
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
27
1442.1.57 by Robert Collins
check that we get the right command line from the default gpg strategy.
28
class FakeConfig(object):
29
6012.2.14 by Jonathan Riddell
fix tests
30
    def gpg_signing_key(self):
31
        return "amy@example.com"
32
1442.1.57 by Robert Collins
check that we get the right command line from the default gpg strategy.
33
    def gpg_signing_command(self):
1442.1.58 by Robert Collins
gpg signing of content
34
        return "false"
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
35
5971.1.69 by Jonathan Riddell
move some code from cmd_verify to gpg.set_acceptable_keys
36
    def acceptable_keys(self):
37
        return None
38
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
39
40
class TestCommandLine(TestCase):
1442.1.57 by Robert Collins
check that we get the right command line from the default gpg strategy.
41
42
    def test_signing_command_line(self):
43
        my_gpg = gpg.GPGStrategy(FakeConfig())
6012.2.14 by Jonathan Riddell
fix tests
44
        self.assertEqual(['false',  '--clearsign', '-u', 'amy@example.com'],
1442.1.57 by Robert Collins
check that we get the right command line from the default gpg strategy.
45
                         my_gpg._command_line())
1442.1.58 by Robert Collins
gpg signing of content
46
47
    def test_checks_return_code(self):
48
        # This test needs a unix like platform - one with 'false' to run.
49
        # if you have one, please make this work :)
50
        my_gpg = gpg.GPGStrategy(FakeConfig())
51
        self.assertRaises(errors.SigningFailed, my_gpg.sign, 'content')
52
1551.8.12 by Aaron Bentley
Add test case for clearing PB
53
    def assertProduces(self, content):
54
        # This needs a 'cat' command or similar to work.
1442.1.58 by Robert Collins
gpg signing of content
55
        my_gpg = gpg.GPGStrategy(FakeConfig())
1185.31.54 by John Arbash Meinel
Win32 not only doesn't have cat, it changes line-endings too. Should be fixed.
56
        if sys.platform == 'win32':
57
            # Windows doesn't come with cat, and we don't require it
58
            # so lets try using python instead.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
59
            # But stupid windows and line-ending conversions.
1185.31.54 by John Arbash Meinel
Win32 not only doesn't have cat, it changes line-endings too. Should be fixed.
60
            # It is too much work to make sys.stdout be in binary mode.
61
            # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443
1185.57.1 by John Arbash Meinel
Use the correct python in case it isn't in the path
62
            my_gpg._command_line = lambda:[sys.executable, '-c',
1185.78.4 by John Arbash Meinel
Reverting gpg changes, should not be mainline, see gpg_uses_tempfile plugin.
63
                    'import sys; sys.stdout.write(sys.stdin.read())']
1185.31.54 by John Arbash Meinel
Win32 not only doesn't have cat, it changes line-endings too. Should be fixed.
64
            new_content = content.replace('\n', '\r\n')
65
66
            self.assertEqual(new_content, my_gpg.sign(content))
67
        else:
1185.78.4 by John Arbash Meinel
Reverting gpg changes, should not be mainline, see gpg_uses_tempfile plugin.
68
            my_gpg._command_line = lambda:['cat', '-']
1185.31.54 by John Arbash Meinel
Win32 not only doesn't have cat, it changes line-endings too. Should be fixed.
69
            self.assertEqual(content, my_gpg.sign(content))
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
70
1551.8.12 by Aaron Bentley
Add test case for clearing PB
71
    def test_returns_output(self):
72
        content = "some content\nwith newlines\n"
73
        self.assertProduces(content)
74
75
    def test_clears_progress(self):
76
        content = "some content\nwith newlines\n"
77
        old_clear_term = ui.ui_factory.clear_term
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
78
        clear_term_called = []
1551.8.12 by Aaron Bentley
Add test case for clearing PB
79
        def clear_term():
80
            old_clear_term()
1551.8.13 by Aaron Bentley
Tweak test_clears_progress
81
            clear_term_called.append(True)
1551.8.12 by Aaron Bentley
Add test case for clearing PB
82
        ui.ui_factory.clear_term = clear_term
83
        try:
84
            self.assertProduces(content)
85
        finally:
86
            ui.ui_factory.clear_term = old_clear_term
87
        self.assertEqual([True], clear_term_called)
88
2273.1.1 by John Arbash Meinel
``GPGStrategy.sign()`` will now raise ``BzrBadParameterUnicode`` if
89
    def test_aborts_on_unicode(self):
2273.1.2 by John Arbash Meinel
Cleanup docstring for Aaron Bentley
90
        """You can't sign Unicode text; it must be encoded first."""
2273.1.1 by John Arbash Meinel
``GPGStrategy.sign()`` will now raise ``BzrBadParameterUnicode`` if
91
        self.assertRaises(errors.BzrBadParameterUnicode,
92
                          self.assertProduces, u'foo')
93
6043.2.4 by Jonathan Riddell
add test for valid_but_unacceptable_key, document tests in verify method
94
class TestVerify(TestCase):
95
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
96
    def import_keys(self):
97
        from StringIO import StringIO
98
        import gpgme
99
        context = gpgme.Context()
100
101
        key = StringIO("""-----BEGIN PGP PUBLIC KEY BLOCK-----
102
Version: GnuPG v1.4.11 (GNU/Linux)
103
104
mQENBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
105
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
106
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
107
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
108
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
109
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAG0JEJhemFhciBUZXN0IEtl
110
eSA8YmF6YWFyQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIG
111
FQgCCQoLBBYCAwECHgECF4AACgkQh2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys
112
2hZmXUq/tU+L92bjQoRY4fmsQpk/FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2
113
jj7UiJd8z9gTRxWTnYwfR/w5PGmxfJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswa
114
IOAZIwe5Vsfs36uSS7p8RQHAZXLXtTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO
115
2qEa0mYiAfDpz40CGtb8N/TQHF3Xcw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqW
116
o/r3RII3Ii3z2yARlg6D+5hVOrFBV8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtB
117
OrkBDQRN+NyIAQgArRZ2YGzUj5dXOVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2
118
V0dcVCqWwT0+a79Wbausv4bStD4SkwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr
119
6UUneB3UXX7MrEqVogVhRM0ORIaK/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEX
120
imBsN3GqoewBHYIneJKBtHE7uzdzw3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeX
121
P6ktvXbX2Iu7VDNoCvRXM9+ntyJtsXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCc
122
VtFjLTcbCqJqpoJWUtsLcNqDqMHOQDpe6KTNTQARAQABiQEfBBgBAgAJBQJN+NyI
123
AhsMAAoJEIdoGx7jCA5FrR8IANnOF3PUj1TbRcwV6RoWmHsFQHrPmM8ogXia1Lsv
124
jE1iEWoC+muvKh6Oydf90k6ZslS7rdDnp2qzYY8W/TiDkxP+fvsZ4mMi1Y0F+3ty
125
1jzWhcsnB2VrJSiavxEXk0tKPrNv4EUGWG6wHsC9TBj37If+nrMyim94VHvI0eHm
126
X8yMlN4O3HfmgD9CbJdUxueP3e31OIYuwh/6F7GII8TNEVHU/8vh/mQcCxppNbc+
127
boff+kIsoa/TAMLwtJoSrX1nXm0K3vZePRLnIgmwVzdkOIkaRJUG2tSQFvkfhvtE
128
LhnkL5l4MO0wrUds0UWRwa3d7j/P2ExrqXdlLmEzrifWyEQ=
129
=hUJn
130
-----END PGP PUBLIC KEY BLOCK-----
131
""")
132
133
        secret_key = StringIO("""-----BEGIN PGP PRIVATE KEY BLOCK-----
134
Version: GnuPG v1.4.11 (GNU/Linux)
135
136
lQOYBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
137
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
138
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
139
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
140
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
141
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAEAB/0RJTbV991SOtVfPQVu
142
LM+tD0SiOXJwIBIINlngsFHWVIiBSDb6uF8dneMR70IRnuEFHFyAUXA7PZDxvcSu
143
phAqIdKCWxQPkAULAS0o4U2K3ZFGh4uOqvfZ8eSnh1rETFv7Yf3u23K89cZiy99n
144
EtWgSqzC/2z5PaZ7/alsYCBqhHuyd4Phaud7qv7FTz8mFrCf+CCY+D08wbnZBu4g
145
N9tBwoxT/UKRfv3nghIh9v+3qWfBEFGhrYbt92XKFbHOQeATZz8AGIv1eqN/+ZQY
146
oYmvVfO3GkrWaRoPeJNLqSDEn/45O1Uh9MJ4mQclXqB0QzMShle8uusHxIeJSQsR
147
z//VBAD11WS7qSgCeiHR+4jDzrrlb2snnA2bfDToEomDxd/n8xm7nJWdkNfJ2BCw
148
KvnxYVxjFNAwkKJGRajzALBLzRVO+K9NtSLiddv5zv+UNdgsKuE8tD7Jqxd/IbWw
149
AimCtL8osnJ+r9dvL+NyjkAT6l/NdEbLXGrBaMeTfSgl2cBOOwQA+sJIh1R5PiCK
150
nLIs9pm3PSy3w92Peelq/x/+0aebTZaJUk2ou3oCvB3druDqrUeaopuuCc0drV7C
151
Ldoey8x/T2ZGzmT2af9qNaD6ScTimDodXcJdwlpobhZTKpsE4EyywpLXtlWte1x0
152
1Mq3llQsIdRdf3GLS+L207hWgKDiDosD/0SyOBO/IBDteeEzeN2hNE3A8oeVbvRS
153
XrS/3uj6oKmlWUBORYP8ptUrXPoVPmNz2y4GO+OysFtfct3Yqb+Sb/52SXMOHTox
154
2oLW08tkzfkDArU5aauMEPmyutGyJ+hGo7fsuLXzXR8OPw4yZJdzG1tRlP2TTKmq
155
Fx8G/Ik6bN4zTYK0JEJhemFhciBUZXN0IEtleSA8YmF6YWFyQGV4YW1wbGUuY29t
156
PokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
157
h2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys2hZmXUq/tU+L92bjQoRY4fmsQpk/
158
FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2jj7UiJd8z9gTRxWTnYwfR/w5PGmx
159
fJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswaIOAZIwe5Vsfs36uSS7p8RQHAZXLX
160
tTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO2qEa0mYiAfDpz40CGtb8N/TQHF3X
161
cw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqWo/r3RII3Ii3z2yARlg6D+5hVOrFB
162
V8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtBOp0DlwRN+NyIAQgArRZ2YGzUj5dX
163
OVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2V0dcVCqWwT0+a79Wbausv4bStD4S
164
kwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr6UUneB3UXX7MrEqVogVhRM0ORIaK
165
/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEXimBsN3GqoewBHYIneJKBtHE7uzdz
166
w3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeXP6ktvXbX2Iu7VDNoCvRXM9+ntyJt
167
sXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCcVtFjLTcbCqJqpoJWUtsLcNqDqMHO
168
QDpe6KTNTQARAQABAAf1EfceUlGLvoA/+yDTNTMjuPfzfKwbB/FOVfX44g3Za1eT
169
v7RvSuj4rFYIdE9UvZEei/pqPOSc+hhSsKZCulGXD5TUpf3AyG7ipWU/kID46Csp
170
0V08DPpFHnuw/N6+qNo5iSnhN9U1XMLjYT5d1HvKur26r2vWbmUTSJ1qIluHL2fT
171
R1pKYYLuoff4MIjZ01Hawq72jjor+dLBmMWveHpq4XNp+vQ4x8aFnY9ozufon0nM
172
uRSJRlQjDNB274tvUbmDFP+nzNbqF1nBTZ6FTdH/iKVNbytiYF7Hbat8GWVZqY1u
173
CZr7BklpIVWlk62ll0psMIPVyANi7YT332LLqYmBBADJKTx2dariG/kWU2W/9VEO
174
2VZpqsqazAxOoFEIOpcOlByhhyw5g0IKu0UyzHkhoCje0cWxpdSBFG432b8zL0AT
175
Z0RycfUG7Sgp9CpY1h8Cc/HbBa8xo1fSM7zplPQrHBqUzlVVBq6HOkUq+7qsPFWc
176
RRie95VsDmIMKQKPJHeYHQQA3EYGit+QHV0dccAInghEsf/mq8Gfnvo6HPYhWcDC
177
DTM39NhNlnl1WkTFCd2TWc+TWQ4KlRsh6bMjUpNa2qjrUl90fLekbogcxxMhcwa6
178
xgzEANZfwqdY0u3aB/CyZ6odfThwcAoeqoMpw34CfeKEroubpi2n8wKByrN2MQXJ
179
4vEEAJbXZOqgAcFAFBUVb5mVT0s2lJMagZFPdhRJz2bttz01s/B8aca6CrDpFRjT
180
03zRFUZjwDYqZDWBC181dCE9yla4OkWd5QyRKSS2EE02KEYqRzT0RngQn7s4AW2r
181
326up3Jhleln3hgD4Kk3V3KHmyK8zqZA0qWzry4Vl2jjkbnAPB2JAR8EGAECAAkF
182
Ak343IgCGwwACgkQh2gbHuMIDkWtHwgA2c4Xc9SPVNtFzBXpGhaYewVAes+YzyiB
183
eJrUuy+MTWIRagL6a68qHo7J1/3STpmyVLut0OenarNhjxb9OIOTE/5++xniYyLV
184
jQX7e3LWPNaFyycHZWslKJq/EReTS0o+s2/gRQZYbrAewL1MGPfsh/6eszKKb3hU
185
e8jR4eZfzIyU3g7cd+aAP0Jsl1TG54/d7fU4hi7CH/oXsYgjxM0RUdT/y+H+ZBwL
186
Gmk1tz5uh9/6Qiyhr9MAwvC0mhKtfWdebQre9l49EuciCbBXN2Q4iRpElQba1JAW
187
+R+G+0QuGeQvmXgw7TCtR2zRRZHBrd3uP8/YTGupd2UuYTOuJ9bIRA==
188
=LXn0
189
-----END PGP PRIVATE KEY BLOCK-----
190
""")
191
6043.2.5 by Jonathan Riddell
catch a revoked key and add test for it
192
        revoked_key = StringIO("""-----BEGIN PGP PUBLIC KEY BLOCK-----
193
Version: GnuPG v1.4.11 (GNU/Linux)
194
195
mI0ETjlW5gEEAOb/6P+TVM59E897wRtatxys2BhsHCXM4T7xjIiANfDwejDdifqh
196
tluTfSJLLxPembtrrEjux1C0AJgc+f0MIfsc3Pr3eFJzKB2ot/1IVG1/1KnA0zt3
197
W2xPT3lRib27WJ9Fag+dMtQaIzgJ7/n2DFxsFZ33FD2kxrEXB2exGg6FABEBAAGI
198
pgQgAQIAEAUCTjlXkAkdAHJldm9rZWQACgkQjs6dvEpb0cQPHAP/Wi9rbx0e+1Sf
199
ziGgyVdr3m3A6uvze5oXKVgFRbGRUYSH4/I8GW0W9x4TcRg9h+YaQ8NUdADr9kNE
200
tKAljLqYA5qdqSfYuaij1M++Xj+KUZ359R74sHuQqwnRy1XXQNfRs/QpXA7vLdds
201
rjg+pbWuXO92TZJUdnqtWW+VEyZBsPy0G3Rlc3Qga2V5IDx0ZXN0QGV4YW1wbGUu
202
Y29tPoi4BBMBAgAiBQJOOVbmAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK
203
CRCOzp28SlvRxNWzA/42WVmI0b+6mF/imEOlY1TiyvrcpK250rkSDsCtL4lOwy7G
204
antZhpgNfnXRd/ySfsS3EB6dpOWgOSxGRvWQhA+vxBT9BYNk49qd3JIrSaSWpR12
205
rET8qO1rEQQFWsw03CxTGujxGlmEO+a1yguRXp2UWaY7FngcQmD+8q7BUIVm7riN
206
BE45VuYBBADTEH2jHTjNCc5CMOhea6EJTrkx3upcEqB2oyhWeSWJiBGOxlcddsjo
207
3J3/EmBB8kK1hM9TidD3SG64x1N287lg8ELJBlKv+pQVyxohGJ1u/THgpTDMMQcL
208
luG5rAHQGSfyzKTiOnaTyBYg3M/nzgUOU9dKEFB0EA3tjUXFOT+r3wARAQABiJ8E
209
GAECAAkFAk45VuYCGwwACgkQjs6dvEpb0cRSLQP/fzCWX2lXwlwWiVF8BOPF7o9z
210
icHErc7/X17RGb4qj1kVf+UkRdUWJrbEVh4h6MncBIuA70WsYogiw+Kz/0LCtQAR
211
YUJsPy/EL++OKPH1aFasOdTxwkTka85+RdYqhP1+z/aYLFMWq6mRFI+o6x2k5mGi
212
7dMv2kKTJPoXUpiXJbg=
213
=hLYO
214
-----END PGP PUBLIC KEY BLOCK-----
215
""")
216
6043.2.8 by Jonathan Riddell
add test for unknown key
217
        expired_key = StringIO("""-----BEGIN PGP PUBLIC KEY BLOCK-----
218
Version: GnuPG v1.4.11 (GNU/Linux)
219
220
mI0ETjZ6PAEEALkR4GcFQidCCxV7pgQwQd5MZua0YO2l92fVqHX+PhnZ6egCLKdD
221
2bWlMUd6MLPF3FlRL7BBAxvW/DazkBOp7ljsnpMpptEzY49Uem1irYLYiVb9zK96
222
0sQZzFxFkfEYetQEXC68mIck8tbySOX5NAOw++3jFm3J7dsU1R3XtYzRABEBAAG0
223
G3Rlc3Qga2V5IDx0ZXN0QGV4YW1wbGUuY29tPoi+BBMBAgAoBQJONno8AhsDBQkA
224
AVGABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAc4m97T40VEz+DA/9PBphG
225
Yp9cHVaHSfTUKGTGgIbvRe60sFNpDCYZeAGDrygOMuI8MNzbVpwefRBFHVPx7jWd
226
rrYMsLkcsNUS9D0baU+0D/qp7JVg7ZSQtG0O6IG4eTZhibteY1fu0+unlXmg9NHx
227
5VvhwzBiJDYji00M2p/CZEMiYFUuy76CsxUpN7iNBE42ejwBBACkv2/mX7IPQg0C
228
A3KSrJsJv+sdvKm4b4xuI4OwagwTIVz4KlTqV4IBrVjSBfwyMXucXz0bTW85qjgA
229
+n67td8vyjYYZUEz1uY9lSquQQDnAN0txL3cLHZXWiWOkmzZVddQtlflK2a/J9o0
230
QkHPVUm+hc4l64dIzStrNl2S66fAvQARAQABiKUEGAECAA8FAk42ejwCGwwFCQAB
231
UYAACgkQHOJve0+NFROEYQP/epg+o8iBs31hkSERyZjrRR66LpywezWj30Rn/3mX
232
Fzi9HkF4xLemWOzdNt9C5PYrOep85PQg8haEjknxVjZFS0ikT1h3OWk/TF1ZrLVm
233
WzyX8DaHQEjKpLJJjXcAbTiZBNMk0QaVC9RvIeHpCf3n3DC49DdjsPJRMKOn8KDi
234
kRk=
235
=p0gt
236
-----END PGP PUBLIC KEY BLOCK-----
237
""")
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
238
        context.import_(key)
239
        context.import_(secret_key)
6043.2.5 by Jonathan Riddell
catch a revoked key and add test for it
240
        context.import_(revoked_key)
6043.2.8 by Jonathan Riddell
add test for unknown key
241
        context.import_(expired_key)
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
242
6043.2.7 by Jonathan Riddell
some reordering of verification, improve names of tests
243
    def test_verify_untrusted_but_accepted(self):
244
        #untrusted by gpg but listed as acceptable_keys by user
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
245
        self.requireFeature(features.gpgme)
246
        self.import_keys()
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
247
            
5971.1.9 by Jonathan Riddell
add some tests
248
        content = """-----BEGIN PGP SIGNED MESSAGE-----
249
Hash: SHA1
250
251
bazaar-ng testament short form 1
252
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
253
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
254
-----BEGIN PGP SIGNATURE-----
255
Version: GnuPG v1.4.11 (GNU/Linux)
256
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
257
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
258
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
259
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
260
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
261
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
262
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
263
=iwsn
5971.1.9 by Jonathan Riddell
add some tests
264
-----END PGP SIGNATURE-----
265
"""
5971.1.31 by Jonathan Riddell
and update tests
266
        plain = """bazaar-ng testament short form 1
267
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
268
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
269
"""
5971.1.9 by Jonathan Riddell
add some tests
270
        my_gpg = gpg.GPGStrategy(FakeConfig())
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
271
        my_gpg.set_acceptable_keys("bazaar@example.com")
5971.1.31 by Jonathan Riddell
and update tests
272
        self.assertEqual((gpg.SIGNATURE_VALID, None), my_gpg.verify(content,
273
                            plain))
5971.1.9 by Jonathan Riddell
add some tests
274
6043.2.7 by Jonathan Riddell
some reordering of verification, improve names of tests
275
    def test_verify_unacceptable_key(self):
6043.2.4 by Jonathan Riddell
add test for valid_but_unacceptable_key, document tests in verify method
276
        self.requireFeature(features.gpgme)
277
        self.import_keys()
278
            
279
        content = """-----BEGIN PGP SIGNED MESSAGE-----
280
Hash: SHA1
281
282
bazaar-ng testament short form 1
283
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
284
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
285
-----BEGIN PGP SIGNATURE-----
286
Version: GnuPG v1.4.11 (GNU/Linux)
287
288
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
289
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
290
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
291
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
292
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
293
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
294
=iwsn
295
-----END PGP SIGNATURE-----
296
"""
297
        plain = """bazaar-ng testament short form 1
298
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
299
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
300
"""
301
        my_gpg = gpg.GPGStrategy(FakeConfig())
302
        my_gpg.set_acceptable_keys("foo@example.com")
303
        self.assertEqual((gpg.SIGNATURE_KEY_MISSING, u'E3080E45'),
304
                         my_gpg.verify(content, plain))
305
6043.2.6 by Jonathan Riddell
catch untrusted keys and add test
306
    def test_verify_valid_but_untrusted(self):
307
        self.requireFeature(features.gpgme)
308
        self.import_keys()
309
            
310
        content = """-----BEGIN PGP SIGNED MESSAGE-----
311
Hash: SHA1
312
313
bazaar-ng testament short form 1
314
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
315
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
316
-----BEGIN PGP SIGNATURE-----
317
Version: GnuPG v1.4.11 (GNU/Linux)
318
319
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
320
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
321
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
322
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
323
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
324
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
325
=iwsn
326
-----END PGP SIGNATURE-----
327
"""
328
        plain = """bazaar-ng testament short form 1
329
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
330
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
331
"""
332
        my_gpg = gpg.GPGStrategy(FakeConfig())
333
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
334
                            plain))
335
5971.1.32 by Jonathan Riddell
test for signing incorrect commit content
336
    def test_verify_bad_testament(self):
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
337
        self.requireFeature(features.gpgme)
338
        self.import_keys()
5971.1.32 by Jonathan Riddell
test for signing incorrect commit content
339
            
340
        content = """-----BEGIN PGP SIGNED MESSAGE-----
341
Hash: SHA1
342
343
bazaar-ng testament short form 1
344
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
345
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
346
-----BEGIN PGP SIGNATURE-----
347
Version: GnuPG v1.4.11 (GNU/Linux)
348
349
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
350
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
351
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
352
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
353
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
354
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
355
=iwsn
356
-----END PGP SIGNATURE-----
357
"""
358
        plain = """bazaar-ng testament short form 1
359
revision-id: doctor@example.com-20110527185938-hluafawphszb8dl1
360
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
361
"""
362
        my_gpg = gpg.GPGStrategy(FakeConfig())
363
        my_gpg.set_acceptable_keys("bazaar@example.com")
364
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
365
                            plain))
366
6043.2.5 by Jonathan Riddell
catch a revoked key and add test for it
367
368
    def test_verify_revoked_signature(self):
369
        self.requireFeature(features.gpgme)
370
        self.import_keys()
371
            
372
        content = """-----BEGIN PGP SIGNED MESSAGE-----
373
Hash: SHA1
374
375
asdf
376
-----BEGIN PGP SIGNATURE-----
377
Version: GnuPG v1.4.11 (GNU/Linux)
378
379
iJwEAQECAAYFAk45V18ACgkQjs6dvEpb0cSIZQP/eOGTXGPlrNwvDkcX2d8O///I
380
ecB4sUIUEpv1XAk1MkNu58lsjjK72lRaLusEGqd7HwrFmpxVeVs0oWLg23PNPCFs
381
yJBID9ma+VxFVPtkEFnrc1R72sBJLfBcTxMkwVTC8eeznjdtn+cg+aLkxbPdrGnr
382
JFA6kUIJU2w9LU/b88Y=
383
=UuRX
384
-----END PGP SIGNATURE-----
385
"""
386
        plain = """asdf\n"""
387
        my_gpg = gpg.GPGStrategy(FakeConfig())
388
        my_gpg.set_acceptable_keys("test@example.com")
389
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None), my_gpg.verify(content,
390
                            plain))
391
5971.1.9 by Jonathan Riddell
add some tests
392
    def test_verify_invalid(self):
5971.1.80 by Jonathan Riddell
add missing self.requireFeature() checks to gpg tests
393
        self.requireFeature(features.gpgme)
5971.1.9 by Jonathan Riddell
add some tests
394
        content = """-----BEGIN PGP SIGNED MESSAGE-----
395
Hash: SHA1
396
397
bazaar-ng testament short form 1
398
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
399
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
400
-----BEGIN PGP SIGNATURE-----
401
Version: GnuPG v1.4.11 (GNU/Linux)
402
403
iEYEARECAAYFAk33gYsACgkQpQbm1N1NUIhiDACglOuQDlnSF4NxfHSkN/zrmFy8
404
nswAoNGXAVuR9ONasAKIGBNUE0b+lols
405
=SOuC
406
-----END PGP SIGNATURE-----
407
"""
5971.1.31 by Jonathan Riddell
and update tests
408
        plain = """bazaar-ng testament short form 1
409
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
410
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
411
"""
5971.1.9 by Jonathan Riddell
add some tests
412
        my_gpg = gpg.GPGStrategy(FakeConfig())
5971.1.22 by Jonathan Riddell
fix tests
413
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None),
5971.1.31 by Jonathan Riddell
and update tests
414
                            my_gpg.verify(content, plain))
5971.1.9 by Jonathan Riddell
add some tests
415
6043.2.8 by Jonathan Riddell
add test for unknown key
416
    def test_verify_expired_but_valid(self):
417
        self.requireFeature(features.gpgme)
418
        content = """-----BEGIN PGP SIGNED MESSAGE-----
419
Hash: SHA1
420
 
421
bazaar-ng testament short form 1
422
revision-id: test@example.com-20110801100657-f1dr1nompeex723z
423
sha1: 59ab434be4c2d5d646dee84f514aa09e1b72feeb
424
-----BEGIN PGP SIGNATURE-----
425
Version: GnuPG v1.4.10 (GNU/Linux)
426
 
427
iJwEAQECAAYFAk42esUACgkQHOJve0+NFRPc5wP7BoZkzBU8JaHMLv/LmqLr0sUz
428
zuE51ofZZ19L7KVtQWsOi4jFy0fi4A5TFwO8u9SOfoREGvkw292Uty9subSouK5/
429
mFmDOYPQ+O83zWgYZsBmMJWYDZ+X9I6XXZSbPtV/7XyTjaxtl5uRnDVJjg+AzKvD
430
dTp8VatVVrwuvzOPDVc=
431
=uHen
432
-----END PGP SIGNATURE-----
433
"""
434
        plain = """bazaar-ng testament short form 1
435
revision-id: test@example.com-20110801100657-f1dr1nompeex723z
436
sha1: 59ab434be4c2d5d646dee84f514aa09e1b72feeb
437
"""
438
        my_gpg = gpg.GPGStrategy(FakeConfig())
6043.3.2 by Jonathan Riddell
update test
439
        self.assertEqual((gpg.SIGNATURE_EXPIRED, u'4F8D1513'),
6043.2.8 by Jonathan Riddell
add test for unknown key
440
                            my_gpg.verify(content, plain))
441
442
    def test_verify_unknown_key(self):
443
        self.requireFeature(features.gpgme)
444
        content = """-----BEGIN PGP SIGNED MESSAGE-----
445
Hash: SHA1
446
447
asdf
448
-----BEGIN PGP SIGNATURE-----
449
Version: GnuPG v1.4.11 (GNU/Linux)
450
451
iQEcBAEBAgAGBQJOORKwAAoJENf6AkFdUeVvJDYH/1Cz+AJn1Jvy5n64o+0fZ5Ow
452
Y7UQb4QQTIOV7jI7n4hv/yBzuHrtImFzYvQl/o2Ezzi8B8L5gZtQy+xCUF+Q8iWs
453
gytZ5JUtSze7hDZo1NUl4etjoRGYqRfrUcvE2LkVH2dFbDGyyQfVmoeSHa5akuuP
454
QZmyg2F983rACVIpGvsqTH6RcBdvE9vx68lugeKQA8ArDn39/74FBFipFzrXSPij
455
eKFpl+yZmIb3g6HkPIC8o4j/tMvc37xF1OG5sBu8FT0+FC+VgY7vAblneDftAbyP
456
sIODx4WcfJtjLG/qkRYqJ4gDHo0eMpTJSk2CWebajdm4b+JBrM1F9mgKuZFLruE=
457
=RNR5
458
-----END PGP SIGNATURE-----
459
"""
460
        plain = "asdf\n"
461
        my_gpg = gpg.GPGStrategy(FakeConfig())
462
        self.assertEqual((gpg.SIGNATURE_KEY_MISSING, u'5D51E56F'),
463
                            my_gpg.verify(content, plain))
464
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
465
    def test_set_acceptable_keys(self):
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
466
        self.requireFeature(features.gpgme)
467
        self.import_keys()
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
468
        my_gpg = gpg.GPGStrategy(FakeConfig())
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
469
        my_gpg.set_acceptable_keys("bazaar@example.com")
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
470
        self.assertEqual(my_gpg.acceptable_keys,
5971.1.14 by Jonathan Riddell
add test for set_acceptable_keys, accept non-trusted keys if specified as acceptable, import dummy key in tests so it works outside my machine
471
                         [u'B5DEED5FCB15DAE6ECEF919587681B1EE3080E45'])
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
472
473
    def test_set_acceptable_keys_unknown(self):
5971.1.80 by Jonathan Riddell
add missing self.requireFeature() checks to gpg tests
474
        self.requireFeature(features.gpgme)
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
475
        my_gpg = gpg.GPGStrategy(FakeConfig())
476
        my_gpg.set_acceptable_keys("unknown")
477
        self.assertEqual(my_gpg.acceptable_keys, [])
5971.1.35 by Jonathan Riddell
set gpgme in tests.features
478
5971.1.11 by Jonathan Riddell
add set_acceptable_keys() so user can specify which gpg keys can be used for verification
479
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
480
class TestDisabled(TestCase):
481
482
    def test_sign(self):
483
        self.assertRaises(errors.SigningFailed,
484
                          gpg.DisabledGPGStrategy(None).sign, 'content')
5971.1.8 by Jonathan Riddell
start adding test cases
485
486
    def test_verify(self):
5971.1.33 by Jonathan Riddell
rename errors.VerifyFailed to errors.SignatureVerificationFailed
487
        self.assertRaises(errors.SignatureVerificationFailed,
5971.1.31 by Jonathan Riddell
and update tests
488
                          gpg.DisabledGPGStrategy(None).verify, 'content',
489
                          'testament')