diff options
| author | Mark Sapiro | 2016-09-29 16:35:13 -0700 |
|---|---|---|
| committer | Barry Warsaw | 2016-10-22 18:22:15 -0400 |
| commit | b4e207583370fa784fa63905897c13bb0b05bc23 (patch) | |
| tree | 8e64595cdcf90426715af47c5d00fcf8289b9811 | |
| parent | 3cf613f56e44bed4bc45f533e6f6263288e66460 (diff) | |
| download | mailman-b4e207583370fa784fa63905897c13bb0b05bc23.tar.gz mailman-b4e207583370fa784fa63905897c13bb0b05bc23.tar.zst mailman-b4e207583370fa784fa63905897c13bb0b05bc23.zip | |
| -rw-r--r-- | src/mailman/chains/headers.py | 5 | ||||
| -rw-r--r-- | src/mailman/chains/tests/test_headers.py | 40 | ||||
| -rw-r--r-- | src/mailman/docs/NEWS.rst | 1 |
3 files changed, 45 insertions, 1 deletions
diff --git a/src/mailman/chains/headers.py b/src/mailman/chains/headers.py index 70f1da587..7a77f9f9b 100644 --- a/src/mailman/chains/headers.py +++ b/src/mailman/chains/headers.py @@ -96,7 +96,10 @@ class HeaderMatchRule: def check(self, mlist, msg, msgdata): """See `IRule`.""" - for value in msg.get_all(self.header, []): + 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 diff --git a/src/mailman/chains/tests/test_headers.py b/src/mailman/chains/tests/test_headers.py index e21fa452d..6bba6c1b6 100644 --- 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: anne@example.com +To: test@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', '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') diff --git a/src/mailman/docs/NEWS.rst b/src/mailman/docs/NEWS.rst index ee8e1c09b..7f4acc5c4 100644 --- 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 ------------- |
