Barry Warsaw pushed to branch master at mailman / Mailman

Commits:
df9ef8c8 by Mark Sapiro at 2017-05-24T22:27:48+00:00
Account for msg['subject'] possibly being a Header instance.

- - - - -
787f5c08 by Barry Warsaw at 2017-05-24T22:27:49+00:00
Merge branch 'header' into 'master'

Account for msg['subject'] possibly being a Header instance.

Closes #338

See merge request !278
- - - - -


2 changed files:

- src/mailman/chains/headers.py
- src/mailman/chains/tests/test_headers.py


Changes:

=====================================
src/mailman/chains/headers.py
=====================================
--- 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


=====================================
src/mailman/chains/tests/test_headers.py
=====================================
--- 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: a...@example.com
+To: t...@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')



View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/6894855b2b6c6fb7ada2dca3708f67a16cf2e2da...787f5c0807a19dbb6c54868856ae94408bf74cec

---
View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/6894855b2b6c6fb7ada2dca3708f67a16cf2e2da...787f5c0807a19dbb6c54868856ae94408bf74cec
You're receiving this email because of your account on gitlab.com.
_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to