Skip to content

Commit 5cab654

Browse files
committed
users can update roles of any user below them (except members and app admins)
1 parent 2ffc354 commit 5cab654

2 files changed

Lines changed: 10 additions & 34 deletions

File tree

src/backend/src/services/users.services.ts

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ import {
66
rankUserRole,
77
User,
88
RoleEnum,
9-
isHead,
109
UserSecureSettings,
1110
UserScheduleSettings,
1211
AuthenticatedUser,
1312
AvailabilityCreateArgs,
1413
UserWithScheduleSettings,
15-
ProjectOverview
14+
ProjectOverview,
15+
isAtLeastRank
1616
} from 'shared';
1717
import prisma from '../prisma/prisma.js';
1818
import { AccessDeniedException, HttpException, NotFoundException } from '../utils/errors.utils.js';
@@ -393,25 +393,16 @@ export default class UsersService {
393393
const userRankedRole = rankUserRole(userRole);
394394
const targetUserRankedRole = rankUserRole(targetUserRole);
395395

396-
const isLeadershipPromotingGuestToMember =
397-
userRole === RoleEnum.LEADERSHIP && targetUserRole === RoleEnum.GUEST && role === RoleEnum.MEMBER;
398-
399-
if (!isLeadershipPromotingGuestToMember) {
400-
if (!isHead(userRole)) {
401-
throw new AccessDeniedException('Guests, members, and leadership cannot update user roles!');
402-
}
403-
404-
if (targetUserRankedRole >= userRankedRole) {
405-
throw new AccessDeniedException('Cannot change the role of a user with an equal or higher role than you');
406-
}
396+
if (!isAtLeastRank(RoleEnum.LEADERSHIP, userRole)) {
397+
throw new AccessDeniedException('Guests and members cannot update user roles!');
398+
}
407399

408-
if (userRole === RoleEnum.HEAD && rankUserRole(role) >= userRankedRole) {
409-
throw new AccessDeniedException('Heads can only promote to leadership or below');
410-
}
400+
if (targetUserRankedRole >= userRankedRole) {
401+
throw new AccessDeniedException('Cannot change the role of a user with an equal or higher role than you');
402+
}
411403

412-
if (rankUserRole(role) > userRankedRole) {
413-
throw new AccessDeniedException('Cannot promote user to a higher role than yourself');
414-
}
404+
if (rankUserRole(role) >= userRankedRole && role !== RoleEnum.APP_ADMIN) {
405+
throw new AccessDeniedException('Cannot promote someone to your own role or higher');
415406
}
416407

417408
await prisma.role.upsert({

src/frontend/src/pages/AdminToolsPage/AdminToolsUserManagement.tsx

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,25 +66,10 @@ const AdminToolsUserManagement: React.FC = () => {
6666
};
6767

6868
const getAvailableRoles = () => {
69-
if (isAdmin(currentUser.role)) {
70-
return Object.values(RoleEnum).filter((v) => rankUserRole(v) <= currentUserRank);
71-
}
72-
if (isLeadership(currentUser.role) && user && user.role === RoleEnum.GUEST) {
73-
return [RoleEnum.MEMBER];
74-
}
75-
if (isLeadership(currentUser.role)) {
76-
return [];
77-
}
7869
return Object.values(RoleEnum).filter((v) => rankUserRole(v) < currentUserRank);
7970
};
8071

8172
const getModifiableUsers = () => {
82-
if (isAdmin(currentUser.role)) {
83-
return users.filter((user) => rankUserRole(user.role) < currentUserRank);
84-
}
85-
if (isLeadership(currentUser.role)) {
86-
return users.filter((user) => user.role === RoleEnum.GUEST);
87-
}
8873
return users.filter((user) => rankUserRole(user.role) < currentUserRank);
8974
};
9075

0 commit comments

Comments
 (0)