Refactor send events

Signed-off-by: Colin Weill--Duflos <lieunoir@rezel.net>
This commit is contained in:
Colin Weill--Duflos 2021-07-29 18:06:21 +02:00
parent 9f7fb3e90e
commit 4e68ce3a06

View file

@ -15,6 +15,7 @@
package routing package routing
import ( import (
"context"
"encoding/json" "encoding/json"
"net/http" "net/http"
"sync" "sync"
@ -232,6 +233,8 @@ func generateSendEvent(
} }
} }
// If the event is a canonical_alias one, we have to check if each alias is correctly formed
// and if each alias exists pointing to the correct room
if eventType == gomatrixserverlib.MRoomCanonicalAlias { if eventType == gomatrixserverlib.MRoomCanonicalAlias {
var content *eventutil.CanonicalAlias var content *eventutil.CanonicalAlias
err = json.Unmarshal(builder.Content, &content) err = json.Unmarshal(builder.Content, &content)
@ -260,82 +263,65 @@ func generateSendEvent(
//TODO: maybe do something like synapse where state is retrieved in order to only check new aliases //TODO: maybe do something like synapse where state is retrieved in order to only check new aliases
for _, alias := range content.AltAliases { for _, alias := range content.AltAliases {
_, domain, err := gomatrixserverlib.SplitID('#', alias) resErr = checkAlias(req.Context(), device, alias, queryRes.Aliases, federation, cfg)
if err != nil { if resErr != nil {
return nil, &util.JSONResponse{ return nil, resErr
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidParam("Room alias must be in the form '#localpart:domain'"),
}
}
found := false
for _, s := range queryRes.Aliases {
if alias == s {
found = true
break
}
}
if !found {
if domain == cfg.Matrix.ServerName {
return nil, &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.BadAlias("Alt alias not present in the room aliases"),
}
}
fedRes, fedErr := federation.LookupRoomAlias(req.Context(), domain, alias)
if fedErr != nil {
// TODO: Return 502 if the remote server errored.
// TODO: Return 504 if the remote server timed out.
util.GetLogger(req.Context()).WithError(fedErr).Error("federation.LookupRoomAlias failed")
resErr := jsonerror.InternalServerError()
return nil, &resErr
}
if fedRes.RoomID == "" {
return nil, &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.BadAlias("Alt alias not present in the room aliases"),
}
}
} }
} }
if content.Alias != "" { if content.Alias != "" {
_, domain, err := gomatrixserverlib.SplitID('#', content.Alias) resErr = checkAlias(req.Context(), device, content.Alias, queryRes.Aliases, federation, cfg)
if err != nil { if resErr != nil {
return nil, &util.JSONResponse{ return nil, resErr
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidParam("Room alias must be in the form '#localpart:domain'"),
}
}
found := false
for _, s := range queryRes.Aliases {
if content.Alias == s {
found = true
break
}
}
if !found {
if domain == cfg.Matrix.ServerName {
return nil, &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.BadAlias("Canonical alias not present in the room aliases"),
}
}
fedRes, fedErr := federation.LookupRoomAlias(req.Context(), domain, content.Alias)
if fedErr != nil {
// TODO: Return 502 if the remote server errored.
// TODO: Return 504 if the remote server timed out.
util.GetLogger(req.Context()).WithError(fedErr).Error("federation.LookupRoomAlias failed")
resErr := jsonerror.InternalServerError()
return nil, &resErr
}
if fedRes.RoomID == "" {
return nil, &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.BadAlias("Canonical alias not present in the room aliases"),
}
}
} }
} }
} }
return e.Event, nil return e.Event, nil
} }
func checkAlias(
ctx context.Context,
device *userapi.Device,
alias string,
roomAliases []string,
federation *gomatrixserverlib.FederationClient,
cfg *config.ClientAPI,
) *util.JSONResponse {
_, domain, err := gomatrixserverlib.SplitID('#', alias)
if err != nil {
return &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidParam("Room alias must be in the form '#localpart:domain'"),
}
}
found := false
for _, s := range roomAliases {
if alias == s {
found = true
break
}
}
if !found {
if domain == cfg.Matrix.ServerName {
return &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.BadAlias("Canonical alias not present in the room aliases"),
}
}
fedRes, fedErr := federation.LookupRoomAlias(ctx, domain, alias)
if fedErr != nil {
// TODO: Return 502 if the remote server errored.
// TODO: Return 504 if the remote server timed out.
util.GetLogger(ctx).WithError(fedErr).Error("federation.LookupRoomAlias failed")
resErr := jsonerror.InternalServerError()
return &resErr
}
if fedRes.RoomID == "" {
return &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.BadAlias("Canonical alias not present in the room aliases"),
}
}
}
return nil
}