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: [email protected]
+To: [email protected]
+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 -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/mailman-checkins.python.org/
Member address: [email protected]