57
57
from synapse .rest .client ._base import client_patterns
58
58
from synapse .rest .client .transactions import HttpTransactionCache
59
59
from synapse .streams .config import PaginationConfig
60
- from synapse .types import JsonDict , StreamToken , ThirdPartyInstanceID , UserID
60
+ from synapse .types import JsonDict , Requester , StreamToken , ThirdPartyInstanceID , UserID
61
61
from synapse .types .state import StateFilter
62
62
from synapse .util import json_decoder
63
63
from synapse .util .cancellation import cancellable
@@ -151,15 +151,22 @@ def register(self, http_server: HttpServer) -> None:
151
151
PATTERNS = "/createRoom"
152
152
register_txn_path (self , PATTERNS , http_server )
153
153
154
- def on_PUT (
154
+ async def on_PUT (
155
155
self , request : SynapseRequest , txn_id : str
156
- ) -> Awaitable [Tuple [int , JsonDict ]]:
156
+ ) -> Tuple [int , JsonDict ]:
157
+ requester = await self .auth .get_user_by_req (request )
157
158
set_tag ("txn_id" , txn_id )
158
- return self .txns .fetch_or_execute_request (request , self .on_POST , request )
159
+ return await self .txns .fetch_or_execute_request (
160
+ request , requester , self ._do , request , requester
161
+ )
159
162
160
163
async def on_POST (self , request : SynapseRequest ) -> Tuple [int , JsonDict ]:
161
164
requester = await self .auth .get_user_by_req (request )
165
+ return await self ._do (request , requester )
162
166
167
+ async def _do (
168
+ self , request : SynapseRequest , requester : Requester
169
+ ) -> Tuple [int , JsonDict ]:
163
170
room_id , _ , _ = await self ._room_creation_handler .create_room (
164
171
requester , self .get_room_config (request )
165
172
)
@@ -172,9 +179,9 @@ def get_room_config(self, request: Request) -> JsonDict:
172
179
173
180
174
181
# TODO: Needs unit testing for generic events
175
- class RoomStateEventRestServlet (TransactionRestServlet ):
182
+ class RoomStateEventRestServlet (RestServlet ):
176
183
def __init__ (self , hs : "HomeServer" ):
177
- super ().__init__ (hs )
184
+ super ().__init__ ()
178
185
self .event_creation_handler = hs .get_event_creation_handler ()
179
186
self .room_member_handler = hs .get_room_member_handler ()
180
187
self .message_handler = hs .get_message_handler ()
@@ -324,16 +331,16 @@ def __init__(self, hs: "HomeServer"):
324
331
def register (self , http_server : HttpServer ) -> None :
325
332
# /rooms/$roomid/send/$event_type[/$txn_id]
326
333
PATTERNS = "/rooms/(?P<room_id>[^/]*)/send/(?P<event_type>[^/]*)"
327
- register_txn_path (self , PATTERNS , http_server , with_get = True )
334
+ register_txn_path (self , PATTERNS , http_server )
328
335
329
- async def on_POST (
336
+ async def _do (
330
337
self ,
331
338
request : SynapseRequest ,
339
+ requester : Requester ,
332
340
room_id : str ,
333
341
event_type : str ,
334
- txn_id : Optional [str ] = None ,
342
+ txn_id : Optional [str ],
335
343
) -> Tuple [int , JsonDict ]:
336
- requester = await self .auth .get_user_by_req (request , allow_guest = True )
337
344
content = parse_json_object_from_request (request )
338
345
339
346
event_dict : JsonDict = {
@@ -362,18 +369,30 @@ async def on_POST(
362
369
set_tag ("event_id" , event_id )
363
370
return 200 , {"event_id" : event_id }
364
371
365
- def on_GET (
366
- self , request : SynapseRequest , room_id : str , event_type : str , txn_id : str
367
- ) -> Tuple [int , str ]:
368
- return 200 , "Not implemented"
372
+ async def on_POST (
373
+ self ,
374
+ request : SynapseRequest ,
375
+ room_id : str ,
376
+ event_type : str ,
377
+ ) -> Tuple [int , JsonDict ]:
378
+ requester = await self .auth .get_user_by_req (request , allow_guest = True )
379
+ return await self ._do (request , requester , room_id , event_type , None )
369
380
370
- def on_PUT (
381
+ async def on_PUT (
371
382
self , request : SynapseRequest , room_id : str , event_type : str , txn_id : str
372
- ) -> Awaitable [Tuple [int , JsonDict ]]:
383
+ ) -> Tuple [int , JsonDict ]:
384
+ requester = await self .auth .get_user_by_req (request , allow_guest = True )
373
385
set_tag ("txn_id" , txn_id )
374
386
375
- return self .txns .fetch_or_execute_request (
376
- request , self .on_POST , request , room_id , event_type , txn_id
387
+ return await self .txns .fetch_or_execute_request (
388
+ request ,
389
+ requester ,
390
+ self ._do ,
391
+ request ,
392
+ requester ,
393
+ room_id ,
394
+ event_type ,
395
+ txn_id ,
377
396
)
378
397
379
398
@@ -389,14 +408,13 @@ def register(self, http_server: HttpServer) -> None:
389
408
PATTERNS = "/join/(?P<room_identifier>[^/]*)"
390
409
register_txn_path (self , PATTERNS , http_server )
391
410
392
- async def on_POST (
411
+ async def _do (
393
412
self ,
394
413
request : SynapseRequest ,
414
+ requester : Requester ,
395
415
room_identifier : str ,
396
- txn_id : Optional [str ] = None ,
416
+ txn_id : Optional [str ],
397
417
) -> Tuple [int , JsonDict ]:
398
- requester = await self .auth .get_user_by_req (request , allow_guest = True )
399
-
400
418
content = parse_json_object_from_request (request , allow_empty_body = True )
401
419
402
420
# twisted.web.server.Request.args is incorrectly defined as Optional[Any]
@@ -420,22 +438,31 @@ async def on_POST(
420
438
421
439
return 200 , {"room_id" : room_id }
422
440
423
- def on_PUT (
441
+ async def on_POST (
442
+ self ,
443
+ request : SynapseRequest ,
444
+ room_identifier : str ,
445
+ ) -> Tuple [int , JsonDict ]:
446
+ requester = await self .auth .get_user_by_req (request , allow_guest = True )
447
+ return await self ._do (request , requester , room_identifier , None )
448
+
449
+ async def on_PUT (
424
450
self , request : SynapseRequest , room_identifier : str , txn_id : str
425
- ) -> Awaitable [Tuple [int , JsonDict ]]:
451
+ ) -> Tuple [int , JsonDict ]:
452
+ requester = await self .auth .get_user_by_req (request , allow_guest = True )
426
453
set_tag ("txn_id" , txn_id )
427
454
428
- return self .txns .fetch_or_execute_request (
429
- request , self .on_POST , request , room_identifier , txn_id
455
+ return await self .txns .fetch_or_execute_request (
456
+ request , requester , self ._do , request , requester , room_identifier , txn_id
430
457
)
431
458
432
459
433
460
# TODO: Needs unit testing
434
- class PublicRoomListRestServlet (TransactionRestServlet ):
461
+ class PublicRoomListRestServlet (RestServlet ):
435
462
PATTERNS = client_patterns ("/publicRooms$" , v1 = True )
436
463
437
464
def __init__ (self , hs : "HomeServer" ):
438
- super ().__init__ (hs )
465
+ super ().__init__ ()
439
466
self .hs = hs
440
467
self .auth = hs .get_auth ()
441
468
@@ -907,22 +934,25 @@ def register(self, http_server: HttpServer) -> None:
907
934
PATTERNS = "/rooms/(?P<room_id>[^/]*)/forget"
908
935
register_txn_path (self , PATTERNS , http_server )
909
936
910
- async def on_POST (
911
- self , request : SynapseRequest , room_id : str , txn_id : Optional [str ] = None
912
- ) -> Tuple [int , JsonDict ]:
913
- requester = await self .auth .get_user_by_req (request , allow_guest = False )
914
-
937
+ async def _do (self , requester : Requester , room_id : str ) -> Tuple [int , JsonDict ]:
915
938
await self .room_member_handler .forget (user = requester .user , room_id = room_id )
916
939
917
940
return 200 , {}
918
941
919
- def on_PUT (
942
+ async def on_POST (
943
+ self , request : SynapseRequest , room_id : str
944
+ ) -> Tuple [int , JsonDict ]:
945
+ requester = await self .auth .get_user_by_req (request , allow_guest = False )
946
+ return await self ._do (requester , room_id )
947
+
948
+ async def on_PUT (
920
949
self , request : SynapseRequest , room_id : str , txn_id : str
921
- ) -> Awaitable [Tuple [int , JsonDict ]]:
950
+ ) -> Tuple [int , JsonDict ]:
951
+ requester = await self .auth .get_user_by_req (request , allow_guest = False )
922
952
set_tag ("txn_id" , txn_id )
923
953
924
- return self .txns .fetch_or_execute_request (
925
- request , self .on_POST , request , room_id , txn_id
954
+ return await self .txns .fetch_or_execute_request (
955
+ request , requester , self ._do , requester , room_id
926
956
)
927
957
928
958
@@ -941,15 +971,14 @@ def register(self, http_server: HttpServer) -> None:
941
971
)
942
972
register_txn_path (self , PATTERNS , http_server )
943
973
944
- async def on_POST (
974
+ async def _do (
945
975
self ,
946
976
request : SynapseRequest ,
977
+ requester : Requester ,
947
978
room_id : str ,
948
979
membership_action : str ,
949
- txn_id : Optional [str ] = None ,
980
+ txn_id : Optional [str ],
950
981
) -> Tuple [int , JsonDict ]:
951
- requester = await self .auth .get_user_by_req (request , allow_guest = True )
952
-
953
982
if requester .is_guest and membership_action not in {
954
983
Membership .JOIN ,
955
984
Membership .LEAVE ,
@@ -1014,13 +1043,30 @@ async def on_POST(
1014
1043
1015
1044
return 200 , return_value
1016
1045
1017
- def on_PUT (
1046
+ async def on_POST (
1047
+ self ,
1048
+ request : SynapseRequest ,
1049
+ room_id : str ,
1050
+ membership_action : str ,
1051
+ ) -> Tuple [int , JsonDict ]:
1052
+ requester = await self .auth .get_user_by_req (request , allow_guest = True )
1053
+ return await self ._do (request , requester , room_id , membership_action , None )
1054
+
1055
+ async def on_PUT (
1018
1056
self , request : SynapseRequest , room_id : str , membership_action : str , txn_id : str
1019
- ) -> Awaitable [Tuple [int , JsonDict ]]:
1057
+ ) -> Tuple [int , JsonDict ]:
1058
+ requester = await self .auth .get_user_by_req (request , allow_guest = True )
1020
1059
set_tag ("txn_id" , txn_id )
1021
1060
1022
- return self .txns .fetch_or_execute_request (
1023
- request , self .on_POST , request , room_id , membership_action , txn_id
1061
+ return await self .txns .fetch_or_execute_request (
1062
+ request ,
1063
+ requester ,
1064
+ self ._do ,
1065
+ request ,
1066
+ requester ,
1067
+ room_id ,
1068
+ membership_action ,
1069
+ txn_id ,
1024
1070
)
1025
1071
1026
1072
@@ -1036,14 +1082,14 @@ def register(self, http_server: HttpServer) -> None:
1036
1082
PATTERNS = "/rooms/(?P<room_id>[^/]*)/redact/(?P<event_id>[^/]*)"
1037
1083
register_txn_path (self , PATTERNS , http_server )
1038
1084
1039
- async def on_POST (
1085
+ async def _do (
1040
1086
self ,
1041
1087
request : SynapseRequest ,
1088
+ requester : Requester ,
1042
1089
room_id : str ,
1043
1090
event_id : str ,
1044
- txn_id : Optional [str ] = None ,
1091
+ txn_id : Optional [str ],
1045
1092
) -> Tuple [int , JsonDict ]:
1046
- requester = await self .auth .get_user_by_req (request )
1047
1093
content = parse_json_object_from_request (request )
1048
1094
1049
1095
try :
@@ -1094,13 +1140,23 @@ async def on_POST(
1094
1140
set_tag ("event_id" , event_id )
1095
1141
return 200 , {"event_id" : event_id }
1096
1142
1097
- def on_PUT (
1143
+ async def on_POST (
1144
+ self ,
1145
+ request : SynapseRequest ,
1146
+ room_id : str ,
1147
+ event_id : str ,
1148
+ ) -> Tuple [int , JsonDict ]:
1149
+ requester = await self .auth .get_user_by_req (request )
1150
+ return await self ._do (request , requester , room_id , event_id , None )
1151
+
1152
+ async def on_PUT (
1098
1153
self , request : SynapseRequest , room_id : str , event_id : str , txn_id : str
1099
- ) -> Awaitable [Tuple [int , JsonDict ]]:
1154
+ ) -> Tuple [int , JsonDict ]:
1155
+ requester = await self .auth .get_user_by_req (request )
1100
1156
set_tag ("txn_id" , txn_id )
1101
1157
1102
- return self .txns .fetch_or_execute_request (
1103
- request , self .on_POST , request , room_id , event_id , txn_id
1158
+ return await self .txns .fetch_or_execute_request (
1159
+ request , requester , self ._do , request , requester , room_id , event_id , txn_id
1104
1160
)
1105
1161
1106
1162
@@ -1224,7 +1280,6 @@ def register_txn_path(
1224
1280
servlet : RestServlet ,
1225
1281
regex_string : str ,
1226
1282
http_server : HttpServer ,
1227
- with_get : bool = False ,
1228
1283
) -> None :
1229
1284
"""Registers a transaction-based path.
1230
1285
@@ -1236,7 +1291,6 @@ def register_txn_path(
1236
1291
regex_string: The regex string to register. Must NOT have a
1237
1292
trailing $ as this string will be appended to.
1238
1293
http_server: The http_server to register paths with.
1239
- with_get: True to also register respective GET paths for the PUTs.
1240
1294
"""
1241
1295
on_POST = getattr (servlet , "on_POST" , None )
1242
1296
on_PUT = getattr (servlet , "on_PUT" , None )
@@ -1254,18 +1308,6 @@ def register_txn_path(
1254
1308
on_PUT ,
1255
1309
servlet .__class__ .__name__ ,
1256
1310
)
1257
- on_GET = getattr (servlet , "on_GET" , None )
1258
- if with_get :
1259
- if on_GET is None :
1260
- raise RuntimeError (
1261
- "register_txn_path called with with_get = True, but no on_GET method exists"
1262
- )
1263
- http_server .register_paths (
1264
- "GET" ,
1265
- client_patterns (regex_string + "/(?P<txn_id>[^/]*)$" , v1 = True ),
1266
- on_GET ,
1267
- servlet .__class__ .__name__ ,
1268
- )
1269
1311
1270
1312
1271
1313
class TimestampLookupRestServlet (RestServlet ):
0 commit comments