aboutsummaryrefslogtreecommitdiff
path: root/roomserver/internal/perform/perform_join.go
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-09-15 11:17:46 +0100
committerGitHub <noreply@github.com>2020-09-15 11:17:46 +0100
commit965f068d1a6298b2ec733b0df983773a6ec8b622 (patch)
treee7a5cda3dba38114189eb857111baaa07bbe4854 /roomserver/internal/perform/perform_join.go
parent8dc95062101b3906ffb83604e2abca02d9a3dd03 (diff)
Handle state with input event as new events (#1415)
* SendEventWithState events as new * Use cumulative state IDs for final event * Error wrapping in calculateAndSetState * Handle overwriting same event type and state key * Hacky way to spot historical events * Don't exclude from sync * Don't generate output events when rewriting forward extremities * Update output event check * Historical output events * Define output room event type * Notify key changes on state * Don't send our membership event twice * Deduplicate state entries * Tweaks * Remove unnecessary nolint * Fix current state upsert in sync API * Send auth events as outliers, state events as rewrite * Sync API don't consume state events * Process events actually * Improve outlier check * Fix local room check * Remove extra room check, it seems to break the whole damn world * Fix federated join check * Fix nil pointer exception * Better comments on DeduplicateStateEntries * Reflow forced federated joins * Don't force federated join for possibly even local invites * Comment SendEventWithState better * Rewrite room state in sync API storage * Add TODO * Clean up all room data when receiving create event * Don't generate output events for rewrites, but instead notify that state is rewritten on the final new event * Rename to PurgeRoom * Exclude backfilled messages from /sync * Split out rewriting state from updating state from state res Co-authored-by: Kegan Dougal <kegan@matrix.org>
Diffstat (limited to 'roomserver/internal/perform/perform_join.go')
-rw-r--r--roomserver/internal/perform/perform_join.go30
1 files changed, 15 insertions, 15 deletions
diff --git a/roomserver/internal/perform/perform_join.go b/roomserver/internal/perform/perform_join.go
index 3d194227..f76806c7 100644
--- a/roomserver/internal/perform/perform_join.go
+++ b/roomserver/internal/perform/perform_join.go
@@ -183,33 +183,33 @@ func (r *Joiner) performJoinRoomByID(
return "", fmt.Errorf("eb.SetContent: %w", err)
}
- // First work out if this is in response to an existing invite
- // from a federated server. If it is then we avoid the situation
- // where we might think we know about a room in the following
- // section but don't know the latest state as all of our users
- // have left.
+ // Force a federated join if we aren't in the room and we've been
+ // given some server names to try joining by.
serverInRoom, _ := helpers.IsServerCurrentlyInRoom(ctx, r.DB, r.ServerName, req.RoomIDOrAlias)
+ forceFederatedJoin := len(req.ServerNames) > 0 && !serverInRoom
+
+ // Force a federated join if we're dealing with a pending invite
+ // and we aren't in the room.
isInvitePending, inviteSender, _, err := helpers.IsInvitePending(ctx, r.DB, req.RoomIDOrAlias, req.UserID)
- if err == nil && isInvitePending && !serverInRoom {
- // Check if there's an invite pending.
+ if err == nil && isInvitePending {
_, inviterDomain, ierr := gomatrixserverlib.SplitID('@', inviteSender)
if ierr != nil {
return "", fmt.Errorf("gomatrixserverlib.SplitID: %w", err)
}
- // Check that the domain isn't ours. If it's local then we don't
- // need to do anything as our own copy of the room state will be
- // up-to-date.
+ // If we were invited by someone from another server then we can
+ // assume they are in the room so we can join via them.
if inviterDomain != r.Cfg.Matrix.ServerName {
- // Add the server of the person who invited us to the server list,
- // as they should be a fairly good bet.
req.ServerNames = append(req.ServerNames, inviterDomain)
-
- // Perform a federated room join.
- return req.RoomIDOrAlias, r.performFederatedJoinRoomByID(ctx, req)
+ forceFederatedJoin = true
}
}
+ // If we should do a forced federated join then do that.
+ if forceFederatedJoin {
+ return req.RoomIDOrAlias, r.performFederatedJoinRoomByID(ctx, req)
+ }
+
// Try to construct an actual join event from the template.
// If this succeeds then it is a sign that the room already exists
// locally on the homeserver.