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, {}
|