summary refs log tree commit diff
path: root/synapse/rest/admin/groups.py
diff options
context:
space:
mode:
authorTravis Ralston <travpc@gmail.com>2021-01-19 13:21:17 -0700
committerTravis Ralston <travpc@gmail.com>2021-01-19 13:21:17 -0700
commit95d7074322c4bfe6e24b78e9b91366933c58d316 (patch)
tree085e48e344b4d885b32ac6bd7a4d3237106cd191 /synapse/rest/admin/groups.py
parentValidate the server name for the /publicRooms endpoint. (#9161) (diff)
downloadsynapse-95d7074322c4bfe6e24b78e9b91366933c58d316.tar.xz
Add admin APIs to force-join users to groups and manage their flair
Fixes https://github.com/matrix-org/synapse/issues/9143

Though the groups API is disappearing soon, these functions are intended to make flair management easier in the short term.
Diffstat (limited to 'synapse/rest/admin/groups.py')
-rw-r--r--synapse/rest/admin/groups.py56
1 files changed, 55 insertions, 1 deletions
diff --git a/synapse/rest/admin/groups.py b/synapse/rest/admin/groups.py

index d0c86b204a..55ad392944 100644 --- a/synapse/rest/admin/groups.py +++ b/synapse/rest/admin/groups.py
@@ -15,7 +15,7 @@ import logging from synapse.api.errors import SynapseError -from synapse.http.servlet import RestServlet +from synapse.http.servlet import assert_params_in_dict, parse_json_object_from_request, RestServlet from synapse.rest.admin._base import admin_patterns, assert_user_is_admin logger = logging.getLogger(__name__) @@ -41,3 +41,57 @@ class DeleteGroupAdminRestServlet(RestServlet): await self.group_server.delete_group(group_id, requester.user.to_string()) return 200, {} + + +class ForceJoinGroupAdminRestServlet(RestServlet): + """Allows a server admin to force-join a local user to a local group. + """ + + PATTERNS = admin_patterns("/group/(?P<group_id>[^/]*)/force_join$") + + def __init__(self, hs): + self.groups_handler = hs.get_groups_local_handler() + self.is_mine_id = hs.is_mine_id + self.auth = hs.get_auth() + + async def on_POST(self, request, group_id): + requester = await self.auth.get_user_by_req(request) + await assert_user_is_admin(self.auth, requester.user) + + if not self.is_mine_id(group_id): + raise SynapseError(400, "Can only affect local groups") + + body = parse_json_object_from_request(request, allow_empty_body=False) + assert_params_in_dict(body, ["user_id"]) + target_user_id = body["user_id"] + await self.groups_handler.force_join_user_to_group(group_id, target_user_id) + + return 200, {} + + +class UpdatePublicityGroupAdminRestServlet(RestServlet): + """Allows a server admin to update a user's publicity (flair) for a given group. + """ + + PATTERNS = admin_patterns("/group/(?P<group_id>[^/]*)/update_publicity$") + + def __init__(self, hs): + self.store = hs.get_datastore() + self.is_mine_id = hs.is_mine_id + self.auth = hs.get_auth() + + async def on_POST(self, request, group_id): + requester = await self.auth.get_user_by_req(request) + await assert_user_is_admin(self.auth, requester.user) + + body = parse_json_object_from_request(request, allow_empty_body=False) + assert_params_in_dict(body, ["user_id"]) + target_user_id = body["user_id"] + if not self.is_mine_id(target_user_id): + raise SynapseError(400, "Can only affect local users") + + # Logic copied from `/self/update_publicity` endpoint. + publicise = body["publicise"] + await self.store.update_group_publicity(group_id, target_user_id, publicise) + + return 200, {}