aboutsummaryrefslogtreecommitdiff
path: root/clientapi/routing/membership.go
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-07-27 09:20:09 +0100
committerGitHub <noreply@github.com>2020-07-27 09:20:09 +0100
commitc8d476a3cca2fe0850373c0276144eea65d0a219 (patch)
treeb1756f28c14481a90c7e03039a0cff079e4ddaff /clientapi/routing/membership.go
parent61963a74ae84df94238cf384419acf4d59c311c1 (diff)
Return HTTP errors when trying to kick invalid users (#1221)
Room integrity was never compromised as GMSL does auth checks, but we would incorrectly 200 OK the request instead of 403ing.
Diffstat (limited to 'clientapi/routing/membership.go')
-rw-r--r--clientapi/routing/membership.go12
1 files changed, 9 insertions, 3 deletions
diff --git a/clientapi/routing/membership.go b/clientapi/routing/membership.go
index a9a8fa00..90ddb699 100644
--- a/clientapi/routing/membership.go
+++ b/clientapi/routing/membership.go
@@ -96,6 +96,7 @@ func SendKick(
req *http.Request, accountDB accounts.Database, device *userapi.Device,
roomID string, cfg *config.Dendrite,
rsAPI roomserverAPI.RoomserverInternalAPI, asAPI appserviceAPI.AppServiceQueryAPI,
+ stateAPI currentstateAPI.CurrentStateInternalAPI,
) util.JSONResponse {
body, evTime, roomVer, reqErr := extractRequestData(req, roomID, rsAPI)
if reqErr != nil {
@@ -108,6 +109,11 @@ func SendKick(
}
}
+ errRes := checkMemberInRoom(req.Context(), stateAPI, device.UserID, roomID)
+ if errRes != nil {
+ return *errRes
+ }
+
var queryRes roomserverAPI.QueryMembershipForUserResponse
err := rsAPI.QueryMembershipForUser(req.Context(), &roomserverAPI.QueryMembershipForUserRequest{
RoomID: roomID,
@@ -116,11 +122,11 @@ func SendKick(
if err != nil {
return util.ErrorResponse(err)
}
- // kick is only valid if the user is not currently banned
- if queryRes.Membership == "ban" {
+ // kick is only valid if the user is not currently banned or left (that is, they are joined or invited)
+ if queryRes.Membership != "join" && queryRes.Membership != "invite" {
return util.JSONResponse{
Code: 403,
- JSON: jsonerror.Unknown("cannot /kick banned users"),
+ JSON: jsonerror.Unknown("cannot /kick banned or left users"),
}
}
// TODO: should we be using SendLeave instead?