29
29
SynapseError ,
30
30
)
31
31
from synapse .api .filtering import Filter
32
+ from synapse .appservice import ApplicationService
32
33
from synapse .events .utils import format_event_for_client_v2
33
34
from synapse .http .servlet import (
34
35
RestServlet ,
47
48
from synapse .streams .config import PaginationConfig
48
49
from synapse .types import (
49
50
JsonDict ,
51
+ Requester ,
50
52
RoomAlias ,
51
53
RoomID ,
52
54
StreamToken ,
53
55
ThirdPartyInstanceID ,
54
56
UserID ,
57
+ create_requester ,
55
58
)
56
59
from synapse .util import json_decoder
57
60
from synapse .util .stringutils import parse_and_validate_server_name , random_string
@@ -309,7 +312,7 @@ def __init__(self, hs):
309
312
self .room_member_handler = hs .get_room_member_handler ()
310
313
self .auth = hs .get_auth ()
311
314
312
- async def inherit_depth_from_prev_ids (self , prev_event_ids ) -> int :
315
+ async def _inherit_depth_from_prev_ids (self , prev_event_ids ) -> int :
313
316
(
314
317
most_recent_prev_event_id ,
315
318
most_recent_prev_event_depth ,
@@ -378,6 +381,25 @@ def _create_insertion_event_dict(
378
381
379
382
return insertion_event
380
383
384
+ async def _create_requester_for_user_id_from_app_service (
385
+ self , user_id : str , app_service : ApplicationService
386
+ ) -> Requester :
387
+ """Creates a new requester for the given user_id
388
+ and validates that the app service is allowed to control
389
+ the given user.
390
+
391
+ Args:
392
+ user_id: The author MXID that the app service is controlling
393
+ app_service: The app service that controls the user
394
+
395
+ Returns:
396
+ Requester object
397
+ """
398
+
399
+ await self .auth .validate_appservice_can_control_user_id (app_service , user_id )
400
+
401
+ return create_requester (user_id , app_service = app_service )
402
+
381
403
async def on_POST (self , request , room_id ):
382
404
requester = await self .auth .get_user_by_req (request , allow_guest = False )
383
405
@@ -443,7 +465,9 @@ async def on_POST(self, request, room_id):
443
465
if event_dict ["type" ] == EventTypes .Member :
444
466
membership = event_dict ["content" ].get ("membership" , None )
445
467
event_id , _ = await self .room_member_handler .update_membership (
446
- requester ,
468
+ await self ._create_requester_for_user_id_from_app_service (
469
+ state_event ["sender" ], requester .app_service
470
+ ),
447
471
target = UserID .from_string (event_dict ["state_key" ]),
448
472
room_id = room_id ,
449
473
action = membership ,
@@ -463,7 +487,9 @@ async def on_POST(self, request, room_id):
463
487
event ,
464
488
_ ,
465
489
) = await self .event_creation_handler .create_and_send_nonmember_event (
466
- requester ,
490
+ await self ._create_requester_for_user_id_from_app_service (
491
+ state_event ["sender" ], requester .app_service
492
+ ),
467
493
event_dict ,
468
494
outlier = True ,
469
495
prev_event_ids = [fake_prev_event_id ],
@@ -479,7 +505,9 @@ async def on_POST(self, request, room_id):
479
505
events_to_create = body ["events" ]
480
506
481
507
prev_event_ids = prev_events_from_query
482
- inherited_depth = await self .inherit_depth_from_prev_ids (prev_events_from_query )
508
+ inherited_depth = await self ._inherit_depth_from_prev_ids (
509
+ prev_events_from_query
510
+ )
483
511
484
512
# Figure out which chunk to connect to. If they passed in
485
513
# chunk_id_from_query let's use it. The chunk ID passed in comes
@@ -509,7 +537,10 @@ async def on_POST(self, request, room_id):
509
537
base_insertion_event ,
510
538
_ ,
511
539
) = await self .event_creation_handler .create_and_send_nonmember_event (
512
- requester ,
540
+ await self ._create_requester_for_user_id_from_app_service (
541
+ base_insertion_event_dict ["sender" ],
542
+ requester .app_service ,
543
+ ),
513
544
base_insertion_event_dict ,
514
545
prev_event_ids = base_insertion_event_dict .get ("prev_events" ),
515
546
auth_event_ids = auth_event_ids ,
@@ -558,7 +589,9 @@ async def on_POST(self, request, room_id):
558
589
}
559
590
560
591
event , context = await self .event_creation_handler .create_event (
561
- requester ,
592
+ await self ._create_requester_for_user_id_from_app_service (
593
+ ev ["sender" ], requester .app_service
594
+ ),
562
595
event_dict ,
563
596
prev_event_ids = event_dict .get ("prev_events" ),
564
597
auth_event_ids = auth_event_ids ,
@@ -588,7 +621,9 @@ async def on_POST(self, request, room_id):
588
621
# where topological_ordering is just depth.
589
622
for (event , context ) in reversed (events_to_persist ):
590
623
ev = await self .event_creation_handler .handle_new_client_event (
591
- requester = requester ,
624
+ await self ._create_requester_for_user_id_from_app_service (
625
+ event ["sender" ], requester .app_service
626
+ ),
592
627
event = event ,
593
628
context = context ,
594
629
)
0 commit comments