mirror of
https://mau.dev/maunium/synapse.git
synced 2024-11-12 04:52:26 +01:00
Fix hierarchy returning 403 when room is accessible through federation (#17194)
This commit is contained in:
parent
e563e4bdf3
commit
e75a23a63d
3 changed files with 72 additions and 2 deletions
1
changelog.d/17194.bugfix
Normal file
1
changelog.d/17194.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix hierarchy returning 403 when room is accessible through federation. Contributed by Krishan (@kfiven).
|
|
@ -183,8 +183,13 @@ class RoomSummaryHandler:
|
||||||
) -> JsonDict:
|
) -> JsonDict:
|
||||||
"""See docstring for SpaceSummaryHandler.get_room_hierarchy."""
|
"""See docstring for SpaceSummaryHandler.get_room_hierarchy."""
|
||||||
|
|
||||||
# First of all, check that the room is accessible.
|
# If the room is available locally, quickly check that the user can access it.
|
||||||
if not await self._is_local_room_accessible(requested_room_id, requester):
|
local_room = await self._store.is_host_joined(
|
||||||
|
requested_room_id, self._server_name
|
||||||
|
)
|
||||||
|
if local_room and not await self._is_local_room_accessible(
|
||||||
|
requested_room_id, requester
|
||||||
|
):
|
||||||
raise UnstableSpecAuthError(
|
raise UnstableSpecAuthError(
|
||||||
403,
|
403,
|
||||||
"User %s not in room %s, and room previews are disabled"
|
"User %s not in room %s, and room previews are disabled"
|
||||||
|
@ -192,6 +197,22 @@ class RoomSummaryHandler:
|
||||||
errcode=Codes.NOT_JOINED,
|
errcode=Codes.NOT_JOINED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if not local_room:
|
||||||
|
room_hierarchy = await self._summarize_remote_room_hierarchy(
|
||||||
|
_RoomQueueEntry(requested_room_id, ()),
|
||||||
|
False,
|
||||||
|
)
|
||||||
|
root_room_entry = room_hierarchy[0]
|
||||||
|
if not root_room_entry or not await self._is_remote_room_accessible(
|
||||||
|
requester, requested_room_id, root_room_entry.room
|
||||||
|
):
|
||||||
|
raise UnstableSpecAuthError(
|
||||||
|
403,
|
||||||
|
"User %s not in room %s, and room previews are disabled"
|
||||||
|
% (requester, requested_room_id),
|
||||||
|
errcode=Codes.NOT_JOINED,
|
||||||
|
)
|
||||||
|
|
||||||
# If this is continuing a previous session, pull the persisted data.
|
# If this is continuing a previous session, pull the persisted data.
|
||||||
if from_token:
|
if from_token:
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -757,6 +757,54 @@ class SpaceSummaryTestCase(unittest.HomeserverTestCase):
|
||||||
)
|
)
|
||||||
self._assert_hierarchy(result, expected)
|
self._assert_hierarchy(result, expected)
|
||||||
|
|
||||||
|
def test_fed_root(self) -> None:
|
||||||
|
"""
|
||||||
|
Test if requested room is available over federation.
|
||||||
|
"""
|
||||||
|
fed_hostname = self.hs.hostname + "2"
|
||||||
|
fed_space = "#fed_space:" + fed_hostname
|
||||||
|
fed_subroom = "#fed_sub_room:" + fed_hostname
|
||||||
|
|
||||||
|
requested_room_entry = _RoomEntry(
|
||||||
|
fed_space,
|
||||||
|
{
|
||||||
|
"room_id": fed_space,
|
||||||
|
"world_readable": True,
|
||||||
|
"room_type": RoomTypes.SPACE,
|
||||||
|
},
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"type": EventTypes.SpaceChild,
|
||||||
|
"room_id": fed_space,
|
||||||
|
"state_key": fed_subroom,
|
||||||
|
"content": {"via": [fed_hostname]},
|
||||||
|
}
|
||||||
|
],
|
||||||
|
)
|
||||||
|
child_room = {
|
||||||
|
"room_id": fed_subroom,
|
||||||
|
"world_readable": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
async def summarize_remote_room_hierarchy(
|
||||||
|
_self: Any, room: Any, suggested_only: bool
|
||||||
|
) -> Tuple[Optional[_RoomEntry], Dict[str, JsonDict], Set[str]]:
|
||||||
|
return requested_room_entry, {fed_subroom: child_room}, set()
|
||||||
|
|
||||||
|
expected = [
|
||||||
|
(fed_space, [fed_subroom]),
|
||||||
|
(fed_subroom, ()),
|
||||||
|
]
|
||||||
|
|
||||||
|
with mock.patch(
|
||||||
|
"synapse.handlers.room_summary.RoomSummaryHandler._summarize_remote_room_hierarchy",
|
||||||
|
new=summarize_remote_room_hierarchy,
|
||||||
|
):
|
||||||
|
result = self.get_success(
|
||||||
|
self.handler.get_room_hierarchy(create_requester(self.user), fed_space)
|
||||||
|
)
|
||||||
|
self._assert_hierarchy(result, expected)
|
||||||
|
|
||||||
def test_fed_filtering(self) -> None:
|
def test_fed_filtering(self) -> None:
|
||||||
"""
|
"""
|
||||||
Rooms returned over federation should be properly filtered to only include
|
Rooms returned over federation should be properly filtered to only include
|
||||||
|
|
Loading…
Reference in a new issue