diff --git a/.changeset/gentle-dingos-retire.md b/.changeset/gentle-dingos-retire.md new file mode 100644 index 00000000000..526facc864e --- /dev/null +++ b/.changeset/gentle-dingos-retire.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': major +--- + +Removes deprecated `setAdminStatus` method diff --git a/apps/meteor/app/lib/server/index.ts b/apps/meteor/app/lib/server/index.ts index da00a9124cb..9fb7c341b83 100644 --- a/apps/meteor/app/lib/server/index.ts +++ b/apps/meteor/app/lib/server/index.ts @@ -36,7 +36,6 @@ import './methods/saveSetting'; import './methods/saveSettings'; import './methods/sendMessage'; import './methods/sendSMTPTestEmail'; -import './methods/setAdminStatus'; import './methods/setEmail'; import './methods/setRealName'; import './methods/unarchiveRoom'; diff --git a/apps/meteor/app/lib/server/methods/setAdminStatus.ts b/apps/meteor/app/lib/server/methods/setAdminStatus.ts deleted file mode 100644 index 0ccbe729a81..00000000000 --- a/apps/meteor/app/lib/server/methods/setAdminStatus.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { isUserFederated } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ddp-client'; -import { Users } from '@rocket.chat/models'; -import { Match, check } from 'meteor/check'; -import { Meteor } from 'meteor/meteor'; - -import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -import { addUserToRole } from '../../../authorization/server/methods/addUserToRole'; -import { removeUserFromRole } from '../../../authorization/server/methods/removeUserFromRole'; -import { methodDeprecationLogger } from '../lib/deprecationWarningLogger'; - -declare module '@rocket.chat/ddp-client' { - // eslint-disable-next-line @typescript-eslint/naming-convention - interface ServerMethods { - setAdminStatus(userId: string, admin?: boolean): void; - } -} - -Meteor.methods({ - async setAdminStatus(userId, admin) { - methodDeprecationLogger.method('setAdminStatus', '8.0.0', 'Use `/v1/roles.addUserToRole` or `/v1/roles.removeUserFromRole`.'); - - check(userId, String); - check(admin, Match.Optional(Boolean)); - - const uid = Meteor.userId(); - - if (!uid) { - throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'setAdminStatus' }); - } - - if ((await hasPermissionAsync(uid, 'assign-admin-role')) !== true) { - throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'setAdminStatus' }); - } - - const user = await Users.findOne({ _id: userId }, { projection: { username: 1, federated: 1 } }); - if (!user || isUserFederated(user)) { - throw new Meteor.Error('error-not-allowed', 'Federated Users cant be admins', { method: 'setAdminStatus' }); - } - - if (admin) { - await addUserToRole(uid, 'admin', user?.username); - return; - } - - await removeUserFromRole(uid, 'admin', user?.username); - }, -}); diff --git a/apps/meteor/client/views/admin/users/UsersTable/UsersTableRow.tsx b/apps/meteor/client/views/admin/users/UsersTable/UsersTableRow.tsx index 987baee3bdb..a3090c133c4 100644 --- a/apps/meteor/client/views/admin/users/UsersTable/UsersTableRow.tsx +++ b/apps/meteor/client/views/admin/users/UsersTable/UsersTableRow.tsx @@ -88,7 +88,7 @@ const UsersTableRow = ({ const isActive = user.active; const isFederatedUser = !!user.federated; - const changeAdminStatusAction = useChangeAdminStatusAction(userId, isAdmin, onReload); + const changeAdminStatusAction = useChangeAdminStatusAction(username, isAdmin, onReload); const changeUserStatusAction = useChangeUserStatusAction(userId, isActive, onReload); const deleteUserAction = useDeleteUserAction(userId, onReload, onReload); const resetTOTPAction = useResetTOTPAction(userId); diff --git a/apps/meteor/client/views/admin/users/hooks/useAdminUserInfoActions.ts b/apps/meteor/client/views/admin/users/hooks/useAdminUserInfoActions.ts index 1f958bb5bba..9a67b986ba4 100644 --- a/apps/meteor/client/views/admin/users/hooks/useAdminUserInfoActions.ts +++ b/apps/meteor/client/views/admin/users/hooks/useAdminUserInfoActions.ts @@ -89,7 +89,7 @@ export const useAdminUserInfoActions = ({ const canDirectMessage = usePermission('create-d'); const canEditOtherUserInfo = usePermission('edit-other-user-info'); - const changeAdminStatusAction = useChangeAdminStatusAction(userId, isAdmin, onChange); + const changeAdminStatusAction = useChangeAdminStatusAction(username, isAdmin, onChange); const changeUserStatusAction = useChangeUserStatusAction(userId, isActive, onChange); const deleteUserAction = useDeleteUserAction(userId, onChange, onReload); const resetTOTPAction = useResetTOTPAction(userId); diff --git a/apps/meteor/client/views/admin/users/hooks/useChangeAdminStatusAction.ts b/apps/meteor/client/views/admin/users/hooks/useChangeAdminStatusAction.ts index af778833bba..88633799183 100644 --- a/apps/meteor/client/views/admin/users/hooks/useChangeAdminStatusAction.ts +++ b/apps/meteor/client/views/admin/users/hooks/useChangeAdminStatusAction.ts @@ -1,25 +1,37 @@ import type { IUser } from '@rocket.chat/core-typings'; -import { useToastMessageDispatch, useMethod, useTranslation, usePermission } from '@rocket.chat/ui-contexts'; +import { useToastMessageDispatch, usePermission, useEndpoint } from '@rocket.chat/ui-contexts'; import { useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; import type { AdminUserAction } from './useAdminUserInfoActions'; -export const useChangeAdminStatusAction = (userId: IUser['_id'], isAdmin: boolean, onChange: () => void): AdminUserAction | undefined => { - const t = useTranslation(); +export const useChangeAdminStatusAction = ( + username: IUser['username'] = '', + isAdmin: boolean, + onChange: () => void, +): AdminUserAction | undefined => { + const { t } = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); - const setAdminStatus = useMethod('setAdminStatus'); + const addUserToRoleEndpoint = useEndpoint('POST', '/v1/roles.addUserToRole'); + const removeUserFromRoleEndpoint = useEndpoint('POST', '/v1/roles.removeUserFromRole'); + const canAssignAdminRole = usePermission('assign-admin-role'); const changeAdminStatus = useCallback(async () => { try { - await setAdminStatus(userId, !isAdmin); - const message = isAdmin ? 'User_is_no_longer_an_admin' : 'User_is_now_an_admin'; - dispatchToastMessage({ type: 'success', message: t(message) }); + if (isAdmin) { + await removeUserFromRoleEndpoint({ roleId: 'admin', username }); + dispatchToastMessage({ type: 'success', message: t('User_is_no_longer_an_admin') }); + onChange(); + return; + } + await addUserToRoleEndpoint({ roleId: 'admin', username }); + dispatchToastMessage({ type: 'success', message: t('User_is_now_an_admin') }); onChange(); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } - }, [userId, dispatchToastMessage, isAdmin, onChange, setAdminStatus, t]); + }, [isAdmin, removeUserFromRoleEndpoint, username, dispatchToastMessage, addUserToRoleEndpoint, t, onChange]); return canAssignAdminRole ? {