diff --git a/clientapi/routing/directory.go b/clientapi/routing/directory.go index ae4660656..31ddd466b 100644 --- a/clientapi/routing/directory.go +++ b/clientapi/routing/directory.go @@ -17,9 +17,11 @@ package routing import ( "fmt" "net/http" + "encoding/json" "github.com/matrix-org/dendrite/clientapi/httputil" "github.com/matrix-org/dendrite/clientapi/jsonerror" + "github.com/matrix-org/dendrite/internal/eventutil" federationSenderAPI "github.com/matrix-org/dendrite/federationsender/api" roomserverAPI "github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/setup/config" @@ -194,6 +196,7 @@ func RemoveLocalAlias( req *http.Request, device *api.Device, alias string, + cfg *config.ClientAPI, rsAPI roomserverAPI.RoomserverInternalAPI, ) util.JSONResponse { queryReq := roomserverAPI.RemoveRoomAliasRequest{ @@ -220,6 +223,88 @@ func RemoveLocalAlias( } } + //if state contains alias + stateTuple := gomatrixserverlib.StateKeyTuple{ + EventType: gomatrixserverlib.MRoomCanonicalAlias, + StateKey: "", + } + stateReq := roomserverAPI.QueryCurrentStateRequest { + RoomID: queryRes.RoomID, + StateTuples: []gomatrixserverlib.StateKeyTuple{stateTuple}, + } + stateRes := &roomserverAPI.QueryCurrentStateResponse{} + err := rsAPI.QueryCurrentState(req.Context(), &stateReq, stateRes) + if err != nil { + util.GetLogger(req.Context()).WithError(err).Error("Query state failed") + resErr := jsonerror.InternalServerError() + return resErr + } + + inAliases := false + if canonicalAliasEvent, ok := stateRes.StateEvents[stateTuple]; ok { + //var canonicalAliasContent *eventutil.CanonicalAlias + canonicalAliasContent := eventutil.CanonicalAlias { + Alias: "", + AltAliases: []string{""}, + } + err := json.Unmarshal(canonicalAliasEvent.Content(), &canonicalAliasContent) + if err != nil { + util.GetLogger(req.Context()).WithError(err).Error("Get content failed") + resErr := jsonerror.InternalServerError() + return resErr + } + if alias == canonicalAliasContent.Alias { + inAliases = true + } else { + for _, s := range(canonicalAliasContent.AltAliases) { + if alias == s { + inAliases = true + break + } + } + } + } + if inAliases { + var stateKey = "" + // May cause some auth problems + builder := gomatrixserverlib.EventBuilder { + Sender: device.UserID, + RoomID: queryRes.RoomID, + Type: gomatrixserverlib.MRoomCanonicalAlias, + StateKey: &stateKey, + } + //TODO reconstruct original minus removed + content := eventutil.CanonicalAlias { + Alias: "", + AltAliases: make([]string, 0), + } + err := builder.SetContent(content) + if err != nil { + util.GetLogger(req.Context()).WithError(err).Error("builder.SetContent failed") + resErr := jsonerror.InternalServerError() + return resErr + } + + evTime, err := httputil.ParseTSParam(req) + if err != nil { + return util.JSONResponse{ + Code: http.StatusBadRequest, + JSON: jsonerror.InvalidArgumentValue(err.Error()), + } + } + + e, err := eventutil.QueryAndBuildEvent(req.Context(), &builder, cfg.Matrix, evTime, rsAPI, nil) + if err != nil { + util.GetLogger(req.Context()).WithError(err).Errorf("failed to QueryAndBuildEvent") + return jsonerror.InternalServerError() + } + err = roomserverAPI.SendEvents(req.Context(), rsAPI, roomserverAPI.KindNew, []*gomatrixserverlib.HeaderedEvent{e}, cfg.Matrix.ServerName, nil) + if err != nil { + util.GetLogger(req.Context()).WithError(err).Errorf("failed to SendEvents") + return jsonerror.InternalServerError() + } + } + return util.JSONResponse{ Code: http.StatusOK, JSON: struct{}{}, diff --git a/clientapi/routing/routing.go b/clientapi/routing/routing.go index ed4cec6f1..9527261bf 100644 --- a/clientapi/routing/routing.go +++ b/clientapi/routing/routing.go @@ -373,7 +373,7 @@ func Setup( if err != nil { return util.ErrorResponse(err) } - return RemoveLocalAlias(req, device, vars["roomAlias"], rsAPI) + return RemoveLocalAlias(req, device, vars["roomAlias"], cfg, rsAPI) }), ).Methods(http.MethodDelete, http.MethodOptions) r0mux.Handle("/directory/list/room/{roomID}", diff --git a/roomserver/api/alias.go b/roomserver/api/alias.go index df69e5b4d..bd1af0498 100644 --- a/roomserver/api/alias.go +++ b/roomserver/api/alias.go @@ -83,4 +83,6 @@ type RemoveRoomAliasResponse struct { Found bool `json:"found"` // Did we remove it? Removed bool `json:"removed"` + // The room ID the alias refers to + RoomID string `json:"room_id"` } diff --git a/roomserver/internal/alias.go b/roomserver/internal/alias.go index 7995279d2..8f2597424 100644 --- a/roomserver/internal/alias.go +++ b/roomserver/internal/alias.go @@ -154,6 +154,7 @@ func (r *RoomserverInternalAPI) RemoveRoomAlias( if err != nil { return fmt.Errorf("r.DB.GetRoomIDForAlias: %w", err) } + response.RoomID = roomID if roomID == "" { response.Found = false response.Removed = false diff --git a/sytest-whitelist b/sytest-whitelist index 74cd12b55..4c25f1f1e 100644 --- a/sytest-whitelist +++ b/sytest-whitelist @@ -542,3 +542,4 @@ Only room members can list aliases of a room Users with sufficient power-level can delete other's aliases Canonical alias can be set Canonical alias can include alt_aliases +Can delete canonical alias