delete_group

pull/7363/head
Andrew Morgan 2020-04-30 00:43:10 +01:00
parent d205f69210
commit 6e23dd4c20
3 changed files with 35 additions and 36 deletions

View File

@ -748,17 +748,18 @@ class GroupsServerHandler(GroupsServerWorkerHandler):
raise NotImplementedError() raise NotImplementedError()
@defer.inlineCallbacks async def remove_user_from_group(
def remove_user_from_group(self, group_id, user_id, requester_user_id, content): self, group_id, user_id, requester_user_id, content
):
"""Remove a user from the group; either a user is leaving or an admin """Remove a user from the group; either a user is leaving or an admin
kicked them. kicked them.
""" """
yield self.check_group_is_ours(group_id, requester_user_id, and_exists=True) await self.check_group_is_ours(group_id, requester_user_id, and_exists=True)
is_kick = False is_kick = False
if requester_user_id != user_id: if requester_user_id != user_id:
is_admin = yield self.store.is_user_admin_in_group( is_admin = await self.store.is_user_admin_in_group(
group_id, requester_user_id group_id, requester_user_id
) )
if not is_admin: if not is_admin:
@ -766,24 +767,24 @@ class GroupsServerHandler(GroupsServerWorkerHandler):
is_kick = True is_kick = True
yield self.store.remove_user_from_group(group_id, user_id) await self.store.remove_user_from_group(group_id, user_id)
if is_kick: if is_kick:
if self.hs.is_mine_id(user_id): if self.hs.is_mine_id(user_id):
groups_local = self.hs.get_groups_local_handler() groups_local = self.hs.get_groups_local_handler()
yield groups_local.user_removed_from_group(group_id, user_id, {}) await groups_local.user_removed_from_group(group_id, user_id, {})
else: else:
yield self.transport_client.remove_user_from_group_notification( await self.transport_client.remove_user_from_group_notification(
get_domain_from_id(user_id), group_id, user_id, {} get_domain_from_id(user_id), group_id, user_id, {}
) )
if not self.hs.is_mine_id(user_id): if not self.hs.is_mine_id(user_id):
yield self.store.maybe_delete_remote_profile_cache(user_id) await self.store.maybe_delete_remote_profile_cache(user_id)
# Delete group if the last user has left # Delete group if the last user has left
users = yield self.store.get_users_in_group(group_id, include_private=True) users = await self.store.get_users_in_group(group_id, include_private=True)
if not users: if not users:
yield self.store.delete_group(group_id) await self.store.delete_group(group_id)
return {} return {}
@ -862,8 +863,7 @@ class GroupsServerHandler(GroupsServerWorkerHandler):
return {"group_id": group_id} return {"group_id": group_id}
@defer.inlineCallbacks async def delete_group(self, group_id, requester_user_id):
def delete_group(self, group_id, requester_user_id):
"""Deletes a group, kicking out all current members. """Deletes a group, kicking out all current members.
Only group admins or server admins can call this request Only group admins or server admins can call this request
@ -876,14 +876,14 @@ class GroupsServerHandler(GroupsServerWorkerHandler):
Deferred Deferred
""" """
yield self.check_group_is_ours(group_id, requester_user_id, and_exists=True) await self.check_group_is_ours(group_id, requester_user_id, and_exists=True)
# Only server admins or group admins can delete groups. # Only server admins or group admins can delete groups.
is_admin = yield self.store.is_user_admin_in_group(group_id, requester_user_id) is_admin = await self.store.is_user_admin_in_group(group_id, requester_user_id)
if not is_admin: if not is_admin:
is_admin = yield self.auth.is_server_admin( is_admin = await self.auth.is_server_admin(
UserID.from_string(requester_user_id) UserID.from_string(requester_user_id)
) )
@ -891,18 +891,17 @@ class GroupsServerHandler(GroupsServerWorkerHandler):
raise SynapseError(403, "User is not an admin") raise SynapseError(403, "User is not an admin")
# Before deleting the group lets kick everyone out of it # Before deleting the group lets kick everyone out of it
users = yield self.store.get_users_in_group(group_id, include_private=True) users = await self.store.get_users_in_group(group_id, include_private=True)
@defer.inlineCallbacks async def _kick_user_from_group(user_id):
def _kick_user_from_group(user_id):
if self.hs.is_mine_id(user_id): if self.hs.is_mine_id(user_id):
groups_local = self.hs.get_groups_local_handler() groups_local = self.hs.get_groups_local_handler()
yield groups_local.user_removed_from_group(group_id, user_id, {}) await groups_local.user_removed_from_group(group_id, user_id, {})
else: else:
yield self.transport_client.remove_user_from_group_notification( await self.transport_client.remove_user_from_group_notification(
get_domain_from_id(user_id), group_id, user_id, {} get_domain_from_id(user_id), group_id, user_id, {}
) )
yield self.store.maybe_delete_remote_profile_cache(user_id) await self.store.maybe_delete_remote_profile_cache(user_id)
# We kick users out in the order of: # We kick users out in the order of:
# 1. Non-admins # 1. Non-admins
@ -921,11 +920,11 @@ class GroupsServerHandler(GroupsServerWorkerHandler):
else: else:
non_admins.append(u["user_id"]) non_admins.append(u["user_id"])
yield concurrently_execute(_kick_user_from_group, non_admins, 10) await concurrently_execute(_kick_user_from_group, non_admins, 10)
yield concurrently_execute(_kick_user_from_group, admins, 10) await concurrently_execute(_kick_user_from_group, admins, 10)
yield _kick_user_from_group(requester_user_id) await _kick_user_from_group(requester_user_id)
yield self.store.delete_group(group_id) await self.store.delete_group(group_id)
def _parse_join_policy_from_contents(content): def _parse_join_policy_from_contents(content):

View File

@ -86,8 +86,7 @@ class DirectoryHandler(BaseHandler):
room_alias, room_id, servers, creator=creator room_alias, room_id, servers, creator=creator
) )
@defer.inlineCallbacks async def create_association(
def create_association(
self, self,
requester: Requester, requester: Requester,
room_alias: RoomAlias, room_alias: RoomAlias,
@ -129,10 +128,10 @@ class DirectoryHandler(BaseHandler):
else: else:
# Server admins are not subject to the same constraints as normal # Server admins are not subject to the same constraints as normal
# users when creating an alias (e.g. being in the room). # users when creating an alias (e.g. being in the room).
is_admin = yield self.auth.is_server_admin(requester.user) is_admin = await self.auth.is_server_admin(requester.user)
if (self.require_membership and check_membership) and not is_admin: if (self.require_membership and check_membership) and not is_admin:
rooms_for_user = yield self.store.get_rooms_for_user(user_id) rooms_for_user = await self.store.get_rooms_for_user(user_id)
if room_id not in rooms_for_user: if room_id not in rooms_for_user:
raise AuthError( raise AuthError(
403, "You must be in the room to create an alias for it" 403, "You must be in the room to create an alias for it"
@ -149,7 +148,7 @@ class DirectoryHandler(BaseHandler):
# per alias creation rule? # per alias creation rule?
raise SynapseError(403, "Not allowed to create alias") raise SynapseError(403, "Not allowed to create alias")
can_create = yield self.can_modify_alias(room_alias, user_id=user_id) can_create = await self.can_modify_alias(room_alias, user_id=user_id)
if not can_create: if not can_create:
raise AuthError( raise AuthError(
400, 400,
@ -157,7 +156,7 @@ class DirectoryHandler(BaseHandler):
errcode=Codes.EXCLUSIVE, errcode=Codes.EXCLUSIVE,
) )
yield self._create_association(room_alias, room_id, servers, creator=user_id) await self._create_association(room_alias, room_id, servers, creator=user_id)
async def delete_association(self, requester: Requester, room_alias: RoomAlias): async def delete_association(self, requester: Requester, room_alias: RoomAlias):
"""Remove an alias from the directory """Remove an alias from the directory

View File

@ -481,12 +481,13 @@ class GroupsLocalHandler(GroupsLocalWorkerHandler):
return {"state": "invite", "user_profile": user_profile} return {"state": "invite", "user_profile": user_profile}
@defer.inlineCallbacks async def remove_user_from_group(
def remove_user_from_group(self, group_id, user_id, requester_user_id, content): self, group_id, user_id, requester_user_id, content
):
"""Remove a user from a group """Remove a user from a group
""" """
if user_id == requester_user_id: if user_id == requester_user_id:
token = yield self.store.register_user_group_membership( token = await self.store.register_user_group_membership(
group_id, user_id, membership="leave" group_id, user_id, membership="leave"
) )
self.notifier.on_new_event("groups_key", token, users=[user_id]) self.notifier.on_new_event("groups_key", token, users=[user_id])
@ -495,13 +496,13 @@ class GroupsLocalHandler(GroupsLocalWorkerHandler):
# retry if the group server is currently down. # retry if the group server is currently down.
if self.is_mine_id(group_id): if self.is_mine_id(group_id):
res = yield self.groups_server_handler.remove_user_from_group( res = await self.groups_server_handler.remove_user_from_group(
group_id, user_id, requester_user_id, content group_id, user_id, requester_user_id, content
) )
else: else:
content["requester_user_id"] = requester_user_id content["requester_user_id"] = requester_user_id
try: try:
res = yield self.transport_client.remove_user_from_group( res = await self.transport_client.remove_user_from_group(
get_domain_from_id(group_id), get_domain_from_id(group_id),
group_id, group_id,
requester_user_id, requester_user_id,