~bzr-pqm/bzr/bzr.dev

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