summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/app/subscriptions.py19
-rw-r--r--src/mailman/rest/members.py7
-rw-r--r--src/mailman/rest/tests/test_membership.py15
3 files changed, 37 insertions, 4 deletions
diff --git a/src/mailman/app/subscriptions.py b/src/mailman/app/subscriptions.py
index 07d8e17da..0d1e979f5 100644
--- a/src/mailman/app/subscriptions.py
+++ b/src/mailman/app/subscriptions.py
@@ -32,7 +32,9 @@ from mailman.interfaces.address import IAddress
from mailman.interfaces.bans import IBanManager
from mailman.interfaces.listmanager import ListDeletingEvent
from mailman.interfaces.mailinglist import SubscriptionPolicy
-from mailman.interfaces.member import MembershipIsBannedError, NotAMemberError
+from mailman.interfaces.member import (
+ AlreadySubscribedError, MemberRole, MembershipIsBannedError,
+ NotAMemberError)
from mailman.interfaces.pending import IPendable, IPendings
from mailman.interfaces.subscriptions import (
ISubscriptionManager, ISubscriptionService,
@@ -198,6 +200,21 @@ class SubscriptionWorkflow(_SubscriptionWorkflowCommon):
self.address = addresses[0]
assert self.user is not None and self.address is not None, (
'Insane sanity check results')
+ # Is this subscriber already a member?
+ if (self.which is WhichSubscriber.user and
+ self.user.preferred_address is not None):
+ subscriber = self.user
+ else:
+ subscriber = self.address
+ if self.mlist.is_subscribed(subscriber):
+ # 2017-04-22 BAW: This branch actually *does* get covered, as I've
+ # verified by a full coverage run, but diffcov for some reason
+ # claims that the test added in the branch that added this code
+ # does not cover the change. That seems like a bug in diffcov.
+ raise AlreadySubscribedError( # pragma: no cover
+ self.mlist.fqdn_listname,
+ self.address.email,
+ MemberRole.member)
# Is this email address banned?
if IBanManager(self.mlist).is_banned(self.address.email):
raise MembershipIsBannedError(self.mlist, self.address.email)
diff --git a/src/mailman/rest/members.py b/src/mailman/rest/members.py
index ba5c3c35f..3ff712259 100644
--- a/src/mailman/rest/members.py
+++ b/src/mailman/rest/members.py
@@ -17,6 +17,7 @@
"""REST for members."""
+from lazr.config import as_boolean
from mailman.app.membership import add_member, delete_member
from mailman.interfaces.action import Action
from mailman.interfaces.address import IAddress
@@ -204,9 +205,9 @@ class AllMembers(_MemberBase):
display_name=str,
delivery_mode=enum_validator(DeliveryMode),
role=enum_validator(MemberRole),
- pre_verified=bool,
- pre_confirmed=bool,
- pre_approved=bool,
+ pre_verified=as_boolean,
+ pre_confirmed=as_boolean,
+ pre_approved=as_boolean,
_optional=('delivery_mode', 'display_name', 'role',
'pre_verified', 'pre_confirmed', 'pre_approved'))
arguments = validator(request)
diff --git a/src/mailman/rest/tests/test_membership.py b/src/mailman/rest/tests/test_membership.py
index 6b4f5195a..e5a2ce283 100644
--- a/src/mailman/rest/tests/test_membership.py
+++ b/src/mailman/rest/tests/test_membership.py
@@ -98,6 +98,21 @@ class TestMembership(unittest.TestCase):
self.assertEqual(cm.exception.code, 409)
self.assertEqual(cm.exception.reason, 'Member already subscribed')
+ def test_try_to_join_a_list_twice_issue260(self):
+ with transaction():
+ anne = self._usermanager.create_address('anne@example.com')
+ self._mlist.subscribe(anne)
+ with self.assertRaises(HTTPError) as cm:
+ call_api('http://localhost:9001/3.0/members', {
+ 'list_id': 'test.example.com',
+ 'subscriber': 'anne@example.com',
+ 'pre_verified': False,
+ 'pre_confirmed': False,
+ 'pre_approved': False,
+ })
+ self.assertEqual(cm.exception.code, 409)
+ self.assertEqual(cm.exception.reason, 'Member already subscribed')
+
def test_subscribe_user_without_preferred_address(self):
with transaction():
getUtility(IUserManager).create_user('anne@example.com')