summaryrefslogtreecommitdiff
path: root/src/mailman/commands/eml_membership.py
diff options
context:
space:
mode:
authorMark Sapiro2016-10-22 12:24:00 -0700
committerMark Sapiro2016-10-22 12:24:00 -0700
commitcbb0847d59fb8b77f634a7209b0dc8170023b6f5 (patch)
tree2469f7eb074a4ab6d9579133987b7fde503732a4 /src/mailman/commands/eml_membership.py
parentd1954d1705a987524bb25ecb8cdbace6de56fa5b (diff)
parent3cf613f56e44bed4bc45f533e6f6263288e66460 (diff)
downloadmailman-cbb0847d59fb8b77f634a7209b0dc8170023b6f5.tar.gz
mailman-cbb0847d59fb8b77f634a7209b0dc8170023b6f5.tar.zst
mailman-cbb0847d59fb8b77f634a7209b0dc8170023b6f5.zip
Diffstat (limited to 'src/mailman/commands/eml_membership.py')
-rw-r--r--src/mailman/commands/eml_membership.py39
1 files changed, 27 insertions, 12 deletions
diff --git a/src/mailman/commands/eml_membership.py b/src/mailman/commands/eml_membership.py
index 7d3704e14..e658e7b58 100644
--- a/src/mailman/commands/eml_membership.py
+++ b/src/mailman/commands/eml_membership.py
@@ -22,8 +22,8 @@ from mailman import public
from mailman.core.i18n import _
from mailman.interfaces.command import ContinueProcessing, IEmailCommand
from mailman.interfaces.member import DeliveryMode, MemberRole
-from mailman.interfaces.registrar import IRegistrar
-from mailman.interfaces.subscriptions import ISubscriptionService
+from mailman.interfaces.subscriptions import (
+ ISubscriptionManager, ISubscriptionService)
from mailman.interfaces.usermanager import IUserManager
from zope.component import getUtility
from zope.interface import implementer
@@ -31,7 +31,7 @@ from zope.interface import implementer
def match_subscriber(email, display_name):
# Return something matching the email which should be used as the
- # subscriber by the IRegistrar interface.
+ # subscriber by the ISubscriptionManager interface.
manager = getUtility(IUserManager)
# Is there a user with a preferred address matching the email?
user = manager.get_user(email)
@@ -101,7 +101,7 @@ used.
print(_('$person is already a member'), file=results)
return ContinueProcessing.yes
subscriber = match_subscriber(email, display_name)
- IRegistrar(mlist).register(subscriber)
+ ISubscriptionManager(mlist).register(subscriber)
print(_('Confirmation email sent to $person'), file=results)
return ContinueProcessing.yes
@@ -173,6 +173,7 @@ You may be asked to confirm your request.""")
print(_('Invalid or unverified email address: $email'),
file=results)
return ContinueProcessing.no
+ already_left = msgdata.setdefault('leaves', set())
for user_address in user.addresses:
# Only recognize verified addresses.
if user_address.verified_on is None:
@@ -181,14 +182,28 @@ You may be asked to confirm your request.""")
if member is not None:
break
else:
- # None of the user's addresses are subscribed to this mailing list.
- print(_(
- '$self.name: $email is not a member of $mlist.fqdn_listname'),
- file=results)
- return ContinueProcessing.no
- member.unsubscribe()
- person = formataddr((user.display_name, email)) # noqa: F841
- print(_('$person left $mlist.fqdn_listname'), file=results)
+ # There are two possible situations. Either none of the user's
+ # addresses are subscribed to this mailing list, or this command
+ # email *already* unsubscribed the user from the mailing list.
+ # E.g. if a message was sent to the -leave address and it
+ # contained the 'leave' command. Don't send a bogus response in
+ # this case, just ignore subsequent leaves of the same address.
+ if email not in already_left:
+ print(_('$self.name: $email is not a member of '
+ '$mlist.fqdn_listname'), file=results)
+ return ContinueProcessing.no
+ if email in already_left:
+ return ContinueProcessing.yes
+ # Ignore any subsequent 'leave' commands.
+ already_left.add(email)
+ manager = ISubscriptionManager(mlist)
+ token, token_owner, member = manager.unregister(user_address)
+ person = formataddr((user.display_name, email)) # noqa
+ if member is None:
+ print(_('$person left $mlist.fqdn_listname'), file=results)
+ else:
+ print(_('Confirmation email sent to $person to leave'
+ ' $mlist.fqdn_listname'), file=results)
return ContinueProcessing.yes