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