aboutsummaryrefslogtreecommitdiff
path: root/federationapi/internal/perform.go
diff options
context:
space:
mode:
Diffstat (limited to 'federationapi/internal/perform.go')
-rw-r--r--federationapi/internal/perform.go18
1 files changed, 17 insertions, 1 deletions
diff --git a/federationapi/internal/perform.go b/federationapi/internal/perform.go
index 577cb70e..7ccd68ef 100644
--- a/federationapi/internal/perform.go
+++ b/federationapi/internal/perform.go
@@ -8,6 +8,7 @@ import (
"time"
"github.com/matrix-org/dendrite/federationapi/api"
+ "github.com/matrix-org/dendrite/federationapi/consumers"
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/version"
"github.com/matrix-org/gomatrix"
@@ -235,6 +236,21 @@ func (r *FederationInternalAPI) performJoinUsingServer(
return fmt.Errorf("respSendJoin.Check: %w", err)
}
+ // We need to immediately update our list of joined hosts for this room now as we are technically
+ // joined. We must do this synchronously: we cannot rely on the roomserver output events as they
+ // will happen asyncly. If we don't update this table, you can end up with bad failure modes like
+ // joining a room, waiting for 200 OK then changing device keys and have those keys not be sent
+ // to other servers (this was a cause of a flakey sytest "Local device key changes get to remote servers")
+ // The events are trusted now as we performed auth checks above.
+ joinedHosts, err := consumers.JoinedHostsFromEvents(respState.StateEvents.TrustedEvents(respMakeJoin.RoomVersion, false))
+ if err != nil {
+ return fmt.Errorf("JoinedHostsFromEvents: failed to get joined hosts: %s", err)
+ }
+ logrus.WithField("hosts", joinedHosts).WithField("room", roomID).Info("Joined federated room with hosts")
+ if _, err = r.db.UpdateRoom(context.Background(), roomID, joinedHosts, nil, true); err != nil {
+ return fmt.Errorf("UpdatedRoom: failed to update room with joined hosts: %s", err)
+ }
+
// If we successfully performed a send_join above then the other
// server now thinks we're a part of the room. Send the newly
// returned state to the roomserver to update our local view.
@@ -650,7 +666,7 @@ func setDefaultRoomVersionFromJoinEvent(joinEvent gomatrixserverlib.EventBuilder
// FederatedAuthProvider is an auth chain provider which fetches events from the server provided
func federatedAuthProvider(
- ctx context.Context, federation *gomatrixserverlib.FederationClient,
+ ctx context.Context, federation api.FederationClient,
keyRing gomatrixserverlib.JSONVerifier, server gomatrixserverlib.ServerName,
) gomatrixserverlib.AuthChainProvider {
// A list of events that we have retried, if they were not included in