diff --git a/clientapi/routing/sendevent.go b/clientapi/routing/sendevent.go index 359446aa8..3d5993718 100644 --- a/clientapi/routing/sendevent.go +++ b/clientapi/routing/sendevent.go @@ -123,7 +123,7 @@ func SendEvent( timeToGenerateEvent := time.Since(startedGeneratingEvent) // validate that the aliases exists - if eventType == gomatrixserverlib.MRoomCanonicalAlias { + 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)) diff --git a/roomserver/internal/alias.go b/roomserver/internal/alias.go index 91ae85b3a..e12ceb2c1 100644 --- a/roomserver/internal/alias.go +++ b/roomserver/internal/alias.go @@ -22,6 +22,7 @@ import ( asAPI "github.com/matrix-org/dendrite/appservice/api" "github.com/matrix-org/dendrite/roomserver/api" + "github.com/matrix-org/dendrite/roomserver/internal/helpers" "github.com/matrix-org/gomatrixserverlib" "github.com/tidwall/gjson" "github.com/tidwall/sjson" @@ -189,59 +190,50 @@ func (r *RoomserverInternalAPI) RemoveRoomAlias( ev, err := r.DB.GetStateEvent(ctx, roomID, gomatrixserverlib.MRoomCanonicalAlias, "") if err != nil && err != sql.ErrNoRows { 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 - // 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 - } + sender := request.UserID + if request.UserID != ev.Sender() { + sender = ev.Sender() + } - 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 { - return err - } + authEvents := make([]string, len(stateRes.StateEvents)) + for i := range stateRes.StateEvents { + authEvents[i] = stateRes.StateEvents[i].EventID() + } - stateEventIDs := make([]string, len(stateRes.StateEvents)) - for i, ev := range stateRes.StateEvents { - stateEventIDs[i] = ev.EventID() - } + builder := &gomatrixserverlib.EventBuilder{ + Sender: sender, + RoomID: ev.RoomID(), + Type: ev.Type(), + StateKey: ev.StateKey(), + PrevEvents: []string{ev.EventID()}, + AuthEvents: authEvents, + Content: res, + } - sender := request.UserID - if request.UserID != ev.Sender() { - sender = ev.Sender() - } - 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) + if err != nil { + return err + } - newEvent, err := builder.Build(time.Now(), r.ServerName, r.Cfg.Matrix.KeyID, r.Cfg.Matrix.PrivateKey, ev.RoomVersion) - if err != nil { - return err - } + err = api.SendEvents(ctx, r.RSAPI, api.KindNew, []*gomatrixserverlib.HeaderedEvent{newEvent.Headered(ev.RoomVersion)}, r.ServerName, r.ServerName, nil, false) + if err != nil { + 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) } }