summary refs log tree commit diff
path: root/synapse/handlers/federation.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--synapse/handlers/federation.py69
1 files changed, 40 insertions, 29 deletions
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py

index 299588e476..ff751d25f6 100644 --- a/synapse/handlers/federation.py +++ b/synapse/handlers/federation.py
@@ -78,6 +78,7 @@ from synapse.replication.http.federation import ( ReplicationStoreRoomOnOutlierMembershipRestServlet, ) from synapse.storage.databases.main.events_worker import EventRedactBehaviour +from synapse.storage.invite_rule import InviteRule from synapse.types import JsonDict, StrCollection, get_domain_from_id from synapse.types.state import StateFilter from synapse.util.async_helpers import Linearizer @@ -210,7 +211,7 @@ class FederationHandler: @tag_args async def maybe_backfill( self, room_id: str, current_depth: int, limit: int, record_time: bool = True - ) -> bool: + ) -> None: """Checks the database to see if we should backfill before paginating, and if so do. @@ -224,8 +225,6 @@ class FederationHandler: should back paginate. record_time: Whether to record the time it takes to backfill. - Returns: - True if we actually tried to backfill something, otherwise False. """ # Starting the processing time here so we can include the room backfill # linearizer lock queue in the timing @@ -251,7 +250,7 @@ class FederationHandler: limit: int, *, processing_start_time: Optional[int], - ) -> bool: + ) -> None: """ Checks whether the `current_depth` is at or approaching any backfill points in the room and if so, will backfill. We only care about @@ -325,7 +324,7 @@ class FederationHandler: limit=1, ) if not have_later_backfill_points: - return False + return None logger.debug( "_maybe_backfill_inner: all backfill points are *after* current depth. Trying again with later backfill points." @@ -345,15 +344,15 @@ class FederationHandler: ) # We return `False` because we're backfilling in the background and there is # no new events immediately for the caller to know about yet. - return False + return None # Even after recursing with `MAX_DEPTH`, we didn't find any # backward extremities to backfill from. if not sorted_backfill_points: logger.debug( - "_maybe_backfill_inner: Not backfilling as no backward extremeties found." + "_maybe_backfill_inner: Not backfilling as no backward extremities found." ) - return False + return None # If we're approaching an extremity we trigger a backfill, otherwise we # no-op. @@ -372,7 +371,7 @@ class FederationHandler: current_depth, limit, ) - return False + return None # For performance's sake, we only want to paginate from a particular extremity # if we can actually see the events we'll get. Otherwise, we'd just spend a lot @@ -440,7 +439,7 @@ class FederationHandler: logger.debug( "_maybe_backfill_inner: found no extremities which would be visible" ) - return False + return None logger.debug( "_maybe_backfill_inner: extremities_to_request %s", extremities_to_request @@ -463,7 +462,7 @@ class FederationHandler: ) ) - async def try_backfill(domains: StrCollection) -> bool: + async def try_backfill(domains: StrCollection) -> None: # TODO: Should we try multiple of these at a time? # Number of contacted remote homeservers that have denied our backfill @@ -486,7 +485,7 @@ class FederationHandler: # If this succeeded then we probably already have the # appropriate stuff. # TODO: We can probably do something more intelligent here. - return True + return None except NotRetryingDestination as e: logger.info("_maybe_backfill_inner: %s", e) continue @@ -510,7 +509,7 @@ class FederationHandler: ) denied_count += 1 if denied_count >= max_denied_count: - return False + return None continue logger.info("Failed to backfill from %s because %s", dom, e) @@ -526,7 +525,7 @@ class FederationHandler: ) denied_count += 1 if denied_count >= max_denied_count: - return False + return None continue logger.info("Failed to backfill from %s because %s", dom, e) @@ -538,7 +537,7 @@ class FederationHandler: logger.exception("Failed to backfill from %s because %s", dom, e) continue - return False + return None # If we have the `processing_start_time`, then we can make an # observation. We wouldn't have the `processing_start_time` in the case @@ -550,14 +549,9 @@ class FederationHandler: (processing_end_time - processing_start_time) / 1000 ) - success = await try_backfill(likely_domains) - if success: - return True - # TODO: we could also try servers which were previously in the room, but # are no longer. - - return False + return await try_backfill(likely_domains) async def send_invite(self, target_host: str, event: EventBase) -> EventBase: """Sends the invite to the remote server for signing. @@ -880,6 +874,9 @@ class FederationHandler: if stripped_room_state is None: raise KeyError("Missing 'knock_room_state' field in send_knock response") + if not isinstance(stripped_room_state, list): + raise TypeError("'knock_room_state' has wrong type") + event.unsigned["knock_room_state"] = stripped_room_state context = EventContext.for_outlier(self._storage_controllers) @@ -1001,11 +998,11 @@ class FederationHandler: ) if include_auth_user_id: - event_content[EventContentFields.AUTHORISING_USER] = ( - await self._event_auth_handler.get_user_which_could_invite( - room_id, - state_ids, - ) + event_content[ + EventContentFields.AUTHORISING_USER + ] = await self._event_auth_handler.get_user_which_could_invite( + room_id, + state_ids, ) builder = self.event_builder_factory.for_room_version( @@ -1086,6 +1083,20 @@ class FederationHandler: if event.state_key == self._server_notices_mxid: raise SynapseError(HTTPStatus.FORBIDDEN, "Cannot invite this user") + # check the invitee's configuration and apply rules + invite_config = await self.store.get_invite_config_for_user(event.state_key) + rule = invite_config.get_invite_rule(event.sender) + if rule == InviteRule.BLOCK: + logger.info( + f"Automatically rejecting invite from {event.sender} due to the invite filtering rules of {event.state_key}" + ) + raise SynapseError( + 403, + "You are not permitted to invite this user.", + errcode=Codes.INVITE_BLOCKED, + ) + # InviteRule.IGNORE is handled at the sync layer + # We retrieve the room member handler here as to not cause a cyclic dependency member_handler = self.hs.get_room_member_handler() # We don't rate limit based on room ID, as that should be done by @@ -1309,9 +1320,9 @@ class FederationHandler: if state_key is not None: # the event was not rejected (get_event raises a NotFoundError for rejected # events) so the state at the event should include the event itself. - assert ( - state_map.get((event.type, state_key)) == event.event_id - ), "State at event did not include event itself" + assert state_map.get((event.type, state_key)) == event.event_id, ( + "State at event did not include event itself" + ) # ... but we need the state *before* that event if "replaces_state" in event.unsigned: