mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-01-12 06:39:26 -05:00
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
1
changelog.d/10807.bugfix
Normal file
1
changelog.d/10807.bugfix
Normal file
@ -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,
|
" (membership=%s)" % old_membership,
|
||||||
errcode=Codes.BAD_STATE,
|
errcode=Codes.BAD_STATE,
|
||||||
)
|
)
|
||||||
if old_membership == "ban" and action != "unban":
|
if old_membership == "ban" and action not in ["ban", "unban", "leave"]:
|
||||||
raise SynapseError(
|
raise SynapseError(
|
||||||
403,
|
403,
|
||||||
"Cannot %s user who was banned" % (action,),
|
"Cannot %s user who was banned" % (action,),
|
||||||
|
@ -26,7 +26,7 @@ from twisted.internet import defer
|
|||||||
|
|
||||||
import synapse.rest.admin
|
import synapse.rest.admin
|
||||||
from synapse.api.constants import EventContentFields, EventTypes, Membership
|
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.handlers.pagination import PurgeStatus
|
||||||
from synapse.rest import admin
|
from synapse.rest import admin
|
||||||
from synapse.rest.client import account, directory, login, profile, room, sync
|
from synapse.rest.client import account, directory, login, profile, room, sync
|
||||||
@ -377,6 +377,91 @@ class RoomPermissionsTestCase(RoomBase):
|
|||||||
expect_code=403,
|
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):
|
class RoomsMemberListTestCase(RoomBase):
|
||||||
"""Tests /rooms/$room_id/members/list REST events."""
|
"""Tests /rooms/$room_id/members/list REST events."""
|
||||||
|
@ -138,6 +138,7 @@ class RestHelper:
|
|||||||
extra_data: Optional[dict] = None,
|
extra_data: Optional[dict] = None,
|
||||||
tok: Optional[str] = None,
|
tok: Optional[str] = None,
|
||||||
expect_code: int = 200,
|
expect_code: int = 200,
|
||||||
|
expect_errcode: str = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Send a membership state event into a room.
|
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
|
extra_data: Extra information to include in the content of the event
|
||||||
tok: The user access token to use
|
tok: The user access token to use
|
||||||
expect_code: The expected HTTP response code
|
expect_code: The expected HTTP response code
|
||||||
|
expect_errcode: The expected Matrix error code
|
||||||
"""
|
"""
|
||||||
temp_id = self.auth_user_id
|
temp_id = self.auth_user_id
|
||||||
self.auth_user_id = src
|
self.auth_user_id = src
|
||||||
@ -177,6 +179,15 @@ class RestHelper:
|
|||||||
channel.result["body"],
|
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
|
self.auth_user_id = temp_id
|
||||||
|
|
||||||
def send(
|
def send(
|
||||||
|
Loading…
Reference in New Issue
Block a user