Skip to content
This repository was archived by the owner on Nov 25, 2024. It is now read-only.

Commit c15bfef

Browse files
authored
Add RoomExists flag to QueryMembershipForUser (#2450)
Fixes matrix-org/complement#369
1 parent 6db08b2 commit c15bfef

6 files changed

Lines changed: 38 additions & 5 deletions

File tree

clientapi/routing/membership.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,12 @@ func SendUnban(
188188
if err != nil {
189189
return util.ErrorResponse(err)
190190
}
191+
if !queryRes.RoomExists {
192+
return util.JSONResponse{
193+
Code: http.StatusForbidden,
194+
JSON: jsonerror.Forbidden("room does not exist"),
195+
}
196+
}
191197
// unban is only valid if the user is currently banned
192198
if queryRes.Membership != "ban" {
193199
return util.JSONResponse{
@@ -471,6 +477,12 @@ func SendForget(
471477
logger.WithError(err).Error("QueryMembershipForUser: could not query membership for user")
472478
return jsonerror.InternalServerError()
473479
}
480+
if !membershipRes.RoomExists {
481+
return util.JSONResponse{
482+
Code: http.StatusForbidden,
483+
JSON: jsonerror.Forbidden("room does not exist"),
484+
}
485+
}
474486
if membershipRes.IsInRoom {
475487
return util.JSONResponse{
476488
Code: http.StatusBadRequest,

clientapi/routing/state.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ func OnIncomingStateRequest(ctx context.Context, device *userapi.Device, rsAPI a
5656
util.GetLogger(ctx).WithError(err).Error("queryAPI.QueryLatestEventsAndState failed")
5757
return jsonerror.InternalServerError()
5858
}
59+
if !stateRes.RoomExists {
60+
return util.JSONResponse{
61+
Code: http.StatusForbidden,
62+
JSON: jsonerror.Forbidden("room does not exist"),
63+
}
64+
}
5965

6066
// Look at the room state and see if we have a history visibility event
6167
// that marks the room as world-readable. If we don't then we assume that

roomserver/api/query.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ type QueryMembershipForUserResponse struct {
122122
Membership string `json:"membership"`
123123
// True if the user asked to forget this room.
124124
IsRoomForgotten bool `json:"is_room_forgotten"`
125+
RoomExists bool `json:"room_exists"`
125126
}
126127

127128
// QueryMembershipsForRoomRequest is a request to QueryMembershipsForRoom

roomserver/internal/query/query.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,10 @@ func (r *Queryer) QueryMembershipForUser(
169169
return err
170170
}
171171
if info == nil {
172-
return fmt.Errorf("QueryMembershipForUser: unknown room %s", request.RoomID)
172+
response.RoomExists = false
173+
return nil
173174
}
175+
response.RoomExists = true
174176

175177
membershipEventNID, stillInRoom, isRoomforgotten, err := r.DB.GetMembership(ctx, info.RoomNID, request.UserID)
176178
if err != nil {

syncapi/routing/context.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ func Context(
7373
logrus.WithError(err).Error("unable to query membership")
7474
return jsonerror.InternalServerError()
7575
}
76+
if !membershipRes.RoomExists {
77+
return util.JSONResponse{
78+
Code: http.StatusForbidden,
79+
JSON: jsonerror.Forbidden("room does not exist"),
80+
}
81+
}
7682

7783
stateFilter := gomatrixserverlib.StateFilter{
7884
Limit: 100,

syncapi/routing/messages.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,16 @@ func OnIncomingMessagesRequest(
6868
var err error
6969

7070
// check if the user has already forgotten about this room
71-
isForgotten, err := checkIsRoomForgotten(req.Context(), roomID, device.UserID, rsAPI)
71+
isForgotten, roomExists, err := checkIsRoomForgotten(req.Context(), roomID, device.UserID, rsAPI)
7272
if err != nil {
7373
return jsonerror.InternalServerError()
7474
}
75+
if !roomExists {
76+
return util.JSONResponse{
77+
Code: http.StatusForbidden,
78+
JSON: jsonerror.Forbidden("room does not exist"),
79+
}
80+
}
7581

7682
if isForgotten {
7783
return util.JSONResponse{
@@ -244,17 +250,17 @@ func OnIncomingMessagesRequest(
244250
}
245251
}
246252

247-
func checkIsRoomForgotten(ctx context.Context, roomID, userID string, rsAPI api.SyncRoomserverAPI) (bool, error) {
253+
func checkIsRoomForgotten(ctx context.Context, roomID, userID string, rsAPI api.SyncRoomserverAPI) (forgotten bool, exists bool, err error) {
248254
req := api.QueryMembershipForUserRequest{
249255
RoomID: roomID,
250256
UserID: userID,
251257
}
252258
resp := api.QueryMembershipForUserResponse{}
253259
if err := rsAPI.QueryMembershipForUser(ctx, &req, &resp); err != nil {
254-
return false, err
260+
return false, false, err
255261
}
256262

257-
return resp.IsRoomForgotten, nil
263+
return resp.IsRoomForgotten, resp.RoomExists, nil
258264
}
259265

260266
// retrieveEvents retrieves events from the local database for a request on

0 commit comments

Comments
 (0)