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

Add RoomExists flag to QueryMembershipForUser #2450

Merged
merged 1 commit into from
May 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions clientapi/routing/membership.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,12 @@ func SendUnban(
if err != nil {
return util.ErrorResponse(err)
}
if !queryRes.RoomExists {
return util.JSONResponse{
Code: http.StatusForbidden,
JSON: jsonerror.Forbidden("room does not exist"),
}
}
// unban is only valid if the user is currently banned
if queryRes.Membership != "ban" {
return util.JSONResponse{
Expand Down Expand Up @@ -471,6 +477,12 @@ func SendForget(
logger.WithError(err).Error("QueryMembershipForUser: could not query membership for user")
return jsonerror.InternalServerError()
}
if !membershipRes.RoomExists {
return util.JSONResponse{
Code: http.StatusForbidden,
JSON: jsonerror.Forbidden("room does not exist"),
}
}
if membershipRes.IsInRoom {
return util.JSONResponse{
Code: http.StatusBadRequest,
Expand Down
6 changes: 6 additions & 0 deletions clientapi/routing/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ func OnIncomingStateRequest(ctx context.Context, device *userapi.Device, rsAPI a
util.GetLogger(ctx).WithError(err).Error("queryAPI.QueryLatestEventsAndState failed")
return jsonerror.InternalServerError()
}
if !stateRes.RoomExists {
return util.JSONResponse{
Code: http.StatusForbidden,
JSON: jsonerror.Forbidden("room does not exist"),
}
}

// Look at the room state and see if we have a history visibility event
// that marks the room as world-readable. If we don't then we assume that
Expand Down
1 change: 1 addition & 0 deletions roomserver/api/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ type QueryMembershipForUserResponse struct {
Membership string `json:"membership"`
// True if the user asked to forget this room.
IsRoomForgotten bool `json:"is_room_forgotten"`
RoomExists bool `json:"room_exists"`
}

// QueryMembershipsForRoomRequest is a request to QueryMembershipsForRoom
Expand Down
4 changes: 3 additions & 1 deletion roomserver/internal/query/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,10 @@ func (r *Queryer) QueryMembershipForUser(
return err
}
if info == nil {
return fmt.Errorf("QueryMembershipForUser: unknown room %s", request.RoomID)
response.RoomExists = false
return nil
}
response.RoomExists = true

membershipEventNID, stillInRoom, isRoomforgotten, err := r.DB.GetMembership(ctx, info.RoomNID, request.UserID)
if err != nil {
Expand Down
6 changes: 6 additions & 0 deletions syncapi/routing/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ func Context(
logrus.WithError(err).Error("unable to query membership")
return jsonerror.InternalServerError()
}
if !membershipRes.RoomExists {
return util.JSONResponse{
Code: http.StatusForbidden,
JSON: jsonerror.Forbidden("room does not exist"),
}
}

stateFilter := gomatrixserverlib.StateFilter{
Limit: 100,
Expand Down
14 changes: 10 additions & 4 deletions syncapi/routing/messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,16 @@ func OnIncomingMessagesRequest(
var err error

// check if the user has already forgotten about this room
isForgotten, err := checkIsRoomForgotten(req.Context(), roomID, device.UserID, rsAPI)
isForgotten, roomExists, err := checkIsRoomForgotten(req.Context(), roomID, device.UserID, rsAPI)
if err != nil {
return jsonerror.InternalServerError()
}
if !roomExists {
return util.JSONResponse{
Code: http.StatusForbidden,
JSON: jsonerror.Forbidden("room does not exist"),
}
}

if isForgotten {
return util.JSONResponse{
Expand Down Expand Up @@ -244,17 +250,17 @@ func OnIncomingMessagesRequest(
}
}

func checkIsRoomForgotten(ctx context.Context, roomID, userID string, rsAPI api.SyncRoomserverAPI) (bool, error) {
func checkIsRoomForgotten(ctx context.Context, roomID, userID string, rsAPI api.SyncRoomserverAPI) (forgotten bool, exists bool, err error) {
req := api.QueryMembershipForUserRequest{
RoomID: roomID,
UserID: userID,
}
resp := api.QueryMembershipForUserResponse{}
if err := rsAPI.QueryMembershipForUser(ctx, &req, &resp); err != nil {
return false, err
return false, false, err
}

return resp.IsRoomForgotten, nil
return resp.IsRoomForgotten, resp.RoomExists, nil
}

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