aboutsummaryrefslogtreecommitdiff
path: root/syncapi/streams
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2022-10-25 15:15:24 +0200
committerGitHub <noreply@github.com>2022-10-25 15:15:24 +0200
commitc62ac3d6ad5c60f5f28a0f50bba50f7cbc2436ce (patch)
tree7053d476211bcc705e48ebd4d4391fd05aed2613 /syncapi/streams
parent8b7bf5e7d7dbb7d87848156c27666fc2353efeba (diff)
Fix `Current state appears in timeline in private history with many messages after` (#2830)
The problem was that we weren't getting enough recent events, as most of them were removed by the history visibility filter. Now we're getting all events between the given input range and re-slice the returned values after applying history visibility.
Diffstat (limited to 'syncapi/streams')
-rw-r--r--syncapi/streams/stream_pdu.go18
1 files changed, 10 insertions, 8 deletions
diff --git a/syncapi/streams/stream_pdu.go b/syncapi/streams/stream_pdu.go
index 707dbe8d..90cf8ce5 100644
--- a/syncapi/streams/stream_pdu.go
+++ b/syncapi/streams/stream_pdu.go
@@ -227,14 +227,10 @@ func (p *PDUStreamProvider) addRoomDeltaToResponse(
stateFilter *gomatrixserverlib.StateFilter,
req *types.SyncRequest,
) (types.StreamPosition, error) {
- if delta.MembershipPos > 0 && delta.Membership == gomatrixserverlib.Leave {
- // make sure we don't leak recent events after the leave event.
- // TODO: History visibility makes this somewhat complex to handle correctly. For example:
- // TODO: This doesn't work for join -> leave in a single /sync request (see events prior to join).
- // TODO: This will fail on join -> leave -> sensitive msg -> join -> leave
- // in a single /sync request
- // This is all "okay" assuming history_visibility == "shared" which it is by default.
- r.To = delta.MembershipPos
+
+ originalLimit := eventFilter.Limit
+ if r.Backwards {
+ eventFilter.Limit = int(r.From - r.To)
}
recentStreamEvents, limited, err := snapshot.RecentEvents(
ctx, delta.RoomID, r,
@@ -303,6 +299,12 @@ func (p *PDUStreamProvider) addRoomDeltaToResponse(
logrus.WithError(err).Error("unable to apply history visibility filter")
}
+ if r.Backwards && len(events) > originalLimit {
+ // We're going backwards and the events are ordered chronologically, so take the last `limit` events
+ events = events[len(events)-originalLimit:]
+ limited = true
+ }
+
if len(delta.StateEvents) > 0 {
updateLatestPosition(delta.StateEvents[len(delta.StateEvents)-1].EventID())
}