Abhilash Raj pushed to branch master at GNU Mailman / Mailman Core


Commits:
98288ae8 by Mark Sapiro at 2021-01-25T19:08:00+00:00
Properly process changed header filters.

- - - - -
5964768c by Abhilash Raj at 2021-01-25T19:08:00+00:00
Merge branch 'header' into 'master'

Properly process changed header filters.

Closes #818

See merge request mailman/mailman!767
- - - - -


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
=====================================
@@ -65,9 +65,8 @@ def make_link(header, pattern, chain=None, suffix=None):
     """
     rule_name = _make_rule_name(suffix)
     if rule_name in config.rules:
-        rule = config.rules[rule_name]
-    else:
-        rule = HeaderMatchRule(header, pattern, suffix)
+        del config.rules[rule_name]
+    rule = HeaderMatchRule(header, pattern, suffix)
     if chain is None:
         return Link(rule)
     return Link(rule, LinkAction.jump, chain)


=====================================
src/mailman/chains/tests/test_headers.py
=====================================
@@ -200,6 +200,70 @@ A message body.
              ('baz', 'z+', LinkAction.jump, 'accept'),
             ])                                      # noqa: E124
 
+    def test_list_complex_rule_deletion(self):
+        # Test that the mailing-list header-match complex rules are read
+        # properly after deletion.
+        chain = config.chains['header-match']
+        header_matches = IHeaderMatchList(self._mlist)
+        header_matches.append('Foo', 'a+', 'reject')
+        header_matches.append('Bar', 'b+', 'discard')
+        header_matches.append('Baz', 'z+', 'accept')
+        links = [link for link in chain.get_links(self._mlist, Message(), {})
+                 if link.rule.name != 'any']
+        self.assertEqual(len(links), 3)
+        self.assertEqual([
+            (link.rule.header, link.rule.pattern, link.action, link.chain.name)
+            for link in links
+            ],
+            [('foo', 'a+', LinkAction.jump, 'reject'),
+             ('bar', 'b+', LinkAction.jump, 'discard'),
+             ('baz', 'z+', LinkAction.jump, 'accept'),
+            ])                                      # noqa: E124
+        del header_matches[0]
+        links = [link for link in chain.get_links(self._mlist, Message(), {})
+                 if link.rule.name != 'any']
+        self.assertEqual(len(links), 2)
+        self.assertEqual([
+            (link.rule.header, link.rule.pattern, link.action, link.chain.name)
+            for link in links
+            ],
+            [('bar', 'b+', LinkAction.jump, 'discard'),
+             ('baz', 'z+', LinkAction.jump, 'accept'),
+            ])                                      # noqa: E124
+
+    def test_list_complex_rule_reorder(self):
+        # Test that the mailing-list header-match complex rules are read
+        # properly after reordering.
+        chain = config.chains['header-match']
+        header_matches = IHeaderMatchList(self._mlist)
+        header_matches.append('Foo', 'a+', 'reject')
+        header_matches.append('Bar', 'b+', 'discard')
+        header_matches.append('Baz', 'z+', 'accept')
+        links = [link for link in chain.get_links(self._mlist, Message(), {})
+                 if link.rule.name != 'any']
+        self.assertEqual(len(links), 3)
+        self.assertEqual([
+            (link.rule.header, link.rule.pattern, link.action, link.chain.name)
+            for link in links
+            ],
+            [('foo', 'a+', LinkAction.jump, 'reject'),
+             ('bar', 'b+', LinkAction.jump, 'discard'),
+             ('baz', 'z+', LinkAction.jump, 'accept'),
+            ])                                      # noqa: E124
+        del header_matches[0]
+        header_matches.append('Foo', 'a+', 'reject')
+        links = [link for link in chain.get_links(self._mlist, Message(), {})
+                 if link.rule.name != 'any']
+        self.assertEqual(len(links), 3)
+        self.assertEqual([
+            (link.rule.header, link.rule.pattern, link.action, link.chain.name)
+            for link in links
+            ],
+            [('bar', 'b+', LinkAction.jump, 'discard'),
+             ('baz', 'z+', LinkAction.jump, 'accept'),
+             ('foo', 'a+', LinkAction.jump, 'reject'),
+            ])                                      # noqa: E124
+
     def test_header_in_subpart(self):
         # Test that headers in sub-parts are also matched.
         msg = mfs("""\
@@ -371,12 +435,18 @@ A message body.
             self.assertEqual(event.mlist, self._mlist)
             self.assertEqual(event.msg, msg)
 
+    @unittest.expectedFailure
     @configuration('antispam', header_checks="""
     Header1: a+
     """, jump_chain='hold')
     def test_reuse_rules(self):
         # Test that existing header-match rules are used instead of creating
         # new ones.
+        # MAS Reusing existing rules is problematic. If the rule with say
+        # position = 0 is deleted the following rule should become
+        # header-match-<list-id>-0 but that rule has the old values for
+        # header and pattern.
+        # See https://gitlab.com/mailman/mailman/-/issues/818
         chain = config.chains['header-match']
         header_matches = IHeaderMatchList(self._mlist)
         header_matches.append('Header2', 'b+')


=====================================
src/mailman/docs/NEWS.rst
=====================================
@@ -40,6 +40,8 @@ Bugs
   (Closes #816)
 * Increase the default REST API (gunicorn) timeout to 360 seconds from 30 as
   several API endpoinds can be very slow. (Closes #770)
+* Header filter rules are now properly processed after deletions and/or
+  reordering.  (Closes #818)
 
 Command line
 ------------



View it on GitLab: 
https://gitlab.com/mailman/mailman/-/compare/55948fdc3849032bc83eba5fbe0125b3505337ec...5964768c0a7110142e4e8a992953f705beb8c250

-- 
View it on GitLab: 
https://gitlab.com/mailman/mailman/-/compare/55948fdc3849032bc83eba5fbe0125b3505337ec...5964768c0a7110142e4e8a992953f705beb8c250
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

Reply via email to