From b554efad8328208c083cf5a085fca79727e5f59e Mon Sep 17 00:00:00 2001
From: Jan Philipp Timme <jan.philipp@timme.it>
Date: Wed, 18 Dec 2019 15:12:33 +0100
Subject: [PATCH] Introduce rough feature skeleton

---
 main.py | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/main.py b/main.py
index 3b1bcf4..dca2768 100644
--- a/main.py
+++ b/main.py
@@ -5,6 +5,8 @@ import logging
 import Milter
 from Milter.utils import parse_addr
 
+import re
+
 # Basic logger that also logs to stdout
 # TODO: Improve this a lot.
 logger = logging.getLogger(__name__)
@@ -17,13 +19,46 @@ handler.setFormatter(formatter)
 
 logger.addHandler(handler)
 
+split_from_regex = re.compile('(?P<from_label>("(.*)")|(.*))(.*)<(?P<from_address>.*)>')
+
+def splitFromHeader(value):
+    match = split_from_regex.match(value)
+    result = {
+        'label': match.group('from_label').strip(),
+        'address': match.group('from_address').strip()
+    }
+    return result
+
 class SuspiciousFrom(Milter.Base):
     def __init__(self):
         self.id = Milter.uniqueID()
         logger.info(f"{self.id} got fired up.")
+        self.milter_final_result = Milter.ACCEPT
+        self.new_headers = []
 
     def header(self, field, value):
-        logger.info(f"{self.id} Got header: {field} --> {value}")
+        if field.lower() == 'from':
+            logger.info(f"Got \"From:\" header with raw value: '{value}'")
+            split = splitFromHeader(value)
+            logger.info(f"Label: {split['label']}, address: {split['address']}")
+            if '@' in split['label']:
+                self.milter_final_result = Milter.REJECT
+
+            else:
+                self.new_headers.append({'name': 'X-From-Checked', 'value': 'Yes, no address in label.'})
+                # Supposedly no additional address in the label, accept it for now
+                # TODO: Also decode utf-8 weirdness and check in there
+                self.milter_final_result = Milter.ACCEPT
+                return Milter.CONTINUE
+        else:
+            return Milter.CONTINUE
+
+    def eom(self):
+        # Finish up message according to results collected on the way.
+        for new_header in self.new_headers:
+            self.addheader(new_header['name'], new_header['value'])
+        return self.milter_final_result
+
 
 def main():
     milter_socket = "inet:7777@127.0.0.1"
-- 
GitLab