WIP Add Canonical event when canonical or alt alias is removed

Signed-off-by: Colin Weill--Duflos <lieunoir@rezel.net>
This commit is contained in:
Colin Weill--Duflos 2021-07-29 12:15:18 +02:00
parent cf163012bd
commit d002f274a7
5 changed files with 90 additions and 1 deletions

View file

@ -17,9 +17,11 @@ package routing
import ( import (
"fmt" "fmt"
"net/http" "net/http"
"encoding/json"
"github.com/matrix-org/dendrite/clientapi/httputil" "github.com/matrix-org/dendrite/clientapi/httputil"
"github.com/matrix-org/dendrite/clientapi/jsonerror" "github.com/matrix-org/dendrite/clientapi/jsonerror"
"github.com/matrix-org/dendrite/internal/eventutil"
federationSenderAPI "github.com/matrix-org/dendrite/federationsender/api" federationSenderAPI "github.com/matrix-org/dendrite/federationsender/api"
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api" roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/setup/config"
@ -194,6 +196,7 @@ func RemoveLocalAlias(
req *http.Request, req *http.Request,
device *api.Device, device *api.Device,
alias string, alias string,
cfg *config.ClientAPI,
rsAPI roomserverAPI.RoomserverInternalAPI, rsAPI roomserverAPI.RoomserverInternalAPI,
) util.JSONResponse { ) util.JSONResponse {
queryReq := roomserverAPI.RemoveRoomAliasRequest{ 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{ return util.JSONResponse{
Code: http.StatusOK, Code: http.StatusOK,
JSON: struct{}{}, JSON: struct{}{},

View file

@ -373,7 +373,7 @@ func Setup(
if err != nil { if err != nil {
return util.ErrorResponse(err) return util.ErrorResponse(err)
} }
return RemoveLocalAlias(req, device, vars["roomAlias"], rsAPI) return RemoveLocalAlias(req, device, vars["roomAlias"], cfg, rsAPI)
}), }),
).Methods(http.MethodDelete, http.MethodOptions) ).Methods(http.MethodDelete, http.MethodOptions)
r0mux.Handle("/directory/list/room/{roomID}", r0mux.Handle("/directory/list/room/{roomID}",

View file

@ -83,4 +83,6 @@ type RemoveRoomAliasResponse struct {
Found bool `json:"found"` Found bool `json:"found"`
// Did we remove it? // Did we remove it?
Removed bool `json:"removed"` Removed bool `json:"removed"`
// The room ID the alias refers to
RoomID string `json:"room_id"`
} }

View file

@ -154,6 +154,7 @@ func (r *RoomserverInternalAPI) RemoveRoomAlias(
if err != nil { if err != nil {
return fmt.Errorf("r.DB.GetRoomIDForAlias: %w", err) return fmt.Errorf("r.DB.GetRoomIDForAlias: %w", err)
} }
response.RoomID = roomID
if roomID == "" { if roomID == "" {
response.Found = false response.Found = false
response.Removed = false response.Removed = false

View file

@ -542,3 +542,4 @@ Only room members can list aliases of a room
Users with sufficient power-level can delete other's aliases Users with sufficient power-level can delete other's aliases
Canonical alias can be set Canonical alias can be set
Canonical alias can include alt_aliases Canonical alias can include alt_aliases
Can delete canonical alias