aboutsummaryrefslogtreecommitdiff
path: root/src/mailman_pgp
diff options
context:
space:
mode:
authorJ08nY2017-07-28 18:17:36 +0200
committerJ08nY2017-07-28 18:17:36 +0200
commited532b89899d8b67ffcfd266e883f1acafa225c7 (patch)
treebbf23012e8a3787cda33137a3bbb33873ee94221 /src/mailman_pgp
parentebc8b78480a039e71d6eb1578046754f78bd8fab (diff)
downloadmailman-pgp-ed532b89899d8b67ffcfd266e883f1acafa225c7.tar.gz
mailman-pgp-ed532b89899d8b67ffcfd266e883f1acafa225c7.tar.zst
mailman-pgp-ed532b89899d8b67ffcfd266e883f1acafa225c7.zip
Diffstat (limited to 'src/mailman_pgp')
-rw-r--r--src/mailman_pgp/pgp/inline.py2
-rw-r--r--src/mailman_pgp/pgp/wrapper.py54
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()