Barry Warsaw pushed to branch release-3.0 at mailman / Mailman
Commits: bfce66e7 by Barry Warsaw at 2015-10-31T20:54:26Z * Fix the processing of subscription confirmation messages when the mailing list is set to confirm-then-moderate. (Closes #114) - - - - - 3 changed files: - src/mailman/commands/eml_confirm.py - src/mailman/commands/tests/test_confirm.py - src/mailman/docs/NEWS.rst Changes: ===================================== src/mailman/commands/eml_confirm.py ===================================== --- a/src/mailman/commands/eml_confirm.py +++ b/src/mailman/commands/eml_confirm.py @@ -54,11 +54,16 @@ class Confirm: tokens.add(token) results.confirms = tokens try: - token, token_owner, member = IRegistrar(mlist).confirm(token) - if token is None: + new_token, token_owner, member = IRegistrar(mlist).confirm(token) + if new_token is None: assert token_owner is TokenOwner.no_one, token_owner assert member is not None, member succeeded = True + elif token_owner is TokenOwner.moderator: + # This must have been a confirm-then-moderator subscription. + assert new_token != token + assert member is None, member + succeeded = True else: assert token_owner is not TokenOwner.no_one, token_owner assert member is None, member ===================================== src/mailman/commands/tests/test_confirm.py ===================================== --- a/src/mailman/commands/tests/test_confirm.py +++ b/src/mailman/commands/tests/test_confirm.py @@ -19,6 +19,7 @@ __all__ = [ 'TestConfirm', + 'TestEmailResponses', ] @@ -26,12 +27,14 @@ import unittest from mailman.app.lifecycle import create_list from mailman.commands.eml_confirm import Confirm +from mailman.config import config from mailman.email.message import Message from mailman.interfaces.command import ContinueProcessing +from mailman.interfaces.mailinglist import SubscriptionPolicy from mailman.interfaces.registrar import IRegistrar from mailman.interfaces.usermanager import IUserManager -from mailman.runners.command import Results -from mailman.testing.helpers import get_queue_messages +from mailman.runners.command import CommandRunner, Results +from mailman.testing.helpers import get_queue_messages, make_testable_runner from mailman.testing.layers import ConfigLayer from zope.component import getUtility @@ -76,3 +79,82 @@ class TestConfirm(unittest.TestCase): # There will be no messages in the queue. messages = get_queue_messages('virgin') self.assertEqual(len(messages), 0) + + +class TestEmailResponses(unittest.TestCase): + """Test the `confirm` command through the command runner.""" + + layer = ConfigLayer + + def setUp(self): + self._mlist = create_list('t...@example.com') + + def test_confirm_then_moderate_workflow(self): + # Issue #114 describes a problem when confirming the moderation email. + self._mlist.subscription_policy = \ + SubscriptionPolicy.confirm_then_moderate + bart = getUtility(IUserManager).create_address( + 'b...@example.com', 'Bart Person') + # Clear any previously queued confirmation messages. + get_queue_messages('virgin') + self._token, token_owner, member = IRegistrar(self._mlist).register( + bart) + # There should now be one email message in the virgin queue, i.e. the + # confirmation message sent to Bart. + items = get_queue_messages('virgin') + self.assertEqual(len(items), 1) + msg = items[0].msg + # Confirmations come first, so this one goes to the subscriber. + self.assertEqual(msg['to'], 'b...@example.com') + confirm, token = str(msg['subject']).split() + self.assertEqual(confirm, 'confirm') + self.assertEqual(token, self._token) + # Craft a confirmation response with the expected tokens. + user_response = Message() + user_response['From'] = 'b...@example.com' + user_response['To'] = 'test-confirm+{}@example.com'.format(token) + user_response['Subject'] = 'Re: confirm {}'.format(token) + user_response.set_payload('') + # Process the message through the command runner. + config.switchboards['command'].enqueue( + user_response, listid='test.example.com') + make_testable_runner(CommandRunner, 'command').run() + # There are now two messages in the virgin queue. One is going to the + # subscriber containing the results of their confirmation message, and + # the other is to the moderators informing them that they need to + # handle the moderation queue. + items = get_queue_messages('virgin') + self.assertEqual(len(items), 2) + if items[0].msg['to'] == 'b...@example.com': + results = items[0].msg + moderator_msg = items[1].msg + else: + results = items[1].msg + moderator_msg = items[0].msg + # Check the moderator message first. + self.assertEqual(moderator_msg['to'], 'test-ow...@example.com') + self.assertEqual( + moderator_msg['subject'], + 'New subscription request to Test from b...@example.com') + lines = moderator_msg.get_payload().splitlines() + self.assertEqual( + lines[-2].strip(), + 'For: Bart Person <b...@example.com>') + self.assertEqual(lines[-1].strip(), 'List: t...@example.com') + # Now check the results message. + self.assertEqual( + str(results['subject']), 'The results of your email commands') + self.assertMultiLineEqual(results.get_payload(), """\ +The results of your email command are provided below. + +- Original message details: +From: b...@example.com +Subject: Re: confirm {} +Date: n/a +Message-ID: n/a + +- Results: +Confirmed + +- Done. +""".format(token)) ===================================== src/mailman/docs/NEWS.rst ===================================== --- a/src/mailman/docs/NEWS.rst +++ b/src/mailman/docs/NEWS.rst @@ -50,6 +50,8 @@ Bugs * Collapse multiple ``Re:`` in Subject headers. Given by Mark Sapiro. (Closes: #147) * Added Trove classifiers to setup.py. (Closes: #152) + * Fix the processing of subscription confirmation messages when the mailing + list is set to confirm-then-moderate. (Closes #114) 3.0.0 -- "Show Don't Tell" View it on GitLab: https://gitlab.com/mailman/mailman/commit/bfce66e70497bc8981d2df6dc891ff94f60d45f9
_______________________________________________ Mailman-checkins mailing list Mailman-checkins@python.org Unsubscribe: https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org