summaryrefslogtreecommitdiff
path: root/src/mailman/rules
diff options
context:
space:
mode:
authorMark Sapiro2016-12-04 15:40:12 -0800
committerMark Sapiro2016-12-04 15:40:12 -0800
commitb7eef6badf3fc6e6bd0534ca58647f0e8219e977 (patch)
tree7e2999232b8e3c6b54fffc5a31a90414c167ffe1 /src/mailman/rules
parent0846595ab8f75afda49fcdf35abe87b609af55d5 (diff)
parentb50fc4b57c9a8886407fd9ae0b88bdaa2075d3a2 (diff)
downloadmailman-b7eef6badf3fc6e6bd0534ca58647f0e8219e977.tar.gz
mailman-b7eef6badf3fc6e6bd0534ca58647f0e8219e977.tar.zst
mailman-b7eef6badf3fc6e6bd0534ca58647f0e8219e977.zip
Merge gitlab.com:mailman/mailman into to_moderators
Diffstat (limited to 'src/mailman/rules')
-rw-r--r--src/mailman/rules/administrivia.py2
-rw-r--r--src/mailman/rules/any.py2
-rw-r--r--src/mailman/rules/approved.py2
-rw-r--r--src/mailman/rules/banned_address.py2
-rw-r--r--src/mailman/rules/emergency.py2
-rw-r--r--src/mailman/rules/implicit_dest.py2
-rw-r--r--src/mailman/rules/loop.py2
-rw-r--r--src/mailman/rules/max_recipients.py2
-rw-r--r--src/mailman/rules/max_size.py2
-rw-r--r--src/mailman/rules/moderation.py2
-rw-r--r--src/mailman/rules/news_moderation.py2
-rw-r--r--src/mailman/rules/no_subject.py6
-rw-r--r--src/mailman/rules/suspicious.py6
-rw-r--r--src/mailman/rules/tests/test_no_subject.py48
-rw-r--r--src/mailman/rules/tests/test_suspicious.py44
-rw-r--r--src/mailman/rules/truth.py2
16 files changed, 112 insertions, 16 deletions
diff --git a/src/mailman/rules/administrivia.py b/src/mailman/rules/administrivia.py
index e5defee6e..6dc6c38b4 100644
--- a/src/mailman/rules/administrivia.py
+++ b/src/mailman/rules/administrivia.py
@@ -18,10 +18,10 @@
"""The administrivia rule."""
from email.iterators import typed_subpart_iterator
-from mailman import public
from mailman.config import config
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
# The list of email commands we search for in the Subject header and payload.
diff --git a/src/mailman/rules/any.py b/src/mailman/rules/any.py
index 466735ebe..6d3bbe21f 100644
--- a/src/mailman/rules/any.py
+++ b/src/mailman/rules/any.py
@@ -17,9 +17,9 @@
"""Check if any previous rules have matched."""
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/approved.py b/src/mailman/rules/approved.py
index a4ea1145e..66f21c8eb 100644
--- a/src/mailman/rules/approved.py
+++ b/src/mailman/rules/approved.py
@@ -20,10 +20,10 @@
import re
from email.iterators import typed_subpart_iterator
-from mailman import public
from mailman.config import config
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/banned_address.py b/src/mailman/rules/banned_address.py
index 8ed33a5e6..850f101db 100644
--- a/src/mailman/rules/banned_address.py
+++ b/src/mailman/rules/banned_address.py
@@ -17,10 +17,10 @@
"""Banned addresses rule."""
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.bans import IBanManager
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/emergency.py b/src/mailman/rules/emergency.py
index 442ccf136..59c0c6a84 100644
--- a/src/mailman/rules/emergency.py
+++ b/src/mailman/rules/emergency.py
@@ -17,9 +17,9 @@
"""The emergency hold rule."""
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/implicit_dest.py b/src/mailman/rules/implicit_dest.py
index c0e116d1c..88429a6ac 100644
--- a/src/mailman/rules/implicit_dest.py
+++ b/src/mailman/rules/implicit_dest.py
@@ -21,10 +21,10 @@ import re
from contextlib import suppress
from email.utils import getaddresses
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.mailinglist import IAcceptableAliasSet
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/loop.py b/src/mailman/rules/loop.py
index 0f8047e76..d9b7c299d 100644
--- a/src/mailman/rules/loop.py
+++ b/src/mailman/rules/loop.py
@@ -17,9 +17,9 @@
"""Look for a posting loop."""
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/max_recipients.py b/src/mailman/rules/max_recipients.py
index 61df613cb..1d38e28c1 100644
--- a/src/mailman/rules/max_recipients.py
+++ b/src/mailman/rules/max_recipients.py
@@ -18,9 +18,9 @@
"""The maximum number of recipients rule."""
from email.utils import getaddresses
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/max_size.py b/src/mailman/rules/max_size.py
index 8911e97fd..c5c492347 100644
--- a/src/mailman/rules/max_size.py
+++ b/src/mailman/rules/max_size.py
@@ -17,9 +17,9 @@
"""The maximum message size rule."""
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/moderation.py b/src/mailman/rules/moderation.py
index 20b238eab..b52ecff3e 100644
--- a/src/mailman/rules/moderation.py
+++ b/src/mailman/rules/moderation.py
@@ -19,13 +19,13 @@
import re
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.action import Action
from mailman.interfaces.bans import IBanManager
from mailman.interfaces.member import MemberRole
from mailman.interfaces.rules import IRule
from mailman.interfaces.usermanager import IUserManager
+from public import public
from zope.component import getUtility
from zope.interface import implementer
diff --git a/src/mailman/rules/news_moderation.py b/src/mailman/rules/news_moderation.py
index 63a7e93b0..8d0fe3402 100644
--- a/src/mailman/rules/news_moderation.py
+++ b/src/mailman/rules/news_moderation.py
@@ -17,10 +17,10 @@
"""The news moderation rule."""
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.nntp import NewsgroupModeration
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
diff --git a/src/mailman/rules/no_subject.py b/src/mailman/rules/no_subject.py
index 4b53067a5..f3eba625a 100644
--- a/src/mailman/rules/no_subject.py
+++ b/src/mailman/rules/no_subject.py
@@ -17,9 +17,9 @@
"""The no-Subject header rule."""
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
@@ -34,5 +34,7 @@ class NoSubject:
def check(self, mlist, msg, msgdata):
"""See `IRule`."""
- subject = msg.get('subject', '').strip()
+ # Convert the header value to a str because it may be an
+ # email.header.Header instance.
+ subject = str(msg.get('subject', '')).strip()
return subject == ''
diff --git a/src/mailman/rules/suspicious.py b/src/mailman/rules/suspicious.py
index f349a313e..049df0a61 100644
--- a/src/mailman/rules/suspicious.py
+++ b/src/mailman/rules/suspicious.py
@@ -20,9 +20,9 @@
import re
import logging
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer
@@ -87,6 +87,8 @@ def has_matching_bounce_header(mlist, msg):
"""
for header, cre, line in _parse_matching_header_opt(mlist):
for value in msg.get_all(header, []):
- if cre.search(value):
+ # Convert the header value to a str because it may be an
+ # email.header.Header instance.
+ if cre.search(str(value)):
return True
return False
diff --git a/src/mailman/rules/tests/test_no_subject.py b/src/mailman/rules/tests/test_no_subject.py
new file mode 100644
index 000000000..0155e25ee
--- /dev/null
+++ b/src/mailman/rules/tests/test_no_subject.py
@@ -0,0 +1,48 @@
+# Copyright (C) 2016 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Test the `no_subject` header rule."""
+
+import unittest
+
+from email.header import Header
+from mailman.app.lifecycle import create_list
+from mailman.email.message import Message
+from mailman.rules import no_subject
+from mailman.testing.layers import ConfigLayer
+
+
+class TestNoSubject(unittest.TestCase):
+ """Test the no_subject rule."""
+
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._mlist = create_list('test@example.com')
+ self._rule = no_subject.NoSubject()
+
+ def test_header_instance_empty(self):
+ msg = Message()
+ msg['Subject'] = Header('')
+ result = self._rule.check(self._mlist, msg, {})
+ self.assertTrue(result)
+
+ def test_header_instance_not_empty(self):
+ msg = Message()
+ msg['Subject'] = Header('Test subject')
+ result = self._rule.check(self._mlist, msg, {})
+ self.assertFalse(result)
diff --git a/src/mailman/rules/tests/test_suspicious.py b/src/mailman/rules/tests/test_suspicious.py
new file mode 100644
index 000000000..441fb0b48
--- /dev/null
+++ b/src/mailman/rules/tests/test_suspicious.py
@@ -0,0 +1,44 @@
+# Copyright (C) 2016 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Test the `suspicious` rule."""
+
+
+import unittest
+
+from email.header import Header
+from mailman.app.lifecycle import create_list
+from mailman.email.message import Message
+from mailman.rules import suspicious
+from mailman.testing.layers import ConfigLayer
+
+
+class TestSuspicious(unittest.TestCase):
+ """Test the suspicious rule."""
+
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._mlist = create_list('test@example.com')
+ self._rule = suspicious.SuspiciousHeader()
+
+ def test_header_instance(self):
+ msg = Message()
+ msg['From'] = Header('user@example.com')
+ self._mlist.bounce_matching_headers = 'from: spam@example.com'
+ result = self._rule.check(self._mlist, msg, {})
+ self.assertFalse(result)
diff --git a/src/mailman/rules/truth.py b/src/mailman/rules/truth.py
index 9883a0e60..224ceeaad 100644
--- a/src/mailman/rules/truth.py
+++ b/src/mailman/rules/truth.py
@@ -17,9 +17,9 @@
"""A rule which always matches."""
-from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.rules import IRule
+from public import public
from zope.interface import implementer