From cc315d00e1fab5f59c3b061639699787189db4d6 Mon Sep 17 00:00:00 2001 From: Sean Whalen Date: Mon, 28 Jan 2019 10:18:19 -0500 Subject: [PATCH 1/2] Rase proper exception on invalid forensic report emails Issue #47 --- parsedmarc/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parsedmarc/__init__.py b/parsedmarc/__init__.py index 4bdefff..9d0aee8 100644 --- a/parsedmarc/__init__.py +++ b/parsedmarc/__init__.py @@ -723,7 +723,7 @@ def parse_report_email(input_, nameservers=None, timeout=2.0, timeout=timeout, strip_attachment_payloads=strip_attachment_payloads) except Exception as e: - raise ParserError(e.__str__()) + raise InvalidForensicReport(e.__str__()) result = OrderedDict([("report_type", "forensic"), ("report", forensic_report)]) From 1ba1bc95431ac12918eb5fb2e892b58e01248c85 Mon Sep 17 00:00:00 2001 From: Sean Whalen <44679+seanthegeek@users.noreply.github.com> Date: Mon, 28 Jan 2019 18:19:07 -0500 Subject: [PATCH 2/2] 5.3.0 - Closses issue #45 and issue #57 --- CHANGELOG.md | 6 ++++++ parsedmarc/__init__.py | 37 +++++++++++++++++++++---------------- setup.py | 2 +- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 084f7c0..979913c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +5.3.0 +----- + +- Fix crash on invalid forensic report sample (Issue #47) +- Fix DavMail support (Issue #45) + 5.2.1 ----- diff --git a/parsedmarc/__init__.py b/parsedmarc/__init__.py index 9d0aee8..3c88534 100644 --- a/parsedmarc/__init__.py +++ b/parsedmarc/__init__.py @@ -38,7 +38,7 @@ from parsedmarc.utils import is_outlook_msg, convert_outlook_msg from parsedmarc.utils import timestamp_to_human, human_timestamp_to_datetime from parsedmarc.utils import parse_email -__version__ = "5.2.1" +__version__ = "5.3.0" logging.basicConfig( format='%(levelname)8s:%(filename)s:%(lineno)d:' @@ -975,18 +975,23 @@ def get_dmarc_reports_from_inbox(host=None, logger.debug("Found {0} messages in IMAP folder {1}".format( len(messages), reports_folder)) for i in range(len(messages)): - message_uid = messages[i] + msg_uid = messages[i] logger.debug("Processing message {0} of {1}: UID {2}".format( i+1, total_messages, - message_uid + msg_uid )) try: try: - raw_msg = server.fetch(message_uid, - ["RFC822"]) - logging.debug(raw_msg.keys()) - raw_msg = raw_msg[message_uid][b"RFC822"] + raw_msg = server.fetch(msg_uid, + ["RFC822"])[msg_uid] + msg_keys = [b'RFC822', b'BODY[NULL]'] + msg_key = '' + for key in msg_keys: + if key in raw_msg.keys(): + msg_key = key + break + raw_msg = raw_msg[msg_key] except (ConnectionResetError, socket.error, TimeoutError) as error: @@ -1006,8 +1011,8 @@ def get_dmarc_reports_from_inbox(host=None, use_uid=True) server.login(user, password) server.select_folder(reports_folder) - raw_msg = server.fetch(message_uid, - ["RFC822"])[message_uid][b"RFC822"] + raw_msg = server.fetch(msg_uid, + ["RFC822"])[msg_uid][b"RFC822"] msg_content = raw_msg.decode("utf-8", errors="replace") sa = strip_attachment_payloads @@ -1017,28 +1022,28 @@ def get_dmarc_reports_from_inbox(host=None, strip_attachment_payloads=sa) if parsed_email["report_type"] == "aggregate": aggregate_reports.append(parsed_email["report"]) - aggregate_report_msg_uids.append(message_uid) + aggregate_report_msg_uids.append(msg_uid) elif parsed_email["report_type"] == "forensic": forensic_reports.append(parsed_email["report"]) - forensic_report_msg_uids.append(message_uid) + forensic_report_msg_uids.append(msg_uid) except imapclient.exceptions.IMAPClientError as error: error = error.__str__().lstrip("b'").rstrip("'").rstrip(".") error = "IMAP error: Skipping message UID {0}: {1}".format( - message_uid, error) + msg_uid, error) logger.error("IMAP error: {0}".format(error)) except InvalidDMARCReport as error: logger.warning(error.__str__()) if not test: if delete: logger.debug( - "Deleting message UID {0}".format(message_uid)) - delete_messages([message_uid]) + "Deleting message UID {0}".format(msg_uid)) + delete_messages([msg_uid]) else: logger.debug( "Moving message UID {0} to {1}".format( - message_uid, invalid_reports_folder)) - move_messages([message_uid], invalid_reports_folder) + msg_uid, invalid_reports_folder)) + move_messages([msg_uid], invalid_reports_folder) if not test: if delete: diff --git a/setup.py b/setup.py index 255bfff..6845390 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ from setuptools import setup from codecs import open from os import path -__version__ = "5.2.1" +__version__ = "5.3.0" description = "A Python package and CLI for parsing aggregate and " \ "forensic DMARC reports"