/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/test_gpg.py

  • Committer: Breezy landing bot
  • Author(s): Jelmer Vernooij
  • Date: 2019-01-28 23:51:14 UTC
  • mfrom: (7251.1.1 skip-crypto-deprecation)
  • Revision ID: breezy.the.bot@gmail.com-20190128235114-wurthh67hpldlyip
Ignore UserWarning on travis.

Merged from https://code.launchpad.net/~jelmer/brz/skip-crypto-deprecation/+merge/362227

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2009, 2011 Canonical Ltd
2
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
18
18
"""Tests for signing and verifying blobs of data via gpg."""
19
19
 
20
20
# import system imports here
21
 
import os
22
21
import sys
23
22
 
24
 
from bzrlib import errors, ui
25
 
import bzrlib.gpg as gpg
26
 
from bzrlib.tests import TestCase, TestCaseInTempDir
27
 
 
28
 
class FakeConfig(object):
29
 
 
30
 
    def gpg_signing_command(self):
31
 
        return "false"
32
 
 
33
 
 
34
 
class TestCommandLine(TestCase):
35
 
 
36
 
    def test_signing_command_line(self):
37
 
        my_gpg = gpg.GPGStrategy(FakeConfig())
38
 
        self.assertEqual(['false',  '--clearsign'],
39
 
                         my_gpg._command_line())
40
 
 
41
 
    def test_checks_return_code(self):
42
 
        # This test needs a unix like platform - one with 'false' to run.
43
 
        # if you have one, please make this work :)
44
 
        my_gpg = gpg.GPGStrategy(FakeConfig())
45
 
        self.assertRaises(errors.SigningFailed, my_gpg.sign, 'content')
46
 
 
47
 
    def assertProduces(self, content):
48
 
        # This needs a 'cat' command or similar to work.
49
 
        my_gpg = gpg.GPGStrategy(FakeConfig())
50
 
        if sys.platform == 'win32':
51
 
            # Windows doesn't come with cat, and we don't require it
52
 
            # so lets try using python instead.
53
 
            # But stupid windows and line-ending conversions.
54
 
            # It is too much work to make sys.stdout be in binary mode.
55
 
            # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443
56
 
            my_gpg._command_line = lambda:[sys.executable, '-c',
57
 
                    'import sys; sys.stdout.write(sys.stdin.read())']
58
 
            new_content = content.replace('\n', '\r\n')
59
 
 
60
 
            self.assertEqual(new_content, my_gpg.sign(content))
61
 
        else:
62
 
            my_gpg._command_line = lambda:['cat', '-']
63
 
            self.assertEqual(content, my_gpg.sign(content))
64
 
 
65
 
    def test_returns_output(self):
66
 
        content = "some content\nwith newlines\n"
67
 
        self.assertProduces(content)
68
 
 
69
 
    def test_clears_progress(self):
70
 
        content = "some content\nwith newlines\n"
71
 
        old_clear_term = ui.ui_factory.clear_term
72
 
        clear_term_called = []
73
 
        def clear_term():
74
 
            old_clear_term()
75
 
            clear_term_called.append(True)
76
 
        ui.ui_factory.clear_term = clear_term
77
 
        try:
78
 
            self.assertProduces(content)
79
 
        finally:
80
 
            ui.ui_factory.clear_term = old_clear_term
81
 
        self.assertEqual([True], clear_term_called)
82
 
 
83
 
    def test_aborts_on_unicode(self):
84
 
        """You can't sign Unicode text; it must be encoded first."""
85
 
        self.assertRaises(errors.BzrBadParameterUnicode,
86
 
                          self.assertProduces, u'foo')
 
23
from .. import (
 
24
    config,
 
25
    errors,
 
26
    gpg,
 
27
    tests,
 
28
    trace,
 
29
    ui,
 
30
    )
 
31
from ..sixish import (
 
32
    BytesIO,
 
33
    )
 
34
from . import (
 
35
    TestCase,
 
36
    features,
 
37
    )
 
38
 
 
39
 
 
40
class FakeConfig(config.MemoryStack):
 
41
 
 
42
    def __init__(self, content=None):
 
43
        if content is None:
 
44
            content = b'''
 
45
gpg_signing_key=amy@example.com
 
46
'''
 
47
        super(FakeConfig, self).__init__(content)
 
48
 
 
49
 
 
50
class TestVerify(TestCase):
 
51
 
 
52
    def import_keys(self):
 
53
        import gpg
 
54
        context = gpg.Context()
 
55
 
 
56
        key = gpg.Data(b"""-----BEGIN PGP PUBLIC KEY BLOCK-----
 
57
Version: GnuPG v1.4.11 (GNU/Linux)
 
58
 
 
59
mQENBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
 
60
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
 
61
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
 
62
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
 
63
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
 
64
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAG0JEJhemFhciBUZXN0IEtl
 
65
eSA8YmF6YWFyQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIG
 
66
FQgCCQoLBBYCAwECHgECF4AACgkQh2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys
 
67
2hZmXUq/tU+L92bjQoRY4fmsQpk/FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2
 
68
jj7UiJd8z9gTRxWTnYwfR/w5PGmxfJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswa
 
69
IOAZIwe5Vsfs36uSS7p8RQHAZXLXtTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO
 
70
2qEa0mYiAfDpz40CGtb8N/TQHF3Xcw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqW
 
71
o/r3RII3Ii3z2yARlg6D+5hVOrFBV8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtB
 
72
OrkBDQRN+NyIAQgArRZ2YGzUj5dXOVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2
 
73
V0dcVCqWwT0+a79Wbausv4bStD4SkwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr
 
74
6UUneB3UXX7MrEqVogVhRM0ORIaK/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEX
 
75
imBsN3GqoewBHYIneJKBtHE7uzdzw3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeX
 
76
P6ktvXbX2Iu7VDNoCvRXM9+ntyJtsXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCc
 
77
VtFjLTcbCqJqpoJWUtsLcNqDqMHOQDpe6KTNTQARAQABiQEfBBgBAgAJBQJN+NyI
 
78
AhsMAAoJEIdoGx7jCA5FrR8IANnOF3PUj1TbRcwV6RoWmHsFQHrPmM8ogXia1Lsv
 
79
jE1iEWoC+muvKh6Oydf90k6ZslS7rdDnp2qzYY8W/TiDkxP+fvsZ4mMi1Y0F+3ty
 
80
1jzWhcsnB2VrJSiavxEXk0tKPrNv4EUGWG6wHsC9TBj37If+nrMyim94VHvI0eHm
 
81
X8yMlN4O3HfmgD9CbJdUxueP3e31OIYuwh/6F7GII8TNEVHU/8vh/mQcCxppNbc+
 
82
boff+kIsoa/TAMLwtJoSrX1nXm0K3vZePRLnIgmwVzdkOIkaRJUG2tSQFvkfhvtE
 
83
LhnkL5l4MO0wrUds0UWRwa3d7j/P2ExrqXdlLmEzrifWyEQ=
 
84
=hUJn
 
85
-----END PGP PUBLIC KEY BLOCK-----
 
86
""")
 
87
 
 
88
        secret_key = gpg.Data(b"""-----BEGIN PGP PRIVATE KEY BLOCK-----
 
89
Version: GnuPG v1.4.11 (GNU/Linux)
 
90
 
 
91
lQOYBE343IgBCADwzPW7kmKb2bjB+UU+1ER/ABMZspvtoZMPusUw7bk6coXHF/0W
 
92
u1K/hSYeX9xaGOfOQw41r/g13MoR9dsL6L84RLiisf38rRoBZt+d5bCbZA5Xo801
 
93
2PeoBoGo6u5oOYKAFLMvrUitPiiE0IT/oQTfC4YUrLN4A+9W0QZruPGIpIXwmZXr
 
94
L0zsqYfNqIN0ompeJenVpKpvm3loJ/zfK7R3EJ3hsv6nkUmWCFsP1Pw3UV1YuCmw
 
95
Mkdn1U7DaOql1WjXgj9ABQDJrun2TGsqrSRzBODtHKA/uOX0K3VfKBU8VZo3dXUm
 
96
1Q4ZeZC39L9qJGTH8TQYlwBLe1yAOp+vx7QJABEBAAEAB/0RJTbV991SOtVfPQVu
 
97
LM+tD0SiOXJwIBIINlngsFHWVIiBSDb6uF8dneMR70IRnuEFHFyAUXA7PZDxvcSu
 
98
phAqIdKCWxQPkAULAS0o4U2K3ZFGh4uOqvfZ8eSnh1rETFv7Yf3u23K89cZiy99n
 
99
EtWgSqzC/2z5PaZ7/alsYCBqhHuyd4Phaud7qv7FTz8mFrCf+CCY+D08wbnZBu4g
 
100
N9tBwoxT/UKRfv3nghIh9v+3qWfBEFGhrYbt92XKFbHOQeATZz8AGIv1eqN/+ZQY
 
101
oYmvVfO3GkrWaRoPeJNLqSDEn/45O1Uh9MJ4mQclXqB0QzMShle8uusHxIeJSQsR
 
102
z//VBAD11WS7qSgCeiHR+4jDzrrlb2snnA2bfDToEomDxd/n8xm7nJWdkNfJ2BCw
 
103
KvnxYVxjFNAwkKJGRajzALBLzRVO+K9NtSLiddv5zv+UNdgsKuE8tD7Jqxd/IbWw
 
104
AimCtL8osnJ+r9dvL+NyjkAT6l/NdEbLXGrBaMeTfSgl2cBOOwQA+sJIh1R5PiCK
 
105
nLIs9pm3PSy3w92Peelq/x/+0aebTZaJUk2ou3oCvB3druDqrUeaopuuCc0drV7C
 
106
Ldoey8x/T2ZGzmT2af9qNaD6ScTimDodXcJdwlpobhZTKpsE4EyywpLXtlWte1x0
 
107
1Mq3llQsIdRdf3GLS+L207hWgKDiDosD/0SyOBO/IBDteeEzeN2hNE3A8oeVbvRS
 
108
XrS/3uj6oKmlWUBORYP8ptUrXPoVPmNz2y4GO+OysFtfct3Yqb+Sb/52SXMOHTox
 
109
2oLW08tkzfkDArU5aauMEPmyutGyJ+hGo7fsuLXzXR8OPw4yZJdzG1tRlP2TTKmq
 
110
Fx8G/Ik6bN4zTYK0JEJhemFhciBUZXN0IEtleSA8YmF6YWFyQGV4YW1wbGUuY29t
 
111
PokBOAQTAQIAIgUCTfjciAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
 
112
h2gbHuMIDkWJUggAwj537fH6WW+GGLA5onys2hZmXUq/tU+L92bjQoRY4fmsQpk/
 
113
FUVPUf+NQ0v1gkxx4BTfyYewaj5G6L8cvqW2jj7UiJd8z9gTRxWTnYwfR/w5PGmx
 
114
fJsBfEUKWsccrPQdOXAhwu0fjYIVk4nqgswaIOAZIwe5Vsfs36uSS7p8RQHAZXLX
 
115
tTOn3KcXHaxu83w6nc4zkWRovGJ9isBN3haO2qEa0mYiAfDpz40CGtb8N/TQHF3X
 
116
cw8rJcxpg6RF3jMtWQnzbVJFp13it00R3LqWo/r3RII3Ii3z2yARlg6D+5hVOrFB
 
117
V8jFLkff1R2ZnVu+7WOrnbpmt3OiMkSeZrtBOp0DlwRN+NyIAQgArRZ2YGzUj5dX
 
118
OVIWgZ1/QFpyfx/cG/293WjRE4Wt2e4SxMf2V0dcVCqWwT0+a79Wbausv4bStD4S
 
119
kwDmu0Jf3z5ERzrr7oZwP0PMsIlM5zT6XSsr6UUneB3UXX7MrEqVogVhRM0ORIaK
 
120
/oRwMXr7K6xVT+bCBP3/p66kHtY1ZpfEzTEXimBsN3GqoewBHYIneJKBtHE7uzdz
 
121
w3O5p5dXqoj5foxGi9R1J15vAmt5pI68HJeXP6ktvXbX2Iu7VDNoCvRXM9+ntyJt
 
122
sXCjNXg4pTGHS/XO4nm2db4FUZOBcVMb1vCcVtFjLTcbCqJqpoJWUtsLcNqDqMHO
 
123
QDpe6KTNTQARAQABAAf1EfceUlGLvoA/+yDTNTMjuPfzfKwbB/FOVfX44g3Za1eT
 
124
v7RvSuj4rFYIdE9UvZEei/pqPOSc+hhSsKZCulGXD5TUpf3AyG7ipWU/kID46Csp
 
125
0V08DPpFHnuw/N6+qNo5iSnhN9U1XMLjYT5d1HvKur26r2vWbmUTSJ1qIluHL2fT
 
126
R1pKYYLuoff4MIjZ01Hawq72jjor+dLBmMWveHpq4XNp+vQ4x8aFnY9ozufon0nM
 
127
uRSJRlQjDNB274tvUbmDFP+nzNbqF1nBTZ6FTdH/iKVNbytiYF7Hbat8GWVZqY1u
 
128
CZr7BklpIVWlk62ll0psMIPVyANi7YT332LLqYmBBADJKTx2dariG/kWU2W/9VEO
 
129
2VZpqsqazAxOoFEIOpcOlByhhyw5g0IKu0UyzHkhoCje0cWxpdSBFG432b8zL0AT
 
130
Z0RycfUG7Sgp9CpY1h8Cc/HbBa8xo1fSM7zplPQrHBqUzlVVBq6HOkUq+7qsPFWc
 
131
RRie95VsDmIMKQKPJHeYHQQA3EYGit+QHV0dccAInghEsf/mq8Gfnvo6HPYhWcDC
 
132
DTM39NhNlnl1WkTFCd2TWc+TWQ4KlRsh6bMjUpNa2qjrUl90fLekbogcxxMhcwa6
 
133
xgzEANZfwqdY0u3aB/CyZ6odfThwcAoeqoMpw34CfeKEroubpi2n8wKByrN2MQXJ
 
134
4vEEAJbXZOqgAcFAFBUVb5mVT0s2lJMagZFPdhRJz2bttz01s/B8aca6CrDpFRjT
 
135
03zRFUZjwDYqZDWBC181dCE9yla4OkWd5QyRKSS2EE02KEYqRzT0RngQn7s4AW2r
 
136
326up3Jhleln3hgD4Kk3V3KHmyK8zqZA0qWzry4Vl2jjkbnAPB2JAR8EGAECAAkF
 
137
Ak343IgCGwwACgkQh2gbHuMIDkWtHwgA2c4Xc9SPVNtFzBXpGhaYewVAes+YzyiB
 
138
eJrUuy+MTWIRagL6a68qHo7J1/3STpmyVLut0OenarNhjxb9OIOTE/5++xniYyLV
 
139
jQX7e3LWPNaFyycHZWslKJq/EReTS0o+s2/gRQZYbrAewL1MGPfsh/6eszKKb3hU
 
140
e8jR4eZfzIyU3g7cd+aAP0Jsl1TG54/d7fU4hi7CH/oXsYgjxM0RUdT/y+H+ZBwL
 
141
Gmk1tz5uh9/6Qiyhr9MAwvC0mhKtfWdebQre9l49EuciCbBXN2Q4iRpElQba1JAW
 
142
+R+G+0QuGeQvmXgw7TCtR2zRRZHBrd3uP8/YTGupd2UuYTOuJ9bIRA==
 
143
=LXn0
 
144
-----END PGP PRIVATE KEY BLOCK-----
 
145
""")
 
146
 
 
147
        revoked_key = gpg.Data(b"""-----BEGIN PGP PUBLIC KEY BLOCK-----
 
148
Version: GnuPG v1.4.11 (GNU/Linux)
 
149
 
 
150
mI0ETjlW5gEEAOb/6P+TVM59E897wRtatxys2BhsHCXM4T7xjIiANfDwejDdifqh
 
151
tluTfSJLLxPembtrrEjux1C0AJgc+f0MIfsc3Pr3eFJzKB2ot/1IVG1/1KnA0zt3
 
152
W2xPT3lRib27WJ9Fag+dMtQaIzgJ7/n2DFxsFZ33FD2kxrEXB2exGg6FABEBAAGI
 
153
pgQgAQIAEAUCTjlXkAkdAHJldm9rZWQACgkQjs6dvEpb0cQPHAP/Wi9rbx0e+1Sf
 
154
ziGgyVdr3m3A6uvze5oXKVgFRbGRUYSH4/I8GW0W9x4TcRg9h+YaQ8NUdADr9kNE
 
155
tKAljLqYA5qdqSfYuaij1M++Xj+KUZ359R74sHuQqwnRy1XXQNfRs/QpXA7vLdds
 
156
rjg+pbWuXO92TZJUdnqtWW+VEyZBsPy0G3Rlc3Qga2V5IDx0ZXN0QGV4YW1wbGUu
 
157
Y29tPoi4BBMBAgAiBQJOOVbmAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK
 
158
CRCOzp28SlvRxNWzA/42WVmI0b+6mF/imEOlY1TiyvrcpK250rkSDsCtL4lOwy7G
 
159
antZhpgNfnXRd/ySfsS3EB6dpOWgOSxGRvWQhA+vxBT9BYNk49qd3JIrSaSWpR12
 
160
rET8qO1rEQQFWsw03CxTGujxGlmEO+a1yguRXp2UWaY7FngcQmD+8q7BUIVm7riN
 
161
BE45VuYBBADTEH2jHTjNCc5CMOhea6EJTrkx3upcEqB2oyhWeSWJiBGOxlcddsjo
 
162
3J3/EmBB8kK1hM9TidD3SG64x1N287lg8ELJBlKv+pQVyxohGJ1u/THgpTDMMQcL
 
163
luG5rAHQGSfyzKTiOnaTyBYg3M/nzgUOU9dKEFB0EA3tjUXFOT+r3wARAQABiJ8E
 
164
GAECAAkFAk45VuYCGwwACgkQjs6dvEpb0cRSLQP/fzCWX2lXwlwWiVF8BOPF7o9z
 
165
icHErc7/X17RGb4qj1kVf+UkRdUWJrbEVh4h6MncBIuA70WsYogiw+Kz/0LCtQAR
 
166
YUJsPy/EL++OKPH1aFasOdTxwkTka85+RdYqhP1+z/aYLFMWq6mRFI+o6x2k5mGi
 
167
7dMv2kKTJPoXUpiXJbg=
 
168
=hLYO
 
169
-----END PGP PUBLIC KEY BLOCK-----
 
170
""")
 
171
 
 
172
        expired_key = gpg.Data(b"""-----BEGIN PGP PUBLIC KEY BLOCK-----
 
173
Version: GnuPG v1.4.11 (GNU/Linux)
 
174
 
 
175
mI0ETjZ6PAEEALkR4GcFQidCCxV7pgQwQd5MZua0YO2l92fVqHX+PhnZ6egCLKdD
 
176
2bWlMUd6MLPF3FlRL7BBAxvW/DazkBOp7ljsnpMpptEzY49Uem1irYLYiVb9zK96
 
177
0sQZzFxFkfEYetQEXC68mIck8tbySOX5NAOw++3jFm3J7dsU1R3XtYzRABEBAAG0
 
178
G3Rlc3Qga2V5IDx0ZXN0QGV4YW1wbGUuY29tPoi+BBMBAgAoBQJONno8AhsDBQkA
 
179
AVGABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAc4m97T40VEz+DA/9PBphG
 
180
Yp9cHVaHSfTUKGTGgIbvRe60sFNpDCYZeAGDrygOMuI8MNzbVpwefRBFHVPx7jWd
 
181
rrYMsLkcsNUS9D0baU+0D/qp7JVg7ZSQtG0O6IG4eTZhibteY1fu0+unlXmg9NHx
 
182
5VvhwzBiJDYji00M2p/CZEMiYFUuy76CsxUpN7iNBE42ejwBBACkv2/mX7IPQg0C
 
183
A3KSrJsJv+sdvKm4b4xuI4OwagwTIVz4KlTqV4IBrVjSBfwyMXucXz0bTW85qjgA
 
184
+n67td8vyjYYZUEz1uY9lSquQQDnAN0txL3cLHZXWiWOkmzZVddQtlflK2a/J9o0
 
185
QkHPVUm+hc4l64dIzStrNl2S66fAvQARAQABiKUEGAECAA8FAk42ejwCGwwFCQAB
 
186
UYAACgkQHOJve0+NFROEYQP/epg+o8iBs31hkSERyZjrRR66LpywezWj30Rn/3mX
 
187
Fzi9HkF4xLemWOzdNt9C5PYrOep85PQg8haEjknxVjZFS0ikT1h3OWk/TF1ZrLVm
 
188
WzyX8DaHQEjKpLJJjXcAbTiZBNMk0QaVC9RvIeHpCf3n3DC49DdjsPJRMKOn8KDi
 
189
kRk=
 
190
=p0gt
 
191
-----END PGP PUBLIC KEY BLOCK-----
 
192
""")
 
193
        context.op_import(key)
 
194
        context.op_import(secret_key)
 
195
        context.op_import(revoked_key)
 
196
        context.op_import(expired_key)
 
197
 
 
198
    def test_verify_untrusted_but_accepted(self):
 
199
        # untrusted by gpg but listed as acceptable_keys by user
 
200
        self.requireFeature(features.gpg)
 
201
        self.import_keys()
 
202
 
 
203
        content = b"""-----BEGIN PGP SIGNED MESSAGE-----
 
204
Hash: SHA1
 
205
 
 
206
bazaar-ng testament short form 1
 
207
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
208
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
209
-----BEGIN PGP SIGNATURE-----
 
210
Version: GnuPG v1.4.11 (GNU/Linux)
 
211
 
 
212
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
 
213
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
 
214
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
 
215
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
 
216
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
 
217
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
 
218
=iwsn
 
219
-----END PGP SIGNATURE-----
 
220
"""
 
221
        plain = b"""bazaar-ng testament short form 1
 
222
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
223
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
224
"""
 
225
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
226
        my_gpg.set_acceptable_keys("bazaar@example.com")
 
227
        self.assertEqual((gpg.SIGNATURE_VALID, None, plain),
 
228
                         my_gpg.verify(content))
 
229
 
 
230
    def test_verify_unacceptable_key(self):
 
231
        self.requireFeature(features.gpg)
 
232
        self.import_keys()
 
233
 
 
234
        content = b"""-----BEGIN PGP SIGNED MESSAGE-----
 
235
Hash: SHA1
 
236
 
 
237
bazaar-ng testament short form 1
 
238
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
239
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
240
-----BEGIN PGP SIGNATURE-----
 
241
Version: GnuPG v1.4.11 (GNU/Linux)
 
242
 
 
243
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
 
244
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
 
245
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
 
246
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
 
247
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
 
248
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
 
249
=iwsn
 
250
-----END PGP SIGNATURE-----
 
251
"""
 
252
        plain = b"""bazaar-ng testament short form 1
 
253
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
254
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
255
"""
 
256
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
257
        my_gpg.set_acceptable_keys("foo@example.com")
 
258
        self.assertEqual((gpg.SIGNATURE_KEY_MISSING, u'E3080E45', plain),
 
259
                         my_gpg.verify(content))
 
260
 
 
261
    def test_verify_valid_but_untrusted(self):
 
262
        self.requireFeature(features.gpg)
 
263
        self.import_keys()
 
264
 
 
265
        content = b"""-----BEGIN PGP SIGNED MESSAGE-----
 
266
Hash: SHA1
 
267
 
 
268
bazaar-ng testament short form 1
 
269
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
270
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
271
-----BEGIN PGP SIGNATURE-----
 
272
Version: GnuPG v1.4.11 (GNU/Linux)
 
273
 
 
274
iQEcBAEBAgAGBQJN+ekFAAoJEIdoGx7jCA5FGtEH/i+XxJRvqU6wdBtLVrGBMAGk
 
275
FZ5VP+KyXYtymSbgSstj/vM12NeMIeFs3xGnNnYuX1MIcY6We5TKtCH0epY6ym5+
 
276
6g2Q2QpQ5/sT2d0mWzR0K4uVngmxVQaXTdk5PdZ40O7ULeDLW6CxzxMHyUL1rsIx
 
277
7UBUTBh1O/1n3ZfD99hUkm3hVcnsN90uTKH59zV9NWwArU0cug60+5eDKJhSJDbG
 
278
rIwlqbFAjDZ7L/48e+IaYIJwBZFzMBpJKdCxzALLtauMf+KK8hGiL2hrRbWm7ty6
 
279
NgxfkMYOB4rDPdSstT35N+5uBG3n/UzjxHssi0svMfVETYYX40y57dm2eZQXFp8=
 
280
=iwsn
 
281
-----END PGP SIGNATURE-----
 
282
"""
 
283
        plain = b"""bazaar-ng testament short form 1
 
284
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
285
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
286
"""
 
287
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
288
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None,
 
289
                          plain), my_gpg.verify(content))
 
290
 
 
291
    def test_verify_revoked_signature(self):
 
292
        self.requireFeature(features.gpg)
 
293
        self.import_keys()
 
294
 
 
295
        content = b"""-----BEGIN PGP SIGNED MESSAGE-----
 
296
Hash: SHA1
 
297
 
 
298
asdf
 
299
-----BEGIN PGP SIGNATURE-----
 
300
Version: GnuPG v1.4.11 (GNU/Linux)
 
301
 
 
302
iJwEAQECAAYFAk45V18ACgkQjs6dvEpb0cSIZQP/eOGTXGPlrNwvDkcX2d8O///I
 
303
ecB4sUIUEpv1XAk1MkNu58lsjjK72lRaLusEGqd7HwrFmpxVeVs0oWLg23PNPCFs
 
304
yJBID9ma+VxFVPtkEFnrc1R72sBJLfBcTxMkwVTC8eeznjdtn+cg+aLkxbPdrGnr
 
305
JFA6kUIJU2w9LU/b88Y=
 
306
=UuRX
 
307
-----END PGP SIGNATURE-----
 
308
"""
 
309
        plain = b"""asdf\n"""
 
310
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
311
        my_gpg.set_acceptable_keys("test@example.com")
 
312
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None, None),
 
313
                         my_gpg.verify(content))
 
314
 
 
315
    def test_verify_invalid(self):
 
316
        self.requireFeature(features.gpg)
 
317
        self.import_keys()
 
318
        content = b"""-----BEGIN PGP SIGNED MESSAGE-----
 
319
Hash: SHA1
 
320
 
 
321
bazaar-ng testament short form 1
 
322
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
323
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
324
-----BEGIN PGP SIGNATURE-----
 
325
Version: GnuPG v1.4.11 (GNU/Linux)
 
326
 
 
327
iEYEARECAAYFAk33gYsACgkQpQbm1N1NUIhiDACglOuQDlnSF4NxfHSkN/zrmFy8
 
328
nswAoNGXAVuR9ONasAKIGBNUE0b+lols
 
329
=SOuC
 
330
-----END PGP SIGNATURE-----
 
331
"""
 
332
        plain = b"""bazaar-ng testament short form 1
 
333
revision-id: amy@example.com-20110527185938-hluafawphszb8dl1
 
334
sha1: 6411f9bdf6571200357140c9ce7c0f50106ac9a4
 
335
"""
 
336
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
337
        self.assertEqual((gpg.SIGNATURE_NOT_VALID, None, plain),
 
338
                         my_gpg.verify(content))
 
339
 
 
340
    def test_verify_expired_but_valid(self):
 
341
        self.requireFeature(features.gpg)
 
342
        self.import_keys()
 
343
        content = b"""-----BEGIN PGP SIGNED MESSAGE-----
 
344
Hash: SHA1
 
345
 
 
346
bazaar-ng testament short form 1
 
347
revision-id: test@example.com-20110801100657-f1dr1nompeex723z
 
348
sha1: 59ab434be4c2d5d646dee84f514aa09e1b72feeb
 
349
-----BEGIN PGP SIGNATURE-----
 
350
Version: GnuPG v1.4.10 (GNU/Linux)
 
351
 
 
352
iJwEAQECAAYFAk42esUACgkQHOJve0+NFRPc5wP7BoZkzBU8JaHMLv/LmqLr0sUz
 
353
zuE51ofZZ19L7KVtQWsOi4jFy0fi4A5TFwO8u9SOfoREGvkw292Uty9subSouK5/
 
354
mFmDOYPQ+O83zWgYZsBmMJWYDZ+X9I6XXZSbPtV/7XyTjaxtl5uRnDVJjg+AzKvD
 
355
dTp8VatVVrwuvzOPDVc=
 
356
=uHen
 
357
-----END PGP SIGNATURE-----
 
358
"""
 
359
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
360
        self.assertEqual((gpg.SIGNATURE_EXPIRED, u'4F8D1513', None),
 
361
                         my_gpg.verify(content))
 
362
 
 
363
    def test_verify_unknown_key(self):
 
364
        self.requireFeature(features.gpg)
 
365
        self.import_keys()
 
366
        content = b"""-----BEGIN PGP SIGNED MESSAGE-----
 
367
Hash: SHA1
 
368
 
 
369
asdf
 
370
-----BEGIN PGP SIGNATURE-----
 
371
Version: GnuPG v1.4.11 (GNU/Linux)
 
372
 
 
373
iQEcBAEBAgAGBQJOORKwAAoJENf6AkFdUeVvJDYH/1Cz+AJn1Jvy5n64o+0fZ5Ow
 
374
Y7UQb4QQTIOV7jI7n4hv/yBzuHrtImFzYvQl/o2Ezzi8B8L5gZtQy+xCUF+Q8iWs
 
375
gytZ5JUtSze7hDZo1NUl4etjoRGYqRfrUcvE2LkVH2dFbDGyyQfVmoeSHa5akuuP
 
376
QZmyg2F983rACVIpGvsqTH6RcBdvE9vx68lugeKQA8ArDn39/74FBFipFzrXSPij
 
377
eKFpl+yZmIb3g6HkPIC8o4j/tMvc37xF1OG5sBu8FT0+FC+VgY7vAblneDftAbyP
 
378
sIODx4WcfJtjLG/qkRYqJ4gDHo0eMpTJSk2CWebajdm4b+JBrM1F9mgKuZFLruE=
 
379
=RNR5
 
380
-----END PGP SIGNATURE-----
 
381
"""
 
382
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
383
        self.assertEqual((gpg.SIGNATURE_KEY_MISSING, u'5D51E56F', None),
 
384
                         my_gpg.verify(content))
 
385
 
 
386
    def test_set_acceptable_keys(self):
 
387
        self.requireFeature(features.gpg)
 
388
        self.import_keys()
 
389
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
390
        my_gpg.set_acceptable_keys("bazaar@example.com")
 
391
        self.assertEqual(my_gpg.acceptable_keys,
 
392
                         [u'B5DEED5FCB15DAE6ECEF919587681B1EE3080E45'])
 
393
 
 
394
    def test_set_acceptable_keys_from_config(self):
 
395
        self.requireFeature(features.gpg)
 
396
        self.import_keys()
 
397
        my_gpg = gpg.GPGStrategy(FakeConfig(
 
398
            b'acceptable_keys=bazaar@example.com'))
 
399
        my_gpg.set_acceptable_keys(None)
 
400
        self.assertEqual(my_gpg.acceptable_keys,
 
401
                         [u'B5DEED5FCB15DAE6ECEF919587681B1EE3080E45'])
 
402
 
 
403
    def test_set_acceptable_keys_unknown(self):
 
404
        self.requireFeature(features.gpg)
 
405
        my_gpg = gpg.GPGStrategy(FakeConfig())
 
406
        self.notes = []
 
407
 
 
408
        def note(*args):
 
409
            self.notes.append(args[0] % args[1:])
 
410
        self.overrideAttr(trace, 'note', note)
 
411
        my_gpg.set_acceptable_keys("unknown")
 
412
        self.assertEqual(my_gpg.acceptable_keys, [])
 
413
        self.assertEqual(self.notes,
 
414
                         ['No GnuPG key results for pattern: unknown'])
87
415
 
88
416
 
89
417
class TestDisabled(TestCase):
90
418
 
91
419
    def test_sign(self):
92
 
        self.assertRaises(errors.SigningFailed,
93
 
                          gpg.DisabledGPGStrategy(None).sign, 'content')
 
420
        self.assertRaises(gpg.SigningFailed,
 
421
                          gpg.DisabledGPGStrategy(None).sign, b'content', gpg.MODE_CLEAR)
 
422
 
 
423
    def test_verify(self):
 
424
        self.assertRaises(gpg.SignatureVerificationFailed,
 
425
                          gpg.DisabledGPGStrategy(None).verify, b'content')