Aurélien Bompard has proposed merging lp:~abompard/mailman/bug-1130696 into 
lp:mailman.

Requested reviews:
  Mailman Coders (mailman-coders)

For more details, see:
https://code.launchpad.net/~abompard/mailman/bug-1130696/+merge/243226

Handle the MIMEMultipart created by the DigestRunner properly, fixes bug 
#1130696.
-- 
Your team Mailman Coders is requested to review the proposed merge of 
lp:~abompard/mailman/bug-1130696 into lp:mailman.
=== modified file 'src/mailman/core/runner.py'
--- src/mailman/core/runner.py	2014-01-01 14:59:42 +0000
+++ src/mailman/core/runner.py	2014-11-30 10:10:54 +0000
@@ -239,7 +239,7 @@
         if mlist is None:
             language_manager = getUtility(ILanguageManager)
             language = language_manager[config.mailman.default_language]
-        elif msg.sender:
+        elif hasattr(msg, "sender") and msg.sender:
             member = mlist.members.get_member(msg.sender)
             language = (member.preferred_language
                         if member is not None

=== modified file 'src/mailman/core/tests/test_runner.py'
--- src/mailman/core/tests/test_runner.py	2014-01-01 14:59:42 +0000
+++ src/mailman/core/tests/test_runner.py	2014-11-30 10:10:54 +0000
@@ -25,14 +25,16 @@
     ]
 
 
+import os
 import unittest
+from email.mime.multipart import MIMEMultipart
 
 from mailman.app.lifecycle import create_list
 from mailman.config import config
 from mailman.core.runner import Runner
 from mailman.interfaces.runner import RunnerCrashEvent
 from mailman.testing.helpers import (
-    configuration, event_subscribers, get_queue_messages,
+    configuration, event_subscribers, get_queue_messages, LogFileMark,
     make_testable_runner, specialized_message_from_string as mfs)
 from mailman.testing.layers import ConfigLayer
 
@@ -42,6 +44,11 @@
     def _dispose(self, mlist, msg, msgdata):
         raise RuntimeError('borked')
 
+
+class StoringRunner(Runner):
+    _disposed = []
+    def _dispose(self, mlist, msg, msgdata):
+        self._disposed.append((mlist, msg, msgdata))
 
 
 class TestRunner(unittest.TestCase):
@@ -87,3 +94,15 @@
         shunted = get_queue_messages('shunt')
         self.assertEqual(len(shunted), 1)
         self.assertEqual(shunted[0].msg['message-id'], '<ant>')
+
+    def test_multipart_message(self):
+        runner = make_testable_runner(StoringRunner, 'in')
+        msg = MIMEMultipart()
+        msg["Message-ID"] = "<ant>"
+        config.switchboards['in'].enqueue(msg, listname='t...@example.com')
+        with event_subscribers(self._got_event):
+            runner.run()
+        error_log = LogFileMark('mailman.error')
+        self.assertEqual(len(self._events), 0, error_log.read())
+        self.assertEqual(len(runner._disposed), 1)
+        self.assertEqual(runner._disposed[0][1]["Message-ID"], "<ant>")

=== modified file 'src/mailman/handlers/cook_headers.py'
--- src/mailman/handlers/cook_headers.py	2014-11-08 15:14:00 +0000
+++ src/mailman/handlers/cook_headers.py	2014-11-30 10:10:54 +0000
@@ -75,7 +75,8 @@
     # message, we want to save some of the information in the msgdata
     # dictionary for later.  Specifically, the sender header will get waxed,
     # but we need it for the Acknowledge module later.
-    msgdata['original_sender'] = msg.sender
+    if hasattr(msg, "sender"):
+        msgdata['original_sender'] = msg.sender
     # VirginRunner sets _fasttrack for internally crafted messages.
     fasttrack = msgdata.get('_fasttrack')
     if not msgdata.get('isdigest') and not fasttrack:

=== added file 'src/mailman/handlers/tests/test_cook_headers.py'
--- src/mailman/handlers/tests/test_cook_headers.py	1970-01-01 00:00:00 +0000
+++ src/mailman/handlers/tests/test_cook_headers.py	2014-11-30 10:10:54 +0000
@@ -0,0 +1,53 @@
+# Copyright (C) 2012-2014 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 cook_headers handler."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+__metaclass__ = type
+__all__ = [
+    'TestCookHeaders',
+    ]
+
+
+import unittest
+from email.mime.multipart import MIMEMultipart
+
+from mailman.app.lifecycle import create_list
+from mailman.handlers import cook_headers
+from mailman.testing.layers import ConfigLayer
+
+
+
+class TestCookHeaders(unittest.TestCase):
+    """Test the cook_headers handler."""
+
+    layer = ConfigLayer
+
+    def setUp(self):
+        self._mlist = create_list('t...@example.com')
+
+    def test_process_multipart(self):
+        # The digest runner creates MIMEMultipart message instances which have
+        # no sender property.
+        msg = MIMEMultipart()
+        msg["message-id"] = "<test>"
+        try:
+            cook_headers.process(self._mlist, msg, {})
+        except AttributeError as e:
+            self.fail(e)

_______________________________________________
Mailman-coders mailing list
Mailman-coders@python.org
https://mail.python.org/mailman/listinfo/mailman-coders

Reply via email to