Barry Warsaw pushed to branch master at mailman / Mailman

Commits:
c972f9d5 by Aurélien Bompard at 2015-12-12T17:23:20Z
Reject notifications contained no reason.

Implement the suggestions from the review.

Cleanups by Barry.

- - - - -


3 changed files:

- src/mailman/chains/reject.py
- + src/mailman/chains/tests/test_reject.py
- src/mailman/docs/NEWS.rst


Changes:

=====================================
src/mailman/chains/reject.py
=====================================
--- a/src/mailman/chains/reject.py
+++ b/src/mailman/chains/reject.py
@@ -26,12 +26,15 @@ import logging
 
 from mailman.app.bounces import bounce_message
 from mailman.chains.base import TerminalChainBase
+from mailman.core.errors import RejectMessage
 from mailman.core.i18n import _
 from mailman.interfaces.chain import RejectEvent
 from zope.event import notify
 
 
 log = logging.getLogger('mailman.vette')
+
+NEWLINE = '\n'
 SEMISPACE = '; '
 
 
@@ -53,7 +56,21 @@ class RejectChain(TerminalChainBase):
         rule_misses = msgdata.get('rule_misses')
         if rule_misses:
             msg['X-Mailman-Rule-Misses'] = SEMISPACE.join(rule_misses)
-        # XXX Exception/reason
-        bounce_message(mlist, msg)
+        reasons = msgdata.get('moderation_reasons')
+        if reasons is None:
+            error = None
+        else:
+            error = RejectMessage(_("""
+Your message to the {list_name} mailing-list was rejected for the following
+reasons:
+
+{reasons}
+
+The original message as received by Mailman is attached.
+""").format(
+    list_name=mlist.display_name,
+    reasons=NEWLINE.join(reasons)
+    ))
+        bounce_message(mlist, msg, error)
         log.info('REJECT: %s', msg.get('message-id', 'n/a'))
         notify(RejectEvent(mlist, msg, msgdata, self))


=====================================
src/mailman/chains/tests/test_reject.py
=====================================
--- /dev/null
+++ b/src/mailman/chains/tests/test_reject.py
@@ -0,0 +1,68 @@
+# Copyright (C) 2015 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/>.
+
+"""Testing the reject chain."""
+
+__all__ = [
+    'TestReject',
+    ]
+
+
+import unittest
+
+from mailman.app.lifecycle import create_list
+from mailman.core.chains import process as process_chain
+from mailman.testing.helpers import (
+    get_queue_messages, specialized_message_from_string as mfs)
+from mailman.testing.layers import ConfigLayer
+
+
+
+class TestReject(unittest.TestCase):
+    """Test the `mailman.app.bounces.bounce_message()` function."""
+
+    layer = ConfigLayer
+
+    def setUp(self):
+        self._mlist = create_list('t...@example.com')
+        self._msg = mfs("""\
+From: a...@example.com
+To: t...@example.com
+Subject: Ignore
+
+""")
+
+    def test_reject_reasons(self):
+        # The bounce message must contain the moderation reasons.
+        msgdata = dict(moderation_reasons=[
+            'TEST-REASON-1',
+            'TEST-REASON-2',
+            ])
+        process_chain(self._mlist, self._msg, msgdata, start_chain='reject')
+        bounces = get_queue_messages('virgin')
+        self.assertEqual(len(bounces), 1)
+        payload = bounces[0].msg.get_payload(0).as_string()
+        self.assertIn('TEST-REASON-1', payload)
+        self.assertIn('TEST-REASON-2', payload)
+
+    def test_no_reason(self):
+        # There may be no moderation reasons.
+        process_chain(self._mlist, self._msg, {}, start_chain='reject')
+        bounces = get_queue_messages('virgin')
+        self.assertEqual(len(bounces), 1)
+        payload = bounces[0].msg.get_payload(0).as_string()
+        self.assertIn('No bounce details are available', payload)


=====================================
src/mailman/docs/NEWS.rst
=====================================
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -94,6 +94,7 @@ Message handling
    processed.  This allows for better anti-spam defenses and rejecting
    non-member posts instead of always holding them for moderator review.
    Given by Aurélien Bompard.  (Closes #163)
+ * Bounces can now contain rejection messages.  Given by Aurélien Bompard.
 
 REST
 ----



View it on GitLab: 
https://gitlab.com/mailman/mailman/commit/c972f9d5504469890ba72e81cd662d18f1ee4c13
_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to