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

Reply via email to