Check that the send event is actually an m.room.canonical_alias

Check that we got an event from the database
This commit is contained in:
Till Faelligen 2022-03-04 10:44:04 +01:00
parent 6dbf96ed75
commit f2e0a652b2
2 changed files with 39 additions and 47 deletions

View file

@ -123,7 +123,7 @@ func SendEvent(
timeToGenerateEvent := time.Since(startedGeneratingEvent) timeToGenerateEvent := time.Since(startedGeneratingEvent)
// validate that the aliases exists // validate that the aliases exists
if eventType == gomatrixserverlib.MRoomCanonicalAlias { if eventType == gomatrixserverlib.MRoomCanonicalAlias && stateKey != nil && *stateKey == "" {
aliasReq := api.AliasEvent{} aliasReq := api.AliasEvent{}
if err = json.Unmarshal(e.Content(), &aliasReq); err != nil { if err = json.Unmarshal(e.Content(), &aliasReq); err != nil {
return util.ErrorResponse(fmt.Errorf("unable to parse alias event: %w", err)) return util.ErrorResponse(fmt.Errorf("unable to parse alias event: %w", err))

View file

@ -22,6 +22,7 @@ import (
asAPI "github.com/matrix-org/dendrite/appservice/api" asAPI "github.com/matrix-org/dendrite/appservice/api"
"github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/internal/helpers"
"github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/gomatrixserverlib"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
"github.com/tidwall/sjson" "github.com/tidwall/sjson"
@ -189,59 +190,50 @@ func (r *RoomserverInternalAPI) RemoveRoomAlias(
ev, err := r.DB.GetStateEvent(ctx, roomID, gomatrixserverlib.MRoomCanonicalAlias, "") ev, err := r.DB.GetStateEvent(ctx, roomID, gomatrixserverlib.MRoomCanonicalAlias, "")
if err != nil && err != sql.ErrNoRows { if err != nil && err != sql.ErrNoRows {
return err return err
} } else if ev != nil {
stateAlias := gjson.GetBytes(ev.Content(), "alias").Str
// the alias to remove is currently set as the canonical alias, remove it
if stateAlias == request.Alias {
res, err := sjson.DeleteBytes(ev.Content(), "alias")
if err != nil {
return err
}
stateAlias := gjson.GetBytes(ev.Content(), "alias").Str sender := request.UserID
// the alias to remove is currently set as the canonical alias, remove it if request.UserID != ev.Sender() {
if stateAlias == request.Alias { sender = ev.Sender()
res, err := sjson.DeleteBytes(ev.Content(), "alias") }
if err != nil {
return err
}
stateRes := &api.QueryLatestEventsAndStateResponse{} stateRes := &api.QueryLatestEventsAndStateResponse{}
if err := helpers.QueryLatestEventsAndState(ctx, r.DB, &api.QueryLatestEventsAndStateRequest{RoomID: roomID}, stateRes); err != nil {
return err
}
if err = r.QueryLatestEventsAndState(ctx, &api.QueryLatestEventsAndStateRequest{RoomID: roomID}, stateRes); err != nil { authEvents := make([]string, len(stateRes.StateEvents))
return err for i := range stateRes.StateEvents {
} authEvents[i] = stateRes.StateEvents[i].EventID()
}
stateEventIDs := make([]string, len(stateRes.StateEvents)) builder := &gomatrixserverlib.EventBuilder{
for i, ev := range stateRes.StateEvents { Sender: sender,
stateEventIDs[i] = ev.EventID() RoomID: ev.RoomID(),
} Type: ev.Type(),
StateKey: ev.StateKey(),
PrevEvents: []string{ev.EventID()},
AuthEvents: authEvents,
Content: res,
}
sender := request.UserID newEvent, err := builder.Build(time.Now(), r.ServerName, r.Cfg.Matrix.KeyID, r.Cfg.Matrix.PrivateKey, ev.RoomVersion)
if request.UserID != ev.Sender() { if err != nil {
sender = ev.Sender() return err
} }
builder := &gomatrixserverlib.EventBuilder{
Sender: sender,
RoomID: ev.RoomID(),
Type: ev.Type(),
StateKey: ev.StateKey(),
PrevEvents: []string{ev.EventID()},
AuthEvents: stateEventIDs,
Content: res,
}
newEvent, err := builder.Build(time.Now(), r.ServerName, r.Cfg.Matrix.KeyID, r.Cfg.Matrix.PrivateKey, ev.RoomVersion) err = api.SendEvents(ctx, r.RSAPI, api.KindNew, []*gomatrixserverlib.HeaderedEvent{newEvent.Headered(ev.RoomVersion)}, r.ServerName, r.ServerName, nil, false)
if err != nil { if err != nil {
return err return err
} }
inputEvent := api.InputRoomEvent{
Kind: api.KindNew,
Event: newEvent.Headered(ev.RoomVersion),
Origin: r.ServerName,
StateEventIDs: stateEventIDs,
HasState: true,
SendAsServer: string(r.ServerName),
}
respInput := &api.InputRoomEventsResponse{}
r.InputRoomEvents(ctx, &api.InputRoomEventsRequest{InputRoomEvents: []api.InputRoomEvent{inputEvent}}, respInput)
if respInput.NotAllowed || respInput.ErrMsg != "" {
return fmt.Errorf(respInput.ErrMsg)
} }
} }