@@ -1953,16 +1953,31 @@ async def on_send_membership_event(
1953
1953
self , origin : str , event : EventBase
1954
1954
) -> EventContext :
1955
1955
"""
1956
- We have received a join/leave/knock event for a room.
1956
+ We have received a join/leave/knock event for a room via send_join/leave/knock .
1957
1957
1958
1958
Verify that event and send it into the room on the remote homeserver's behalf.
1959
1959
1960
+ This is quite similar to on_receive_pdu, with the following principal
1961
+ differences:
1962
+ * only membership events are permitted (and only events with
1963
+ sender==state_key -- ie, no kicks or bans)
1964
+ * *We* send out the event on behalf of the remote server.
1965
+ * We enforce the membership restrictions of restricted rooms.
1966
+ * Rejected events result in an exception rather than being stored.
1967
+
1968
+ There are also other differences, however it is not clear if these are by
1969
+ design or omission. In particular, we do not attempt to backfill any missing
1970
+ prev_events.
1971
+
1960
1972
Args:
1961
1973
origin: The homeserver of the remote (joining/invited/knocking) user.
1962
1974
event: The member event that has been signed by the remote homeserver.
1963
1975
1964
1976
Returns:
1965
1977
The context of the event after inserting it into the room graph.
1978
+
1979
+ Raises:
1980
+ SynapseError if the event is not accepted into the room
1966
1981
"""
1967
1982
logger .debug (
1968
1983
"on_send_membership_event: Got event: %s, signatures: %s" ,
@@ -1981,7 +1996,7 @@ async def on_send_membership_event(
1981
1996
if event .sender != event .state_key :
1982
1997
raise SynapseError (400 , "state_key and sender must match" , Codes .BAD_JSON )
1983
1998
1984
- event .internal_metadata .outlier = False
1999
+ assert not event .internal_metadata .outlier
1985
2000
1986
2001
# Send this event on behalf of the other server.
1987
2002
#
@@ -1991,6 +2006,11 @@ async def on_send_membership_event(
1991
2006
event .internal_metadata .send_on_behalf_of = origin
1992
2007
1993
2008
context = await self .state_handler .compute_event_context (event )
2009
+ context = await self ._check_event_auth (origin , event , context )
2010
+ if context .rejected :
2011
+ raise SynapseError (
2012
+ 403 , f"{ event .membership } event was rejected" , Codes .FORBIDDEN
2013
+ )
1994
2014
1995
2015
# for joins, we need to check the restrictions of restricted rooms
1996
2016
if event .membership == Membership .JOIN :
@@ -2008,8 +2028,8 @@ async def on_send_membership_event(
2008
2028
403 , "This event is not allowed in this context" , Codes .FORBIDDEN
2009
2029
)
2010
2030
2011
- await self . _auth_and_persist_event ( origin , event , context )
2012
-
2031
+ # all looks good, we can persist the event.
2032
+ await self . _run_push_actions_and_persist_event ( event , context )
2013
2033
return context
2014
2034
2015
2035
async def _check_join_restrictions (
@@ -2179,6 +2199,18 @@ async def _auth_and_persist_event(
2179
2199
backfilled = backfilled ,
2180
2200
)
2181
2201
2202
+ await self ._run_push_actions_and_persist_event (event , context , backfilled )
2203
+
2204
+ async def _run_push_actions_and_persist_event (
2205
+ self , event : EventBase , context : EventContext , backfilled : bool = False
2206
+ ):
2207
+ """Run the push actions for a received event, and persist it.
2208
+
2209
+ Args:
2210
+ event: The event itself.
2211
+ context: The event context.
2212
+ backfilled: True if the event was backfilled.
2213
+ """
2182
2214
try :
2183
2215
if (
2184
2216
not event .internal_metadata .is_outlier ()
@@ -2492,9 +2524,9 @@ async def _check_event_auth(
2492
2524
origin : str ,
2493
2525
event : EventBase ,
2494
2526
context : EventContext ,
2495
- state : Optional [Iterable [EventBase ]],
2496
- auth_events : Optional [MutableStateMap [EventBase ]],
2497
- backfilled : bool ,
2527
+ state : Optional [Iterable [EventBase ]] = None ,
2528
+ auth_events : Optional [MutableStateMap [EventBase ]] = None ,
2529
+ backfilled : bool = False ,
2498
2530
) -> EventContext :
2499
2531
"""
2500
2532
Checks whether an event should be rejected (for failing auth checks).
0 commit comments