From 4298a7ac0d12b8a3b3e300dcb1a289d8e151e636 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Fri, 5 Jun 2020 11:03:54 +0100 Subject: [PATCH] Use AuthChainProvider --- federationsender/internal/perform/join.go | 60 ++++++++++++++--------- go.mod | 2 +- go.sum | 4 +- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/federationsender/internal/perform/join.go b/federationsender/internal/perform/join.go index 96088053f..b6017361a 100644 --- a/federationsender/internal/perform/join.go +++ b/federationsender/internal/perform/join.go @@ -33,37 +33,49 @@ func (r joinContext) CheckSendJoinResponse( ) error { // A list of events that we have retried, if they were not included in // the auth events supplied in the send_join. - retries := map[string]*gomatrixserverlib.Event{} + retries := map[string][]gomatrixserverlib.Event{} // Define a function which we can pass to Check to retrieve missing // auth events inline. This greatly increases our chances of not having // to repeat the entire set of checks just for a missing event or two. - missingAuth := func(eventID string, roomVersion gomatrixserverlib.RoomVersion) (*gomatrixserverlib.Event, error) { - if retry, ok := retries[eventID]; ok { - if retry == nil { - return nil, fmt.Errorf("missingAuth: not retrying failed event ID %q", eventID) + missingAuth := func(roomVersion gomatrixserverlib.RoomVersion, eventIDs []string) ([]gomatrixserverlib.Event, error) { + returning := []gomatrixserverlib.Event{} + + // See if we have retry entries for each of the supplied event IDs. + for _, eventID := range eventIDs { + // If we've already satisfied a request for ths event ID before then + // just append the results. + if retry, ok := retries[eventID]; ok { + if retry == nil { + return nil, fmt.Errorf("missingAuth: not retrying failed event ID %q", eventID) + } + returning = append(returning, retry...) + continue } - return retries[eventID], nil - } - // Make a note of the fact that we tried to do something with this - // event ID, even if we don't succeed. - retries[eventID] = nil - // Try to retrieve the event from the server that sent us the send - // join response. - tx, txerr := r.federation.GetEvent(ctx, server, eventID) - if txerr != nil { - return nil, fmt.Errorf("missingAuth r.federation.GetEvent: %w", txerr) - } - // For each event returned, add it to the auth events. - for _, pdu := range tx.PDUs { - ev, everr := gomatrixserverlib.NewEventFromUntrustedJSON(pdu, roomVersion) - if everr != nil { - return nil, fmt.Errorf("missingAuth gomatrixserverlib.NewEventFromUntrustedJSON: %w", everr) + + // Make a note of the fact that we tried to do something with this + // event ID, even if we don't succeed. + retries[event.EventID()] = nil + + // Try to retrieve the event from the server that sent us the send + // join response. + tx, txerr := r.federation.GetEvent(ctx, server, eventID) + if txerr != nil { + return nil, fmt.Errorf("missingAuth r.federation.GetEvent: %w", txerr) + } + + // For each event returned, add it to the auth events. + for _, pdu := range tx.PDUs { + ev, everr := gomatrixserverlib.NewEventFromUntrustedJSON(pdu, roomVersion) + if everr != nil { + return nil, fmt.Errorf("missingAuth gomatrixserverlib.NewEventFromUntrustedJSON: %w", everr) + } + returning = append(returning, ev) + retries[event.EventID()] = append(retries[event.EventID()], ev) } - respSendJoin.AuthEvents = append(respSendJoin.AuthEvents, ev) - retries[ev.EventID()] = &ev } - return retries[eventID], nil + + return returning, nil } // TODO: Can we expand Check here to return a list of missing auth diff --git a/go.mod b/go.mod index 79d111324..193c391e1 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/matrix-org/go-http-js-libp2p v0.0.0-20200518170932-783164aeeda4 github.com/matrix-org/go-sqlite3-js v0.0.0-20200522092705-bc8506ccbcf3 github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26 - github.com/matrix-org/gomatrixserverlib v0.0.0-20200605092912-92df423db8b1 + github.com/matrix-org/gomatrixserverlib v0.0.0-20200605095527-c03da98710cd github.com/matrix-org/naffka v0.0.0-20200422140631-181f1ee7401f github.com/matrix-org/util v0.0.0-20190711121626-527ce5ddefc7 github.com/mattn/go-sqlite3 v2.0.2+incompatible diff --git a/go.sum b/go.sum index ec9529f23..d360966d8 100644 --- a/go.sum +++ b/go.sum @@ -356,8 +356,8 @@ github.com/matrix-org/go-sqlite3-js v0.0.0-20200522092705-bc8506ccbcf3 h1:Yb+Wlf github.com/matrix-org/go-sqlite3-js v0.0.0-20200522092705-bc8506ccbcf3/go.mod h1:e+cg2q7C7yE5QnAXgzo512tgFh1RbQLC0+jozuegKgo= github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26 h1:Hr3zjRsq2bhrnp3Ky1qgx/fzCtCALOoGYylh2tpS9K4= github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26/go.mod h1:3fxX6gUjWyI/2Bt7J1OLhpCzOfO/bB3AiX0cJtEKud0= -github.com/matrix-org/gomatrixserverlib v0.0.0-20200605092912-92df423db8b1 h1:6H7xPq0h2am96DIERFWaTCTkQDYqnfU0nE5pVToOO9s= -github.com/matrix-org/gomatrixserverlib v0.0.0-20200605092912-92df423db8b1/go.mod h1:JsAzE1Ll3+gDWS9JSUHPJiiyAksvOOnGWF2nXdg4ZzU= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200605095527-c03da98710cd h1:87mjWypZO9qmHhh51ncZTkOZTdLbG4bU1gMNDW3bBH4= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200605095527-c03da98710cd/go.mod h1:JsAzE1Ll3+gDWS9JSUHPJiiyAksvOOnGWF2nXdg4ZzU= github.com/matrix-org/naffka v0.0.0-20200422140631-181f1ee7401f h1:pRz4VTiRCO4zPlEMc3ESdUOcW4PXHH4Kj+YDz1XyE+Y= github.com/matrix-org/naffka v0.0.0-20200422140631-181f1ee7401f/go.mod h1:y0oDTjZDv5SM9a2rp3bl+CU+bvTRINQsdb7YlDql5Go= github.com/matrix-org/util v0.0.0-20190711121626-527ce5ddefc7 h1:ntrLa/8xVzeSs8vHFHK25k0C+NV74sYMJnNSg5NoSRo=