From 61bfb1eef4ff901cd1e59e2f70db16db4c2fb6e8 Mon Sep 17 00:00:00 2001 From: Mark Sapiro Date: Sun, 18 Mar 2012 15:05:50 -0700 Subject: * Added a unit test for rules/approved.py * Renamed rules/docs/approve.py to approved.py for consistency. --- src/mailman/docs/NEWS.rst | 2 + src/mailman/rules/docs/approve.rst | 514 ------------------------------- src/mailman/rules/docs/approved.rst | 514 +++++++++++++++++++++++++++++++ src/mailman/rules/tests/__init__.py | 0 src/mailman/rules/tests/test_approved.py | 74 +++++ 5 files changed, 590 insertions(+), 514 deletions(-) delete mode 100644 src/mailman/rules/docs/approve.rst create mode 100644 src/mailman/rules/docs/approved.rst create mode 100644 src/mailman/rules/tests/__init__.py create mode 100644 src/mailman/rules/tests/test_approved.py diff --git a/src/mailman/docs/NEWS.rst b/src/mailman/docs/NEWS.rst index b92a3b618..21deef544 100644 --- a/src/mailman/docs/NEWS.rst +++ b/src/mailman/docs/NEWS.rst @@ -126,6 +126,8 @@ Commands Bug fixes --------- + * Fixed a UnicodeError with non-ascii message bodies in rules/approved.py + (LP: #949924) * Subscription disabled probe warning notification messages are now sent without a `Precedence:` header. Given by Mark Sapiro. (LP: #808821) * Fixed KeyError in retry runner, contributed by Stephen A. Goss. diff --git a/src/mailman/rules/docs/approve.rst b/src/mailman/rules/docs/approve.rst deleted file mode 100644 index 3e1206563..000000000 --- a/src/mailman/rules/docs/approve.rst +++ /dev/null @@ -1,514 +0,0 @@ -===================== -Pre-approved postings -===================== - -Messages can contain a pre-approval, which is used to bypass the message -approval queue. This has several use cases: - -- A list administrator can send an emergency message to the mailing list from - an unregistered address, say if they are away from their normal email. - -- An automated script can be programmed to send a message to an otherwise - moderated list. - -In order to support this, a mailing list can be given a *moderator password* -which is shared among all the administrators. - - >>> mlist = create_list('_xtest@example.com') - >>> mlist.moderator_password = 'abcxyz' - -The ``approved`` rule determines whether the message contains the proper -approval or not. - - >>> rule = config.rules['approved'] - >>> print rule.name - approved - - -No approval -=========== - -If the message has no ``Approve:`` or ``Approved:`` header (or their ``X-`` -equivalents), then the rule does not match. - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... - ... An important message. - ... """) - >>> rule.check(mlist, msg, {}) - False - -If the message has an ``Approve:``, ``Approved:``, ``X-Approve:``, or -``X-Approved:`` header with a value that does not match the moderator -password, then the rule does not match. However, the header is still removed. -:: - - >>> msg['Approve'] = '12345' - >>> rule.check(mlist, msg, {}) - False - >>> print msg['approve'] - None - - >>> del msg['approve'] - >>> msg['Approved'] = '12345' - >>> rule.check(mlist, msg, {}) - False - >>> print msg['approved'] - None - - >>> del msg['approved'] - >>> msg['X-Approve'] = '12345' - >>> rule.check(mlist, msg, {}) - False - >>> print msg['x-approve'] - None - - >>> del msg['x-approve'] - >>> msg['X-Approved'] = '12345' - >>> rule.check(mlist, msg, {}) - False - >>> print msg['x-approved'] - None - - >>> del msg['x-approved'] - - -Using an approval header -======================== - -If the moderator password is given in an ``Approve:`` header, then the rule -matches, and the ``Approve:`` header is stripped. - - >>> msg['Approve'] = 'abcxyz' - >>> rule.check(mlist, msg, {}) - True - >>> print msg['approve'] - None - -Similarly, for the ``Approved:`` header. - - >>> del msg['approve'] - >>> msg['Approved'] = 'abcxyz' - >>> rule.check(mlist, msg, {}) - True - >>> print msg['approved'] - None - -The headers ``X-Approve:`` and ``X-Approved:`` are treated the same way. -:: - - >>> del msg['approved'] - >>> msg['X-Approve'] = 'abcxyz' - >>> rule.check(mlist, msg, {}) - True - >>> print msg['x-approve'] - None - - >>> del msg['x-approve'] - >>> msg['X-Approved'] = 'abcxyz' - >>> rule.check(mlist, msg, {}) - True - >>> print msg['x-approved'] - None - - >>> del msg['x-approved'] - - -Using a pseudo-header -===================== - -Different mail user agents have varying degrees to which they support custom -headers like ``Approve:`` and ``Approved:``. For this reason, Mailman also -supports using a *pseudo-header*, which is really just the first -non-whitespace line in the payload of the message. If this pseudo-header -looks like a matching ``Approve:`` or ``Approved:`` header, the message is -similarly allowed to pass. - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... - ... Approve: abcxyz - ... An important message. - ... """) - >>> rule.check(mlist, msg, {}) - True - -The pseudo-header is removed. - - >>> print msg.as_string() - From: aperson@example.com - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - - -Similarly for the ``Approved:`` header. -:: - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... - ... Approved: abcxyz - ... An important message. - ... """) - >>> rule.check(mlist, msg, {}) - True - - >>> print msg.as_string() - From: aperson@example.com - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - - -As before, a mismatch in the pseudo-header does not approve the message, but -the pseudo-header line is still removed. -:: - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... - ... Approve: 123456 - ... An important message. - ... """) - >>> rule.check(mlist, msg, {}) - False - - >>> print msg.as_string() - From: aperson@example.com - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - - -Similarly for the ``Approved:`` header. -:: - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... - ... Approved: 123456 - ... An important message. - ... """) - >>> rule.check(mlist, msg, {}) - False - - >>> print msg.as_string() - From: aperson@example.com - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - - - -MIME multipart support -====================== - -Mailman searches for the pseudo-header as the first non-whitespace line in the -first ``text/plain`` message part of the message. This allows the feature to -be used with MIME documents. - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... MIME-Version: 1.0 - ... Content-Type: multipart/mixed; boundary="AAA" - ... - ... --AAA - ... Content-Type: application/x-ignore - ... - ... Approve: 123456 - ... The above line will be ignored. - ... - ... --AAA - ... Content-Type: text/plain - ... - ... Approve: abcxyz - ... An important message. - ... --AAA-- - ... """) - >>> rule.check(mlist, msg, {}) - True - -Like before, the pseudo-header is removed, but only from the text parts. - - >>> print msg.as_string() - From: aperson@example.com - MIME-Version: 1.0 - Content-Type: multipart/mixed; boundary="AAA" - - --AAA - Content-Type: application/x-ignore - - Approve: 123456 - The above line will be ignored. - - --AAA - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - --AAA-- - - -The same goes for the ``Approved:`` message. - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... MIME-Version: 1.0 - ... Content-Type: multipart/mixed; boundary="AAA" - ... - ... --AAA - ... Content-Type: application/x-ignore - ... - ... Approved: 123456 - ... The above line will be ignored. - ... - ... --AAA - ... Content-Type: text/plain - ... - ... Approved: abcxyz - ... An important message. - ... --AAA-- - ... """) - >>> rule.check(mlist, msg, {}) - True - -And the header is removed. - - >>> print msg.as_string() - From: aperson@example.com - MIME-Version: 1.0 - Content-Type: multipart/mixed; boundary="AAA" - - --AAA - Content-Type: application/x-ignore - - Approved: 123456 - The above line will be ignored. - - --AAA - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - --AAA-- - - -Here, the correct password is in the non-``text/plain`` part, so it is ignored. - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... MIME-Version: 1.0 - ... Content-Type: multipart/mixed; boundary="AAA" - ... - ... --AAA - ... Content-Type: application/x-ignore - ... - ... Approve: abcxyz - ... The above line will be ignored. - ... - ... --AAA - ... Content-Type: text/plain - ... - ... Approve: 123456 - ... An important message. - ... --AAA-- - ... """) - >>> rule.check(mlist, msg, {}) - False - -And yet the pseudo-header is still stripped. - - >>> print msg.as_string() - From: aperson@example.com - MIME-Version: 1.0 - Content-Type: multipart/mixed; boundary="AAA" - - --AAA - Content-Type: application/x-ignore - - Approve: abcxyz - The above line will be ignored. - - --AAA - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - --AAA-- - -As before, the same goes for the ``Approved:`` header. - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... MIME-Version: 1.0 - ... Content-Type: multipart/mixed; boundary="AAA" - ... - ... --AAA - ... Content-Type: application/x-ignore - ... - ... Approved: abcxyz - ... The above line will be ignored. - ... - ... --AAA - ... Content-Type: text/plain - ... - ... Approved: 123456 - ... An important message. - ... --AAA-- - ... """) - >>> rule.check(mlist, msg, {}) - False - -And the pseudo-header is removed. - - >>> print msg.as_string() - From: aperson@example.com - MIME-Version: 1.0 - Content-Type: multipart/mixed; boundary="AAA" - - --AAA - Content-Type: application/x-ignore - - Approved: abcxyz - The above line will be ignored. - - --AAA - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - --AAA-- - - -Stripping text/html parts -========================= - -Because some mail readers will include both a ``text/plain`` part and a -``text/html`` alternative, the ``approved`` rule has to search the -alternatives and strip anything that looks like an ``Approve:`` or -``Approved:`` headers. - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... MIME-Version: 1.0 - ... Content-Type: multipart/mixed; boundary="AAA" - ... - ... --AAA - ... Content-Type: text/html - ... - ... - ... - ... - ... Approved: abcxyz - ...

The above line will be ignored. - ... - ... - ... - ... --AAA - ... Content-Type: text/plain - ... - ... Approved: abcxyz - ... An important message. - ... --AAA-- - ... """) - >>> rule.check(mlist, msg, {}) - True - -And the header-like text in the ``text/html`` part was stripped. - - >>> print msg.as_string() - From: aperson@example.com - MIME-Version: 1.0 - Content-Type: multipart/mixed; boundary="AAA" - - --AAA - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/html; charset="us-ascii" - - - - - -

The above line will be ignored. - - - - --AAA - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - --AAA-- - - -This is true even if the rule does not match. -:: - - >>> msg = message_from_string("""\ - ... From: aperson@example.com - ... MIME-Version: 1.0 - ... Content-Type: multipart/mixed; boundary="AAA" - ... - ... --AAA - ... Content-Type: text/html - ... - ... - ... - ... - ... Approve: 123456 - ...

The above line will be ignored. - ... - ... - ... - ... --AAA - ... Content-Type: text/plain - ... - ... Approve: 123456 - ... An important message. - ... --AAA-- - ... """) - >>> rule.check(mlist, msg, {}) - False - - >>> print msg.as_string() - From: aperson@example.com - MIME-Version: 1.0 - Content-Type: multipart/mixed; boundary="AAA" - - --AAA - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/html; charset="us-ascii" - - - - - -

The above line will be ignored. - - - - --AAA - Content-Transfer-Encoding: 7bit - MIME-Version: 1.0 - Content-Type: text/plain; charset="us-ascii" - - An important message. - --AAA-- - diff --git a/src/mailman/rules/docs/approved.rst b/src/mailman/rules/docs/approved.rst new file mode 100644 index 000000000..3e1206563 --- /dev/null +++ b/src/mailman/rules/docs/approved.rst @@ -0,0 +1,514 @@ +===================== +Pre-approved postings +===================== + +Messages can contain a pre-approval, which is used to bypass the message +approval queue. This has several use cases: + +- A list administrator can send an emergency message to the mailing list from + an unregistered address, say if they are away from their normal email. + +- An automated script can be programmed to send a message to an otherwise + moderated list. + +In order to support this, a mailing list can be given a *moderator password* +which is shared among all the administrators. + + >>> mlist = create_list('_xtest@example.com') + >>> mlist.moderator_password = 'abcxyz' + +The ``approved`` rule determines whether the message contains the proper +approval or not. + + >>> rule = config.rules['approved'] + >>> print rule.name + approved + + +No approval +=========== + +If the message has no ``Approve:`` or ``Approved:`` header (or their ``X-`` +equivalents), then the rule does not match. + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... + ... An important message. + ... """) + >>> rule.check(mlist, msg, {}) + False + +If the message has an ``Approve:``, ``Approved:``, ``X-Approve:``, or +``X-Approved:`` header with a value that does not match the moderator +password, then the rule does not match. However, the header is still removed. +:: + + >>> msg['Approve'] = '12345' + >>> rule.check(mlist, msg, {}) + False + >>> print msg['approve'] + None + + >>> del msg['approve'] + >>> msg['Approved'] = '12345' + >>> rule.check(mlist, msg, {}) + False + >>> print msg['approved'] + None + + >>> del msg['approved'] + >>> msg['X-Approve'] = '12345' + >>> rule.check(mlist, msg, {}) + False + >>> print msg['x-approve'] + None + + >>> del msg['x-approve'] + >>> msg['X-Approved'] = '12345' + >>> rule.check(mlist, msg, {}) + False + >>> print msg['x-approved'] + None + + >>> del msg['x-approved'] + + +Using an approval header +======================== + +If the moderator password is given in an ``Approve:`` header, then the rule +matches, and the ``Approve:`` header is stripped. + + >>> msg['Approve'] = 'abcxyz' + >>> rule.check(mlist, msg, {}) + True + >>> print msg['approve'] + None + +Similarly, for the ``Approved:`` header. + + >>> del msg['approve'] + >>> msg['Approved'] = 'abcxyz' + >>> rule.check(mlist, msg, {}) + True + >>> print msg['approved'] + None + +The headers ``X-Approve:`` and ``X-Approved:`` are treated the same way. +:: + + >>> del msg['approved'] + >>> msg['X-Approve'] = 'abcxyz' + >>> rule.check(mlist, msg, {}) + True + >>> print msg['x-approve'] + None + + >>> del msg['x-approve'] + >>> msg['X-Approved'] = 'abcxyz' + >>> rule.check(mlist, msg, {}) + True + >>> print msg['x-approved'] + None + + >>> del msg['x-approved'] + + +Using a pseudo-header +===================== + +Different mail user agents have varying degrees to which they support custom +headers like ``Approve:`` and ``Approved:``. For this reason, Mailman also +supports using a *pseudo-header*, which is really just the first +non-whitespace line in the payload of the message. If this pseudo-header +looks like a matching ``Approve:`` or ``Approved:`` header, the message is +similarly allowed to pass. + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... + ... Approve: abcxyz + ... An important message. + ... """) + >>> rule.check(mlist, msg, {}) + True + +The pseudo-header is removed. + + >>> print msg.as_string() + From: aperson@example.com + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + + +Similarly for the ``Approved:`` header. +:: + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... + ... Approved: abcxyz + ... An important message. + ... """) + >>> rule.check(mlist, msg, {}) + True + + >>> print msg.as_string() + From: aperson@example.com + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + + +As before, a mismatch in the pseudo-header does not approve the message, but +the pseudo-header line is still removed. +:: + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... + ... Approve: 123456 + ... An important message. + ... """) + >>> rule.check(mlist, msg, {}) + False + + >>> print msg.as_string() + From: aperson@example.com + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + + +Similarly for the ``Approved:`` header. +:: + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... + ... Approved: 123456 + ... An important message. + ... """) + >>> rule.check(mlist, msg, {}) + False + + >>> print msg.as_string() + From: aperson@example.com + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + + + +MIME multipart support +====================== + +Mailman searches for the pseudo-header as the first non-whitespace line in the +first ``text/plain`` message part of the message. This allows the feature to +be used with MIME documents. + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... MIME-Version: 1.0 + ... Content-Type: multipart/mixed; boundary="AAA" + ... + ... --AAA + ... Content-Type: application/x-ignore + ... + ... Approve: 123456 + ... The above line will be ignored. + ... + ... --AAA + ... Content-Type: text/plain + ... + ... Approve: abcxyz + ... An important message. + ... --AAA-- + ... """) + >>> rule.check(mlist, msg, {}) + True + +Like before, the pseudo-header is removed, but only from the text parts. + + >>> print msg.as_string() + From: aperson@example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="AAA" + + --AAA + Content-Type: application/x-ignore + + Approve: 123456 + The above line will be ignored. + + --AAA + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + --AAA-- + + +The same goes for the ``Approved:`` message. + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... MIME-Version: 1.0 + ... Content-Type: multipart/mixed; boundary="AAA" + ... + ... --AAA + ... Content-Type: application/x-ignore + ... + ... Approved: 123456 + ... The above line will be ignored. + ... + ... --AAA + ... Content-Type: text/plain + ... + ... Approved: abcxyz + ... An important message. + ... --AAA-- + ... """) + >>> rule.check(mlist, msg, {}) + True + +And the header is removed. + + >>> print msg.as_string() + From: aperson@example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="AAA" + + --AAA + Content-Type: application/x-ignore + + Approved: 123456 + The above line will be ignored. + + --AAA + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + --AAA-- + + +Here, the correct password is in the non-``text/plain`` part, so it is ignored. + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... MIME-Version: 1.0 + ... Content-Type: multipart/mixed; boundary="AAA" + ... + ... --AAA + ... Content-Type: application/x-ignore + ... + ... Approve: abcxyz + ... The above line will be ignored. + ... + ... --AAA + ... Content-Type: text/plain + ... + ... Approve: 123456 + ... An important message. + ... --AAA-- + ... """) + >>> rule.check(mlist, msg, {}) + False + +And yet the pseudo-header is still stripped. + + >>> print msg.as_string() + From: aperson@example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="AAA" + + --AAA + Content-Type: application/x-ignore + + Approve: abcxyz + The above line will be ignored. + + --AAA + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + --AAA-- + +As before, the same goes for the ``Approved:`` header. + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... MIME-Version: 1.0 + ... Content-Type: multipart/mixed; boundary="AAA" + ... + ... --AAA + ... Content-Type: application/x-ignore + ... + ... Approved: abcxyz + ... The above line will be ignored. + ... + ... --AAA + ... Content-Type: text/plain + ... + ... Approved: 123456 + ... An important message. + ... --AAA-- + ... """) + >>> rule.check(mlist, msg, {}) + False + +And the pseudo-header is removed. + + >>> print msg.as_string() + From: aperson@example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="AAA" + + --AAA + Content-Type: application/x-ignore + + Approved: abcxyz + The above line will be ignored. + + --AAA + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + --AAA-- + + +Stripping text/html parts +========================= + +Because some mail readers will include both a ``text/plain`` part and a +``text/html`` alternative, the ``approved`` rule has to search the +alternatives and strip anything that looks like an ``Approve:`` or +``Approved:`` headers. + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... MIME-Version: 1.0 + ... Content-Type: multipart/mixed; boundary="AAA" + ... + ... --AAA + ... Content-Type: text/html + ... + ... + ... + ... + ... Approved: abcxyz + ...

The above line will be ignored. + ... + ... + ... + ... --AAA + ... Content-Type: text/plain + ... + ... Approved: abcxyz + ... An important message. + ... --AAA-- + ... """) + >>> rule.check(mlist, msg, {}) + True + +And the header-like text in the ``text/html`` part was stripped. + + >>> print msg.as_string() + From: aperson@example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="AAA" + + --AAA + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/html; charset="us-ascii" + + + + + +

The above line will be ignored. + + + + --AAA + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + --AAA-- + + +This is true even if the rule does not match. +:: + + >>> msg = message_from_string("""\ + ... From: aperson@example.com + ... MIME-Version: 1.0 + ... Content-Type: multipart/mixed; boundary="AAA" + ... + ... --AAA + ... Content-Type: text/html + ... + ... + ... + ... + ... Approve: 123456 + ...

The above line will be ignored. + ... + ... + ... + ... --AAA + ... Content-Type: text/plain + ... + ... Approve: 123456 + ... An important message. + ... --AAA-- + ... """) + >>> rule.check(mlist, msg, {}) + False + + >>> print msg.as_string() + From: aperson@example.com + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="AAA" + + --AAA + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/html; charset="us-ascii" + + + + + +

The above line will be ignored. + + + + --AAA + Content-Transfer-Encoding: 7bit + MIME-Version: 1.0 + Content-Type: text/plain; charset="us-ascii" + + An important message. + --AAA-- + diff --git a/src/mailman/rules/tests/__init__.py b/src/mailman/rules/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/mailman/rules/tests/test_approved.py b/src/mailman/rules/tests/test_approved.py new file mode 100644 index 000000000..79e3c84e2 --- /dev/null +++ b/src/mailman/rules/tests/test_approved.py @@ -0,0 +1,74 @@ +# Copyright (C) 2012 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 . + +"""Test the mime_delete handler.""" + +from __future__ import absolute_import, print_function, unicode_literals + +__metaclass__ = type +__all__ = [ + 'TestApproved', + ] + + +import unittest + +from zope.component import getUtility + +from mailman.app.lifecycle import create_list +from mailman.config import config +from mailman.core import errors +from mailman.interfaces.action import FilterAction +from mailman.interfaces.member import MemberRole +from mailman.interfaces.usermanager import IUserManager +from mailman.rules import approved +from mailman.testing.helpers import ( + LogFileMark, + get_queue_messages, + specialized_message_from_string as mfs) +from mailman.testing.layers import ConfigLayer + + + +class TestApproved(unittest.TestCase): + """Test the approved handler.""" + + layer = ConfigLayer + + def setUp(self): + self._mlist = create_list('test@example.com') + self._rule = approved.Approved() + self._msg = mfs("""\ +From: anne@example.com +To: test@example.com +Subject: A Message with non-ascii body +Message-ID: +MIME-Version: 1.0 +Content-Type: text/plain; charset="iso-8859-1" +Content-Transfer-Encoding: quoted-printable + +This is a message body with a non-ascii character =E4 + +""") + + def test_approved_nonascii(self): + result = True + try: + result = self._rule.check(self._mlist, self._msg, {}) + except (UnicodeError, UnicodeWarning): + raise AssertionError('Non-ascii message raised UnicodeError') + self.assertEqual(result, False) -- cgit v1.3.1