Mark Sapiro pushed to branch master at GNU Mailman / Mailman Core


Commits:
cbf5584f by Mark Sapiro at 2021-01-14T21:11:30-08:00
RFC 2047 decode headers for header filters.

- - - - -
3066edc3 by Mark Sapiro at 2021-01-15T05:35:00+00:00
Merge branch 'match' into 'master'

RFC 2047 decode headers for header filters.

Closes #815

See merge request mailman/mailman!759
- - - - -


3 changed files:

- src/mailman/chains/headers.py
- src/mailman/chains/tests/test_headers.py
- src/mailman/docs/NEWS.rst


Changes:

=====================================
src/mailman/chains/headers.py
=====================================
@@ -20,7 +20,7 @@
 import re
 import logging
 
-from email.header import Header
+from email.header import Header, decode_header, make_header
 from itertools import count
 from mailman.chains.base import Chain, Link
 from mailman.config import config
@@ -104,8 +104,10 @@ class HeaderMatchRule:
         for value in headers:
             if isinstance(value, Header):
                 value = value.encode()
+            # RFC2047 decode, but don't change value as it affects the msg.
+            new_value = str(make_header(decode_header(value)))
             try:
-                mo = re.search(self.pattern, value, re.IGNORECASE)
+                mo = re.search(self.pattern, new_value, re.IGNORECASE)
             except re.error as error:
                 log.error(
                     "Invalid regexp '{}' in header_matches for {}: {}".format(


=====================================
src/mailman/chains/tests/test_headers.py
=====================================
@@ -240,6 +240,30 @@ This is junk
         self.assertIsInstance(event, HoldEvent)
         self.assertEqual(event.chain, config.chains['hold'])
 
+    def test_rfc2047_encodedheader(self):
+        # Test case where msg.get_all() returns raw rfc2047 encoded string.
+        msg = message_from_bytes(b"""\
+From: a...@example.com
+To: t...@example.com
+Subject: =?utf-8?b?SSBsaWtlIElrZQo=?=
+Message-ID: <ant>
+
+body
+
+""", Message)
+        msgdata = {}
+        header_matches = IHeaderMatchList(self._mlist)
+        header_matches.append('Subject', 'I Like Ike', 'hold')
+        # This event subscriber records the event that occurs when the message
+        # is processed by the owner chain.
+        events = []
+        with event_subscribers(events.append):
+            process(self._mlist, msg, msgdata, start_chain='header-match')
+        self.assertEqual(len(events), 1)
+        event = events[0]
+        self.assertIsInstance(event, HoldEvent)
+        self.assertEqual(event.chain, config.chains['hold'])
+
     def test_get_all_returns_non_string(self):
         # Test case where msg.get_all() returns header instance.
         msg = message_from_bytes(b"""\


=====================================
src/mailman/docs/NEWS.rst
=====================================
@@ -34,6 +34,8 @@ Bugs
   ``SubscriptionPendingError``.  (Closes #805)
 * RFC 2369 ``List-Owner`` header is now added when these headers are included.
   (Closes #809)
+* Header filters will now properly match RFC 2047 encoded headers.
+  (Closes #815)
 
 Command line
 ------------



View it on GitLab: 
https://gitlab.com/mailman/mailman/-/compare/e29aa652ef2c8088b3ca626ba33626487604ba5d...3066edc3679e7497efd74753778710d7fa976542

-- 
View it on GitLab: 
https://gitlab.com/mailman/mailman/-/compare/e29aa652ef2c8088b3ca626ba33626487604ba5d...3066edc3679e7497efd74753778710d7fa976542
You're receiving this email because of your account on gitlab.com.


_______________________________________________
Mailman-checkins mailing list -- mailman-checkins@python.org
To unsubscribe send an email to mailman-checkins-le...@python.org
https://mail.python.org/mailman3/lists/mailman-checkins.python.org/
Member address: arch...@jab.org

Reply via email to