diff --git a/parsedmarc/__init__.py b/parsedmarc/__init__.py index fd3dc9c..c8f5ad9 100644 --- a/parsedmarc/__init__.py +++ b/parsedmarc/__init__.py @@ -272,7 +272,7 @@ def _parse_smtp_tls_failure_details(failure_details): return new_failure_details except KeyError as e: - raise InvalidSMTPTLSReport(f"Missing required failure details field:" f" {e}") + raise InvalidSMTPTLSReport(f"Missing required failure details field: {e}") except Exception as e: raise InvalidSMTPTLSReport(str(e)) @@ -284,7 +284,7 @@ def _parse_smtp_tls_report_policy(policy): policy_type = policy["policy"]["policy-type"] failure_details = [] if policy_type not in policy_types: - raise InvalidSMTPTLSReport(f"Invalid policy type " f"{policy_type}") + raise InvalidSMTPTLSReport(f"Invalid policy type {policy_type}") new_policy = OrderedDict(policy_domain=policy_domain, policy_type=policy_type) if "policy-string" in policy["policy"]: if isinstance(policy["policy"]["policy-string"], list): @@ -332,9 +332,7 @@ def parse_smtp_tls_report_json(report): raise Exception(f"Missing required field: {required_field}]") if not isinstance(report["policies"], list): policies_type = type(report["policies"]) - raise InvalidSMTPTLSReport( - f"policies must be a list, " f"not {policies_type}" - ) + raise InvalidSMTPTLSReport(f"policies must be a list, not {policies_type}") for policy in report["policies"]: policies.append(_parse_smtp_tls_report_policy(policy)) @@ -1246,11 +1244,11 @@ def parse_report_email( field_name = match[0].lower().replace(" ", "-") fields[field_name] = match[1].strip() - feedback_report = "Arrival-Date: {}\n" "Source-IP: {}" "".format( + feedback_report = "Arrival-Date: {}\nSource-IP: {}".format( fields["received-date"], fields["sender-ip-address"] ) except Exception as e: - error = "Unable to parse message with " 'subject "{0}": {1}'.format( + error = 'Unable to parse message with subject "{0}": {1}'.format( subject, e ) raise InvalidDMARCReport(error) @@ -1297,7 +1295,7 @@ def parse_report_email( raise InvalidDMARCReport(error) except Exception as e: - error = "Unable to parse message with " 'subject "{0}": {1}'.format( + error = 'Unable to parse message with subject "{0}": {1}'.format( subject, e ) raise ParserError(error) @@ -1331,7 +1329,7 @@ def parse_report_email( return result if result is None: - error = 'Message with subject "{0}" is ' "not a valid report".format(subject) + error = 'Message with subject "{0}" is not a valid report'.format(subject) raise InvalidDMARCReport(error) @@ -1666,7 +1664,7 @@ def get_dmarc_reports_from_mailbox( aggregate_reports.append(parsed_email["report"]) else: logger.debug( - "Skipping duplicate aggregate report " f"with ID: {report_id}" + f"Skipping duplicate aggregate report with ID: {report_id}" ) aggregate_report_msg_uids.append(msg_uid) elif parsed_email["report_type"] == "forensic": @@ -1708,7 +1706,7 @@ def get_dmarc_reports_from_mailbox( except Exception as e: message = "Error deleting message UID" - e = "{0} {1}: " "{2}".format(message, msg_uid, e) + e = "{0} {1}: {2}".format(message, msg_uid, e) logger.error("Mailbox error: {0}".format(e)) else: if len(aggregate_report_msg_uids) > 0: diff --git a/parsedmarc/cli.py b/parsedmarc/cli.py index a0e6423..dbf0acd 100644 --- a/parsedmarc/cli.py +++ b/parsedmarc/cli.py @@ -49,7 +49,7 @@ from parsedmarc.log import logger from parsedmarc.utils import is_mbox, get_reverse_dns from parsedmarc import SEEN_AGGREGATE_REPORT_IDS -http.client._MAXHEADERS = 200 # pylint:disable=protected-access +http.client._MAXHEADERS = 200 # pylint:disable=protected-access formatter = logging.Formatter( fmt="%(levelname)8s:%(filename)s:%(lineno)d:%(message)s", @@ -399,7 +399,7 @@ def _main(): arg_parser.add_argument( "-c", "--config-file", - help="a path to a configuration file " "(--silent implied)", + help="a path to a configuration file (--silent implied)", ) arg_parser.add_argument( "file_path", @@ -407,7 +407,7 @@ def _main(): help="one or more paths to aggregate or forensic " "report files, emails, or mbox files'", ) - strip_attachment_help = "remove attachment payloads from forensic " "report output" + strip_attachment_help = "remove attachment payloads from forensic report output" arg_parser.add_argument( "--strip-attachment-payloads", help=strip_attachment_help, action="store_true" ) @@ -450,14 +450,14 @@ def _main(): arg_parser.add_argument( "-t", "--dns_timeout", - help="number of seconds to wait for an answer " "from DNS (default: 2.0)", + help="number of seconds to wait for an answer from DNS (default: 2.0)", type=float, default=2.0, ) arg_parser.add_argument( "--offline", action="store_true", - help="do not make online queries for geolocation " " or DNS", + help="do not make online queries for geolocation or DNS", ) arg_parser.add_argument( "-s", "--silent", action="store_true", help="only print errors" @@ -734,7 +734,7 @@ def _main(): if "host" in imap_config: opts.imap_host = imap_config["host"] else: - logger.error("host setting missing from the " "imap config section") + logger.error("host setting missing from the imap config section") exit(-1) if "port" in imap_config: opts.imap_port = imap_config.getint("port") @@ -750,14 +750,12 @@ def _main(): if "user" in imap_config: opts.imap_user = imap_config["user"] else: - logger.critical("user setting missing from the " "imap config section") + logger.critical("user setting missing from the imap config section") exit(-1) if "password" in imap_config: opts.imap_password = imap_config["password"] else: - logger.critical( - "password setting missing from the " "imap config section" - ) + logger.critical("password setting missing from the imap config section") exit(-1) if "reports_folder" in imap_config: opts.mailbox_reports_folder = imap_config["reports_folder"] @@ -826,21 +824,20 @@ def _main(): opts.graph_user = graph_config["user"] else: logger.critical( - "user setting missing from the " "msgraph config section" + "user setting missing from the msgraph config section" ) exit(-1) if "password" in graph_config: opts.graph_password = graph_config["password"] else: logger.critical( - "password setting missing from the " "msgraph config section" + "password setting missing from the msgraph config section" ) if "client_secret" in graph_config: opts.graph_client_secret = graph_config["client_secret"] else: logger.critical( - "client_secret setting missing from the " - "msgraph config section" + "client_secret setting missing from the msgraph config section" ) exit(-1) @@ -853,7 +850,7 @@ def _main(): opts.graph_tenant_id = graph_config["tenant_id"] else: logger.critical( - "tenant_id setting missing from the " "msgraph config section" + "tenant_id setting missing from the msgraph config section" ) exit(-1) @@ -862,8 +859,7 @@ def _main(): opts.graph_client_secret = graph_config["client_secret"] else: logger.critical( - "client_secret setting missing from the " - "msgraph config section" + "client_secret setting missing from the msgraph config section" ) exit(-1) @@ -871,7 +867,7 @@ def _main(): opts.graph_client_id = graph_config["client_id"] else: logger.critical( - "client_id setting missing from the " "msgraph config section" + "client_id setting missing from the msgraph config section" ) exit(-1) @@ -879,7 +875,7 @@ def _main(): opts.graph_mailbox = graph_config["mailbox"] elif opts.graph_auth_method != AuthMethod.UsernamePassword.name: logger.critical( - "mailbox setting missing from the " "msgraph config section" + "mailbox setting missing from the msgraph config section" ) exit(-1) @@ -897,7 +893,7 @@ def _main(): opts.elasticsearch_hosts = _str_to_list(elasticsearch_config["hosts"]) else: logger.critical( - "hosts setting missing from the " "elasticsearch config section" + "hosts setting missing from the elasticsearch config section" ) exit(-1) if "timeout" in elasticsearch_config: @@ -935,7 +931,7 @@ def _main(): opts.opensearch_hosts = _str_to_list(opensearch_config["hosts"]) else: logger.critical( - "hosts setting missing from the " "opensearch config section" + "hosts setting missing from the opensearch config section" ) exit(-1) if "timeout" in opensearch_config: @@ -971,21 +967,21 @@ def _main(): opts.hec = hec_config["url"] else: logger.critical( - "url setting missing from the " "splunk_hec config section" + "url setting missing from the splunk_hec config section" ) exit(-1) if "token" in hec_config: opts.hec_token = hec_config["token"] else: logger.critical( - "token setting missing from the " "splunk_hec config section" + "token setting missing from the splunk_hec config section" ) exit(-1) if "index" in hec_config: opts.hec_index = hec_config["index"] else: logger.critical( - "index setting missing from the " "splunk_hec config section" + "index setting missing from the splunk_hec config section" ) exit(-1) if "skip_certificate_verification" in hec_config: @@ -998,9 +994,7 @@ def _main(): if "hosts" in kafka_config: opts.kafka_hosts = _str_to_list(kafka_config["hosts"]) else: - logger.critical( - "hosts setting missing from the " "kafka config section" - ) + logger.critical("hosts setting missing from the kafka config section") exit(-1) if "user" in kafka_config: opts.kafka_username = kafka_config["user"] @@ -1015,21 +1009,20 @@ def _main(): opts.kafka_aggregate_topic = kafka_config["aggregate_topic"] else: logger.critical( - "aggregate_topic setting missing from the " "kafka config section" + "aggregate_topic setting missing from the kafka config section" ) exit(-1) if "forensic_topic" in kafka_config: opts.kafka_forensic_topic = kafka_config["forensic_topic"] else: logger.critical( - "forensic_topic setting missing from the " "kafka config section" + "forensic_topic setting missing from the kafka config section" ) if "smtp_tls_topic" in kafka_config: opts.kafka_smtp_tls_topic = kafka_config["smtp_tls_topic"] else: logger.critical( - "forensic_topic setting missing from the " - "splunk_hec config section" + "forensic_topic setting missing from the splunk_hec config section" ) if "smtp" in config.sections(): @@ -1037,7 +1030,7 @@ def _main(): if "host" in smtp_config: opts.smtp_host = smtp_config["host"] else: - logger.critical("host setting missing from the " "smtp config section") + logger.critical("host setting missing from the smtp config section") exit(-1) if "port" in smtp_config: opts.smtp_port = smtp_config.getint("port") @@ -1049,23 +1042,21 @@ def _main(): if "user" in smtp_config: opts.smtp_user = smtp_config["user"] else: - logger.critical("user setting missing from the " "smtp config section") + logger.critical("user setting missing from the smtp config section") exit(-1) if "password" in smtp_config: opts.smtp_password = smtp_config["password"] else: - logger.critical( - "password setting missing from the " "smtp config section" - ) + logger.critical("password setting missing from the smtp config section") exit(-1) if "from" in smtp_config: opts.smtp_from = smtp_config["from"] else: - logger.critical("from setting missing from the " "smtp config section") + logger.critical("from setting missing from the smtp config section") if "to" in smtp_config: opts.smtp_to = _str_to_list(smtp_config["to"]) else: - logger.critical("to setting missing from the " "smtp config section") + logger.critical("to setting missing from the smtp config section") if "subject" in smtp_config: opts.smtp_subject = smtp_config["subject"] if "attachment" in smtp_config: @@ -1078,7 +1069,7 @@ def _main(): if "bucket" in s3_config: opts.s3_bucket = s3_config["bucket"] else: - logger.critical("bucket setting missing from the " "s3 config section") + logger.critical("bucket setting missing from the s3 config section") exit(-1) if "path" in s3_config: opts.s3_path = s3_config["path"] @@ -1103,9 +1094,7 @@ def _main(): if "server" in syslog_config: opts.syslog_server = syslog_config["server"] else: - logger.critical( - "server setting missing from the " "syslog config section" - ) + logger.critical("server setting missing from the syslog config section") exit(-1) if "port" in syslog_config: opts.syslog_port = syslog_config["port"] @@ -1156,17 +1145,17 @@ def _main(): if "host" in gelf_config: opts.gelf_host = gelf_config["host"] else: - logger.critical("host setting missing from the " "gelf config section") + logger.critical("host setting missing from the gelf config section") exit(-1) if "port" in gelf_config: opts.gelf_port = gelf_config["port"] else: - logger.critical("port setting missing from the " "gelf config section") + logger.critical("port setting missing from the gelf config section") exit(-1) if "mode" in gelf_config: opts.gelf_mode = gelf_config["mode"] else: - logger.critical("mode setting missing from the " "gelf config section") + logger.critical("mode setting missing from the gelf config section") exit(-1) if "webhook" in config.sections(): @@ -1192,8 +1181,7 @@ def _main(): try: fh = logging.FileHandler(opts.log_file, "a") formatter = logging.Formatter( - "%(asctime)s - " - "%(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" + "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" ) fh.setFormatter(formatter) logger.addHandler(fh) @@ -1301,7 +1289,7 @@ def _main(): if opts.hec: if opts.hec_token is None or opts.hec_index is None: - logger.error("HEC token and HEC index are required when " "using HEC URL") + logger.error("HEC token and HEC index are required when using HEC URL") exit(1) verify = True @@ -1464,7 +1452,7 @@ def _main(): try: if opts.imap_user is None or opts.imap_password is None: logger.error( - "IMAP user and password must be specified if" "host is specified" + "IMAP user and password must be specified ifhost is specified" ) ssl = True diff --git a/parsedmarc/mail/gmail.py b/parsedmarc/mail/gmail.py index f9163db..e25b20b 100644 --- a/parsedmarc/mail/gmail.py +++ b/parsedmarc/mail/gmail.py @@ -63,9 +63,7 @@ class GmailConnection(MailboxConnection): ).execute() except HttpError as e: if e.status_code == 409: - logger.debug( - f"Folder {folder_name} already exists, " f"skipping creation" - ) + logger.debug(f"Folder {folder_name} already exists, skipping creation") else: raise e diff --git a/parsedmarc/mail/graph.py b/parsedmarc/mail/graph.py index 740aeb8..f18816d 100644 --- a/parsedmarc/mail/graph.py +++ b/parsedmarc/mail/graph.py @@ -141,16 +141,16 @@ class MSGraphConnection(MailboxConnection): request_url = f"/users/{self.mailbox_name}/mailFolders{sub_url}" resp = self._client.post(request_url, json=request_body) if resp.status_code == 409: - logger.debug(f"Folder {folder_name} already exists, " f"skipping creation") + logger.debug(f"Folder {folder_name} already exists, skipping creation") elif resp.status_code == 201: logger.debug(f"Created folder {folder_name}") else: - logger.warning(f"Unknown response " f"{resp.status_code} {resp.json()}") + logger.warning(f"Unknown response {resp.status_code} {resp.json()}") def fetch_messages(self, folder_name: str, **kwargs) -> List[str]: """Returns a list of message UIDs in the specified folder""" folder_id = self._find_folder_id_from_folder_path(folder_name) - url = f"/users/{self.mailbox_name}/mailFolders/" f"{folder_id}/messages" + url = f"/users/{self.mailbox_name}/mailFolders/{folder_id}/messages" since = kwargs.get("since") if not since: since = None @@ -189,7 +189,7 @@ class MSGraphConnection(MailboxConnection): resp = self._client.patch(url, json={"isRead": "true"}) if resp.status_code != 200: raise RuntimeWarning( - f"Failed to mark message read" f"{resp.status_code}: {resp.json()}" + f"Failed to mark message read{resp.status_code}: {resp.json()}" ) def fetch_message(self, message_id: str, **kwargs): @@ -197,7 +197,7 @@ class MSGraphConnection(MailboxConnection): result = self._client.get(url) if result.status_code != 200: raise RuntimeWarning( - f"Failed to fetch message" f"{result.status_code}: {result.json()}" + f"Failed to fetch message{result.status_code}: {result.json()}" ) mark_read = kwargs.get("mark_read") if mark_read: @@ -209,7 +209,7 @@ class MSGraphConnection(MailboxConnection): resp = self._client.delete(url) if resp.status_code != 204: raise RuntimeWarning( - f"Failed to delete message " f"{resp.status_code}: {resp.json()}" + f"Failed to delete message {resp.status_code}: {resp.json()}" ) def move_message(self, message_id: str, folder_name: str): @@ -219,7 +219,7 @@ class MSGraphConnection(MailboxConnection): resp = self._client.post(url, json=request_body) if resp.status_code != 201: raise RuntimeWarning( - f"Failed to move message " f"{resp.status_code}: {resp.json()}" + f"Failed to move message {resp.status_code}: {resp.json()}" ) def keepalive(self): @@ -254,7 +254,7 @@ class MSGraphConnection(MailboxConnection): filter = f"?$filter=displayName eq '{folder_name}'" folders_resp = self._client.get(url + filter) if folders_resp.status_code != 200: - raise RuntimeWarning(f"Failed to list folders." f"{folders_resp.json()}") + raise RuntimeWarning(f"Failed to list folders.{folders_resp.json()}") folders: list = folders_resp.json()["value"] matched_folders = [ folder for folder in folders if folder["displayName"] == folder_name diff --git a/parsedmarc/mail/imap.py b/parsedmarc/mail/imap.py index 11bdf9b..97f3954 100644 --- a/parsedmarc/mail/imap.py +++ b/parsedmarc/mail/imap.py @@ -85,7 +85,5 @@ class IMAPConnection(MailboxConnection): logger.warning("IMAP connection timeout. Reconnecting...") sleep(check_timeout) except Exception as e: - logger.warning( - "IMAP connection error. {0}. " "Reconnecting...".format(e) - ) + logger.warning("IMAP connection error. {0}. Reconnecting...".format(e)) sleep(check_timeout) diff --git a/parsedmarc/utils.py b/parsedmarc/utils.py index 37136ff..ae056f2 100644 --- a/parsedmarc/utils.py +++ b/parsedmarc/utils.py @@ -344,7 +344,7 @@ def get_service_from_reverse_dns_base_domain( if not (offline or always_use_local_file) and len(reverse_dns_map) == 0: try: - logger.debug(f"Trying to fetch " f"reverse DNS map from {url}...") + logger.debug(f"Trying to fetch reverse DNS map from {url}...") csv_file.write(requests.get(url).text) csv_file.seek(0) load_csv(csv_file)