Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Allow sending a membership event to unban a user #10807

Merged
merged 8 commits into from
Sep 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/10807.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Allow sending a membership event to unban a user. Contributed by @aaronraimist.
2 changes: 1 addition & 1 deletion synapse/handlers/room_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ async def update_membership_locked(
" (membership=%s)" % old_membership,
errcode=Codes.BAD_STATE,
)
if old_membership == "ban" and action != "unban":
if old_membership == "ban" and action not in ["ban", "unban", "leave"]:
raise SynapseError(
403,
"Cannot %s user who was banned" % (action,),
Expand Down
87 changes: 86 additions & 1 deletion tests/rest/client/test_rooms.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

import synapse.rest.admin
from synapse.api.constants import EventContentFields, EventTypes, Membership
from synapse.api.errors import HttpResponseException
from synapse.api.errors import Codes, HttpResponseException
from synapse.handlers.pagination import PurgeStatus
from synapse.rest import admin
from synapse.rest.client import account, directory, login, profile, room, sync
Expand Down Expand Up @@ -377,6 +377,91 @@ def test_leave_permissions(self):
expect_code=403,
)

# tests the "from banned" line from the table in https://spec.matrix.org/unstable/client-server-api/#mroommember
def test_member_event_from_ban(self):
room = self.created_rmid
self.helper.invite(room=room, src=self.rmcreator_id, targ=self.user_id)
self.helper.join(room=room, user=self.user_id)

other = "@burgundy:red"

# User cannot ban other since they do not have required power level
self.helper.change_membership(
room=room,
src=self.user_id,
targ=other,
membership=Membership.BAN,
expect_code=403, # expect failure
expect_errcode=Codes.FORBIDDEN,
)

# Admin bans other
self.helper.change_membership(
room=room,
src=self.rmcreator_id,
targ=other,
membership=Membership.BAN,
expect_code=200,
)

# from ban to invite: Must never happen.
self.helper.change_membership(
room=room,
src=self.rmcreator_id,
targ=other,
membership=Membership.INVITE,
expect_code=403, # expect failure
expect_errcode=Codes.BAD_STATE,
)

# from ban to join: Must never happen.
self.helper.change_membership(
room=room,
src=other,
targ=other,
membership=Membership.JOIN,
expect_code=403, # expect failure
expect_errcode=Codes.BAD_STATE,
)

# from ban to ban: No change.
self.helper.change_membership(
room=room,
src=self.rmcreator_id,
targ=other,
membership=Membership.BAN,
expect_code=200,
)

# from ban to knock: Must never happen.
self.helper.change_membership(
room=room,
src=self.rmcreator_id,
targ=other,
membership=Membership.KNOCK,
expect_code=403, # expect failure
expect_errcode=Codes.BAD_STATE,
)

# User cannot unban other since they do not have required power level
self.helper.change_membership(
room=room,
src=self.user_id,
targ=other,
membership=Membership.LEAVE,
expect_code=403, # expect failure
expect_errcode=Codes.FORBIDDEN,
)

# from ban to leave: User was unbanned.
self.helper.change_membership(
room=room,
src=self.rmcreator_id,
targ=other,
membership=Membership.LEAVE,
expect_code=200,
)


class RoomsMemberListTestCase(RoomBase):
"""Tests /rooms/$room_id/members/list REST events."""
Expand Down
11 changes: 11 additions & 0 deletions tests/rest/client/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ def change_membership(
extra_data: Optional[dict] = None,
tok: Optional[str] = None,
expect_code: int = 200,
expect_errcode: str = None,
) -> None:
"""
Send a membership state event into a room.
Expand All @@ -150,6 +151,7 @@ def change_membership(
extra_data: Extra information to include in the content of the event
tok: The user access token to use
expect_code: The expected HTTP response code
expect_errcode: The expected Matrix error code
"""
temp_id = self.auth_user_id
self.auth_user_id = src
Expand Down Expand Up @@ -177,6 +179,15 @@ def change_membership(
channel.result["body"],
)

if expect_errcode:
assert (
str(channel.json_body["errcode"]) == expect_errcode
), "Expected: %r, got: %r, resp: %r" % (
expect_errcode,
channel.json_body["errcode"],
channel.result["body"],
)

self.auth_user_id = temp_id

def send(
Expand Down