mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-01 03:03:10 -06:00
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:
parent
6dbf96ed75
commit
f2e0a652b2
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue