diff options
| author | J08nY | 2017-07-28 18:17:36 +0200 |
|---|---|---|
| committer | J08nY | 2017-07-28 18:17:36 +0200 |
| commit | ed532b89899d8b67ffcfd266e883f1acafa225c7 (patch) | |
| tree | bbf23012e8a3787cda33137a3bbb33873ee94221 /src | |
| parent | ebc8b78480a039e71d6eb1578046754f78bd8fab (diff) | |
| download | mailman-pgp-ed532b89899d8b67ffcfd266e883f1acafa225c7.tar.gz mailman-pgp-ed532b89899d8b67ffcfd266e883f1acafa225c7.tar.zst mailman-pgp-ed532b89899d8b67ffcfd266e883f1acafa225c7.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman_pgp/pgp/inline.py | 2 | ||||
| -rw-r--r-- | src/mailman_pgp/pgp/wrapper.py | 54 |
2 files changed, 43 insertions, 13 deletions
diff --git a/src/mailman_pgp/pgp/inline.py b/src/mailman_pgp/pgp/inline.py index c93d801..bb0971d 100644 --- a/src/mailman_pgp/pgp/inline.py +++ b/src/mailman_pgp/pgp/inline.py @@ -318,7 +318,5 @@ class InlineWrapper: def sign_then_encrypt(self, key, *keys, hash=None, cipher=SymmetricKeyAlgorithm.AES256, **kwargs): - # TODO: sign into cleartext here and then encrypt? I mean that's weird - # but thats what sing *then* encrypt means for inline pgp. return self.sign_encrypt(key, *keys, hash=hash, cipher=cipher, **kwargs) diff --git a/src/mailman_pgp/pgp/wrapper.py b/src/mailman_pgp/pgp/wrapper.py index 59f0fdd..42b51b9 100644 --- a/src/mailman_pgp/pgp/wrapper.py +++ b/src/mailman_pgp/pgp/wrapper.py @@ -15,11 +15,14 @@ # this program. If not, see <http://www.gnu.org/licenses/>. """A combined PGP/MIME + inline PGP wrapper.""" +import copy +from pgpy.errors import PGPError from public import public from mailman_pgp.pgp.inline import InlineWrapper from mailman_pgp.pgp.mime import MIMEWrapper +from mailman_pgp.pgp.mime_multisig import MIMEMultiSigWrapper from mailman_pgp.utils.pgp import verifies @@ -34,18 +37,23 @@ class PGPWrapper(): :param msg: The message to wrap. :type msg: mailman.email.message.Message :param default: - :type default: MIMEWrapper or InlineWrapper + :type default: MIMEWrapper|MIMEMultiSigWrapper|InlineWrapper """ self.msg = msg self.mime = MIMEWrapper(msg) self.inline = InlineWrapper(msg) + self.multisig = MIMEMultiSigWrapper(msg) + self.wrappers = (self.mime, self.inline, self.multisig) if default is MIMEWrapper: self.default = self.mime + elif default is MIMEMultiSigWrapper: + self.default = self.multisig elif default is InlineWrapper: self.default = self.inline else: raise ValueError('Default wrapper must be one of ' + MIMEWrapper.__name__ + ' ' + + MIMEMultiSigWrapper.__name__ + ' ' + InlineWrapper.__name__ + '.') def get_payload(self): @@ -58,7 +66,7 @@ class PGPWrapper(): :return: If the message is signed. :rtype: bool """ - return self.mime.is_signed() or self.inline.is_signed() + return any(wrapper.is_signed() for wrapper in self.wrappers) def has_signature(self): """ @@ -67,17 +75,19 @@ class PGPWrapper(): :return: If some parts of the message are signed. :rtype: bool """ - return self.mime.has_signature() or self.inline.has_signature() + return any(wrapper.has_signature() for wrapper in self.wrappers) def get_signed(self): """ Get the signed content of the message. :return: The signed contents of the message. - :rtype: Generator[str] + :rtype: typing.Generator[str] """ if self.mime.is_signed(): yield from self.mime.get_signed() + elif self.multisig.is_signed(): + yield from self.multisig.get_signed() elif self.inline.is_signed(): yield from self.inline.get_signed() @@ -90,6 +100,8 @@ class PGPWrapper(): """ if self.mime.is_signed(): yield from self.mime.get_signature() + elif self.multisig.is_signed(): + yield from self.multisig.get_signature() elif self.inline.is_signed(): yield from self.inline.get_signature() @@ -113,10 +125,12 @@ class PGPWrapper(): :param key: The key to verify with. :type key: pgpy.PGPKey :return: The verified signatures. - :rtype: Generator[pgpy.types.SignatureVerification] + :rtype: typing.Generator[pgpy.types.SignatureVerification] """ if self.mime.is_signed(): yield from self.mime.verify(key) + elif self.multisig.is_signed(): + yield from self.multisig.verify(key) elif self.inline.is_signed(): yield from self.inline.verify(key) @@ -130,7 +144,7 @@ class PGPWrapper(): :return: If the message is encrypted. :rtype: bool """ - return self.mime.is_encrypted() or self.inline.is_encrypted() + return any(wrapper.is_encrypted() for wrapper in self.wrappers) def has_encryption(self): """ @@ -139,7 +153,7 @@ class PGPWrapper(): :return: If some parts of the message are encrypted. :rtype: bool """ - return self.mime.has_encryption() or self.inline.has_encryption() + return any(wrapper.has_encryption() for wrapper in self.wrappers) def get_encrypted(self): """ @@ -147,9 +161,11 @@ class PGPWrapper(): :return: :rtype: typing.Generator[pgpy.PGPMessage] """ - if self.mime.is_signed(): + if self.mime.is_encrypted(): yield from self.mime.get_encrypted() - elif self.inline.is_signed(): + elif self.multisig.is_encrypted(): + yield from self.mime.get_encrypted() + elif self.inline.is_encrypted(): yield from self.inline.get_encrypted() def encrypt(self, *keys, **kwargs): @@ -176,9 +192,23 @@ class PGPWrapper(): """ if self.mime.is_encrypted(): return self.mime.decrypt(key) + elif self.multisig.is_encrypted(): + return self.multisig.decrypt(key) elif self.inline.is_encrypted(): return self.inline.decrypt(key) + def try_decrypt(self, key): + """ + + :param key: + :return: + :rtype: mailman.email.message.Message + """ + try: + return self.decrypt(key) + except PGPError: + return copy.deepcopy(self.msg) + def sign_encrypt(self, key, *keys, **kwargs): """ Sign and encrypt the message, in one go. @@ -220,7 +250,7 @@ class PGPWrapper(): :return: If the message is keys. :rtype: bool """ - return self.mime.is_keys() or self.inline.is_keys() + return any(wrapper.is_keys() for wrapper in self.wrappers) def has_keys(self): """ @@ -229,7 +259,7 @@ class PGPWrapper(): :return: If the message contains keys. :rtype: bool """ - return self.mime.has_keys() or self.inline.has_keys() + return any(wrapper.has_keys() for wrapper in self.wrappers) def keys(self): """ @@ -240,5 +270,7 @@ class PGPWrapper(): """ if self.mime.has_keys(): yield from self.mime.keys() + elif self.multisig.has_keys(): + yield from self.multisig.keys() elif self.inline.has_keys(): yield from self.inline.keys() |
