From a70cdd1a9923662f262e870a81a55b8b0f6723b8 Mon Sep 17 00:00:00 2001 From: Brendan Abolivier Date: Fri, 8 Sep 2017 17:39:54 +0100 Subject: [PATCH] Use federation to auth the event if the server isn't in the room --- .../dendrite/federationapi/routing/routing.go | 2 +- .../federationapi/writers/threepid.go | 53 ++++++++++--------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/github.com/matrix-org/dendrite/federationapi/routing/routing.go b/src/github.com/matrix-org/dendrite/federationapi/routing/routing.go index 8d49800d5..3186da9b1 100644 --- a/src/github.com/matrix-org/dendrite/federationapi/routing/routing.go +++ b/src/github.com/matrix-org/dendrite/federationapi/routing/routing.go @@ -82,7 +82,7 @@ func Setup( v1fedmux.Handle("/3pid/onbind", common.MakeFedAPI( "3pid_onbind", cfg.Matrix.ServerName, keys, func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse { - return writers.CreateInvitesFrom3PIDInvites(httpReq, query, cfg, producer) + return writers.CreateInvitesFrom3PIDInvites(httpReq, query, cfg, producer, federation) }, )) diff --git a/src/github.com/matrix-org/dendrite/federationapi/writers/threepid.go b/src/github.com/matrix-org/dendrite/federationapi/writers/threepid.go index ad9b48569..920d9c8c4 100644 --- a/src/github.com/matrix-org/dendrite/federationapi/writers/threepid.go +++ b/src/github.com/matrix-org/dendrite/federationapi/writers/threepid.go @@ -48,7 +48,7 @@ type invites struct { // CreateInvitesFrom3PIDInvites implements POST /_matrix/federation/v1/3pid/onbind func CreateInvitesFrom3PIDInvites( req *http.Request, queryAPI api.RoomserverQueryAPI, cfg config.Dendrite, - producer *producers.RoomserverProducer, + producer *producers.RoomserverProducer, federation *gomatrixserverlib.FederationClient, ) util.JSONResponse { var body invites if reqErr := httputil.UnmarshalJSONRequest(req, &body); reqErr != nil { @@ -57,7 +57,7 @@ func CreateInvitesFrom3PIDInvites( evs := []gomatrixserverlib.Event{} for _, inv := range body.Invites { - event, err := createInviteFrom3PIDInvite(queryAPI, cfg, inv) + event, err := createInviteFrom3PIDInvite(queryAPI, cfg, inv, federation) if err != nil { return httputil.LogThenError(req, err) } @@ -83,6 +83,7 @@ func CreateInvitesFrom3PIDInvites( // necessary data to do so. func createInviteFrom3PIDInvite( queryAPI api.RoomserverQueryAPI, cfg config.Dendrite, inv invite, + federation *gomatrixserverlib.FederationClient, ) (*gomatrixserverlib.Event, error) { // Build the event builder := &gomatrixserverlib.EventBuilder{ @@ -120,30 +121,34 @@ func createInviteFrom3PIDInvite( } if !queryRes.RoomExists { - // TODO: Use federation to auth the event - return nil, nil + // Use federation to auth the event + _, remoteServer, err := gomatrixserverlib.SplitID('!', inv.RoomID) + *builder, err = federation.ExchangeThirdPartyInvite(remoteServer, *builder) + if err != nil { + return nil, err + } + } else { + // Auth the event locally + builder.Depth = queryRes.Depth + builder.PrevEvents = queryRes.LatestEvents + + authEvents := gomatrixserverlib.NewAuthEvents(nil) + + for i := range queryRes.StateEvents { + authEvents.AddEvent(&queryRes.StateEvents[i]) + } + + if err = fillDisplayName(builder, content, authEvents); err != nil { + return nil, err + } + + refs, err := eventsNeeded.AuthEventReferences(&authEvents) + if err != nil { + return nil, err + } + builder.AuthEvents = refs } - // Finish building the event - builder.Depth = queryRes.Depth - builder.PrevEvents = queryRes.LatestEvents - - authEvents := gomatrixserverlib.NewAuthEvents(nil) - - for i := range queryRes.StateEvents { - authEvents.AddEvent(&queryRes.StateEvents[i]) - } - - if err = fillDisplayName(builder, content, authEvents); err != nil { - return nil, err - } - - refs, err := eventsNeeded.AuthEventReferences(&authEvents) - if err != nil { - return nil, err - } - builder.AuthEvents = refs - eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) now := time.Now() event, err := builder.Build(eventID, now, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey)