Barry Warsaw pushed to branch master at mailman / Mailman

Commits:
b4e20758 by Mark Sapiro at 2016-10-22T18:22:15-04:00
Fixes for #280.

- - - - -
4cd3c3f3 by Barry Warsaw at 2016-10-22T18:24:39-04:00
Tweaks.

- - - - -


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
=====================================
--- a/src/mailman/chains/headers.py
+++ b/src/mailman/chains/headers.py
@@ -96,7 +96,11 @@ class HeaderMatchRule:
 
     def check(self, mlist, msg, msgdata):
         """See `IRule`."""
-        for value in msg.get_all(self.header, []):
+        # Collect all the headers in all subparts.
+        headers = []
+        for p in msg.walk():
+            headers.extend(p.get_all(self.header, []))
+        for value in headers:
             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
@@ -169,6 +169,46 @@ class TestHeaderChain(unittest.TestCase):
              ('baz', 'z+', LinkAction.jump, 'accept'),
             ])                                      # noqa: E124
 
+    def test_header_in_subpart(self):
+        # Test that headers in sub-parts are also matched.
+        msg = mfs("""\
+From: a...@example.com
+To: t...@example.com
+Subject: A message
+Message-ID: <ant>
+Foo: foo
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="================12345=="
+
+--================12345==
+Content-Type: text/plain; charset="us-ascii"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+
+A message body.
+
+--================12345==
+Content-Type: application/junk
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+
+This is junk
+
+--================12345==--
+""")
+        msgdata = {}
+        header_matches = IHeaderMatchList(self._mlist)
+        header_matches.append('Content-Type', 'application/junk', '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')


=====================================
src/mailman/docs/NEWS.rst
=====================================
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -90,6 +90,7 @@ Bugs
    Aurélien Bompard.  (Closes: #273)
  * Allow MailingList.info to be set using the REST API.  Given by Aurélien
    Bompard.
+ * Extend header filters to also check sub-part headers.  (Closes #280)
 
 Configuration
 -------------



View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/3cf613f56e44bed4bc45f533e6f6263288e66460...4cd3c3f309bb91d46a7ce55a32216db2321804c1
_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to