From 90207a39a44e9abd09257fca4dd5316d28abce2c Mon Sep 17 00:00:00 2001 From: Sean Whalen Date: Thu, 18 Oct 2018 09:51:30 -0400 Subject: [PATCH] 4.3.5 - Fix base64 attachment decoding (#26) --- CHANGELOG.md | 5 +++++ parsedmarc/__version__.py | 2 +- parsedmarc/utils.py | 20 +++++++++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9eb9ce4..14fb717 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +4.3.5 +----- + +- Fix base64 attachment decoding (#26) + 4.3.4 ----- diff --git a/parsedmarc/__version__.py b/parsedmarc/__version__.py index f401c5a..648f1fe 100644 --- a/parsedmarc/__version__.py +++ b/parsedmarc/__version__.py @@ -2,7 +2,7 @@ import platform -__version__ = "4.3.4" +__version__ = "4.3.5" USER_AGENT = "Mozilla/5.0 ((0 {1})) parsedmarc/{2}".format( platform.system(), diff --git a/parsedmarc/utils.py b/parsedmarc/utils.py index 2221e57..6433594 100644 --- a/parsedmarc/utils.py +++ b/parsedmarc/utils.py @@ -34,6 +34,24 @@ class EmailParserError(RuntimeError): """Raised when an error parsing the email occurs""" +def decode_base64(data): + """ + Decodes a base64 string, with padding being optional + + Args: + data: A base64 encoded string + + Returns: + bytes: The decoded bytes + + """ + data = str(data) + missing_padding = len(data) % 4 + if missing_padding != 0: + data += b'=' * (4 - missing_padding) + return base64.b64decode(data) + + def get_base_domain(domain): """ Gets the base domain name for the given domain @@ -458,7 +476,7 @@ def parse_email(data, strip_attachment_payloads=False): payload = attachment["payload"] if "content_transfer_encoding" in attachment: if attachment["content_transfer_encoding"] == "base64": - payload = base64.b64decode(payload) + payload = decode_base64(payload) else: payload = str.encode(payload) attachment["sha256"] = hashlib.sha256(payload).hexdigest()