Refactor tests to use the Selections object instead of the Policy object
[zeroinstall/zeroinstall-mseaborn.git] / tests / testgpg.py
blobd5a9aeda7338e12c1cf893142a93171ae5e94355
1 #!/usr/bin/env python2.4
2 from basetest import BaseTest
3 import sys, tempfile
4 import unittest
6 sys.path.insert(0, '..')
7 from zeroinstall.injector import gpg, model, trust
9 err_sig = """-----BEGIN PGP MESSAGE-----
10 Version: GnuPG v1.4.0 (GNU/Linux)
12 owGbwMvMwCTYk9R5Infvsj7G01xJDE513j1OiSlcHfbMrCDOBJisINP6XQwLGjzn
13 tMxedXc3y75I7r1hQZFTb/ewMcx3yefZ8zb/vZd10I7LEYdDj4fnKsYAAA==
14 =kMeU
15 -----END PGP MESSAGE-----
16 """
18 bad_sig = """-----BEGIN PGP SIGNED MESSAGE-----
19 Hash: SHA1
21 Hell0
22 -----BEGIN PGP SIGNATURE-----
23 Version: GnuPG v1.4.0 (GNU/Linux)
25 iD8DBQFCfk3grgeCgFmlPMERAhl8AKC0aktrLzz646zTY0TRzdnxPdbLBgCeJWbk
26 GRVbJusevCKvtoSn7RAW2mg=
27 =xQJ5
28 -----END PGP SIGNATURE-----
29 """
31 good_sig = """-----BEGIN PGP SIGNED MESSAGE-----
32 Hash: SHA1
34 Hello
35 -----BEGIN PGP SIGNATURE-----
36 Version: GnuPG v1.4.0 (GNU/Linux)
38 iD8DBQFCfk3grgeCgFmlPMERAhl8AKC0aktrLzz646zTY0TRzdnxPdbLBgCeJWbk
39 GRVbJusevCKvtoSn7RAW2mg=
40 =xQJ5
41 -----END PGP SIGNATURE-----
42 """
44 bad_xml_main = """<?xml version='1.0'?>
45 <root/>"""
47 invalid_xmls_sigs = [
48 ('last line is not end-of-comment',
49 """<!-- Base64 Signature
50 """),
51 ('No signature block in XML',
52 """<!-- Base64 Sig
53 iD8DBQBDtpK9rgeCgFmlPMERAg0gAKCaJhXFnk
54 -->
55 """),
56 ('extra data on comment line',
57 """<!-- Base64 Signature data
58 iD8DBQBDtpK9rgeCgFmlPMERAg0gAKCaJhXFnk
59 -->
60 """),
61 ('last line is not end-of-comment',
62 """<!-- Base64 Signature
63 iD8DBQBDtpK9rgeCgFmlPMERAg0gAKCaJhXFnk
64 WZRBLT0an56WYaBODukSsf4=
65 --> More
66 """),
67 ('Invalid base 64 encoded signature:',
68 """<!-- Base64 Signature
69 iD8DBQBDtpK9rgeCgFmlPMERAg0gAKCaJhXFnk
70 WZRBLT0an56WYaBODukSsf4=
71 =zMc+
72 -->
73 """),
74 ('Invalid characters found',
75 """<!-- Base64 Signature
76 iD8DBQBDtpK9rge<CgFmlPMERAg0gAKCaJhXFnk
77 WZRBLT0an56WYaBODukSsf4=
78 -->
79 """)]
81 good_xml_sig = """<?xml version='1.0'?>
82 <root/>
83 <!-- Base64 Signature
84 iD8DBQBDuChIrgeCgFmlPMERAnGEAJ0ZS1PeyWonx6xS/mgpYTKNgSXa5QCeMSYPHhNcvxu3f84y
85 Uk7hxHFeQPo=
86 -->
87 """
89 bad_xml_sig = """<?xml version='1.0'?>
90 <ro0t/>
91 <!-- Base64 Signature
92 iD8DBQBDuChIrgeCgFmlPMERAnGEAJ0ZS1PeyWonx6xS/mgpYTKNgSXa5QCeMSYPHhNcvxu3f84y
93 Uk7hxHFeQPo=
94 -->
95 """
97 from data import thomas_key
99 class TestGPG(BaseTest):
100 def setUp(self):
101 BaseTest.setUp(self)
103 stream = tempfile.TemporaryFile()
104 stream.write(thomas_key)
105 stream.seek(0)
106 gpg.import_key(stream)
107 trust.trust_db.trust_key(
108 '92429807C9853C0744A68B9AAE07828059A53CC1')
110 def testImportBad(self):
111 stream = tempfile.TemporaryFile()
112 stream.write("Bad key")
113 stream.seek(0)
114 try:
115 gpg.import_key(stream)
116 assert False
117 except model.SafeException:
118 pass # OK
120 def testErrSig(self):
121 stream = tempfile.TemporaryFile()
122 stream.write(err_sig)
123 stream.seek(0)
124 data, sigs = gpg.check_stream(stream)
125 self.assertEquals("Bad\n", data.read())
126 assert len(sigs) == 1
127 assert isinstance(sigs[0], gpg.ErrSig)
128 assert sigs[0].need_key() == "8C6289C86DBDA68E"
129 self.assertEquals("17", sigs[0].status[gpg.ErrSig.ALG])
130 assert sigs[0].is_trusted() is False
131 assert str(sigs[0]).startswith('ERROR')
133 def testBadSig(self):
134 self.assertEquals("Hell0\n", self.check_bad(bad_sig))
136 def testBadXMLSig(self):
137 self.assertEquals(bad_xml_sig, self.check_bad(bad_xml_sig))
139 def testInvalidXMLSig(self):
140 for error, sig in invalid_xmls_sigs:
141 try:
142 self.check_bad(bad_xml_main + '\n' + sig)
143 except model.SafeException, ex:
144 if error not in str(ex):
145 raise model.SafeException(str(ex) + '\nSig:\n' + sig)
147 def check_bad(self, sig):
148 stream = tempfile.TemporaryFile()
149 stream.write(sig)
150 stream.seek(0)
151 data, sigs = gpg.check_stream(stream)
152 assert len(sigs) == 1
153 assert isinstance(sigs[0], gpg.BadSig)
154 self.assertEquals("AE07828059A53CC1",
155 sigs[0].status[gpg.BadSig.KEYID])
156 assert sigs[0].is_trusted() is False
157 assert sigs[0].need_key() is None
158 assert str(sigs[0]).startswith('BAD')
159 return data.read()
161 def testGoodSig(self):
162 self.assertEquals("Hello\n", self.check_good(good_sig))
164 def testGoodXMLSig(self):
165 self.assertEquals(good_xml_sig, self.check_good(good_xml_sig))
167 def check_good(self, sig):
168 stream = tempfile.TemporaryFile()
169 stream.write(sig)
170 stream.seek(0)
171 data, sigs = gpg.check_stream(stream)
172 assert len(sigs) == 1
173 assert isinstance(sigs[0], gpg.ValidSig)
174 self.assertEquals("92429807C9853C0744A68B9AAE07828059A53CC1",
175 sigs[0].fingerprint)
176 assert sigs[0].is_trusted() is True
177 assert sigs[0].need_key() is None
178 assert str(sigs[0]).startswith('Valid')
179 for item in sigs[0].get_details():
180 if item[0] in ('pub', 'uid') and len(item) > 9:
181 self.assertEquals(
182 "Thomas Leonard <tal197@users.sourceforge.net>",
183 item[9])
184 break
185 else:
186 self.fail("Missing name")
187 return data.read()
189 def testNoSig(self):
190 stream = tempfile.TemporaryFile()
191 stream.write("Hello")
192 stream.seek(0)
193 try:
194 gpg.check_stream(stream)
195 assert False
196 except model.SafeException:
197 pass # OK
199 def testLoadKeys(self):
200 self.assertEquals({}, gpg.load_keys([]))
202 suite = unittest.makeSuite(TestGPG)
203 if __name__ == '__main__':
204 sys.argv.append('-v')
205 unittest.main()