Skip to content

Commit

Permalink
Prevent from remove admin capabilities by yourself (#804)
Browse files Browse the repository at this point in the history
  • Loading branch information
postrowinski committed Apr 26, 2023
1 parent 940725d commit ca23750
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
10 changes: 10 additions & 0 deletions mwdb/resources/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,9 @@ def put(self, name):
group = (
db.session.query(Group).filter(Group.name == group_name_obj["name"]).first()
)

user = g.auth_user

if group is None:
raise NotFound("No such group")

Expand All @@ -240,6 +243,13 @@ def put(self, name):
group.name = obj["name"]

if obj["capabilities"] is not None:
if (
user.login == group.name
and Capabilities.manage_users not in obj["capabilities"]
):
raise Forbidden(
f"Can't remove '{Capabilities.manage_users }', yourself"
)
group.capabilities = obj["capabilities"]

if obj["default"] is not None:
Expand Down
14 changes: 12 additions & 2 deletions mwdb/web/src/components/Profile/Views/ProfileCapabilities.jsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import React, { useState, useCallback, useEffect } from "react";
import React, { useState, useCallback, useEffect, useContext } from "react";
import { useOutletContext } from "react-router-dom";
import { Link } from "react-router-dom";
import { faTimes, faSave } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { find, isNil, isEmpty } from "lodash";
import { api } from "@mwdb-web/commons/api";
import { capabilitiesList, Capability } from "@mwdb-web/commons/auth";
import {
capabilitiesList,
Capability,
AuthContext,
} from "@mwdb-web/commons/auth";
import {
GroupBadge,
BootstrapSelect,
Expand All @@ -15,6 +19,7 @@ import {
import { useCheckCapabilities } from "@mwdb-web/commons/hooks";

function CapabilitiesTable({ profile }) {
const { user } = useContext(AuthContext);
const { userHasCapabilities } = useCheckCapabilities();
const { setCapabilitiesToDelete } = useOutletContext();

Expand All @@ -27,6 +32,11 @@ function CapabilitiesTable({ profile }) {
}

function isDeleteButtonRender(cap) {
const userOrGroupName = profile.name || profile.login;
const isManageUsersCapability = cap === Capability.manageUsers;
if (isManageUsersCapability && userOrGroupName === user.login) {
return false;
}
return !isNil(profile.login) ? isUserDeleteButtonRender(cap) : true;
}

Expand Down

0 comments on commit ca23750

Please sign in to comment.