diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2022-05-03 13:47:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-03 12:47:56 +0000 |
commit | db2edf5a65c5bcac565e052b2dbd74253755a717 (patch) | |
tree | bfce61a18ba3ae38c41ca5587ea0604bb1363d38 /synapse/federation/sender | |
parent | Merge branch 'master' into develop (diff) | |
download | synapse-db2edf5a65c5bcac565e052b2dbd74253755a717.tar.xz |
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.
Diffstat (limited to 'synapse/federation/sender')
-rw-r--r-- | synapse/federation/sender/__init__.py | 39 |
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 |