Skip to content

Commit 594cd5f

Browse files
authored
Fix Internal Server Error for Non-Local Users in Room Actions (#17607)
1 parent b21134d commit 594cd5f

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

changelog.d/17607.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Return `400 M_BAD_JSON` upon attempting to complete various room actions with a non-local user ID and unknown room ID, rather than an internal server error.

synapse/storage/databases/main/roommember.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#
2020
#
2121
import logging
22+
from http import HTTPStatus
2223
from typing import (
2324
TYPE_CHECKING,
2425
AbstractSet,
@@ -39,6 +40,7 @@
3940
import attr
4041

4142
from synapse.api.constants import EventTypes, Membership
43+
from synapse.api.errors import Codes, SynapseError
4244
from synapse.logging.opentracing import trace
4345
from synapse.metrics import LaterGauge
4446
from synapse.metrics.background_process_metrics import wrap_as_background_process
@@ -631,10 +633,8 @@ async def get_local_current_membership_for_user_in_room(
631633
"""
632634
# Paranoia check.
633635
if not self.hs.is_mine_id(user_id):
634-
raise Exception(
635-
"Cannot call 'get_local_current_membership_for_user_in_room' on "
636-
"non-local user %s" % (user_id,),
637-
)
636+
message = f"Provided user_id {user_id} is a non-local user"
637+
raise SynapseError(HTTPStatus.BAD_REQUEST, message, errcode=Codes.BAD_JSON)
638638

639639
results = cast(
640640
Optional[Tuple[str, str]],

tests/handlers/test_room_member.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import synapse.rest.client.login
77
import synapse.rest.client.room
88
from synapse.api.constants import EventTypes, Membership
9-
from synapse.api.errors import LimitExceededError, SynapseError
9+
from synapse.api.errors import Codes, LimitExceededError, SynapseError
1010
from synapse.crypto.event_signing import add_hashes_and_signatures
1111
from synapse.events import FrozenEventV3
1212
from synapse.federation.federation_client import SendJoinResult
@@ -383,6 +383,26 @@ def test_forget_when_not_left(self) -> None:
383383
"""Tests that a user cannot not forgets a room that has not left."""
384384
self.get_failure(self.handler.forget(self.alice_ID, self.room_id), SynapseError)
385385

386+
def test_nonlocal_room_user_action(self) -> None:
387+
"""
388+
Test that non-local user ids cannot perform room actions through
389+
this homeserver.
390+
"""
391+
alien_user_id = UserID.from_string("@cheeky_monkey:matrix.org")
392+
bad_room_id = f"{self.room_id}+BAD_ID"
393+
394+
exc = self.get_failure(
395+
self.handler.update_membership(
396+
create_requester(self.alice),
397+
alien_user_id,
398+
bad_room_id,
399+
"unban",
400+
),
401+
SynapseError,
402+
).value
403+
404+
self.assertEqual(exc.errcode, Codes.BAD_JSON)
405+
386406
def test_rejoin_forgotten_by_user(self) -> None:
387407
"""Test that a user that has forgotten a room can do a re-join.
388408
The room was not forgotten from the local server.

0 commit comments

Comments
 (0)