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

Requested reviews:
  Mailman Coders (mailman-coders)

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

Fixes the unicode issues reported in bug #1130957 (unit tests included! ;-))
-- 
Your team Mailman Coders is requested to review the proposed merge of 
lp:~abompard/mailman/bug-1130957 into lp:mailman.
=== modified file 'src/mailman/handlers/owner_recipients.py'
--- src/mailman/handlers/owner_recipients.py	2014-01-01 14:59:42 +0000
+++ src/mailman/handlers/owner_recipients.py	2014-11-27 15:58:46 +0000
@@ -55,7 +55,7 @@
         # To prevent -owner messages from going into a black hole, if there
         # are no administrators available, the message goes to the site owner.
         if len(recipients) == 0:
-            msgdata['recipients'] = set((config.mailman.site_owner,))
+            msgdata['recipients'] = set((unicode(config.mailman.site_owner),))
         else:
             msgdata['recipients'] = recipients
         # Don't decorate these messages with the header/footers.  Eventually

=== modified file 'src/mailman/handlers/tests/test_recipients.py'
--- src/mailman/handlers/tests/test_recipients.py	2014-01-01 14:59:42 +0000
+++ src/mailman/handlers/tests/test_recipients.py	2014-11-27 15:58:46 +0000
@@ -198,3 +198,20 @@
         msgdata = {}
         self._process(self._mlist, self._msg, msgdata)
         self.assertEqual(msgdata['recipients'], set(('[email protected]',)))
+
+    def test_site_admin_unicode(self):
+        # Since the conf file is read as a bytestring, the site_owner is also a
+        # bytestring and must be converted to unicode when used as a fallback.
+        self._cris.unsubscribe()
+        self._dave.unsubscribe()
+        self.assertEqual(self._mlist.administrators.member_count, 0)
+        msgdata = {}
+        strconf = b"""
+        [mailman]
+        site_owner: [email protected]
+        """
+        config.push("test_site_admin_unicode", strconf)
+        self._process(self._mlist, self._msg, msgdata)
+        config.pop("test_site_admin_unicode")
+        self.assertEqual(len(msgdata['recipients']), 1)
+        self.assertTrue(isinstance(list(msgdata['recipients'])[0], unicode))

=== modified file 'src/mailman/runners/digest.py'
--- src/mailman/runners/digest.py	2014-04-28 15:23:35 +0000
+++ src/mailman/runners/digest.py	2014-11-27 15:58:46 +0000
@@ -260,7 +260,7 @@
         # Add the payload.  If the decoded payload is empty, this may be a
         # multipart message.  In that case, just stringify it.
         payload = msg.get_payload(decode=True)
-        payload = (payload if payload else msg.as_string().split('\n\n', 1)[1])
+        payload = (payload if payload else msg.as_string().split(b'\n\n', 1)[1])
         try:
             charset = msg.get_content_charset('us-ascii')
             payload = unicode(payload, charset, 'replace')

=== added file 'src/mailman/runners/tests/test_digest.py'
--- src/mailman/runners/tests/test_digest.py	1970-01-01 00:00:00 +0000
+++ src/mailman/runners/tests/test_digest.py	2014-11-27 15:58:46 +0000
@@ -0,0 +1,96 @@
+# 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 digest runner."""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+__metaclass__ = type
+__all__ = [
+    'TestDigest',
+    ]
+
+import os
+import unittest
+from email.mime.text import MIMEText
+
+from mailman.app.lifecycle import create_list
+from mailman.config import config
+from mailman.email.message import Message
+from mailman.runners.digest import DigestRunner
+from mailman.testing.helpers import (
+    digest_mbox, make_testable_runner, reset_the_world,
+    specialized_message_from_string as mfs)
+from mailman.testing.layers import ConfigLayer
+
+
+
+class TestDigest(unittest.TestCase):
+    """Test the digest runner."""
+
+    layer = ConfigLayer
+
+    def setUp(self):
+        self._mlist = create_list('[email protected]')
+        self._mlist.digest_size_threshold = 1
+        #self._mlist.volume = 1
+        #self._mlist.next_digest_number = 1
+        self._digestq = config.switchboards['digest']
+        self._shuntq = config.switchboards['shunt']
+        self._virginq = config.switchboards['virgin']
+        self._runner = make_testable_runner(DigestRunner, 'digest')
+        self._process = config.handlers['to-digest'].process
+
+    def tearDown(self):
+        reset_the_world()
+
+    def test_simple_message(self):
+        msg = mfs("""\
+From: [email protected]
+To: [email protected]
+
+message triggering a digest
+""")
+        mbox = digest_mbox(self._mlist)
+        mbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf')
+        self._process(self._mlist, msg, {})
+        self._digestq.enqueue(msg,
+            listname=self._mlist.fqdn_listname,
+            digest_path=mbox_path,
+            volume=1, digest_number=1)
+        self._runner.run()
+
+    def test_non_ascii_message(self):
+        msg = Message()
+        msg["From"] = "[email protected]"
+        msg["To"] = "[email protected]"
+        msg["Content-Type"] = "multipart/mixed"
+        msg.attach(MIMEText("message with non-ascii chars: \xc3\xa9",
+                            "plain", "utf-8"))
+        mbox = digest_mbox(self._mlist)
+        mbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf')
+        mbox.add(msg.as_string())
+        self._digestq.enqueue(msg,
+            listname=self._mlist.fqdn_listname,
+            digest_path=mbox_path,
+            volume=1, digest_number=1)
+        self._runner.run()
+        errorlog = open(os.path.join(config.LOG_DIR, "error")).read()
+        # The runner will send the file to the shunt queue on exception
+        self.assertEqual(len(self._shuntq.files), 0, errorlog)
+        # 2 messages in the virgin queue: the digest as plain-text and as multipart
+        self.assertEqual(len(self._virginq.files), 2, errorlog)

_______________________________________________
Mailman-coders mailing list
[email protected]
https://mail.python.org/mailman/listinfo/mailman-coders

Reply via email to