Skip to content

Commit 51e74a8

Browse files
committed
fix: make validateRoleList to check by role name or id
1 parent d0be8ad commit 51e74a8

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

apps/meteor/server/lib/roles/addUserRoles.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import { syncRoomRolePriorityForUserAndRoom } from './syncRoomRolePriority';
66
import { validateRoleList } from './validateRoleList';
77
import { notifyOnSubscriptionChangedByRoomIdAndUserId } from '../../../app/lib/server/lib/notifyListener';
88

9-
export const addUserRolesAsync = async (userId: IUser['_id'], roles: IRole['_id'][], scope?: IRoom['_id']): Promise<boolean> => {
9+
export const addUserRolesAsync = async (
10+
userId: IUser['_id'],
11+
roles: IRole['_id'][] | IRole['name'][],
12+
scope?: IRoom['_id'],
13+
): Promise<boolean> => {
1014
if (!userId || !roles?.length) {
1115
return false;
1216
}
@@ -25,7 +29,7 @@ export const addUserRolesAsync = async (userId: IUser['_id'], roles: IRole['_id'
2529
}
2630

2731
for await (const roleId of roles) {
28-
const role = await Roles.findOneById<Pick<IRole, '_id' | 'scope'>>(roleId, { projection: { scope: 1 } });
32+
const role = await Roles.findOneByIdOrName<Pick<IRole, '_id' | 'scope'>>(roleId, { projection: { scope: 1 } });
2933

3034
if (!role) {
3135
process.env.NODE_ENV === 'development' && console.warn(`[WARN] RolesRaw.addUserRoles: role: ${roleId} not found`);

apps/meteor/server/lib/roles/removeUserFromRoles.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import { syncRoomRolePriorityForUserAndRoom } from './syncRoomRolePriority';
66
import { validateRoleList } from './validateRoleList';
77
import { notifyOnSubscriptionChangedByRoomIdAndUserId } from '../../../app/lib/server/lib/notifyListener';
88

9-
export const removeUserFromRolesAsync = async (userId: IUser['_id'], roles: IRole['_id'][], scope?: IRoom['_id']): Promise<boolean> => {
9+
export const removeUserFromRolesAsync = async (
10+
userId: IUser['_id'],
11+
roles: IRole['_id'][] | IRole['name'][],
12+
scope?: IRoom['_id'],
13+
): Promise<boolean> => {
1014
if (!userId || !roles) {
1115
return false;
1216
}
@@ -25,19 +29,19 @@ export const removeUserFromRolesAsync = async (userId: IUser['_id'], roles: IRol
2529
}
2630

2731
for await (const roleId of roles) {
28-
const role = await Roles.findOneById<Pick<IRole, '_id' | 'scope'>>(roleId, { projection: { scope: 1 } });
32+
const role = await Roles.findOneByIdOrName<Pick<IRole, '_id' | 'scope'>>(roleId, { projection: { scope: 1 } });
2933
if (!role) {
3034
continue;
3135
}
3236

3337
if (role.scope === 'Subscriptions' && scope) {
34-
const removeRolesResponse = await Subscriptions.removeRolesByUserId(userId, [roleId], scope);
38+
const removeRolesResponse = await Subscriptions.removeRolesByUserId(userId, [role._id], scope);
3539
await syncRoomRolePriorityForUserAndRoom(userId, scope);
3640
if (removeRolesResponse.modifiedCount) {
3741
void notifyOnSubscriptionChangedByRoomIdAndUserId(scope, userId);
3842
}
3943
} else {
40-
await Users.removeRolesByUserId(userId, [roleId]);
44+
await Users.removeRolesByUserId(userId, [role._id]);
4145
}
4246
}
4347

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import type { IRole } from '@rocket.chat/core-typings';
22
import { Roles } from '@rocket.chat/models';
33

4-
export const validateRoleList = async (roleIds: IRole['_id'][]): Promise<boolean> => {
4+
export const validateRoleList = async (roleIdsOrNames: IRole['_id'][] | IRole['name'][]): Promise<boolean> => {
5+
if (!Array.isArray(roleIdsOrNames) || roleIdsOrNames.length === 0) {
6+
return true;
7+
}
8+
59
const options = {
610
projection: {
711
_id: 1,
12+
name: 1,
813
},
914
};
1015

11-
const existingRoleIds = (await Roles.findInIds<Pick<IRole, '_id'>>(roleIds, options).toArray()).map(({ _id }) => _id);
12-
return !roleIds.find((_id) => !existingRoleIds.includes(_id));
16+
const roles = await Roles.findInIdsOrNames<Pick<IRole, '_id' | 'name'>>(roleIdsOrNames, options).toArray();
17+
18+
return roleIdsOrNames.every((item) => roles.some((role) => role._id === item || role.name === item));
1319
};

0 commit comments

Comments
 (0)