aboutsummaryrefslogtreecommitdiff
path: root/clientapi
diff options
context:
space:
mode:
authorS7evinK <2353100+S7evinK@users.noreply.github.com>2022-03-07 10:37:04 +0100
committerGitHub <noreply@github.com>2022-03-07 10:37:04 +0100
commit9fbaa1194bb3d7e9f4dfff09461528b846d26a6e (patch)
tree42b6beb39024ff9666c84c2e4ad5e3abf4bec35b /clientapi
parent86d4eef9f10abd944bf689298cc6f9e915b940c7 (diff)
Add canonical alias support (#2236)
* Add canonical support * Add test * Check that the send event is actually an m.room.canonical_alias Check that we got an event from the database * Update to get correct required events * Add flakey test to blacklist
Diffstat (limited to 'clientapi')
-rw-r--r--clientapi/jsonerror/jsonerror.go5
-rw-r--r--clientapi/routing/sendevent.go36
2 files changed, 41 insertions, 0 deletions
diff --git a/clientapi/jsonerror/jsonerror.go b/clientapi/jsonerror/jsonerror.go
index 97c59703..1fc1c0c0 100644
--- a/clientapi/jsonerror/jsonerror.go
+++ b/clientapi/jsonerror/jsonerror.go
@@ -58,6 +58,11 @@ func BadJSON(msg string) *MatrixError {
return &MatrixError{"M_BAD_JSON", msg}
}
+// BadAlias is an error when the client supplies a bad alias.
+func BadAlias(msg string) *MatrixError {
+ return &MatrixError{"M_BAD_ALIAS", msg}
+}
+
// NotJSON is an error when the client supplies something that is not JSON
// to a JSON endpoint.
func NotJSON(msg string) *MatrixError {
diff --git a/clientapi/routing/sendevent.go b/clientapi/routing/sendevent.go
index 23935b5d..3d599371 100644
--- a/clientapi/routing/sendevent.go
+++ b/clientapi/routing/sendevent.go
@@ -16,6 +16,8 @@ package routing
import (
"context"
+ "encoding/json"
+ "fmt"
"net/http"
"sync"
"time"
@@ -120,6 +122,40 @@ func SendEvent(
}
timeToGenerateEvent := time.Since(startedGeneratingEvent)
+ // validate that the aliases exists
+ if eventType == gomatrixserverlib.MRoomCanonicalAlias && stateKey != nil && *stateKey == "" {
+ aliasReq := api.AliasEvent{}
+ if err = json.Unmarshal(e.Content(), &aliasReq); err != nil {
+ return util.ErrorResponse(fmt.Errorf("unable to parse alias event: %w", err))
+ }
+ if !aliasReq.Valid() {
+ return util.JSONResponse{
+ Code: http.StatusBadRequest,
+ JSON: jsonerror.InvalidParam("Request contains invalid aliases."),
+ }
+ }
+ aliasRes := &api.GetAliasesForRoomIDResponse{}
+ if err = rsAPI.GetAliasesForRoomID(req.Context(), &api.GetAliasesForRoomIDRequest{RoomID: roomID}, aliasRes); err != nil {
+ return jsonerror.InternalServerError()
+ }
+ var found int
+ requestAliases := append(aliasReq.AltAliases, aliasReq.Alias)
+ for _, alias := range aliasRes.Aliases {
+ for _, altAlias := range requestAliases {
+ if altAlias == alias {
+ found++
+ }
+ }
+ }
+ // check that we found at least the same amount of existing aliases as are in the request
+ if aliasReq.Alias != "" && found < len(requestAliases) {
+ return util.JSONResponse{
+ Code: http.StatusBadRequest,
+ JSON: jsonerror.BadAlias("No matching alias found."),
+ }
+ }
+ }
+
var txnAndSessionID *api.TransactionID
if txnID != nil {
txnAndSessionID = &api.TransactionID{