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

Commit

Permalink
Allow sending a membership event to unban a user (#10807)
Browse files Browse the repository at this point in the history
* Allow membership event to unban user

Signed-off-by: Aaron Raimist <aaron@raim.ist>
  • Loading branch information
aaronraimist committed Sep 21, 2021
1 parent f455b0e commit 6a751ff
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 2 deletions.
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

0 comments on commit 6a751ff

Please sign in to comment.