From 9e2d61d3bd68ba41bdce5a3e19cf344c9cc9023d Mon Sep 17 00:00:00 2001
From: ale <ale@incal.net>
Date: Sat, 22 Oct 2022 10:27:00 +0100
Subject: [PATCH] Fix use of undefined original_from

---
 feedbackloop/parse.py | 137 +++++++++++++++++++++---------------------
 1 file changed, 68 insertions(+), 69 deletions(-)

diff --git a/feedbackloop/parse.py b/feedbackloop/parse.py
index 3ebe6cb..7d852ea 100644
--- a/feedbackloop/parse.py
+++ b/feedbackloop/parse.py
@@ -117,78 +117,77 @@ class MailScanner():
     def scan(self, unseen, limit=None):
         for uid, raw_msg in self._scan_mailbox(unseen, limit):
             try:
-
-                # Parse the ARF message body.
-                msg = ARFMessage(raw_msg)
-                report_sender, _ = _normalize_addr(
-                    _hdr(msg.get_message_headers(), 'From'))
-
-                # Try different ways of finding the original sender. We
-                # look at a few possible things, in order of increasing
-                # priority:
-                #
-                # - the From of the original message
-                # - the From reported in the feedback-report attachment
-                # - the authenticated sender from the Received headers
-                #
-                # We also attempt to detect if the sender is a mailing
-                # list by looking for a "List-Id" header, or a "-bounces"
-                # sender.
-                hdrs = msg.get_original_message_headers()
-                is_list = False
-                timestamp = datetime.now()
-
-                if hdrs:
-                    original_from = _hdr(hdrs, 'From')
-                    timestamp = datetime.fromtimestamp(
-                        time.mktime(parsedate(_hdr(hdrs, 'Date'))))
-
-                fr = msg.get_feedback_report()
-                if fr:
-                    print(f'feedback report: {fr.get_feedback_type()} - {fr.get_original_mail_from()}')
-                    original_from = fr.get_original_mail_from()
-                    arrival_date = fr.get_arrival_date()
-                    if arrival_date:
-                        timestamp = datetime.fromtimestamp(
-                            time.mktime(parsedate(arrival_date)))
-
-                if hdrs:
-                    auth_sender = _find_authenticated_sender(hdrs)
-                    if auth_sender:
-                        print(f'found authenticated sender: {auth_sender}')
-                        original_from = auth_sender
-
-                if hdrs:
-                    list_id = _hdr(hdrs, 'List-Id')
-                    if list_id:
-                        list_name = self._list_name_from_id(list_id)
-                        if list_name:
-                            original_from = list_name
-                            is_list = True
-
-                if not original_from:
-                    print('unable to extract original sender')
-                    continue
-
-                original_from, maybe_list = _normalize_addr(original_from)
-                if maybe_list and not is_list:
-                    is_list = maybe_list
-
-                entry = FeedbackEntry(
-                    sender=original_from,
-                    reporter=report_sender,
-                    is_list=is_list,
-                    timestamp=timestamp,
-                )
-                if not is_list:
-                    entry.message = raw_msg
-                print(f'original from: {original_from}, list={is_list}')
-                yield entry
+                entry = self._parse_message(raw_msg)
                 self._to_delete.append(uid)
-
+                yield entry
             except Exception as e:
                 print(f'error: {e}')
-                #print(raw_msg)
+
+    def _parse_message(self, raw_msg):
+        # Parse the ARF message body.
+        msg = ARFMessage(raw_msg)
+        report_sender, _ = _normalize_addr(
+            _hdr(msg.get_message_headers(), 'From'))
+
+        # Try different ways of finding the original sender. We
+        # look at a few possible things, in order of increasing
+        # priority:
+        #
+        # - the From of the original message
+        # - the From reported in the feedback-report attachment
+        # - the authenticated sender from the Received headers
+        #
+        # We also attempt to detect if the sender is a mailing
+        # list by looking for a "List-Id" header, or a "-bounces"
+        # sender.
+        hdrs = msg.get_original_message_headers()
+        is_list = False
+        timestamp = datetime.now()
+        original_from = None
+
+        if hdrs:
+            original_from = _hdr(hdrs, 'From')
+            timestamp = datetime.fromtimestamp(
+                time.mktime(parsedate(_hdr(hdrs, 'Date'))))
+
+        fr = msg.get_feedback_report()
+        if fr:
+            print(f'feedback report: {fr.get_feedback_type()} - {fr.get_original_mail_from()}')
+            original_from = fr.get_original_mail_from()
+            arrival_date = fr.get_arrival_date()
+            if arrival_date:
+                timestamp = datetime.fromtimestamp(
+                    time.mktime(parsedate(arrival_date)))
+
+        if hdrs:
+            auth_sender = _find_authenticated_sender(hdrs)
+            if auth_sender:
+                print(f'found authenticated sender: {auth_sender}')
+                original_from = auth_sender
+
+        if hdrs:
+            list_id = _hdr(hdrs, 'List-Id')
+            if list_id:
+                list_name = self._list_name_from_id(list_id)
+                if list_name:
+                    original_from = list_name
+                    is_list = True
+
+        if not original_from:
+            raise Exception('unable to extract original sender')
+
+        original_from, maybe_list = _normalize_addr(original_from)
+        if maybe_list and not is_list:
+            is_list = maybe_list
+
+        print(f'original from: {original_from}, list={is_list}')
+        return FeedbackEntry(
+            sender=original_from,
+            reporter=report_sender,
+            is_list=is_list,
+            timestamp=timestamp,
+            message=raw_msg,
+        )
 
     
 def main():
-- 
GitLab