summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw2016-02-15 12:10:44 -0500
committerBarry Warsaw2016-02-15 12:10:44 -0500
commit6a8cbd3b1f3fb7f3806eadb131700091d32a31b4 (patch)
tree7a9bd5753b098380fa01d2007c30209923a36f25
parent407adc0e44c7487e78643c5185c49f1a1bedd7d6 (diff)
downloadmailman-6a8cbd3b1f3fb7f3806eadb131700091d32a31b4.tar.gz
mailman-6a8cbd3b1f3fb7f3806eadb131700091d32a31b4.tar.zst
mailman-6a8cbd3b1f3fb7f3806eadb131700091d32a31b4.zip
-rw-r--r--src/mailman/docs/NEWS.rst3
-rw-r--r--src/mailman/rest/sub_moderation.py6
-rw-r--r--src/mailman/rest/tests/test_moderation.py15
3 files changed, 23 insertions, 1 deletions
diff --git a/src/mailman/docs/NEWS.rst b/src/mailman/docs/NEWS.rst
index cf475e7de..e67fffb37 100644
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -59,6 +59,9 @@ Bugs
* Fix membership query when multiple users are subscribed to a mailing list.
Reported by Darrell Kresge. (Closes: #190)
* Prevent moderation of messages held for a different list. (Closes: #161)
+ * When approving a subscription request via the REST API, for a user who is
+ already a member, return an HTTP 409 Conflict code instead of the previous
+ server traceback (and resulting HTTP 500 code). (Closes: #193)
Configuration
-------------
diff --git a/src/mailman/rest/sub_moderation.py b/src/mailman/rest/sub_moderation.py
index b0ffdc8c1..e019b7bf4 100644
--- a/src/mailman/rest/sub_moderation.py
+++ b/src/mailman/rest/sub_moderation.py
@@ -24,10 +24,12 @@ __all__ = [
from mailman.app.moderator import send_rejection
from mailman.interfaces.action import Action
+from mailman.interfaces.member import AlreadySubscribedError
from mailman.interfaces.pending import IPendings
from mailman.interfaces.registrar import IRegistrar
from mailman.rest.helpers import (
- CollectionMixin, bad_request, child, etag, no_content, not_found, okay)
+ CollectionMixin, bad_request, child, conflict, etag, no_content,
+ not_found, okay)
from mailman.rest.validator import Validator, enum_validator
from mailman.utilities.i18n import _
from zope.component import getUtility
@@ -91,6 +93,8 @@ class IndividualRequest(_ModerationBase):
self._registrar.confirm(self._token)
except LookupError:
not_found(response)
+ except AlreadySubscribedError:
+ conflict(response, 'Already subscribed')
else:
no_content(response)
elif action is Action.discard:
diff --git a/src/mailman/rest/tests/test_moderation.py b/src/mailman/rest/tests/test_moderation.py
index 17322b618..9d4bee92a 100644
--- a/src/mailman/rest/tests/test_moderation.py
+++ b/src/mailman/rest/tests/test_moderation.py
@@ -250,6 +250,21 @@ class TestSubscriptionModeration(unittest.TestCase):
))
self.assertEqual(cm.exception.code, 404)
+ def test_accept_already_subscribed(self):
+ # POST to a subscription request, but the user is already subscribed.
+ with transaction():
+ token, token_owner, member = self._registrar.register(self._anne)
+ # Make Anne already a member.
+ self._mlist.subscribe(self._anne)
+ # Accept the pending subscription, which raises an error.
+ url = 'http://localhost:9001/3.0/lists/ant.example.com/requests/{}'
+ with self.assertRaises(HTTPError) as cm:
+ call_api(url.format(token), dict(
+ action='accept',
+ ))
+ self.assertEqual(cm.exception.code, 409)
+ self.assertEqual(cm.exception.reason, b'Already subscribed')
+
def test_accept_bad_token(self):
# Try to accept a request with a bogus token.
with self.assertRaises(HTTPError) as cm: