Allow sending a membership event to unban a user (#10807)
* Allow membership event to unban user Signed-off-by: Aaron Raimist <aaron@raim.ist>
This commit is contained in:
parent
f455b0e420
commit
6a751ff5e0
|
@ -0,0 +1 @@
|
|||
Allow sending a membership event to unban a user. Contributed by @aaronraimist.
|
|
@ -668,7 +668,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
|||
" (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,),
|
||||
|
|
|
@ -26,7 +26,7 @@ from twisted.internet import defer
|
|||
|
||||
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
|
||||
|
@ -377,6 +377,91 @@ class RoomPermissionsTestCase(RoomBase):
|
|||
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."""
|
||||
|
|
|
@ -138,6 +138,7 @@ class RestHelper:
|
|||
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.
|
||||
|
@ -150,6 +151,7 @@ class RestHelper:
|
|||
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
|
||||
|
@ -177,6 +179,15 @@ class RestHelper:
|
|||
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(
|
||||
|
|
Loading…
Reference in New Issue