diff options
| -rw-r--r-- | src/mailman_pgp/pgp/inline.py | 14 | ||||
| -rw-r--r-- | src/mailman_pgp/pgp/mime.py | 8 | ||||
| -rw-r--r-- | src/mailman_pgp/pgp/tests/base.py | 2 | ||||
| -rw-r--r-- | src/mailman_pgp/pgp/wrapper.py | 9 |
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) |
