Exclude OOB memberships from the federation sender (#12570)
As the comment says, there is no need to process such events, and indeed we
need to avoid doing so.
Fixes #12509.
1 files changed, 39 insertions, 0 deletions
diff --git a/synapse/federation/sender/__init__.py b/synapse/federation/sender/__init__.py
index 30e2421efc..d795b7b26b 100644
--- a/synapse/federation/sender/__init__.py
+++ b/synapse/federation/sender/__init__.py
@@ -355,6 +355,45 @@ class FederationSender(AbstractFederationSender):
if not is_mine and send_on_behalf_of is None:
return
+ # We also want to not send out-of-band membership events.
+ #
+ # OOB memberships are used in three (and a half) situations:
+ #
+ # (1) invite events which we have received over federation. Those
+ # will have a `sender` on a different server, so will be
+ # skipped by the "is_mine" test above anyway.
+ #
+ # (2) rejections of invites to federated rooms - either remotely
+ # or locally generated. (Such rejections are normally
+ # created via federation, in which case the remote server is
+ # responsible for sending out the rejection. If that fails,
+ # we'll create a leave event locally, but that's only really
+ # for the benefit of the invited user - we don't have enough
+ # information to send it out over federation).
+ #
+ # (2a) rescinded knocks. These are identical to rejected invites.
+ #
+ # (3) knock events which we have sent over federation. As with
+ # invite rejections, the remote server should send them out to
+ # the federation.
+ #
+ # So, in all the above cases, we want to ignore such events.
+ #
+ # OOB memberships are always(?) outliers anyway, so if we *don't*
+ # ignore them, we'll get an exception further down when we try to
+ # fetch the membership list for the room.
+ #
+ # Arguably, we could equivalently ignore all outliers here, since
+ # in theory the only way for an outlier with a local `sender` to
+ # exist is by being an OOB membership (via one of (2), (2a) or (3)
+ # above).
+ #
+ if event.internal_metadata.is_out_of_band_membership():
+ return
+
+ # Finally, there are some other events that we should not send out
+ # until someone asks for them. They are explicitly flagged as such
+ # with `proactively_send: False`.
if not event.internal_metadata.should_proactively_send():
return
|