diff options
| -rw-r--r-- | src/mailman/docs/NEWS.rst | 3 | ||||
| -rw-r--r-- | src/mailman/rest/sub_moderation.py | 6 | ||||
| -rw-r--r-- | src/mailman/rest/tests/test_moderation.py | 15 |
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: |
