Use federation to auth the event if the server isn't in the room

This commit is contained in:
Brendan Abolivier 2017-09-08 17:39:54 +01:00
parent 31f6c21d98
commit a70cdd1a99
No known key found for this signature in database
GPG key ID: 8EF1500759F70623
2 changed files with 30 additions and 25 deletions

View file

@ -82,7 +82,7 @@ func Setup(
v1fedmux.Handle("/3pid/onbind", common.MakeFedAPI( v1fedmux.Handle("/3pid/onbind", common.MakeFedAPI(
"3pid_onbind", cfg.Matrix.ServerName, keys, "3pid_onbind", cfg.Matrix.ServerName, keys,
func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse { func(httpReq *http.Request, request *gomatrixserverlib.FederationRequest) util.JSONResponse {
return writers.CreateInvitesFrom3PIDInvites(httpReq, query, cfg, producer) return writers.CreateInvitesFrom3PIDInvites(httpReq, query, cfg, producer, federation)
}, },
)) ))

View file

@ -48,7 +48,7 @@ type invites struct {
// CreateInvitesFrom3PIDInvites implements POST /_matrix/federation/v1/3pid/onbind // CreateInvitesFrom3PIDInvites implements POST /_matrix/federation/v1/3pid/onbind
func CreateInvitesFrom3PIDInvites( func CreateInvitesFrom3PIDInvites(
req *http.Request, queryAPI api.RoomserverQueryAPI, cfg config.Dendrite, req *http.Request, queryAPI api.RoomserverQueryAPI, cfg config.Dendrite,
producer *producers.RoomserverProducer, producer *producers.RoomserverProducer, federation *gomatrixserverlib.FederationClient,
) util.JSONResponse { ) util.JSONResponse {
var body invites var body invites
if reqErr := httputil.UnmarshalJSONRequest(req, &body); reqErr != nil { if reqErr := httputil.UnmarshalJSONRequest(req, &body); reqErr != nil {
@ -57,7 +57,7 @@ func CreateInvitesFrom3PIDInvites(
evs := []gomatrixserverlib.Event{} evs := []gomatrixserverlib.Event{}
for _, inv := range body.Invites { for _, inv := range body.Invites {
event, err := createInviteFrom3PIDInvite(queryAPI, cfg, inv) event, err := createInviteFrom3PIDInvite(queryAPI, cfg, inv, federation)
if err != nil { if err != nil {
return httputil.LogThenError(req, err) return httputil.LogThenError(req, err)
} }
@ -83,6 +83,7 @@ func CreateInvitesFrom3PIDInvites(
// necessary data to do so. // necessary data to do so.
func createInviteFrom3PIDInvite( func createInviteFrom3PIDInvite(
queryAPI api.RoomserverQueryAPI, cfg config.Dendrite, inv invite, queryAPI api.RoomserverQueryAPI, cfg config.Dendrite, inv invite,
federation *gomatrixserverlib.FederationClient,
) (*gomatrixserverlib.Event, error) { ) (*gomatrixserverlib.Event, error) {
// Build the event // Build the event
builder := &gomatrixserverlib.EventBuilder{ builder := &gomatrixserverlib.EventBuilder{
@ -120,30 +121,34 @@ func createInviteFrom3PIDInvite(
} }
if !queryRes.RoomExists { if !queryRes.RoomExists {
// TODO: Use federation to auth the event // Use federation to auth the event
return nil, nil _, 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) eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName)
now := time.Now() now := time.Now()
event, err := builder.Build(eventID, now, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey) event, err := builder.Build(eventID, now, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey)