summaryrefslogtreecommitdiff
path: root/email-print-mime-structure
diff options
context:
space:
mode:
Diffstat (limited to 'email-print-mime-structure')
-rwxr-xr-xemail-print-mime-structure31
1 files changed, 19 insertions, 12 deletions
diff --git a/email-print-mime-structure b/email-print-mime-structure
index 6c68eb3..d152b34 100755
--- a/email-print-mime-structure
+++ b/email-print-mime-structure
@@ -32,6 +32,7 @@ something like "cat -n"
'''
import os
import sys
+import enum
import email
import logging
import subprocess
@@ -51,6 +52,8 @@ try:
except ImportError:
argcomplete = None
+EncType = enum.Enum('EncType', ['PGPMIME', 'SMIME'])
+
class MimePrinter(object):
def __init__(self, args:Namespace):
self.args = args
@@ -79,7 +82,6 @@ class MimePrinter(object):
print(f'{prefix}{z.get_content_type()}{cset}{disposition}{fname} {nbytes:d} bytes')
cryptopayload:Optional[Message] = None
- ciphertext:Union[List[Message],str,bytes,None] = None
try_pgp_decrypt:bool = self.args.pgpkey or self.args.use_gpg_agent
if try_pgp_decrypt and \
@@ -87,23 +89,28 @@ class MimePrinter(object):
(parent.get_content_type().lower() == 'multipart/encrypted') and \
(str(parent.get_param('protocol')).lower() == 'application/pgp-encrypted') and \
(num == 2):
- ciphertext = z.get_payload(decode=True)
- if not isinstance(ciphertext, bytes):
- logging.warning('encrypted part was not a leaf mime part somehow')
- return
- if self.args.pgpkey:
- cryptopayload = self.pgpy_decrypt(self.args.pgpkey, ciphertext)
- if cryptopayload is None and self.args.use_gpg_agent:
- cryptopayload = self.pipe_decrypt(ciphertext, ['gpg', '--batch', '--decrypt'])
- if cryptopayload is None:
- logging.warning(f'Unable to decrypt')
- return
+ cryptopayload = self.decrypt_part(z, EncType.PGPMIME)
if cryptopayload is not None:
newprefix = prefix[:-3] + ' '
print(f'{newprefix}↧ (decrypts to)')
self.print_tree(cryptopayload, newprefix + '└', z, 0)
+ def decrypt_part(self, msg:Message, flavor:EncType) -> Optional[Message]:
+ ciphertext:Union[List[Message],str,bytes,None] = msg.get_payload(decode=True)
+ cryptopayload:Optional[Message] = None
+ if not isinstance(ciphertext, bytes):
+ logging.warning('encrypted part was not a leaf mime part somehow')
+ return None
+ if flavor == EncType.PGPMIME:
+ if self.args.pgpkey:
+ cryptopayload = self.pgpy_decrypt(self.args.pgpkey, ciphertext)
+ if cryptopayload is None and self.args.use_gpg_agent:
+ cryptopayload = self.pipe_decrypt(ciphertext, ['gpg', '--batch', '--decrypt'])
+ if cryptopayload is None:
+ logging.warning(f'Unable to decrypt')
+ return cryptopayload
+
def pgpy_decrypt(self, keys:List[str], ciphertext:bytes) -> Optional[Message]:
if pgpy is None:
logging.warning(f'Python module pgpy is not available, not decrypting (try "apt install python3-pgpy")')