From bacf54cd5e88b20fdb9afe0d9b9047c80a97fd79 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Tue, 8 Sep 2020 20:15:34 +0100 Subject: [PATCH] Handle overwriting same event type and state key --- roomserver/api/wrapper.go | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/roomserver/api/wrapper.go b/roomserver/api/wrapper.go index 7e7fee566..5cc6c816e 100644 --- a/roomserver/api/wrapper.go +++ b/roomserver/api/wrapper.go @@ -47,7 +47,7 @@ func SendEventWithState( ctx context.Context, rsAPI RoomserverInternalAPI, state *gomatrixserverlib.RespState, event gomatrixserverlib.HeaderedEvent, haveEventIDs map[string]bool, ) error { - outliers, err := state.Events() + stateEvents, err := state.Events() if err != nil { return err } @@ -55,18 +55,34 @@ func SendEventWithState( var ires []InputRoomEvent var stateIDs []string - for _, outlier := range outliers { - if haveEventIDs[outlier.EventID()] { + for _, stateEvent := range stateEvents { + if stateEvent.StateKey() == nil { + continue + } + if haveEventIDs[stateEvent.EventID()] { + continue + } + if stateEvent.Type() == event.Type() && *stateEvent.StateKey() == *event.StateKey() { + // If this event is an old state event that will be replaced by the + // given event, then store it as an outlier instead. We don't want + // to include it in the current room state as we will end up violating + // unique constraints in the state block, but we need the event to + // be stored as it may be referred to as an auth_event or prev_event. + ires = append(ires, InputRoomEvent{ + Kind: KindOutlier, + Event: stateEvent.Headered(event.RoomVersion), + AuthEventIDs: stateEvent.AuthEventIDs(), + }) continue } ires = append(ires, InputRoomEvent{ Kind: KindNew, - Event: outlier.Headered(event.RoomVersion), - AuthEventIDs: outlier.AuthEventIDs(), + Event: stateEvent.Headered(event.RoomVersion), + AuthEventIDs: stateEvent.AuthEventIDs(), HasState: true, StateEventIDs: stateIDs, }) - stateIDs = append(stateIDs, outlier.EventID()) + stateIDs = append(stateIDs, stateEvent.EventID()) } ires = append(ires, InputRoomEvent{