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