From 80aaeb9d03fc4ef0a2a6c966dfc198f1ee2fc913 Mon Sep 17 00:00:00 2001 From: M-ZubairAhmed Date: Tue, 16 Jul 2024 14:20:13 +0000 Subject: [PATCH] [MM-59083] Handle permissions in user management options (#27668) --- .../system_user_detail/system_user_detail.tsx | 2 +- ...=> confirm_manage_user_settings_modal.tsx} | 3 +- .../system_users_list_actions/index.tsx | 614 ++++++++++-------- webapp/channels/src/i18n/en.json | 1 + 4 files changed, 347 insertions(+), 273 deletions(-) rename webapp/channels/src/components/admin_console/system_users/system_users_list_actions/{confirmManageUserSettingsModal.tsx => confirm_manage_user_settings_modal.tsx} (95%) diff --git a/webapp/channels/src/components/admin_console/system_user_detail/system_user_detail.tsx b/webapp/channels/src/components/admin_console/system_user_detail/system_user_detail.tsx index a11bbf26b5..eaf4d5be0e 100644 --- a/webapp/channels/src/components/admin_console/system_user_detail/system_user_detail.tsx +++ b/webapp/channels/src/components/admin_console/system_user_detail/system_user_detail.tsx @@ -19,7 +19,7 @@ import AdminUserCard from 'components/admin_console/admin_user_card/admin_user_c import BlockableLink from 'components/admin_console/blockable_link'; import ResetPasswordModal from 'components/admin_console/reset_password_modal'; import TeamList from 'components/admin_console/system_user_detail/team_list'; -import {ConfirmManageUserSettingsModal} from 'components/admin_console/system_users/system_users_list_actions/confirmManageUserSettingsModal'; +import ConfirmManageUserSettingsModal from 'components/admin_console/system_users/system_users_list_actions/confirm_manage_user_settings_modal'; import ConfirmModal from 'components/confirm_modal'; import FormError from 'components/form_error'; import SaveButton from 'components/save_button'; diff --git a/webapp/channels/src/components/admin_console/system_users/system_users_list_actions/confirmManageUserSettingsModal.tsx b/webapp/channels/src/components/admin_console/system_users/system_users_list_actions/confirm_manage_user_settings_modal.tsx similarity index 95% rename from webapp/channels/src/components/admin_console/system_users/system_users_list_actions/confirmManageUserSettingsModal.tsx rename to webapp/channels/src/components/admin_console/system_users/system_users_list_actions/confirm_manage_user_settings_modal.tsx index acfedf4972..ea3060b8c3 100644 --- a/webapp/channels/src/components/admin_console/system_users/system_users_list_actions/confirmManageUserSettingsModal.tsx +++ b/webapp/channels/src/components/admin_console/system_users/system_users_list_actions/confirm_manage_user_settings_modal.tsx @@ -14,10 +14,9 @@ type Props = { user: UserProfile; onConfirm: () => void; onExited: () => void; - onHide: () => void; } -export function ConfirmManageUserSettingsModal(props: Props) { +export default function ConfirmManageUserSettingsModal(props: Props) { const title = ( haveISystemPermission(state, {permission: Permissions.SYSCONSOLE_WRITE_USERMANAGEMENT_USERS})); const showManageUserSettings = useSelector(getShowManageUserSettings); function getTranslatedUserRole(userRoles: UserProfile['roles']) { @@ -92,40 +94,222 @@ export function SystemUsersListAction({user, currentUser, tableId, rowIndex, onE const menuId = `actionMenu-${tableId}-${rowIndex}`; const menuItemIdPrefix = `actionMenuItem-${tableId}-${rowIndex}`; + const isCurrentUserSystemAdmin = useMemo(() => isSystemAdmin(currentUser.roles), [currentUser.roles]); + // Disable if SystemAdmin being edited by non SystemAdmin eg. userManager with EditOtherUsers permissions - const isDisabled = !isSystemAdmin(currentUser.roles) && isSystemAdmin(user.roles); + const isNonSystemAdminEditingSystemAdmin = !isCurrentUserSystemAdmin && isSystemAdmin(user.roles); + const disableEditingOtherUsers = isNonSystemAdminEditingSystemAdmin || !haveSysConsoleWriteUserManagementUsersPermissions; - const onDeactivateMember = () => updateUser({delete_at: new Date().getMilliseconds()}); - const onUpdateRoles = (roles: string) => updateUser({roles}); - const onSwitchToEmailPassword = () => updateUser({auth_service: undefined}); - const onUpdateEmail = (email: string) => updateUser({email}); - const onPromoteToMember = () => updateUser({roles: user.roles.replace(General.SYSTEM_GUEST_ROLE, '')}); - const onDemoteToGuest = () => updateUser({roles: `${user.roles} ${General.SYSTEM_GUEST_ROLE}`}); + const handleManageRolesClick = useCallback(() => { + function onRoleUpdateSuccess(roles: string) { + updateUser({roles}); + } - const openUserSettingsModal = useCallback(() => { dispatch(openModal({ - modalId: ModalIdentifiers.USER_SETTINGS, - dialogType: UserSettingsModal, + modalId: ModalIdentifiers.MANAGE_ROLES_MODAL, + dialogType: ManageRolesModal, dialogProps: { - adminMode: true, - isContentProductSettings: true, - userID: user.id, + user, + onSuccess: onRoleUpdateSuccess, }, })); - }, [dispatch, user.id]); + }, [user, updateUser]); + + const handleManageTeamsClick = useCallback(() => { + dispatch(openModal({ + modalId: ModalIdentifiers.MANAGE_TEAMS_MODAL, + dialogType: ManageTeamsModal, + dialogProps: { + user, + }, + })); + }, [user]); + + const handleManageUserSettingsClick = useCallback(() => { + function onConfirmManageUserSettingsClick() { + dispatch(openModal({ + modalId: ModalIdentifiers.USER_SETTINGS, + dialogType: UserSettingsModal, + dialogProps: { + adminMode: true, + isContentProductSettings: true, + userID: user.id, + }, + })); + } + + dispatch(openModal({ + modalId: ModalIdentifiers.CONFIRM_MANAGE_USER_SETTINGS_MODAL, + dialogType: ConfirmManageUserSettingsModal, + dialogProps: { + user, + onConfirm: onConfirmManageUserSettingsClick, + }, + })); + }, [user]); + + const handleManageTokensClick = useCallback(() => { + dispatch(openModal({ + modalId: ModalIdentifiers.MANAGE_TOKENS_MODAL, + dialogType: ManageTokensModal, + dialogProps: { + user, + }, + })); + }, [user.id]); + + const handleResetPasswordClick = useCallback(() => { + dispatch(openModal({ + modalId: ModalIdentifiers.RESET_PASSWORD_MODAL, + dialogType: ResetPasswordModal, + dialogProps: { + user, + }, + })); + }, [user]); + + const handleRemoveMfaClick = useCallback(async () => { + await adminResetMfa(user.id, null, onError).then(() => { + updateUser({mfa_active: false}); + }); + + try { + await adminResetMfa(user.id, null, onError); + updateUser({mfa_active: false}); + } catch (error) { + onError(error); + } + }, [user.id, updateUser, onError]); + + const handleSwitchToEmailPasswordClick = useCallback(() => { + function onSwitchToEmailPasswordSuccess() { + updateUser({auth_service: undefined}); + } + + dispatch(openModal({ + modalId: ModalIdentifiers.RESET_PASSWORD_MODAL, + dialogType: ResetPasswordModal, + dialogProps: { + user, + onSuccess: onSwitchToEmailPasswordSuccess, + }, + })); + }, [user, updateUser]); + + const handleUpdateEmailClick = useCallback(() => { + function onUpdateEmailSuccess(email: string) { + updateUser({email}); + } + + dispatch(openModal({ + modalId: ModalIdentifiers.RESET_EMAIL_MODAL, + dialogType: ResetEmailModal, + dialogProps: { + user, + onSuccess: onUpdateEmailSuccess, + }, + })); + }, [user, updateUser]); + + const handlePromoteToMemberClick = useCallback(() => { + function onPromoteToMemberSuccess() { + updateUser({roles: user.roles.replace(General.SYSTEM_GUEST_ROLE, '')}); + } + + dispatch(openModal({ + modalId: ModalIdentifiers.PROMOTE_TO_MEMBER_MODAL, + dialogType: PromoteToMemberModal, + dialogProps: { + user, + onError, + onSuccess: onPromoteToMemberSuccess, + }, + })); + }, [user, updateUser, onError]); + + const handleDemoteToGuestClick = useCallback(() => { + function onDemoteToGuestSuccess() { + updateUser({roles: `${user.roles} ${General.SYSTEM_GUEST_ROLE}`}); + } + + dispatch(openModal({ + modalId: ModalIdentifiers.DEMOTE_TO_GUEST_MODAL, + dialogType: DemoteToGuestModal, + dialogProps: { + user, + onError, + onSuccess: onDemoteToGuestSuccess, + }, + })); + }, [user, updateUser, onError]); + + const handleRemoveSessionsClick = useCallback(() => { + dispatch(openModal({ + modalId: ModalIdentifiers.REVOKE_SESSIONS_MODAL, + dialogType: RevokeSessionsModal, + dialogProps: { + user, + currentUser, + onError, + }, + })); + }, [user, currentUser.id, onError]); + + const handleReSyncUserViaLdapGroupsClick = useCallback(() => { + dispatch(openModal({ + modalId: ModalIdentifiers.CREATE_GROUP_SYNCABLES_MEMBERSHIP_MODAL, + dialogType: CreateGroupSyncablesMembershipsModal, + dialogProps: { + user, + onError, + }, + })); + }, [user, onError]); + + const handleActivateUserClick = useCallback(async () => { + if (user.auth_service === Constants.LDAP_SERVICE) { + return; + } + + const {error} = await dispatch(updateUserActive(user.id, true)); + + if (error) { + onError(error); + } else { + updateUser({delete_at: 0}); + } + }, [user.id, user.auth_service, updateUser, onError]); + + const handleDeactivateMemberClick = useCallback(() => { + function onDeactivateMemberSuccess() { + updateUser({delete_at: new Date().getMilliseconds()}); + } + + dispatch( + openModal({ + modalId: ModalIdentifiers.DEACTIVATE_MEMBER_MODAL, + dialogType: DeactivateMemberModal, + dialogProps: { + user, + onError, + onSuccess: onDeactivateMemberSuccess, + }, + }), + ); + }, [user, updateUser, onError]); return ( {getTranslatedUserRole(user.roles)} - {!isDisabled && ( + {!disableEditingOtherUsers && (