Clarify the invite flows

This commit is contained in:
Erik Johnston 2019-01-23 20:05:44 +00:00
parent 07f62da55a
commit 7c288c2250
3 changed files with 24 additions and 7 deletions

View file

@ -41,8 +41,12 @@ class _EventInternalMetadata(object):
def is_outlier(self): def is_outlier(self):
return getattr(self, "outlier", False) return getattr(self, "outlier", False)
def is_invite_from_remote(self): def is_new_remote_event(self):
return getattr(self, "invite_from_remote", False) """Whether this is a new remote event, like an invite or an invite
rejection. This is needed as those events are marked as outliers, but
they still need to be processed.
"""
return getattr(self, "new_remote_event", False)
def get_send_on_behalf_of(self): def get_send_on_behalf_of(self):
"""Whether this server should send the event on behalf of another server. """Whether this server should send the event on behalf of another server.

View file

@ -43,6 +43,7 @@ from synapse.api.errors import (
StoreError, StoreError,
SynapseError, SynapseError,
) )
from synapse.crypto.event_signing import compute_event_signature
from synapse.events.validator import EventValidator from synapse.events.validator import EventValidator
from synapse.replication.http.federation import ( from synapse.replication.http.federation import (
ReplicationCleanRoomRestServlet, ReplicationCleanRoomRestServlet,
@ -1283,7 +1284,15 @@ class FederationHandler(BaseHandler):
) )
event.internal_metadata.outlier = True event.internal_metadata.outlier = True
event.internal_metadata.invite_from_remote = True event.internal_metadata.new_remote_event = True
event.signatures.update(
compute_event_signature(
event,
self.hs.hostname,
self.hs.config.signing_key[0]
)
)
context = yield self.state_handler.compute_event_context(event) context = yield self.state_handler.compute_event_context(event)
yield self.persist_events_and_notify([(event, context)]) yield self.persist_events_and_notify([(event, context)])
@ -1301,6 +1310,7 @@ class FederationHandler(BaseHandler):
# Mark as outlier as we don't have any state for this event; we're not # Mark as outlier as we don't have any state for this event; we're not
# even in the room. # even in the room.
event.internal_metadata.outlier = True event.internal_metadata.outlier = True
event.internal_metadata.new_remote_event = True
# Try the host that we succesfully called /make_leave/ on first for # Try the host that we succesfully called /make_leave/ on first for
# the /send_leave/ request. # the /send_leave/ request.

View file

@ -588,10 +588,13 @@ class RoomMemberStore(RoomMemberWorkerStore):
) )
# We update the local_invites table only if the event is "current", # We update the local_invites table only if the event is "current",
# i.e., its something that has just happened. # i.e., its something that has just happened. If the event is an
# The only current event that can also be an outlier is if its an # outlier it is only current if its a "new remote event", like a
# invite that has come in across federation. # remote invite or a rejection of a remote invite.
is_new_state = not backfilled is_new_state = not backfilled and (
not event.internal_metadata.is_outlier()
or event.internal_metadata.is_new_remote_event()
)
is_mine = self.hs.is_mine_id(event.state_key) is_mine = self.hs.is_mine_id(event.state_key)
if is_new_state and is_mine: if is_new_state and is_mine:
if event.membership == Membership.INVITE: if event.membership == Membership.INVITE: