diff options
Diffstat (limited to 'src/mailman/rest/members.py')
| -rw-r--r-- | src/mailman/rest/members.py | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/src/mailman/rest/members.py b/src/mailman/rest/members.py index 3ff712259..2d5b95115 100644 --- a/src/mailman/rest/members.py +++ b/src/mailman/rest/members.py @@ -17,7 +17,6 @@ """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 @@ -198,22 +197,43 @@ class AllMembers(_MemberBase): def on_post(self, request, response): """Create a new member.""" - try: - validator = Validator( - list_id=str, - subscriber=subscriber_validator(self.api), - display_name=str, - delivery_mode=enum_validator(DeliveryMode), - role=enum_validator(MemberRole), - 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) - except ValueError as error: - bad_request(response, str(error)) + # Validate the params manually as the subscription_policy workflow + # attributes are dynamic, so parse all known and optional attirbutes + # and leave the rest to policy_kwargs. + required_arguments = ['list_id', 'subscriber'] + known_arguments = dict(list_id=str, + subscriber=subscriber_validator(self.api), + display_name=str, + delivery_mode=enum_validator(DeliveryMode), + role=enum_validator(MemberRole)) + + arguments = {} + policy_kwargs = {} + + wrong = [] + for key, value in request.params.items(): + try: + if key in known_arguments: + converter = known_arguments[key] + arguments[key] = converter(value) + else: + policy_kwargs[key] = value + except ValueError: + wrong.append(key) + + if len(wrong) > 0: + params = ', '.join(wrong) + bad_request(response, + 'Cannot convert parameters: {}'.format(params)) return + + missing = [key for key in required_arguments if key not in arguments] + if len(missing) > 0: + bad_request(response, 'Missing parameters: {}'.format(missing)) + return + # XXX policy_kwargs are string, while subscription workflows expects + # whatever. + # Dig the mailing list out of the arguments. list_id = arguments.pop('list_id') mlist = getUtility(IListManager).get_by_list_id(list_id) @@ -247,20 +267,13 @@ class AllMembers(_MemberBase): # nonmembers go through the legacy API for now. role = arguments.pop('role', MemberRole.member) if role is MemberRole.member: - # Get the pre_ flags for the subscription workflow. - pre_verified = arguments.pop('pre_verified', False) - pre_confirmed = arguments.pop('pre_confirmed', False) - pre_approved = arguments.pop('pre_approved', False) # Now we can run the registration process until either the # subscriber is subscribed, or the workflow is paused for # verification, confirmation, or approval. registrar = ISubscriptionManager(mlist) try: token, token_owner, member = registrar.register( - subscriber, - pre_verified=pre_verified, - pre_confirmed=pre_confirmed, - pre_approved=pre_approved) + subscriber, **policy_kwargs) except AlreadySubscribedError: conflict(response, b'Member already subscribed') return |
