From 8a5f59cb9ffc014437777ce6ce5273050c8839fb Mon Sep 17 00:00:00 2001 From: Pallavi Kumari Date: Sat, 8 Nov 2025 01:38:47 +0530 Subject: [PATCH] disable re-key button for non licensed --- messages/en-US.json | 3 +- .../[remoteExitNodeId]/credentials/page.tsx | 40 +++++++++++++++-- .../clients/[clientId]/credentials/page.tsx | 41 ++++++++++++++--- .../sites/[niceId]/credentials/page.tsx | 45 +++++++++++++++---- 4 files changed, 111 insertions(+), 18 deletions(-) diff --git a/messages/en-US.json b/messages/en-US.json index dc4b429a..c9d55062 100644 --- a/messages/en-US.json +++ b/messages/en-US.json @@ -2112,5 +2112,6 @@ "regenerateCredentialsConfirmation": "Are you sure you want to regenerate the credentials?", "endpoint": "Endpoint", "id": "Id", - "SecretKey": "Secret Key" + "SecretKey": "Secret Key", + "featureDisabledTooltip": "This feature is only available in the enterprise plan and require a license to use it." } diff --git a/src/app/[orgId]/settings/(private)/remote-exit-nodes/[remoteExitNodeId]/credentials/page.tsx b/src/app/[orgId]/settings/(private)/remote-exit-nodes/[remoteExitNodeId]/credentials/page.tsx index b605ad35..0fcdcbbb 100644 --- a/src/app/[orgId]/settings/(private)/remote-exit-nodes/[remoteExitNodeId]/credentials/page.tsx +++ b/src/app/[orgId]/settings/(private)/remote-exit-nodes/[remoteExitNodeId]/credentials/page.tsx @@ -22,6 +22,10 @@ import { } from "@server/routers/remoteExitNode/types"; import { useRemoteExitNodeContext } from "@app/hooks/useRemoteExitNodeContext"; import RegenerateCredentialsModal from "@app/components/RegenerateCredentialsModal"; +import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; +import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; +import { build } from "@server/build"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@app/components/ui/tooltip"; export default function CredentialsPage() { const { env } = useEnvContext(); @@ -34,8 +38,19 @@ export default function CredentialsPage() { const [modalOpen, setModalOpen] = useState(false); const [credentials, setCredentials] = useState(null); + const { licenseStatus, isUnlocked } = useLicenseStatusContext(); + const subscription = useSubscriptionStatusContext(); + + const isSecurityFeatureDisabled = () => { + const isEnterpriseNotLicensed = build === "enterprise" && !isUnlocked(); + const isSaasNotSubscribed = + build === "saas" && !subscription?.isSubscribed(); + return isEnterpriseNotLicensed || isSaasNotSubscribed; + }; + + const handleConfirmRegenerate = async () => { - + const response = await api.get>( `/org/${orgId}/pick-remote-exit-node-defaults` ); @@ -82,9 +97,26 @@ export default function CredentialsPage() { - + + + +
+ +
+
+ + {isSecurityFeatureDisabled() && ( + + {t("featureDisabledTooltip")} + + )} +
+
diff --git a/src/app/[orgId]/settings/clients/[clientId]/credentials/page.tsx b/src/app/[orgId]/settings/clients/[clientId]/credentials/page.tsx index e4a67544..024c539a 100644 --- a/src/app/[orgId]/settings/clients/[clientId]/credentials/page.tsx +++ b/src/app/[orgId]/settings/clients/[clientId]/credentials/page.tsx @@ -18,6 +18,10 @@ import { useTranslations } from "next-intl"; import { PickClientDefaultsResponse } from "@server/routers/client"; import { useClientContext } from "@app/hooks/useClientContext"; import RegenerateCredentialsModal from "@app/components/RegenerateCredentialsModal"; +import { build } from "@server/build"; +import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; +import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@app/components/ui/tooltip"; export default function CredentialsPage() { const { env } = useEnvContext(); @@ -26,12 +30,23 @@ export default function CredentialsPage() { const router = useRouter(); const t = useTranslations(); const { client } = useClientContext(); - + const [modalOpen, setModalOpen] = useState(false); const [clientDefaults, setClientDefaults] = useState(null); + const { licenseStatus, isUnlocked } = useLicenseStatusContext(); + const subscription = useSubscriptionStatusContext(); + + const isSecurityFeatureDisabled = () => { + const isEnterpriseNotLicensed = build === "enterprise" && !isUnlocked(); + const isSaasNotSubscribed = + build === "saas" && !subscription?.isSubscribed(); + return isEnterpriseNotLicensed || isSaasNotSubscribed; + }; + + const handleConfirmRegenerate = async () => { - + const res = await api.get(`/org/${orgId}/pick-client-defaults`); if (res && res.status === 200) { const data = res.data.data; @@ -74,9 +89,25 @@ export default function CredentialsPage() { - + + + +
+ +
+
+ + {isSecurityFeatureDisabled() && ( + + {t("featureDisabledTooltip")} + + )} +
+
diff --git a/src/app/[orgId]/settings/sites/[niceId]/credentials/page.tsx b/src/app/[orgId]/settings/sites/[niceId]/credentials/page.tsx index 3942ef83..8351c730 100644 --- a/src/app/[orgId]/settings/sites/[niceId]/credentials/page.tsx +++ b/src/app/[orgId]/settings/sites/[niceId]/credentials/page.tsx @@ -19,6 +19,10 @@ import { PickSiteDefaultsResponse } from "@server/routers/site"; import { useSiteContext } from "@app/hooks/useSiteContext"; import { generateKeypair } from "../wireguardConfig"; import RegenerateCredentialsModal from "@app/components/RegenerateCredentialsModal"; +import { useLicenseStatusContext } from "@app/hooks/useLicenseStatusContext"; +import { useSubscriptionStatusContext } from "@app/hooks/useSubscriptionStatusContext"; +import { build } from "@server/build"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@app/components/ui/tooltip"; export default function CredentialsPage() { const { env } = useEnvContext(); @@ -27,12 +31,23 @@ export default function CredentialsPage() { const router = useRouter(); const t = useTranslations(); const { site } = useSiteContext(); - + const [modalOpen, setModalOpen] = useState(false); const [siteDefaults, setSiteDefaults] = useState(null); const [wgConfig, setWgConfig] = useState(""); const [publicKey, setPublicKey] = useState(""); + const { licenseStatus, isUnlocked } = useLicenseStatusContext(); + const subscription = useSubscriptionStatusContext(); + + const isSecurityFeatureDisabled = () => { + const isEnterpriseNotLicensed = build === "enterprise" && !isUnlocked(); + const isSaasNotSubscribed = + build === "saas" && !subscription?.isSubscribed(); + return isEnterpriseNotLicensed || isSaasNotSubscribed; + }; + + const hydrateWireGuardConfig = ( privateKey: string, publicKey: string, @@ -113,7 +128,7 @@ PersistentKeepalive = 5`; const getCredentialType = () => { if (site?.type === "wireguard") return "site-wireguard"; if (site?.type === "newt") return "site-newt"; - return "site-newt"; + return "site-newt"; }; const getCredentials = () => { @@ -142,12 +157,26 @@ PersistentKeepalive = 5`; - + + + +
+ +
+
+ + {isSecurityFeatureDisabled() && ( + + {t("featureDisabledTooltip")} + + )} +
+