From b98c8629e59a633871b61f7e7c576220bc3e7107 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 9 Jul 2024 23:51:09 +0800 Subject: [PATCH 1/4] misc: moved admin user deletion to pro --- .../src/ee/services/license/licence-fns.ts | 3 ++- .../src/ee/services/license/license-types.ts | 1 + backend/src/server/routes/index.ts | 3 ++- .../super-admin/super-admin-service.ts | 11 +++++++- frontend/src/hooks/api/subscriptions/types.ts | 1 + .../views/admin/DashboardPage/UserPanel.tsx | 26 ++++++++++++++----- 6 files changed, 36 insertions(+), 9 deletions(-) diff --git a/backend/src/ee/services/license/licence-fns.ts b/backend/src/ee/services/license/licence-fns.ts index d69f7bf95..f016ea6ab 100644 --- a/backend/src/ee/services/license/licence-fns.ts +++ b/backend/src/ee/services/license/licence-fns.ts @@ -38,7 +38,8 @@ export const getDefaultOnPremFeatures = (): TFeatureSet => ({ has_used_trial: true, secretApproval: false, secretRotation: true, - caCrl: false + caCrl: false, + adminUserDeletion: false }); export const setupLicenceRequestWithStore = (baseURL: string, refreshUrl: string, licenseKey: string) => { diff --git a/backend/src/ee/services/license/license-types.ts b/backend/src/ee/services/license/license-types.ts index 36b03ff80..4b6c1b450 100644 --- a/backend/src/ee/services/license/license-types.ts +++ b/backend/src/ee/services/license/license-types.ts @@ -56,6 +56,7 @@ export type TFeatureSet = { secretApproval: false; secretRotation: true; caCrl: false; + adminUserDeletion: false; }; export type TOrgPlansTableDTO = { diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index 069d61569..b69309612 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -466,7 +466,8 @@ export const registerRoutes = async ( authService: loginService, serverCfgDAL: superAdminDAL, orgService, - keyStore + keyStore, + licenseService }); const rateLimitService = rateLimitServiceFactory({ rateLimitDAL, diff --git a/backend/src/services/super-admin/super-admin-service.ts b/backend/src/services/super-admin/super-admin-service.ts index 650910681..73eaeda42 100644 --- a/backend/src/services/super-admin/super-admin-service.ts +++ b/backend/src/services/super-admin/super-admin-service.ts @@ -1,6 +1,7 @@ import bcrypt from "bcrypt"; import { TSuperAdmin, TSuperAdminUpdate } from "@app/db/schemas"; +import { TLicenseServiceFactory } from "@app/ee/services/license/license-service"; import { TKeyStoreFactory } from "@app/keystore/keystore"; import { getConfig } from "@app/lib/config/env"; import { infisicalSymmetricEncypt } from "@app/lib/crypto/encryption"; @@ -20,6 +21,7 @@ type TSuperAdminServiceFactoryDep = { authService: Pick; orgService: Pick; keyStore: Pick; + licenseService: Pick; }; export type TSuperAdminServiceFactory = ReturnType; @@ -36,7 +38,8 @@ export const superAdminServiceFactory = ({ userDAL, authService, orgService, - keyStore + keyStore, + licenseService }: TSuperAdminServiceFactoryDep) => { const initServerCfg = async () => { // TODO(akhilmhdh): bad pattern time less change this later to me itself @@ -219,6 +222,12 @@ export const superAdminServiceFactory = ({ }; const deleteUser = async (userId: string) => { + if (!licenseService.onPremFeatures.adminUserDeletion) { + throw new BadRequestError({ + message: "Failed to delete user due to plan restriction. Upgrade to Infisical's Pro plan." + }); + } + const user = await userDAL.deleteById(userId); return user; }; diff --git a/frontend/src/hooks/api/subscriptions/types.ts b/frontend/src/hooks/api/subscriptions/types.ts index 89635a953..d5e5f80e6 100644 --- a/frontend/src/hooks/api/subscriptions/types.ts +++ b/frontend/src/hooks/api/subscriptions/types.ts @@ -39,4 +39,5 @@ export type SubscriptionPlan = { trial_end: number | null; has_used_trial: boolean; caCrl: boolean; + adminUserDeletion: boolean; }; diff --git a/frontend/src/views/admin/DashboardPage/UserPanel.tsx b/frontend/src/views/admin/DashboardPage/UserPanel.tsx index 733d52624..6db9222ef 100644 --- a/frontend/src/views/admin/DashboardPage/UserPanel.tsx +++ b/frontend/src/views/admin/DashboardPage/UserPanel.tsx @@ -16,9 +16,10 @@ import { Td, Th, THead, - Tr + Tr, + UpgradePlanModal } from "@app/components/v2"; -import { useUser } from "@app/context"; +import { useSubscription, useUser } from "@app/context"; import { useDebounce, usePopUp } from "@app/hooks"; import { useAdminDeleteUser, useAdminGetUsers } from "@app/hooks/api"; import { UsePopUpState } from "@app/hooks/usePopUp"; @@ -27,8 +28,8 @@ const UserPanelTable = ({ handlePopUpOpen }: { handlePopUpOpen: ( - popUpName: keyof UsePopUpState<["removeUser"]>, - data: { + popUpName: keyof UsePopUpState<["removeUser", "upgradePlan"]>, + data?: { username: string; id: string; } @@ -38,6 +39,7 @@ const UserPanelTable = ({ const { user } = useUser(); const userId = user?.id || ""; const debounedSearchTerm = useDebounce(searchUserFilter, 500); + const { subscription } = useSubscription(); const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } = useAdminGetUsers({ limit: 20, @@ -83,7 +85,13 @@ const UserPanelTable = ({ variant="plain" ariaLabel="update" isDisabled={userId === id} - onClick={() => handlePopUpOpen("removeUser", { username, id })} + onClick={() => { + if (!subscription?.adminUserDeletion) { + handlePopUpOpen("upgradePlan"); + return; + } + handlePopUpOpen("removeUser", { username, id }); + }} > @@ -117,7 +125,8 @@ const UserPanelTable = ({ export const UserPanel = () => { const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ - "removeUser" + "removeUser", + "upgradePlan" ] as const); const { mutateAsync: deleteUser } = useAdminDeleteUser(); @@ -156,6 +165,11 @@ export const UserPanel = () => { onChange={(isOpen) => handlePopUpToggle("removeUser", isOpen)} onDeleteApproved={handleRemoveUser} /> + handlePopUpToggle("upgradePlan", isOpen)} + text="You can delete users via Admin UI if you switch to Infisical's Pro plan." + /> ); }; From 9832915eba4320b2f9ab508e159cc710258c2128 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Tue, 9 Jul 2024 21:09:55 -0400 Subject: [PATCH 2/4] add .? incase adminUserDeletion is empty --- backend/src/services/super-admin/super-admin-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/services/super-admin/super-admin-service.ts b/backend/src/services/super-admin/super-admin-service.ts index 73eaeda42..94775e89d 100644 --- a/backend/src/services/super-admin/super-admin-service.ts +++ b/backend/src/services/super-admin/super-admin-service.ts @@ -222,7 +222,7 @@ export const superAdminServiceFactory = ({ }; const deleteUser = async (userId: string) => { - if (!licenseService.onPremFeatures.adminUserDeletion) { + if (!licenseService.onPremFeatures?.adminUserDeletion) { throw new BadRequestError({ message: "Failed to delete user due to plan restriction. Upgrade to Infisical's Pro plan." }); From c501c85eb8bcd07b2603c9e05d8eece320745780 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Thu, 11 Jul 2024 00:14:34 +0800 Subject: [PATCH 3/4] misc: renamed to more generic label --- backend/src/ee/services/license/licence-fns.ts | 2 +- backend/src/ee/services/license/license-types.ts | 2 +- backend/src/services/super-admin/super-admin-service.ts | 2 +- frontend/src/hooks/api/subscriptions/types.ts | 2 +- frontend/src/views/admin/DashboardPage/UserPanel.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/ee/services/license/licence-fns.ts b/backend/src/ee/services/license/licence-fns.ts index f016ea6ab..3e30276cb 100644 --- a/backend/src/ee/services/license/licence-fns.ts +++ b/backend/src/ee/services/license/licence-fns.ts @@ -39,7 +39,7 @@ export const getDefaultOnPremFeatures = (): TFeatureSet => ({ secretApproval: false, secretRotation: true, caCrl: false, - adminUserDeletion: false + instanceUserManagement: false }); export const setupLicenceRequestWithStore = (baseURL: string, refreshUrl: string, licenseKey: string) => { diff --git a/backend/src/ee/services/license/license-types.ts b/backend/src/ee/services/license/license-types.ts index 4b6c1b450..72ea25e91 100644 --- a/backend/src/ee/services/license/license-types.ts +++ b/backend/src/ee/services/license/license-types.ts @@ -56,7 +56,7 @@ export type TFeatureSet = { secretApproval: false; secretRotation: true; caCrl: false; - adminUserDeletion: false; + instanceUserManagement: false; }; export type TOrgPlansTableDTO = { diff --git a/backend/src/services/super-admin/super-admin-service.ts b/backend/src/services/super-admin/super-admin-service.ts index 94775e89d..e7798500f 100644 --- a/backend/src/services/super-admin/super-admin-service.ts +++ b/backend/src/services/super-admin/super-admin-service.ts @@ -222,7 +222,7 @@ export const superAdminServiceFactory = ({ }; const deleteUser = async (userId: string) => { - if (!licenseService.onPremFeatures?.adminUserDeletion) { + if (!licenseService.onPremFeatures?.instanceUserManagement) { throw new BadRequestError({ message: "Failed to delete user due to plan restriction. Upgrade to Infisical's Pro plan." }); diff --git a/frontend/src/hooks/api/subscriptions/types.ts b/frontend/src/hooks/api/subscriptions/types.ts index d5e5f80e6..6a8b053b4 100644 --- a/frontend/src/hooks/api/subscriptions/types.ts +++ b/frontend/src/hooks/api/subscriptions/types.ts @@ -39,5 +39,5 @@ export type SubscriptionPlan = { trial_end: number | null; has_used_trial: boolean; caCrl: boolean; - adminUserDeletion: boolean; + instanceUserManagement: boolean; }; diff --git a/frontend/src/views/admin/DashboardPage/UserPanel.tsx b/frontend/src/views/admin/DashboardPage/UserPanel.tsx index 6db9222ef..5814d3673 100644 --- a/frontend/src/views/admin/DashboardPage/UserPanel.tsx +++ b/frontend/src/views/admin/DashboardPage/UserPanel.tsx @@ -86,7 +86,7 @@ const UserPanelTable = ({ ariaLabel="update" isDisabled={userId === id} onClick={() => { - if (!subscription?.adminUserDeletion) { + if (!subscription?.instanceUserManagement) { handlePopUpOpen("upgradePlan"); return; } From e439f4e5aa8623f7da9483433f72cbd9af3b108c Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Thu, 11 Jul 2024 13:25:48 -0400 Subject: [PATCH 4/4] Update UserPanel.tsx --- frontend/src/views/admin/DashboardPage/UserPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/admin/DashboardPage/UserPanel.tsx b/frontend/src/views/admin/DashboardPage/UserPanel.tsx index 5814d3673..2475ef14b 100644 --- a/frontend/src/views/admin/DashboardPage/UserPanel.tsx +++ b/frontend/src/views/admin/DashboardPage/UserPanel.tsx @@ -168,7 +168,7 @@ export const UserPanel = () => { handlePopUpToggle("upgradePlan", isOpen)} - text="You can delete users via Admin UI if you switch to Infisical's Pro plan." + text="Deleting users via Admin UI is only available on Infisical's Pro plan and above." /> );