summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurélien Bompard2014-12-09 12:25:45 +0100
committerAurélien Bompard2014-12-09 12:25:45 +0100
commitc11cdd249fe3f3a28da4be703b345d925a14c601 (patch)
treeecde5eb1e283b20eb65e1bb79c6ab77e4caeee39
parent0567d12d3cefc204f056b3b70f5f88b7ec02318a (diff)
downloadmailman-c11cdd249fe3f3a28da4be703b345d925a14c601.tar.gz
mailman-c11cdd249fe3f3a28da4be703b345d925a14c601.tar.zst
mailman-c11cdd249fe3f3a28da4be703b345d925a14c601.zip
-rw-r--r--src/mailman/core/runner.py2
-rw-r--r--src/mailman/core/tests/test_runner.py22
-rw-r--r--src/mailman/email/message.py6
-rw-r--r--src/mailman/handlers/cook_headers.py3
-rw-r--r--src/mailman/handlers/tests/test_cook_headers.py21
-rw-r--r--src/mailman/runners/digest.py4
-rw-r--r--src/mailman/runners/tests/test_digest.py45
-rw-r--r--src/mailman/testing/helpers.py22
8 files changed, 65 insertions, 60 deletions
diff --git a/src/mailman/core/runner.py b/src/mailman/core/runner.py
index de7acdd1c..81a2ea3d1 100644
--- a/src/mailman/core/runner.py
+++ b/src/mailman/core/runner.py
@@ -239,7 +239,7 @@ class Runner:
if mlist is None:
language_manager = getUtility(ILanguageManager)
language = language_manager[config.mailman.default_language]
- elif hasattr(msg, "sender") and msg.sender:
+ elif msg.sender:
member = mlist.members.get_member(msg.sender)
language = (member.preferred_language
if member is not None
diff --git a/src/mailman/core/tests/test_runner.py b/src/mailman/core/tests/test_runner.py
index 06c360fa0..2fd4ae7d6 100644
--- a/src/mailman/core/tests/test_runner.py
+++ b/src/mailman/core/tests/test_runner.py
@@ -27,7 +27,6 @@ __all__ = [
import os
import unittest
-from email.mime.multipart import MIMEMultipart
from mailman.app.lifecycle import create_list
from mailman.config import config
@@ -35,7 +34,8 @@ from mailman.core.runner import Runner
from mailman.interfaces.runner import RunnerCrashEvent
from mailman.testing.helpers import (
configuration, event_subscribers, get_queue_messages, LogFileMark,
- make_testable_runner, specialized_message_from_string as mfs)
+ make_testable_runner, specialized_message_from_string as mfs,
+ make_digest_messages)
from mailman.testing.layers import ConfigLayer
@@ -95,14 +95,16 @@ Message-ID: <ant>
self.assertEqual(len(shunted), 1)
self.assertEqual(shunted[0].msg['message-id'], '<ant>')
- def test_multipart_message(self):
+ def test_digest_messages(self):
+ # Digest messages can be MIMEMultipart (LP#1130696)
runner = make_testable_runner(StoringRunner, 'in')
- msg = MIMEMultipart()
- msg["Message-ID"] = "<ant>"
- config.switchboards['in'].enqueue(msg, listname='test@example.com')
+ make_digest_messages(self._mlist)
+ for bag in get_queue_messages("virgin"):
+ config.switchboards['in'].enqueue(bag.msg, listname='test@example.com')
+ error_log = LogFileMark('mailman.error')
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>")
+ errors = error_log.read()
+ self.assertEqual(len(self._events), 0, errors)
+ self.assertEqual(len(get_queue_messages("shunt")), 0, errors)
+ self.assertEqual(len(runner._disposed), 2)
diff --git a/src/mailman/email/message.py b/src/mailman/email/message.py
index f3a44e63c..1fca952c7 100644
--- a/src/mailman/email/message.py
+++ b/src/mailman/email/message.py
@@ -36,6 +36,7 @@ __all__ = [
import email
import email.message
import email.utils
+import email.mime.multipart
from email.header import Header
@@ -159,6 +160,11 @@ class Message(email.message.Message):
+class MultipartMessage(email.mime.multipart.MIMEMultipart, Message):
+ """Class for MIME digest messages"""
+
+
+
class UserNotification(Message):
"""Class for internally crafted messages."""
diff --git a/src/mailman/handlers/cook_headers.py b/src/mailman/handlers/cook_headers.py
index 20ffc390c..d5d096448 100644
--- a/src/mailman/handlers/cook_headers.py
+++ b/src/mailman/handlers/cook_headers.py
@@ -75,8 +75,7 @@ def process(mlist, msg, msgdata):
# 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.
- if hasattr(msg, "sender"):
- msgdata['original_sender'] = 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:
diff --git a/src/mailman/handlers/tests/test_cook_headers.py b/src/mailman/handlers/tests/test_cook_headers.py
index 1a8fa6cdc..a7121da6d 100644
--- a/src/mailman/handlers/tests/test_cook_headers.py
+++ b/src/mailman/handlers/tests/test_cook_headers.py
@@ -26,10 +26,10 @@ __all__ = [
import unittest
-from email.mime.multipart import MIMEMultipart
from mailman.app.lifecycle import create_list
from mailman.handlers import cook_headers
+from mailman.testing.helpers import get_queue_messages, make_digest_messages
from mailman.testing.layers import ConfigLayer
@@ -42,12 +42,13 @@ class TestCookHeaders(unittest.TestCase):
def setUp(self):
self._mlist = create_list('test@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)
+ def test_process_digest(self):
+ # Digest messages can be MIMEMultipart (LP#1130696)
+ make_digest_messages(self._mlist)
+ messages = [ bag.msg for bag in get_queue_messages("virgin") ]
+ self.assertEqual(len(messages), 2)
+ for msg in messages:
+ try:
+ cook_headers.process(self._mlist, msg, {})
+ except AttributeError as e:
+ self.fail(e)
diff --git a/src/mailman/runners/digest.py b/src/mailman/runners/digest.py
index 98fe82f39..4ccfe0bde 100644
--- a/src/mailman/runners/digest.py
+++ b/src/mailman/runners/digest.py
@@ -32,7 +32,6 @@ import logging
from StringIO import StringIO
from copy import deepcopy
from email.header import Header
-from email.message import Message
from email.mime.message import MIMEMessage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
@@ -42,6 +41,7 @@ from urllib2 import URLError
from mailman.config import config
from mailman.core.i18n import _
from mailman.core.runner import Runner
+from mailman.email.message import Message, MultipartMessage
from mailman.handlers.decorate import decorate
from mailman.interfaces.member import DeliveryMode, DeliveryStatus
from mailman.utilities.i18n import make
@@ -172,7 +172,7 @@ class MIMEDigester(Digester):
self._keepers = set(config.digests.mime_digest_keep_headers.split())
def _make_message(self):
- return MIMEMultipart('mixed')
+ return MultipartMessage('mixed')
def add_toc(self, count):
"""Add the table of contents."""
diff --git a/src/mailman/runners/tests/test_digest.py b/src/mailman/runners/tests/test_digest.py
index 80cf253bc..74508bd7d 100644
--- a/src/mailman/runners/tests/test_digest.py
+++ b/src/mailman/runners/tests/test_digest.py
@@ -35,7 +35,7 @@ from mailman.email.message import Message
from mailman.runners.digest import DigestRunner
from mailman.testing.helpers import (
LogFileMark, digest_mbox, get_queue_messages, make_testable_runner,
- specialized_message_from_string as mfs)
+ specialized_message_from_string as mfs, make_digest_messages)
from mailman.testing.layers import ConfigLayer
@@ -54,23 +54,9 @@ class TestDigest(unittest.TestCase):
self._runner = make_testable_runner(DigestRunner, 'digest')
self._process = config.handlers['to-digest'].process
- def test_simple_message(self):
- msg = mfs("""\
-From: anne@example.org
-To: test@example.com
-
-message triggering a digest
-""")
- 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()
- # There are two messages in the virgin queue: the digest as plain-text
- # and as multipart.
+ def _check_virgin_queue(self):
+ # There should be two messages in the virgin queue: the digest as
+ # plain-text and as multipart.
messages = get_queue_messages('virgin')
self.assertEqual(len(messages), 2)
self.assertEqual(
@@ -80,6 +66,10 @@ message triggering a digest
self.assertEqual(item.msg['subject'],
'Test Digest, Vol 1, Issue 1')
+ def test_simple_message(self):
+ make_digest_messages(self._mlist)
+ self._check_virgin_queue()
+
def test_non_ascii_message(self):
msg = Message()
msg['From'] = 'anne@example.org'
@@ -88,25 +78,10 @@ message triggering a digest
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)
# Use any error logs as the error message if the test fails.
error_log = LogFileMark('mailman.error')
- self._runner.run()
+ make_digest_messages(self._mlist, msg)
# The runner will send the file to the shunt queue on exception.
self.assertEqual(len(self._shuntq.files), 0, error_log.read())
- # There are two messages in the virgin queue: the digest as plain-text
- # and as multipart.
- messages = get_queue_messages('virgin')
- self.assertEqual(len(messages), 2)
- self.assertEqual(
- sorted(item.msg.get_content_type() for item in messages),
- ['multipart/mixed', 'text/plain'])
- for item in messages:
- self.assertEqual(item.msg['subject'],
- 'Test Digest, Vol 1, Issue 1')
+ self._check_virgin_queue()
diff --git a/src/mailman/testing/helpers.py b/src/mailman/testing/helpers.py
index b0fe14a0d..5a9dee0e0 100644
--- a/src/mailman/testing/helpers.py
+++ b/src/mailman/testing/helpers.py
@@ -72,6 +72,7 @@ from mailman.interfaces.member import MemberRole
from mailman.interfaces.messages import IMessageStore
from mailman.interfaces.styles import IStyleManager
from mailman.interfaces.usermanager import IUserManager
+from mailman.runners.digest import DigestRunner
from mailman.utilities.mailbox import Mailbox
@@ -529,3 +530,24 @@ class LogFileMark:
with open(self._filename) as fp:
fp.seek(self._filepos)
return fp.read()
+
+
+
+def make_digest_messages(mlist, msg=None):
+ if msg is None:
+ msg = specialized_message_from_string("""\
+From: anne@example.org
+To: {listname}
+Message-ID: <testing>
+
+message triggering a digest
+""".format(listname=mlist.fqdn_listname))
+ mbox_path = os.path.join(mlist.data_path, 'digest.mmdf')
+ config.handlers['to-digest'].process(mlist, msg, {})
+ config.switchboards['digest'].enqueue(
+ msg,
+ listname=mlist.fqdn_listname,
+ digest_path=mbox_path,
+ volume=1, digest_number=1)
+ runner = make_testable_runner(DigestRunner, 'digest')
+ runner.run()