Merge pull request #2091 from Infisical/misc/moved-admin-user-deletion-to-pro

misc: moved admin user deletion to pro plan
This commit is contained in:
Maidul Islam
2024-07-11 13:28:33 -04:00
committed by GitHub
6 changed files with 36 additions and 9 deletions
@@ -38,7 +38,8 @@ export const getDefaultOnPremFeatures = (): TFeatureSet => ({
has_used_trial: true, has_used_trial: true,
secretApproval: false, secretApproval: false,
secretRotation: true, secretRotation: true,
caCrl: false caCrl: false,
instanceUserManagement: false
}); });
export const setupLicenceRequestWithStore = (baseURL: string, refreshUrl: string, licenseKey: string) => { export const setupLicenceRequestWithStore = (baseURL: string, refreshUrl: string, licenseKey: string) => {
@@ -56,6 +56,7 @@ export type TFeatureSet = {
secretApproval: false; secretApproval: false;
secretRotation: true; secretRotation: true;
caCrl: false; caCrl: false;
instanceUserManagement: false;
}; };
export type TOrgPlansTableDTO = { export type TOrgPlansTableDTO = {
+2 -1
View File
@@ -469,7 +469,8 @@ export const registerRoutes = async (
authService: loginService, authService: loginService,
serverCfgDAL: superAdminDAL, serverCfgDAL: superAdminDAL,
orgService, orgService,
keyStore keyStore,
licenseService
}); });
const rateLimitService = rateLimitServiceFactory({ const rateLimitService = rateLimitServiceFactory({
rateLimitDAL, rateLimitDAL,
@@ -1,6 +1,7 @@
import bcrypt from "bcrypt"; import bcrypt from "bcrypt";
import { TSuperAdmin, TSuperAdminUpdate } from "@app/db/schemas"; import { TSuperAdmin, TSuperAdminUpdate } from "@app/db/schemas";
import { TLicenseServiceFactory } from "@app/ee/services/license/license-service";
import { TKeyStoreFactory } from "@app/keystore/keystore"; import { TKeyStoreFactory } from "@app/keystore/keystore";
import { getConfig } from "@app/lib/config/env"; import { getConfig } from "@app/lib/config/env";
import { infisicalSymmetricEncypt } from "@app/lib/crypto/encryption"; import { infisicalSymmetricEncypt } from "@app/lib/crypto/encryption";
@@ -20,6 +21,7 @@ type TSuperAdminServiceFactoryDep = {
authService: Pick<TAuthLoginFactory, "generateUserTokens">; authService: Pick<TAuthLoginFactory, "generateUserTokens">;
orgService: Pick<TOrgServiceFactory, "createOrganization">; orgService: Pick<TOrgServiceFactory, "createOrganization">;
keyStore: Pick<TKeyStoreFactory, "getItem" | "setItemWithExpiry" | "deleteItem">; keyStore: Pick<TKeyStoreFactory, "getItem" | "setItemWithExpiry" | "deleteItem">;
licenseService: Pick<TLicenseServiceFactory, "onPremFeatures">;
}; };
export type TSuperAdminServiceFactory = ReturnType<typeof superAdminServiceFactory>; export type TSuperAdminServiceFactory = ReturnType<typeof superAdminServiceFactory>;
@@ -36,7 +38,8 @@ export const superAdminServiceFactory = ({
userDAL, userDAL,
authService, authService,
orgService, orgService,
keyStore keyStore,
licenseService
}: TSuperAdminServiceFactoryDep) => { }: TSuperAdminServiceFactoryDep) => {
const initServerCfg = async () => { const initServerCfg = async () => {
// TODO(akhilmhdh): bad pattern time less change this later to me itself // TODO(akhilmhdh): bad pattern time less change this later to me itself
@@ -219,6 +222,12 @@ export const superAdminServiceFactory = ({
}; };
const deleteUser = async (userId: string) => { const deleteUser = async (userId: string) => {
if (!licenseService.onPremFeatures?.instanceUserManagement) {
throw new BadRequestError({
message: "Failed to delete user due to plan restriction. Upgrade to Infisical's Pro plan."
});
}
const user = await userDAL.deleteById(userId); const user = await userDAL.deleteById(userId);
return user; return user;
}; };
@@ -39,4 +39,5 @@ export type SubscriptionPlan = {
trial_end: number | null; trial_end: number | null;
has_used_trial: boolean; has_used_trial: boolean;
caCrl: boolean; caCrl: boolean;
instanceUserManagement: boolean;
}; };
@@ -16,9 +16,10 @@ import {
Td, Td,
Th, Th,
THead, THead,
Tr Tr,
UpgradePlanModal
} from "@app/components/v2"; } from "@app/components/v2";
import { useUser } from "@app/context"; import { useSubscription, useUser } from "@app/context";
import { useDebounce, usePopUp } from "@app/hooks"; import { useDebounce, usePopUp } from "@app/hooks";
import { useAdminDeleteUser, useAdminGetUsers } from "@app/hooks/api"; import { useAdminDeleteUser, useAdminGetUsers } from "@app/hooks/api";
import { UsePopUpState } from "@app/hooks/usePopUp"; import { UsePopUpState } from "@app/hooks/usePopUp";
@@ -27,8 +28,8 @@ const UserPanelTable = ({
handlePopUpOpen handlePopUpOpen
}: { }: {
handlePopUpOpen: ( handlePopUpOpen: (
popUpName: keyof UsePopUpState<["removeUser"]>, popUpName: keyof UsePopUpState<["removeUser", "upgradePlan"]>,
data: { data?: {
username: string; username: string;
id: string; id: string;
} }
@@ -38,6 +39,7 @@ const UserPanelTable = ({
const { user } = useUser(); const { user } = useUser();
const userId = user?.id || ""; const userId = user?.id || "";
const debounedSearchTerm = useDebounce(searchUserFilter, 500); const debounedSearchTerm = useDebounce(searchUserFilter, 500);
const { subscription } = useSubscription();
const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } = useAdminGetUsers({ const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } = useAdminGetUsers({
limit: 20, limit: 20,
@@ -83,7 +85,13 @@ const UserPanelTable = ({
variant="plain" variant="plain"
ariaLabel="update" ariaLabel="update"
isDisabled={userId === id} isDisabled={userId === id}
onClick={() => handlePopUpOpen("removeUser", { username, id })} onClick={() => {
if (!subscription?.instanceUserManagement) {
handlePopUpOpen("upgradePlan");
return;
}
handlePopUpOpen("removeUser", { username, id });
}}
> >
<FontAwesomeIcon icon={faXmark} /> <FontAwesomeIcon icon={faXmark} />
</IconButton> </IconButton>
@@ -117,7 +125,8 @@ const UserPanelTable = ({
export const UserPanel = () => { export const UserPanel = () => {
const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([
"removeUser" "removeUser",
"upgradePlan"
] as const); ] as const);
const { mutateAsync: deleteUser } = useAdminDeleteUser(); const { mutateAsync: deleteUser } = useAdminDeleteUser();
@@ -156,6 +165,11 @@ export const UserPanel = () => {
onChange={(isOpen) => handlePopUpToggle("removeUser", isOpen)} onChange={(isOpen) => handlePopUpToggle("removeUser", isOpen)}
onDeleteApproved={handleRemoveUser} onDeleteApproved={handleRemoveUser}
/> />
<UpgradePlanModal
isOpen={popUp.upgradePlan.isOpen}
onOpenChange={(isOpen) => handlePopUpToggle("upgradePlan", isOpen)}
text="Deleting users via Admin UI is only available on Infisical's Pro plan and above."
/>
</div> </div>
); );
}; };