summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2017-07-06 17:33:34 +0200
committerJ08nY2017-07-06 17:33:34 +0200
commitbb76f8a84d94fb9d19ad96e7fb9c640dea9a982f (patch)
tree6910b318673d4381adceceef8082f3e2f18906a9 /src
parente224ef8e73c1626b0848a2c05a014cd30dd7b250 (diff)
downloadmailman-pgp-bb76f8a84d94fb9d19ad96e7fb9c640dea9a982f.tar.gz
mailman-pgp-bb76f8a84d94fb9d19ad96e7fb9c640dea9a982f.tar.zst
mailman-pgp-bb76f8a84d94fb9d19ad96e7fb9c640dea9a982f.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman_pgp/pgp/inline.py14
-rw-r--r--src/mailman_pgp/pgp/mime.py8
-rw-r--r--src/mailman_pgp/pgp/tests/base.py2
-rw-r--r--src/mailman_pgp/pgp/wrapper.py9
4 files changed, 32 insertions, 1 deletions
diff --git a/src/mailman_pgp/pgp/inline.py b/src/mailman_pgp/pgp/inline.py
index 3cd2aa1..9c19030 100644
--- a/src/mailman_pgp/pgp/inline.py
+++ b/src/mailman_pgp/pgp/inline.py
@@ -38,6 +38,11 @@ class InlineWrapper:
"""
self.msg = msg
+ def get_payload(self):
+ for part in walk(self.msg):
+ if not part.is_multipart():
+ yield part.get_payload()
+
def _walk(self, walk_fn, *args, **kwargs):
for part in walk(self.msg):
if not part.is_multipart():
@@ -69,6 +74,15 @@ class InlineWrapper:
"""
return any(self._walk(self._is_signed))
+ def get_signed(self):
+ for part in walk(self.msg):
+ if not part.is_multipart() and self._is_signed(part):
+ try:
+ msg = PGPMessage.from_blob(part.get_payload()).message
+ except:
+ continue
+ yield msg
+
def _is_encrypted(self, part):
try:
msg = PGPMessage.from_blob(part.get_payload())
diff --git a/src/mailman_pgp/pgp/mime.py b/src/mailman_pgp/pgp/mime.py
index 81208bd..afb1c35 100644
--- a/src/mailman_pgp/pgp/mime.py
+++ b/src/mailman_pgp/pgp/mime.py
@@ -57,6 +57,9 @@ class MIMEWrapper:
"""
self.msg = msg
+ def get_payload(self):
+ yield self.msg.as_string()
+
def _is_mime(self):
is_multipart = self.msg.is_multipart()
payloads = len(self.msg.get_payload())
@@ -83,6 +86,9 @@ class MIMEWrapper:
def has_signature(self):
return self.is_signed()
+ def get_signed(self):
+ yield self.msg.get_payload(0).as_string(0)
+
def is_encrypted(self):
"""
Whether the whole message is MIME encrypted as per RFC3156 section 4.
@@ -275,7 +281,7 @@ class MIMEWrapper:
payload = self.msg.as_string()
pmsg = PGPMessage.new(payload)
pmsg = self._encrypt(pmsg, *keys, cipher=cipher)
- out = self._wrap_encrypted(pmsg)
+ out = self._wrap_encrypted(pmsg)
copy_headers(self.msg, out)
return out
diff --git a/src/mailman_pgp/pgp/tests/base.py b/src/mailman_pgp/pgp/tests/base.py
index 4b1e0c2..2f8d406 100644
--- a/src/mailman_pgp/pgp/tests/base.py
+++ b/src/mailman_pgp/pgp/tests/base.py
@@ -116,3 +116,5 @@ class WrapperTestCase(TestCase):
verification = decrypted_wrapped.verify(sign_key.pubkey)
for sig in verification:
self.assertTrue(bool(sig))
+ self.assertListEqual(list(decrypted_wrapped.get_signed()),
+ list(wrapped.get_payload()))
diff --git a/src/mailman_pgp/pgp/wrapper.py b/src/mailman_pgp/pgp/wrapper.py
index b562d0f..fcbec0e 100644
--- a/src/mailman_pgp/pgp/wrapper.py
+++ b/src/mailman_pgp/pgp/wrapper.py
@@ -47,12 +47,21 @@ class PGPWrapper():
MIMEWrapper.__name__ + ' ' +
InlineWrapper.__name__ + '.')
+ def get_payload(self):
+ return self.default.get_payload()
+
def is_signed(self):
return self.mime.is_signed() or self.inline.is_signed()
def has_signature(self):
return self.mime.has_signature() or self.inline.has_signature()
+ def get_signed(self):
+ if self.mime.is_signed():
+ yield from self.mime.get_signed()
+ elif self.inline.is_signed():
+ yield from self.inline.get_signed()
+
def sign(self, key, **kwargs):
return self.default.sign(key, **kwargs)