summary refs log tree commit diff
path: root/synapse/rest/admin/groups.py
diff options
context:
space:
mode:
Diffstat (limited to 'synapse/rest/admin/groups.py')
-rw-r--r--synapse/rest/admin/groups.py60
1 files changed, 59 insertions, 1 deletions
diff --git a/synapse/rest/admin/groups.py b/synapse/rest/admin/groups.py
index d0c86b204a..6af36e32b7 100644
--- a/synapse/rest/admin/groups.py
+++ b/synapse/rest/admin/groups.py
@@ -15,7 +15,11 @@
 import logging
 
 from synapse.api.errors import SynapseError
-from synapse.http.servlet import RestServlet
+from synapse.http.servlet import (
+    RestServlet,
+    assert_params_in_dict,
+    parse_json_object_from_request,
+)
 from synapse.rest.admin._base import admin_patterns, assert_user_is_admin
 
 logger = logging.getLogger(__name__)
@@ -41,3 +45,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, {}