diff --git a/clientapi/routing/createroom.go b/clientapi/routing/createroom.go index b6a5d1221..027a21e76 100644 --- a/clientapi/routing/createroom.go +++ b/clientapi/routing/createroom.go @@ -382,7 +382,7 @@ func createRoom( continue } // Build some stripped state for the invite. - candidates := append(gomatrixserverlib.UnwrapEventHeaders(builtEvents), *inviteEvent) + candidates := append(gomatrixserverlib.UnwrapEventHeaders(builtEvents), inviteEvent.Event) var strippedState []gomatrixserverlib.InviteV2StrippedState for _, event := range candidates { switch event.Type() { diff --git a/clientapi/routing/membership.go b/clientapi/routing/membership.go index c2145159a..0ad21f717 100644 --- a/clientapi/routing/membership.go +++ b/clientapi/routing/membership.go @@ -77,7 +77,7 @@ func sendMembership(ctx context.Context, accountDB accounts.Database, device *us _, err = roomserverAPI.SendEvents( ctx, rsAPI, - []gomatrixserverlib.HeaderedEvent{event.Headered(roomVer)}, + []gomatrixserverlib.HeaderedEvent{*event}, cfg.Matrix.ServerName, nil, ) @@ -210,7 +210,7 @@ func SendInvite( perr := roomserverAPI.SendInvite( req.Context(), rsAPI, - event.Headered(roomVer), + event.Event.Headered(roomVer), nil, // ask the roomserver to draw up invite room state for us cfg.Matrix.ServerName, nil, @@ -232,7 +232,7 @@ func buildMembershipEvent( membership, roomID string, isDirect bool, cfg *config.Dendrite, evTime time.Time, rsAPI roomserverAPI.RoomserverInternalAPI, asAPI appserviceAPI.AppServiceQueryAPI, -) (*gomatrixserverlib.Event, error) { +) (*gomatrixserverlib.HeaderedEvent, error) { profile, err := loadProfile(ctx, targetUserID, cfg, accountDB, asAPI) if err != nil { return nil, err diff --git a/clientapi/routing/redaction.go b/clientapi/routing/redaction.go index 1c3a08a6d..84d3454b8 100644 --- a/clientapi/routing/redaction.go +++ b/clientapi/routing/redaction.go @@ -15,6 +15,7 @@ package routing import ( + "context" "net/http" "time" @@ -119,6 +120,11 @@ func SendRedaction( JSON: jsonerror.NotFound("Room does not exist"), } } + _, err = roomserverAPI.SendEvents(context.Background(), rsAPI, []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: 200, JSON: redactionResponse{ diff --git a/clientapi/routing/sendevent.go b/clientapi/routing/sendevent.go index aba5f0d51..bf32992f5 100644 --- a/clientapi/routing/sendevent.go +++ b/clientapi/routing/sendevent.go @@ -180,11 +180,11 @@ func generateSendEvent( stateEvents[i] = &queryRes.StateEvents[i].Event } provider := gomatrixserverlib.NewAuthEvents(stateEvents) - if err = gomatrixserverlib.Allowed(*e, &provider); err != nil { + if err = gomatrixserverlib.Allowed(e.Event, &provider); err != nil { return nil, &util.JSONResponse{ Code: http.StatusForbidden, JSON: jsonerror.Forbidden(err.Error()), // TODO: Is this error string comprehensible to the client? } } - return e, nil + return &e.Event, nil } diff --git a/federationapi/routing/join.go b/federationapi/routing/join.go index 8dcd15333..17981f532 100644 --- a/federationapi/routing/join.go +++ b/federationapi/routing/join.go @@ -118,7 +118,7 @@ func MakeJoin( } provider := gomatrixserverlib.NewAuthEvents(stateEvents) - if err = gomatrixserverlib.Allowed(*event, &provider); err != nil { + if err = gomatrixserverlib.Allowed(event.Event, &provider); err != nil { return util.JSONResponse{ Code: http.StatusForbidden, JSON: jsonerror.Forbidden(err.Error()), diff --git a/federationapi/routing/leave.go b/federationapi/routing/leave.go index 108fc50ae..56f1b05af 100644 --- a/federationapi/routing/leave.go +++ b/federationapi/routing/leave.go @@ -32,15 +32,6 @@ func MakeLeave( rsAPI api.RoomserverInternalAPI, roomID, userID string, ) util.JSONResponse { - verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} - verRes := api.QueryRoomVersionForRoomResponse{} - if err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), &verReq, &verRes); err != nil { - return util.JSONResponse{ - Code: http.StatusInternalServerError, - JSON: jsonerror.InternalServerError(), - } - } - _, domain, err := gomatrixserverlib.SplitID('@', userID) if err != nil { return util.JSONResponse{ @@ -91,7 +82,7 @@ func MakeLeave( stateEvents[i] = &queryRes.StateEvents[i].Event } provider := gomatrixserverlib.NewAuthEvents(stateEvents) - if err = gomatrixserverlib.Allowed(*event, &provider); err != nil { + if err = gomatrixserverlib.Allowed(event.Event, &provider); err != nil { return util.JSONResponse{ Code: http.StatusForbidden, JSON: jsonerror.Forbidden(err.Error()), @@ -101,7 +92,7 @@ func MakeLeave( return util.JSONResponse{ Code: http.StatusOK, JSON: map[string]interface{}{ - "room_version": verRes.RoomVersion, + "room_version": event.RoomVersion, "event": builder, }, } diff --git a/internal/eventutil/events.go b/internal/eventutil/events.go index e6c7a4ff7..d56f5be8f 100644 --- a/internal/eventutil/events.go +++ b/internal/eventutil/events.go @@ -40,12 +40,12 @@ func BuildEvent( ctx context.Context, builder *gomatrixserverlib.EventBuilder, cfg *config.Dendrite, evTime time.Time, rsAPI api.RoomserverInternalAPI, queryRes *api.QueryLatestEventsAndStateResponse, -) (*gomatrixserverlib.Event, error) { +) (*gomatrixserverlib.HeaderedEvent, error) { if queryRes == nil { queryRes = &api.QueryLatestEventsAndStateResponse{} } - err := AddPrevEventsToEvent(ctx, builder, rsAPI, queryRes) + ver, err := AddPrevEventsToEvent(ctx, builder, rsAPI, queryRes) if err != nil { // This can pass through a ErrRoomNoExists to the caller return nil, err @@ -59,7 +59,8 @@ func BuildEvent( return nil, err } - return &event, nil + h := event.Headered(ver) + return &h, nil } // AddPrevEventsToEvent fills out the prev_events and auth_events fields in builder @@ -67,14 +68,14 @@ func AddPrevEventsToEvent( ctx context.Context, builder *gomatrixserverlib.EventBuilder, rsAPI api.RoomserverInternalAPI, queryRes *api.QueryLatestEventsAndStateResponse, -) error { +) (gomatrixserverlib.RoomVersion, error) { eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(builder) if err != nil { - return fmt.Errorf("gomatrixserverlib.StateNeededForEventBuilder: %w", err) + return "", fmt.Errorf("gomatrixserverlib.StateNeededForEventBuilder: %w", err) } if len(eventsNeeded.Tuples()) == 0 { - return errors.New("expecting state tuples for event builder, got none") + return "", errors.New("expecting state tuples for event builder, got none") } // Ask the roomserver for information about this room @@ -83,16 +84,16 @@ func AddPrevEventsToEvent( StateToFetch: eventsNeeded.Tuples(), } if err = rsAPI.QueryLatestEventsAndState(ctx, &queryReq, queryRes); err != nil { - return fmt.Errorf("rsAPI.QueryLatestEventsAndState: %w", err) + return "", fmt.Errorf("rsAPI.QueryLatestEventsAndState: %w", err) } if !queryRes.RoomExists { - return ErrRoomNoExists + return "", ErrRoomNoExists } eventFormat, err := queryRes.RoomVersion.EventFormat() if err != nil { - return fmt.Errorf("queryRes.RoomVersion.EventFormat: %w", err) + return "", fmt.Errorf("queryRes.RoomVersion.EventFormat: %w", err) } builder.Depth = queryRes.Depth @@ -102,13 +103,13 @@ func AddPrevEventsToEvent( for i := range queryRes.StateEvents { err = authEvents.AddEvent(&queryRes.StateEvents[i].Event) if err != nil { - return fmt.Errorf("authEvents.AddEvent: %w", err) + return "", fmt.Errorf("authEvents.AddEvent: %w", err) } } refs, err := eventsNeeded.AuthEventReferences(&authEvents) if err != nil { - return fmt.Errorf("eventsNeeded.AuthEventReferences: %w", err) + return "", fmt.Errorf("eventsNeeded.AuthEventReferences: %w", err) } truncAuth, truncPrev := truncateAuthAndPrevEvents(refs, queryRes.LatestEvents) @@ -128,7 +129,7 @@ func AddPrevEventsToEvent( builder.PrevEvents = v2PrevRefs } - return nil + return queryRes.RoomVersion, nil } // truncateAuthAndPrevEvents limits the number of events we add into