Barry Warsaw pushed to branch master at mailman / Mailman

Commits:
6a8cbd3b by Barry Warsaw at 2016-02-15T12:10:44-05:00
Handle AlreadySubscribedError in REST.

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

- - - - -


3 changed files:

- src/mailman/docs/NEWS.rst
- src/mailman/rest/sub_moderation.py
- src/mailman/rest/tests/test_moderation.py


Changes:

=====================================
src/mailman/docs/NEWS.rst
=====================================
--- 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
 -------------


=====================================
src/mailman/rest/sub_moderation.py
=====================================
--- 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:


=====================================
src/mailman/rest/tests/test_moderation.py
=====================================
--- 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:



View it on GitLab: 
https://gitlab.com/mailman/mailman/commit/6a8cbd3b1f3fb7f3806eadb131700091d32a31b4
_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to