summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gemato/manifest.py17
-rw-r--r--gemato/recursiveloader.py5
-rw-r--r--tests/test_manifest.py2
-rw-r--r--tests/test_openpgp.py35
4 files changed, 50 insertions, 9 deletions
diff --git a/gemato/manifest.py b/gemato/manifest.py
index 39a8655..cef8b25 100644
--- a/gemato/manifest.py
+++ b/gemato/manifest.py
@@ -1,6 +1,6 @@
# gemato: Manifest file objects
# vim:fileencoding=utf-8
-# (c) 2017 Michał Górny
+# (c) 2017-2018 Michał Górny
# Licensed under the terms of 2-clause BSD license
import datetime
@@ -337,7 +337,7 @@ class ManifestFile(object):
from files and writing to them.
"""
- __slots__ = ['entries', 'openpgp_signed']
+ __slots__ = ['entries', 'openpgp_signed', 'openpgp_signature']
def __init__(self, f=None):
"""
@@ -347,6 +347,7 @@ class ManifestFile(object):
self.entries = []
self.openpgp_signed = None
+ self.openpgp_signature = None
if f is not None:
self.load(f)
@@ -360,14 +361,16 @@ class ManifestFile(object):
@openpgp_env needs to be provided.
If the verification succeeds, the openpgp_signed property will
- be set to True. If it fails or OpenPGP is not available,
- an exception will be raised. If the exception is caught,
- the caller can continue using the ManifestFile instance
- -- it will be loaded completely.
+ be set to True and openpgp_signature will contain the signature
+ data. If it fails or OpenPGP is not available, an exception
+ will be raised. If the exception is caught, the caller
+ can continue using the ManifestFile instance -- it will
+ be loaded completely.
"""
self.entries = []
self.openpgp_signed = False
+ self.openpgp_signature = None
state = ManifestState.DATA
openpgp_data = ''
@@ -436,7 +439,7 @@ class ManifestFile(object):
if verify_openpgp and state == ManifestState.POST_SIGNED_DATA:
assert openpgp_env
with io.StringIO(openpgp_data) as f:
- openpgp_env.verify_file(f)
+ self.openpgp_signature = openpgp_env.verify_file(f)
self.openpgp_signed = True
def dump(self, f, sign_openpgp=None, openpgp_keyid=None,
diff --git a/gemato/recursiveloader.py b/gemato/recursiveloader.py
index 35c304a..6dd456c 100644
--- a/gemato/recursiveloader.py
+++ b/gemato/recursiveloader.py
@@ -161,6 +161,7 @@ class ManifestRecursiveLoader(object):
'openpgp_keyid',
'hashes',
'openpgp_signed',
+ 'openpgp_signature',
'sort',
'compress_watermark',
'compress_format',
@@ -188,7 +189,8 @@ class ManifestRecursiveLoader(object):
@verify_openpgp and @openpgp_env are passed down
to ManifestFile. If the top-level Manifest is OpenPGP-signed
and the verification succeeds, openpgp_signed property
- is set to True. @verify_openpgp is True by default.
+ is set to True and openpgp_signature will contain the signature
+ data. @verify_openpgp is True by default.
@sign_openpgp is passed down to ManifestFile when writing
the top-level Manifest. If it is True, the top-level Manifest
@@ -258,6 +260,7 @@ class ManifestRecursiveLoader(object):
m = self.load_manifest(self.top_level_manifest_filename,
allow_create=allow_create)
self.openpgp_signed = m.openpgp_signed
+ self.openpgp_signature = m.openpgp_signature
def load_manifest(self, relpath, verify_entry=None,
allow_create=False):
diff --git a/tests/test_manifest.py b/tests/test_manifest.py
index fe1a060..a9f47c9 100644
--- a/tests/test_manifest.py
+++ b/tests/test_manifest.py
@@ -1,6 +1,6 @@
# gemato: Manifest file support tests
# vim:fileencoding=utf-8
-# (c) 2017 Michał Górny
+# (c) 2017-2018 Michał Górny
# Licensed under the terms of 2-clause BSD license
import datetime
diff --git a/tests/test_openpgp.py b/tests/test_openpgp.py
index 6f09014..d373e48 100644
--- a/tests/test_openpgp.py
+++ b/tests/test_openpgp.py
@@ -234,6 +234,7 @@ class SignedManifestTest(unittest.TestCase):
self.assertIsNotNone(m.find_timestamp())
self.assertIsNotNone(m.find_path_entry('myebuild-0.ebuild'))
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
def test_dash_escaped_manifest_load(self):
m = gemato.manifest.ManifestFile()
@@ -242,6 +243,7 @@ class SignedManifestTest(unittest.TestCase):
self.assertIsNotNone(m.find_timestamp())
self.assertIsNotNone(m.find_path_entry('myebuild-0.ebuild'))
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
def test_modified_manifest_load(self):
"""
@@ -254,6 +256,7 @@ class SignedManifestTest(unittest.TestCase):
self.assertIsNotNone(m.find_timestamp())
self.assertIsNotNone(m.find_path_entry('myebuild-0.ebuild'))
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
def test_junk_before_manifest_load(self):
m = gemato.manifest.ManifestFile()
@@ -295,6 +298,7 @@ class SignedManifestTest(unittest.TestCase):
os.path.join(d, 'Manifest'),
verify_openpgp=False)
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
finally:
shutil.rmtree(d)
@@ -329,6 +333,7 @@ class SignedManifestTest(unittest.TestCase):
os.path.join(d, 'Manifest'),
verify_openpgp=False)
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
m.save_manifest('Manifest')
with io.open(os.path.join(d, 'Manifest'), 'r') as f:
@@ -385,6 +390,10 @@ class OpenPGPCorrectKeyTest(unittest.TestCase):
self.assertIsNotNone(m.find_timestamp())
self.assertIsNotNone(m.find_path_entry('myebuild-0.ebuild'))
self.assertTrue(m.openpgp_signed)
+ self.assertEqual(m.openpgp_signature.fingerprint, KEY_FINGERPRINT)
+ self.assertEqual(m.openpgp_signature.timestamp, SIG_TIMESTAMP)
+ self.assertIsNone(m.openpgp_signature.expire_timestamp)
+ self.assertEqual(m.openpgp_signature.primary_key_fingerprint, KEY_FINGERPRINT)
def test_dash_escaped_manifest_load(self):
m = gemato.manifest.ManifestFile()
@@ -393,6 +402,10 @@ class OpenPGPCorrectKeyTest(unittest.TestCase):
self.assertIsNotNone(m.find_timestamp())
self.assertIsNotNone(m.find_path_entry('myebuild-0.ebuild'))
self.assertTrue(m.openpgp_signed)
+ self.assertEqual(m.openpgp_signature.fingerprint, KEY_FINGERPRINT)
+ self.assertEqual(m.openpgp_signature.timestamp, SIG_TIMESTAMP)
+ self.assertIsNone(m.openpgp_signature.expire_timestamp)
+ self.assertEqual(m.openpgp_signature.primary_key_fingerprint, KEY_FINGERPRINT)
def test_modified_manifest_load(self):
m = gemato.manifest.ManifestFile()
@@ -411,6 +424,10 @@ class OpenPGPCorrectKeyTest(unittest.TestCase):
verify_openpgp=True,
openpgp_env=self.env)
self.assertTrue(m.openpgp_signed)
+ self.assertEqual(m.openpgp_signature.fingerprint, KEY_FINGERPRINT)
+ self.assertEqual(m.openpgp_signature.timestamp, SIG_TIMESTAMP)
+ self.assertIsNone(m.openpgp_signature.expire_timestamp)
+ self.assertEqual(m.openpgp_signature.primary_key_fingerprint, KEY_FINGERPRINT)
finally:
shutil.rmtree(d)
@@ -426,6 +443,10 @@ class OpenPGPCorrectKeyTest(unittest.TestCase):
verify_openpgp=True,
openpgp_env=self.env)
self.assertTrue(m.openpgp_signed)
+ self.assertEqual(m.openpgp_signature.fingerprint, KEY_FINGERPRINT)
+ self.assertEqual(m.openpgp_signature.timestamp, SIG_TIMESTAMP)
+ self.assertIsNone(m.openpgp_signature.expire_timestamp)
+ self.assertEqual(m.openpgp_signature.primary_key_fingerprint, KEY_FINGERPRINT)
finally:
shutil.rmtree(d)
@@ -500,6 +521,7 @@ class OpenPGPNoKeyTest(unittest.TestCase):
self.assertIsNotNone(m.find_timestamp())
self.assertIsNotNone(m.find_path_entry('myebuild-0.ebuild'))
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
def test_recursive_manifest_loader(self):
d = tempfile.mkdtemp()
@@ -711,6 +733,7 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
f.seek(0)
m.load(f, openpgp_env=self.env)
self.assertTrue(m.openpgp_signed)
+ self.assertIsNotNone(m.openpgp_signature)
def test_dump_signed_manifest_keyid(self):
m = gemato.manifest.ManifestFile()
@@ -721,17 +744,20 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
f.seek(0)
m.load(f, openpgp_env=self.env)
self.assertTrue(m.openpgp_signed)
+ self.assertIsNotNone(m.openpgp_signature)
def test_dump_force_signed_manifest(self):
m = gemato.manifest.ManifestFile()
with io.StringIO(SIGNED_MANIFEST) as f:
m.load(f, verify_openpgp=False, openpgp_env=self.env)
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
with io.StringIO() as f:
m.dump(f, sign_openpgp=True, openpgp_env=self.env)
f.seek(0)
m.load(f, openpgp_env=self.env)
self.assertTrue(m.openpgp_signed)
+ self.assertIsNotNone(m.openpgp_signature)
def test_dump_force_unsigned_manifest(self):
m = gemato.manifest.ManifestFile()
@@ -743,6 +769,7 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
f.seek(0)
m.load(f, openpgp_env=self.env)
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
def test_recursive_manifest_loader_save_manifest(self):
d = tempfile.mkdtemp()
@@ -761,6 +788,7 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
with io.open(os.path.join(d, 'Manifest'), 'r') as f:
m2.load(f, openpgp_env=self.env)
self.assertTrue(m2.openpgp_signed)
+ self.assertIsNotNone(m.openpgp_signature)
finally:
shutil.rmtree(d)
@@ -783,6 +811,7 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
os.path.join(d, 'Manifest.gz'), 'r') as cf:
m2.load(cf, openpgp_env=self.env)
self.assertTrue(m2.openpgp_signed)
+ self.assertIsNotNone(m.openpgp_signature)
finally:
shutil.rmtree(d)
@@ -798,12 +827,14 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
sign_openpgp=True,
openpgp_env=self.env)
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
m.save_manifest('Manifest')
m2 = gemato.manifest.ManifestFile()
with io.open(os.path.join(d, 'Manifest'), 'r') as f:
m2.load(f, openpgp_env=self.env)
self.assertTrue(m2.openpgp_signed)
+ self.assertIsNotNone(m2.openpgp_signature)
finally:
shutil.rmtree(d)
@@ -820,6 +851,7 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
sign_openpgp=True,
openpgp_env=self.env)
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
m.save_manifest('Manifest.gz')
m2 = gemato.manifest.ManifestFile()
@@ -827,6 +859,7 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
os.path.join(d, 'Manifest.gz'), 'r') as cf:
m2.load(cf, openpgp_env=self.env)
self.assertTrue(m2.openpgp_signed)
+ self.assertIsNotNone(m2.openpgp_signature)
finally:
shutil.rmtree(d)
@@ -848,6 +881,7 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
sign_openpgp=True,
openpgp_env=self.env)
self.assertFalse(m.openpgp_signed)
+ self.assertIsNone(m.openpgp_signature)
m.load_manifest('eclass/Manifest')
m.save_manifest('eclass/Manifest')
@@ -856,5 +890,6 @@ class OpenPGPPrivateKeyTest(unittest.TestCase):
with io.open(os.path.join(d, 'eclass/Manifest'), 'r') as f:
m2.load(f, openpgp_env=self.env)
self.assertFalse(m2.openpgp_signed)
+ self.assertIsNone(m2.openpgp_signature)
finally:
shutil.rmtree(d)