#!/usr/bin/env python2.4 from basetest import BaseTest import sys, tempfile, os, shutil import unittest sys.path.insert(0, '..') from zeroinstall.injector import gpg, model, basedir, trust err_sig = """-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.0 (GNU/Linux) owGbwMvMwCTYk9R5Infvsj7G01xJDE513j1OiSlcHfbMrCDOBJisINP6XQwLGjzn tMxedXc3y75I7r1hQZFTb/ewMcx3yefZ8zb/vZd10I7LEYdDj4fnKsYAAA== =kMeU -----END PGP MESSAGE----- """ bad_sig = """-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hell0 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCfk3grgeCgFmlPMERAhl8AKC0aktrLzz646zTY0TRzdnxPdbLBgCeJWbk GRVbJusevCKvtoSn7RAW2mg= =xQJ5 -----END PGP SIGNATURE----- """ good_sig = """-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hello -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCfk3grgeCgFmlPMERAhl8AKC0aktrLzz646zTY0TRzdnxPdbLBgCeJWbk GRVbJusevCKvtoSn7RAW2mg= =xQJ5 -----END PGP SIGNATURE----- """ bad_xml_main = """ """ invalid_xmls_sigs = [ ('last line is not end-of-comment', """ """), ('extra data on comment line', """ """), ('last line is not end-of-comment', """ More """), ('Invalid base 64 encoded signature:', """ """), ('Invalid characters found', """ """)] good_xml_sig = """ """ bad_xml_sig = """ """ from data import thomas_key class TestGPG(BaseTest): def setUp(self): BaseTest.setUp(self) stream = tempfile.TemporaryFile() stream.write(thomas_key) stream.seek(0) gpg.import_key(stream) trust.trust_db.trust_key( '92429807C9853C0744A68B9AAE07828059A53CC1') def testImportBad(self): stream = tempfile.TemporaryFile() stream.write("Bad key") stream.seek(0) try: gpg.import_key(stream) assert False except model.SafeException: pass # OK def testErrSig(self): stream = tempfile.TemporaryFile() stream.write(err_sig) stream.seek(0) data, sigs = gpg.check_stream(stream) self.assertEquals("Bad\n", data.read()) assert len(sigs) == 1 assert isinstance(sigs[0], gpg.ErrSig) assert sigs[0].need_key() == "8C6289C86DBDA68E" self.assertEquals("17", sigs[0].status[gpg.ErrSig.ALG]) assert sigs[0].is_trusted() is False assert str(sigs[0]).startswith('ERROR') def testBadSig(self): self.assertEquals("Hell0\n", self.check_bad(bad_sig)) def testBadXMLSig(self): self.assertEquals(bad_xml_sig, self.check_bad(bad_xml_sig)) def testInvalidXMLSig(self): for error, sig in invalid_xmls_sigs: try: self.check_bad(bad_xml_main + '\n' + sig) except model.SafeException, ex: if error not in str(ex): raise model.SafeException(str(ex) + '\nSig:\n' + sig) def check_bad(self, sig): stream = tempfile.TemporaryFile() stream.write(sig) stream.seek(0) data, sigs = gpg.check_stream(stream) assert len(sigs) == 1 assert isinstance(sigs[0], gpg.BadSig) self.assertEquals("AE07828059A53CC1", sigs[0].status[gpg.BadSig.KEYID]) assert sigs[0].is_trusted() is False assert sigs[0].need_key() is None assert str(sigs[0]).startswith('BAD') return data.read() def testGoodSig(self): self.assertEquals("Hello\n", self.check_good(good_sig)) def testGoodXMLSig(self): self.assertEquals(good_xml_sig, self.check_good(good_xml_sig)) def check_good(self, sig): stream = tempfile.TemporaryFile() stream.write(sig) stream.seek(0) data, sigs = gpg.check_stream(stream) assert len(sigs) == 1 assert isinstance(sigs[0], gpg.ValidSig) self.assertEquals("92429807C9853C0744A68B9AAE07828059A53CC1", sigs[0].fingerprint) assert sigs[0].is_trusted() is True assert sigs[0].need_key() is None assert str(sigs[0]).startswith('Valid') for item in sigs[0].get_details(): if item[0] in ('pub', 'uid') and len(item) > 9: self.assertEquals( "Thomas Leonard ", item[9]) break else: self.fail("Missing name") return data.read() def testNoSig(self): stream = tempfile.TemporaryFile() stream.write("Hello") stream.seek(0) try: gpg.check_stream(stream) assert False except model.SafeException: pass # OK def testLoadKeys(self): self.assertEquals({}, gpg.load_keys([])) suite = unittest.makeSuite(TestGPG) if __name__ == '__main__': sys.argv.append('-v') unittest.main()