aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2022-10-24 17:03:04 +0200
committerGitHub <noreply@github.com>2022-10-24 17:03:04 +0200
commit7506e3303e78e47a7bea454de1e726c6f6640d2f (patch)
tree2c2c6987fb900fb5b0164dabfeef1beb4d410cc5
parenta553fe770575b027809fc0a0f81e6709e6d068df (diff)
Get messages from before user left the room (#2824)
This is going to make `Can get rooms/{roomId}/messages for a departed room (SPEC-216)` pass, since we now only grep events from before the user left the room.
-rw-r--r--syncapi/routing/messages.go33
-rw-r--r--sytest-whitelist4
2 files changed, 28 insertions, 9 deletions
diff --git a/syncapi/routing/messages.go b/syncapi/routing/messages.go
index 8f3ed3f5..86cf8e73 100644
--- a/syncapi/routing/messages.go
+++ b/syncapi/routing/messages.go
@@ -83,18 +83,18 @@ func OnIncomingMessagesRequest(
defer sqlutil.EndTransactionWithCheck(snapshot, &succeeded, &err)
// check if the user has already forgotten about this room
- isForgotten, roomExists, err := checkIsRoomForgotten(req.Context(), roomID, device.UserID, rsAPI)
+ membershipResp, err := getMembershipForUser(req.Context(), roomID, device.UserID, rsAPI)
if err != nil {
return jsonerror.InternalServerError()
}
- if !roomExists {
+ if !membershipResp.RoomExists {
return util.JSONResponse{
Code: http.StatusForbidden,
JSON: jsonerror.Forbidden("room does not exist"),
}
}
- if isForgotten {
+ if membershipResp.IsRoomForgotten {
return util.JSONResponse{
Code: http.StatusForbidden,
JSON: jsonerror.Forbidden("user already forgot about this room"),
@@ -195,6 +195,20 @@ func OnIncomingMessagesRequest(
}
}
+ // If the user already left the room, grep events from before that
+ if membershipResp.Membership == gomatrixserverlib.Leave {
+ var token types.TopologyToken
+ token, err = snapshot.EventPositionInTopology(req.Context(), membershipResp.EventID)
+ if err != nil {
+ return util.JSONResponse{
+ Code: http.StatusInternalServerError,
+ }
+ }
+ if backwardOrdering {
+ from = token
+ }
+ }
+
mReq := messagesReq{
ctx: req.Context(),
db: db,
@@ -283,17 +297,16 @@ func (m *messagesResp) applyLazyLoadMembers(
}
}
-func checkIsRoomForgotten(ctx context.Context, roomID, userID string, rsAPI api.SyncRoomserverAPI) (forgotten bool, exists bool, err error) {
+func getMembershipForUser(ctx context.Context, roomID, userID string, rsAPI api.SyncRoomserverAPI) (resp api.QueryMembershipForUserResponse, err error) {
req := api.QueryMembershipForUserRequest{
RoomID: roomID,
UserID: userID,
}
- resp := api.QueryMembershipForUserResponse{}
if err := rsAPI.QueryMembershipForUser(ctx, &req, &resp); err != nil {
- return false, false, err
+ return api.QueryMembershipForUserResponse{}, err
}
- return resp.IsRoomForgotten, resp.RoomExists, nil
+ return resp, nil
}
// retrieveEvents retrieves events from the local database for a request on
@@ -313,7 +326,11 @@ func (r *messagesReq) retrieveEvents() (
}
var events []*gomatrixserverlib.HeaderedEvent
- util.GetLogger(r.ctx).WithField("start", start).WithField("end", end).Infof("Fetched %d events locally", len(streamEvents))
+ util.GetLogger(r.ctx).WithFields(logrus.Fields{
+ "start": r.from,
+ "end": r.to,
+ "backwards": r.backwardOrdering,
+ }).Infof("Fetched %d events locally", len(streamEvents))
// There can be two reasons for streamEvents to be empty: either we've
// reached the oldest event in the room (or the most recent one, depending
diff --git a/sytest-whitelist b/sytest-whitelist
index 1387838f..e92ae649 100644
--- a/sytest-whitelist
+++ b/sytest-whitelist
@@ -752,4 +752,6 @@ When user joins a room the state is included in the next sync
When user joins a room the state is included in a gapped sync
Messages that notify from another user increment notification_count
Messages that highlight from another user increment unread highlight count
-Notifications can be viewed with GET /notifications \ No newline at end of file
+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 \ No newline at end of file