diff --git a/roomserver/api/query.go b/roomserver/api/query.go index 67a217c82..a80fe684c 100644 --- a/roomserver/api/query.go +++ b/roomserver/api/query.go @@ -177,7 +177,7 @@ type QueryStateAndAuthChainRequest struct { // The room ID to query the state in. RoomID string `json:"room_id"` // The list of prev events for the event. Used to calculate the state at - // the event + // the event. If empty, assumes current state. PrevEventIDs []string `json:"prev_event_ids"` // The list of auth events for the event. Used to calculate the auth chain AuthEventIDs []string `json:"auth_event_ids"` diff --git a/roomserver/internal/query/query.go b/roomserver/internal/query/query.go index b34ae7701..640210298 100644 --- a/roomserver/internal/query/query.go +++ b/roomserver/internal/query/query.go @@ -334,10 +334,41 @@ func (r *Queryer) QueryStateAndAuthChain( response.RoomExists = true response.RoomVersion = info.RoomVersion - stateEvents, err := r.loadStateAtEventIDs(ctx, *info, request.PrevEventIDs) - if err != nil { - return err + var stateEvents []gomatrixserverlib.Event + if len(request.PrevEventIDs) > 0 { + stateEvents, err = r.loadStateAtEventIDs(ctx, *info, request.PrevEventIDs) + if err != nil { + return err + } + } else { + // no PrevEventIDs or AuthEventIDs were provided, so return current state instead. + + // XXX: is this right? + roomState := state.NewStateResolution(r.DB, *info) + // no need to resolve state again later + request.ResolveState = false + + var currentStateSnapshotNID types.StateSnapshotNID + _, currentStateSnapshotNID, _, err = + r.DB.LatestEventIDs(ctx, info.RoomNID) + if err != nil { + return err + } + + var stateEntries []types.StateEntry + stateEntries, err = roomState.LoadStateAtSnapshot( + ctx, currentStateSnapshotNID, + ) + if err != nil { + return err + } + + stateEvents, err = helpers.LoadStateEvents(ctx, r.DB, stateEntries) + if err != nil { + return err + } } + response.PrevEventsExist = true // add the auth event IDs for the current state events too