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

Commit b2fe440

Browse files
author
David Robertson
committed
Use Pydantic to validate PUT /directory/list/room/{roomId}
1 parent 55d4bf8 commit b2fe440

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

synapse/handlers/directory.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import string
1717
from typing import TYPE_CHECKING, Iterable, List, Optional
1818

19+
from typing_extensions import Literal
20+
1921
from synapse.api.constants import MAX_ALIAS_LENGTH, EventTypes
2022
from synapse.api.errors import (
2123
AuthError,
@@ -429,7 +431,10 @@ async def _user_can_delete_alias(
429431
return await self.auth.check_can_change_room_list(room_id, requester)
430432

431433
async def edit_published_room_list(
432-
self, requester: Requester, room_id: str, visibility: str
434+
self,
435+
requester: Requester,
436+
room_id: str,
437+
visibility: Literal["public", "private"],
433438
) -> None:
434439
"""Edit the entry of the room in the published room list.
435440
@@ -451,9 +456,6 @@ async def edit_published_room_list(
451456
if requester.is_guest:
452457
raise AuthError(403, "Guests cannot edit the published room list")
453458

454-
if visibility not in ["public", "private"]:
455-
raise SynapseError(400, "Invalid visibility setting")
456-
457459
if visibility == "public" and not self.enable_room_list_search:
458460
# The room list has been disabled.
459461
raise AuthError(

synapse/rest/client/directory.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from typing import TYPE_CHECKING, List, Optional, Tuple
1717

1818
from pydantic import StrictStr
19+
from typing_extensions import Literal
1920

2021
from twisted.web.server import Request
2122

@@ -141,16 +142,18 @@ async def on_GET(self, request: Request, room_id: str) -> Tuple[int, JsonDict]:
141142

142143
return 200, {"visibility": "public" if room["is_public"] else "private"}
143144

145+
class PutBody(RequestBodyModel):
146+
visibility: Literal["public", "private"] = "public"
147+
144148
async def on_PUT(
145149
self, request: SynapseRequest, room_id: str
146150
) -> Tuple[int, JsonDict]:
147151
requester = await self.auth.get_user_by_req(request)
148152

149-
content = parse_json_object_from_request(request)
150-
visibility = content.get("visibility", "public")
153+
content = parse_and_validate_json_object_from_request(request, self.PutBody)
151154

152155
await self.directory_handler.edit_published_room_list(
153-
requester, room_id, visibility
156+
requester, room_id, content.visibility
154157
)
155158

156159
return 200, {}

0 commit comments

Comments
 (0)