13
13
# limitations under the License.
14
14
15
15
import logging
16
- from typing import TYPE_CHECKING , Tuple
16
+ from typing import TYPE_CHECKING , List , Optional , Tuple
17
+
18
+ from pydantic import StrictStr
19
+ from typing_extensions import Literal
17
20
18
21
from twisted .web .server import Request
19
22
20
23
from synapse .api .errors import AuthError , Codes , NotFoundError , SynapseError
21
24
from synapse .http .server import HttpServer
22
- from synapse .http .servlet import RestServlet , parse_json_object_from_request
25
+ from synapse .http .servlet import (
26
+ RestServlet ,
27
+ parse_and_validate_json_object_from_request ,
28
+ )
23
29
from synapse .http .site import SynapseRequest
24
30
from synapse .rest .client ._base import client_patterns
31
+ from synapse .rest .models import RequestBodyModel
25
32
from synapse .types import JsonDict , RoomAlias
26
33
27
34
if TYPE_CHECKING :
@@ -54,38 +61,35 @@ async def on_GET(self, request: Request, room_alias: str) -> Tuple[int, JsonDict
54
61
55
62
return 200 , res
56
63
64
+ class PutBody (RequestBodyModel ):
65
+ # TODO: get Pydantic to validate that this is a valid room id?
66
+ room_id : StrictStr
67
+ # `servers` is unspecced
68
+ servers : Optional [List [StrictStr ]] = None
69
+
57
70
async def on_PUT (
58
71
self , request : SynapseRequest , room_alias : str
59
72
) -> Tuple [int , JsonDict ]:
60
73
if not RoomAlias .is_valid (room_alias ):
61
74
raise SynapseError (400 , "Room alias invalid" , errcode = Codes .INVALID_PARAM )
62
75
room_alias_obj = RoomAlias .from_string (room_alias )
63
76
64
- content = parse_json_object_from_request (request )
65
- if "room_id" not in content :
66
- raise SynapseError (
67
- 400 , 'Missing params: ["room_id"]' , errcode = Codes .BAD_JSON
68
- )
77
+ content = parse_and_validate_json_object_from_request (request , self .PutBody )
69
78
70
79
logger .debug ("Got content: %s" , content )
71
80
logger .debug ("Got room name: %s" , room_alias_obj .to_string ())
72
81
73
- room_id = content ["room_id" ]
74
- servers = content ["servers" ] if "servers" in content else None
75
-
76
- logger .debug ("Got room_id: %s" , room_id )
77
- logger .debug ("Got servers: %s" , servers )
82
+ logger .debug ("Got room_id: %s" , content .room_id )
83
+ logger .debug ("Got servers: %s" , content .servers )
78
84
79
- # TODO(erikj): Check types.
80
-
81
- room = await self .store .get_room (room_id )
85
+ room = await self .store .get_room (content .room_id )
82
86
if room is None :
83
87
raise SynapseError (400 , "Room does not exist" )
84
88
85
89
requester = await self .auth .get_user_by_req (request )
86
90
87
91
await self .directory_handler .create_association (
88
- requester , room_alias_obj , room_id , servers
92
+ requester , room_alias_obj , content . room_id , content . servers
89
93
)
90
94
91
95
return 200 , {}
@@ -137,16 +141,18 @@ async def on_GET(self, request: Request, room_id: str) -> Tuple[int, JsonDict]:
137
141
138
142
return 200 , {"visibility" : "public" if room ["is_public" ] else "private" }
139
143
144
+ class PutBody (RequestBodyModel ):
145
+ visibility : Literal ["public" , "private" ] = "public"
146
+
140
147
async def on_PUT (
141
148
self , request : SynapseRequest , room_id : str
142
149
) -> Tuple [int , JsonDict ]:
143
150
requester = await self .auth .get_user_by_req (request )
144
151
145
- content = parse_json_object_from_request (request )
146
- visibility = content .get ("visibility" , "public" )
152
+ content = parse_and_validate_json_object_from_request (request , self .PutBody )
147
153
148
154
await self .directory_handler .edit_published_room_list (
149
- requester , room_id , visibility
155
+ requester , room_id , content . visibility
150
156
)
151
157
152
158
return 200 , {}
@@ -163,20 +169,26 @@ def __init__(self, hs: "HomeServer"):
163
169
self .directory_handler = hs .get_directory_handler ()
164
170
self .auth = hs .get_auth ()
165
171
172
+ class PutBody (RequestBodyModel ):
173
+ visibility : Literal ["public" , "private" ] = "public"
174
+
166
175
async def on_PUT (
167
176
self , request : SynapseRequest , network_id : str , room_id : str
168
177
) -> Tuple [int , JsonDict ]:
169
- content = parse_json_object_from_request (request )
170
- visibility = content .get ("visibility" , "public" )
171
- return await self ._edit (request , network_id , room_id , visibility )
178
+ content = parse_and_validate_json_object_from_request (request , self .PutBody )
179
+ return await self ._edit (request , network_id , room_id , content .visibility )
172
180
173
181
async def on_DELETE (
174
182
self , request : SynapseRequest , network_id : str , room_id : str
175
183
) -> Tuple [int , JsonDict ]:
176
184
return await self ._edit (request , network_id , room_id , "private" )
177
185
178
186
async def _edit (
179
- self , request : SynapseRequest , network_id : str , room_id : str , visibility : str
187
+ self ,
188
+ request : SynapseRequest ,
189
+ network_id : str ,
190
+ room_id : str ,
191
+ visibility : Literal ["public" , "private" ],
180
192
) -> Tuple [int , JsonDict ]:
181
193
requester = await self .auth .get_user_by_req (request )
182
194
if not requester .app_service :
0 commit comments