summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBarry Warsaw2017-05-24 22:27:49 +0000
committerBarry Warsaw2017-05-24 22:27:49 +0000
commit787f5c0807a19dbb6c54868856ae94408bf74cec (patch)
treeffcee2b13164c415c8b48e9b46c82207e5ba2bbf /src
parent6894855b2b6c6fb7ada2dca3708f67a16cf2e2da (diff)
parentdf9ef8c8b2d4152e1970f7d0021bcc9a242ceaa8 (diff)
downloadmailman-787f5c0807a19dbb6c54868856ae94408bf74cec.tar.gz
mailman-787f5c0807a19dbb6c54868856ae94408bf74cec.tar.zst
mailman-787f5c0807a19dbb6c54868856ae94408bf74cec.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/chains/headers.py3
-rw-r--r--src/mailman/chains/tests/test_headers.py30
2 files changed, 33 insertions, 0 deletions
diff --git a/src/mailman/chains/headers.py b/src/mailman/chains/headers.py
index d41e64386..6fc061fe4 100644
--- a/src/mailman/chains/headers.py
+++ b/src/mailman/chains/headers.py
@@ -20,6 +20,7 @@
import re
import logging
+from email.header import Header
from itertools import count
from mailman.chains.base import Chain, Link
from mailman.config import config
@@ -101,6 +102,8 @@ class HeaderMatchRule:
for p in msg.walk():
headers.extend(p.get_all(self.header, []))
for value in headers:
+ if isinstance(value, Header):
+ value = value.encode()
if re.search(self.pattern, value, re.IGNORECASE):
return True
return False
diff --git a/src/mailman/chains/tests/test_headers.py b/src/mailman/chains/tests/test_headers.py
index b74b8ebc9..3da7a2435 100644
--- a/src/mailman/chains/tests/test_headers.py
+++ b/src/mailman/chains/tests/test_headers.py
@@ -19,6 +19,7 @@
import unittest
+from email.header import Header
from mailman.app.lifecycle import create_list
from mailman.chains.headers import HeaderMatchRule, make_link
from mailman.config import config
@@ -209,6 +210,35 @@ This is junk
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 = mfs("""\
+From: anne@example.com
+To: test@example.com
+Subject: =?unknown-8bit?q?Become_smarter_now_=96_Increase__your_brain...?=
+Message-ID: <ant>
+
+body
+
+""")
+ # XXX In the wild we have seen a message instance in which the subject
+ # header value is an email.header.Header instance rather than a
+ # string. We don't know how to recreate that here so we cheat.
+ msg['Subject'] = Header(
+ 'Become_smarter_now \x96 Increase your brain...', 'utf-8')
+ msgdata = {}
+ header_matches = IHeaderMatchList(self._mlist)
+ header_matches.append('Subject', '=\?utf', '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'])
+
@configuration('antispam', header_checks="""
Foo: foo
""", jump_chain='hold')