mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-12 01:13:10 -06:00
Use federation to auth the event if the server isn't in the room
This commit is contained in:
parent
31f6c21d98
commit
a70cdd1a99
|
|
@ -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)
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue