summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBarry Warsaw2015-04-13 18:28:59 -0400
committerBarry Warsaw2015-04-13 18:28:59 -0400
commit24c01dbd8e93acdc61884b3b9783a0e71fd6df23 (patch)
tree18d2503ae488efa403f9606b9fbdf67298fec7ff /src
parentf7a4e76d24898ec942a0f3a9a932916d9d0662bc (diff)
downloadmailman-24c01dbd8e93acdc61884b3b9783a0e71fd6df23.tar.gz
mailman-24c01dbd8e93acdc61884b3b9783a0e71fd6df23.tar.zst
mailman-24c01dbd8e93acdc61884b3b9783a0e71fd6df23.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/app/subscriptions.py5
-rw-r--r--src/mailman/app/tests/test_subscriptions.py28
-rw-r--r--src/mailman/app/workflow.py4
3 files changed, 36 insertions, 1 deletions
diff --git a/src/mailman/app/subscriptions.py b/src/mailman/app/subscriptions.py
index 6c60a71a4..999b04270 100644
--- a/src/mailman/app/subscriptions.py
+++ b/src/mailman/app/subscriptions.py
@@ -50,6 +50,7 @@ from mailman.interfaces.subscriptions import (
ISubscriptionService, MissingUserError, RequestRecord)
from mailman.interfaces.user import IUser
from mailman.interfaces.usermanager import IUserManager
+from mailman.interfaces.workflow import IWorkflowStateManager
from mailman.model.member import Member
from mailman.utilities.datetime import now
from mailman.utilities.i18n import make
@@ -176,7 +177,6 @@ class SubscriptionWorkflow(Workflow):
# Create a pending record. This will give us the hash token we can use
# to uniquely name this workflow.
pendable = Pendable(
- when=now().isoformat(),
list_id=self.mlist.list_id,
address=self.address.email,
)
@@ -268,6 +268,9 @@ class SubscriptionWorkflow(Workflow):
def _step_do_subscription(self):
# We can immediately subscribe the user to the mailing list.
self.mlist.subscribe(self.subscriber)
+ # This workflow is done so throw away any associated state.
+ getUtility(IWorkflowStateManager).restore(self.name, self.token)
+ self.token = None
def _step_send_confirmation(self):
self.push('do_confirm_verify')
diff --git a/src/mailman/app/tests/test_subscriptions.py b/src/mailman/app/tests/test_subscriptions.py
index bdfa72e29..7bb635a16 100644
--- a/src/mailman/app/tests/test_subscriptions.py
+++ b/src/mailman/app/tests/test_subscriptions.py
@@ -32,12 +32,14 @@ from mailman.interfaces.address import InvalidEmailAddressError
from mailman.interfaces.bans import IBanManager
from mailman.interfaces.member import (
MemberRole, MembershipIsBannedError, MissingPreferredAddressError)
+from mailman.interfaces.pending import IPendings
from mailman.interfaces.subscriptions import (
MissingUserError, ISubscriptionService)
from mailman.testing.helpers import LogFileMark, get_queue_messages
from mailman.testing.layers import ConfigLayer
from mailman.interfaces.mailinglist import SubscriptionPolicy
from mailman.interfaces.usermanager import IUserManager
+from mailman.interfaces.workflow import IWorkflowStateManager
from mailman.utilities.datetime import now
from unittest.mock import patch
from zope.component import getUtility
@@ -343,6 +345,32 @@ class TestSubscriptionWorkflow(unittest.TestCase):
member = self._mlist.regular_members.get_member(self._anne)
self.assertEqual(member.address, anne)
+ def test_do_subscription_cleanups(self):
+ # Once the user is subscribed, the token, and its associated pending
+ # database record will be removed from the database.
+ self._mlist.subscription_policy = SubscriptionPolicy.open
+ anne = self._user_manager.create_address(self._anne)
+ workflow = SubscriptionWorkflow(self._mlist, anne,
+ pre_verified=True,
+ pre_confirmed=True,
+ pre_approved=True)
+ # Cache the token.
+ token = workflow.token
+ # Consume the entire state machine.
+ list(workflow)
+ # Anne is now a member of the mailing list.
+ member = self._mlist.regular_members.get_member(self._anne)
+ self.assertEqual(member.address, anne)
+ # The workflow is done, so it has no token.
+ self.assertIsNone(workflow.token)
+ # The pendable associated with the token has been evicted.
+ self.assertIsNone(getUtility(IPendings).confirm(token, expunge=False))
+ # There is no saved workflow associated with the token.
+ new_workflow = SubscriptionWorkflow(self._mlist)
+ new_workflow.token = token
+ new_workflow.restore()
+ self.assertIsNone(new_workflow.which)
+
def test_moderator_approves(self):
# The workflow runs until moderator approval is required, at which
# point the workflow is saved. Once the moderator approves, the
diff --git a/src/mailman/app/workflow.py b/src/mailman/app/workflow.py
index 9395dc7b7..8006f8e51 100644
--- a/src/mailman/app/workflow.py
+++ b/src/mailman/app/workflow.py
@@ -49,6 +49,10 @@ class Workflow:
self.debug = False
self._count = 0
+ @property
+ def name(self):
+ return self.__class__.__name__
+
def __iter__(self):
return self