summaryrefslogtreecommitdiff
path: root/src/mailman
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman')
-rw-r--r--src/mailman/chains/builtin.py2
-rw-r--r--src/mailman/chains/docs/moderation.rst5
-rw-r--r--src/mailman/core/docs/chains.rst9
-rw-r--r--src/mailman/docs/NEWS.rst2
-rw-r--r--src/mailman/rules/docs/rules.rst1
-rw-r--r--src/mailman/rules/no_senders.py45
-rw-r--r--src/mailman/rules/tests/test_no_senders.py53
-rw-r--r--src/mailman/runners/docs/incoming.rst8
8 files changed, 117 insertions, 8 deletions
diff --git a/src/mailman/chains/builtin.py b/src/mailman/chains/builtin.py
index a3f1fccf3..9b97fef38 100644
--- a/src/mailman/chains/builtin.py
+++ b/src/mailman/chains/builtin.py
@@ -42,6 +42,8 @@ class BuiltInChain:
# jump to the moderation chain to do the action. Otherwise, the rule
# misses buts sets msgdata['dmarc'] for the handler.
('dmarc-mitigation', LinkAction.jump, 'moderation'),
+ # Discard emails with no valid senders.
+ ('no-senders', LinkAction.jump, 'discard'),
('approved', LinkAction.jump, 'accept'),
('emergency', LinkAction.jump, 'hold'),
('loop', LinkAction.jump, 'discard'),
diff --git a/src/mailman/chains/docs/moderation.rst b/src/mailman/chains/docs/moderation.rst
index e3c9e12f5..2963bd40c 100644
--- a/src/mailman/chains/docs/moderation.rst
+++ b/src/mailman/chains/docs/moderation.rst
@@ -88,6 +88,7 @@ built-in chain. No rules hit and so the message is accepted.
Hits:
Misses:
dmarc-mitigation
+ no-senders
approved
emergency
loop
@@ -126,6 +127,7 @@ moderator approval.
member-moderation
Misses:
dmarc-mitigation
+ no-senders
approved
emergency
loop
@@ -153,6 +155,7 @@ Anne's moderation action can also be set to `discard`...
member-moderation
Misses:
dmarc-mitigation
+ no-senders
approved
emergency
loop
@@ -179,6 +182,7 @@ Anne's moderation action can also be set to `discard`...
member-moderation
Misses:
dmarc-mitigation
+ no-senders
approved
emergency
loop
@@ -220,6 +224,7 @@ moderator approval.
nonmember-moderation
Misses:
dmarc-mitigation
+ no-senders
approved
emergency
loop
diff --git a/src/mailman/core/docs/chains.rst b/src/mailman/core/docs/chains.rst
index e3190e364..84b340775 100644
--- a/src/mailman/core/docs/chains.rst
+++ b/src/mailman/core/docs/chains.rst
@@ -268,10 +268,10 @@ This message will end up in the `pipeline` queue.
Message-ID: <first>
Message-ID-Hash: 4CMWUN6BHVCMHMDAOSJZ2Q72G5M32MWB
X-Message-ID-Hash: 4CMWUN6BHVCMHMDAOSJZ2Q72G5M32MWB
- X-Mailman-Rule-Misses: dmarc-mitigation; approved; emergency; loop;
- banned-address; member-moderation; nonmember-moderation; administrivia;
- implicit-dest; max-recipients; max-size; news-moderation; no-subject;
- suspicious-header
+ X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency;
+ loop; banned-address; member-moderation; nonmember-moderation;
+ administrivia; implicit-dest; max-recipients; max-size;
+ news-moderation; no-subject; suspicious-header
<BLANKLINE>
An important message.
<BLANKLINE>
@@ -293,6 +293,7 @@ hit and all rules that have missed.
max-size
member-moderation
news-moderation
+ no-senders
no-subject
nonmember-moderation
suspicious-header
diff --git a/src/mailman/docs/NEWS.rst b/src/mailman/docs/NEWS.rst
index c21f561a1..c4ea7e561 100644
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -19,6 +19,8 @@ Bugs
* Syntactically invalid sender addresses are now ignored. (Closes #229)
* An AttributeError: 'str' object has no attribute 'decode' exception in
subject prefixing is fixed. (Closes #359)
+ * Messages with no syntactically valid senders are now automatically
+ discarded. (Closes #369)
Interfaces
----------
diff --git a/src/mailman/rules/docs/rules.rst b/src/mailman/rules/docs/rules.rst
index 8b351650c..b3b0b9d15 100644
--- a/src/mailman/rules/docs/rules.rst
+++ b/src/mailman/rules/docs/rules.rst
@@ -30,6 +30,7 @@ names to rule objects.
max-size True
member-moderation True
news-moderation True
+ no-senders True
no-subject True
nonmember-moderation True
suspicious-header True
diff --git a/src/mailman/rules/no_senders.py b/src/mailman/rules/no_senders.py
new file mode 100644
index 000000000..7e8c78fa7
--- /dev/null
+++ b/src/mailman/rules/no_senders.py
@@ -0,0 +1,45 @@
+# Copyright (C) 2007-2017 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/>.
+
+"""Membership related rules."""
+
+from mailman.core.i18n import _
+from mailman.interfaces.rules import IRule
+from public import public
+from zope.interface import implementer
+
+
+@public
+@implementer(IRule)
+class NoSenders:
+ """The message has no senders rule."""
+
+ name = 'no-senders'
+ description = _('Match messages with no valid senders.')
+ record = True
+
+ def check(self, mlist, msg, msgdata):
+ """See `IRule`."""
+ if msg.sender:
+ return False
+ else:
+ msgdata['moderation_action'] = 'discard'
+ msgdata['moderation_sender'] = _('None')
+ msgdata.setdefault('moderation_reasons', []).append(
+ # This will get translated at the point of use.
+ 'The message has no valid senders')
+ return True
diff --git a/src/mailman/rules/tests/test_no_senders.py b/src/mailman/rules/tests/test_no_senders.py
new file mode 100644
index 000000000..eb59dfe71
--- /dev/null
+++ b/src/mailman/rules/tests/test_no_senders.py
@@ -0,0 +1,53 @@
+# Copyright (C) 2016-2017 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 mailman.app.lifecycle import create_list
+from mailman.email.message import Message
+from mailman.rules import no_senders
+from mailman.testing.layers import ConfigLayer
+
+
+class TestNoSubject(unittest.TestCase):
+ """Test the no_senders rule."""
+
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._mlist = create_list('test@example.com')
+ self._rule = no_senders.NoSenders()
+
+ def test_message_has_no_sender(self):
+ msg = Message()
+ msgdata = {}
+ result = self._rule.check(self._mlist, msg, msgdata)
+ self.assertTrue(result)
+ self.assertEqual(msgdata['moderation_action'], 'discard')
+ self.assertEqual(msgdata['moderation_reasons'],
+ ['The message has no valid senders'])
+ self.assertEqual(msgdata['moderation_sender'], 'None')
+
+ def test_message_has_sender(self):
+ msg = Message()
+ msg['From'] = 'anne@example.com'
+ msgdata = {}
+ result = self._rule.check(self._mlist, msg, msgdata)
+ self.assertFalse(result)
+ self.assertEqual(msgdata, {})
diff --git a/src/mailman/runners/docs/incoming.rst b/src/mailman/runners/docs/incoming.rst
index 33810d104..217cc0955 100644
--- a/src/mailman/runners/docs/incoming.rst
+++ b/src/mailman/runners/docs/incoming.rst
@@ -128,10 +128,10 @@ Now the message is in the pipeline queue.
Message-ID-Hash: 4CMWUN6BHVCMHMDAOSJZ2Q72G5M32MWB
X-Message-ID-Hash: 4CMWUN6BHVCMHMDAOSJZ2Q72G5M32MWB
Date: ...
- X-Mailman-Rule-Misses: dmarc-mitigation; approved; emergency; loop;
- banned-address; member-moderation; nonmember-moderation; administrivia;
- implicit-dest; max-recipients; max-size; news-moderation; no-subject;
- suspicious-header
+ X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency;
+ loop; banned-address; member-moderation; nonmember-moderation;
+ administrivia; implicit-dest; max-recipients; max-size;
+ news-moderation; no-subject; suspicious-header
<BLANKLINE>
First post!
<BLANKLINE>