aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--syncapi/streams/stream_pdu.go18
-rw-r--r--sytest-whitelist3
2 files changed, 12 insertions, 9 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())
}
diff --git a/sytest-whitelist b/sytest-whitelist
index e5e405af..60610929 100644
--- a/sytest-whitelist
+++ b/sytest-whitelist
@@ -756,4 +756,5 @@ Notifications can be viewed with GET /notifications
Can get rooms/{roomId}/messages for a departed room (SPEC-216)
Local device key changes appear in /keys/changes
Can get rooms/{roomId}/members at a given point
-Can filter rooms/{roomId}/members \ No newline at end of file
+Can filter rooms/{roomId}/members
+Current state appears in timeline in private history with many messages after \ No newline at end of file