diff --git a/frontend/src/const/routes.ts b/frontend/src/const/routes.ts index 221917b94..a7b6d1375 100644 --- a/frontend/src/const/routes.ts +++ b/frontend/src/const/routes.ts @@ -101,6 +101,10 @@ export const ROUTE_PATHS = Object.freeze({ "/secret-manager/$projectId/integrations/azure-devops/create", "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/create" ), + AzureKeyVaultAuthorizePage: setRoute( + "/secret-manager/$projectId/integrations/azure-key-vault/authorize", + "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize" + ), AzureKeyVaultOauthCallbackPage: setRoute( "/secret-manager/$projectId/integrations/azure-key-vault/oauth2/callback", "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback" diff --git a/frontend/src/pages/secret-manager/IntegrationsListPage/IntegrationsListPage.utils.tsx b/frontend/src/pages/secret-manager/IntegrationsListPage/IntegrationsListPage.utils.tsx index 439ada69d..040274b16 100644 --- a/frontend/src/pages/secret-manager/IntegrationsListPage/IntegrationsListPage.utils.tsx +++ b/frontend/src/pages/secret-manager/IntegrationsListPage/IntegrationsListPage.utils.tsx @@ -80,8 +80,16 @@ export const redirectForProviderAuth = ( createIntegrationMissingEnvVarsNotification(integrationOption.slug); return; } - const link = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${integrationOption.clientId}&response_type=code&redirect_uri=${window.location.origin}/integrations/azure-key-vault/oauth2/callback&response_mode=query&scope=https://vault.azure.net/.default openid offline_access&state=${state}`; - window.location.assign(link); + navigate({ + to: "/secret-manager/$projectId/integrations/azure-key-vault/authorize", + params: { + projectId + }, + search: { + clientId: integrationOption.clientId, + state, + } + }); break; } case "azure-app-configuration": { diff --git a/frontend/src/pages/secret-manager/integrations/AzureKeyVaultAuthorizePage/AzureKeyVaultAuthorizePage.tsx b/frontend/src/pages/secret-manager/integrations/AzureKeyVaultAuthorizePage/AzureKeyVaultAuthorizePage.tsx new file mode 100644 index 000000000..419aa30bf --- /dev/null +++ b/frontend/src/pages/secret-manager/integrations/AzureKeyVaultAuthorizePage/AzureKeyVaultAuthorizePage.tsx @@ -0,0 +1,97 @@ +import { Controller, useForm } from "react-hook-form"; + +import { faArrowUpRightFromSquare, faBookOpen } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { zodResolver } from "@hookform/resolvers/zod"; +import z from "zod"; + +import { Button, Card, CardTitle, FormControl, Input } from "@app/components/v2"; +import { Helmet } from "react-helmet"; +import { useSearch } from "@tanstack/react-router"; +import { ROUTE_PATHS } from "@app/const/routes"; + +const schema = z.object({ + tenantId: z.string().trim().optional() +}); + +type FormData = z.infer; + +export function AzureKeyVaultAuthorizePage() { + const { state, clientId } = useSearch({ + from: ROUTE_PATHS.SecretManager.Integratons.AzureKeyVaultAuthorizePage.id, + }); + + const { control, handleSubmit } = useForm({ + resolver: zodResolver(schema) + }); + + const onFormSubmit = async ({ tenantId }: FormData) => { + const link = `https://login.microsoftonline.com/${ + tenantId ?? "common" + }/oauth2/v2.0/authorize?client_id=${clientId}&response_type=code&redirect_uri=${ + window.location.origin + }/integrations/azure-key-vault/oauth2/callback&response_mode=query&scope=https://vault.azure.net/.default openid offline_access&state=${state}`; + + window.location.assign(link); + }; + + return ( +
+ + Authorize Azure Key Vault Integration + + + + +
+
+ Github logo +
+ Azure Key Vault Integration + +
+ + Docs + +
+
+
+
+
+ ( + + + + )} + /> + + +
+
+ ); +} diff --git a/frontend/src/pages/secret-manager/integrations/AzureKeyVaultAuthorizePage/route.tsx b/frontend/src/pages/secret-manager/integrations/AzureKeyVaultAuthorizePage/route.tsx new file mode 100644 index 000000000..cb8c47764 --- /dev/null +++ b/frontend/src/pages/secret-manager/integrations/AzureKeyVaultAuthorizePage/route.tsx @@ -0,0 +1,17 @@ +import { createFileRoute } from "@tanstack/react-router"; +import z from 'zod' + +import { AzureKeyVaultAuthorizePage } from "./AzureKeyVaultAuthorizePage"; + + +const PageQueryParamsSchema = z.object({ + state: z.string(), + clientId: z.string().optional(), +}); + +export const Route = createFileRoute( + "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize" +)({ + component: AzureKeyVaultAuthorizePage, + validateSearch: PageQueryParamsSchema +}); diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index 3c507a555..7548b3883 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -159,6 +159,7 @@ import { Route as secretManagerIntegrationsChecklyConfigurePageRouteImport } fro import { Route as secretManagerIntegrationsChecklyAuthorizePageRouteImport } from './pages/secret-manager/integrations/ChecklyAuthorizePage/route' import { Route as secretManagerIntegrationsBitbucketConfigurePageRouteImport } from './pages/secret-manager/integrations/BitbucketConfigurePage/route' import { Route as secretManagerIntegrationsAzureKeyVaultConfigurePageRouteImport } from './pages/secret-manager/integrations/AzureKeyVaultConfigurePage/route' +import { Route as secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteImport } from './pages/secret-manager/integrations/AzureKeyVaultAuthorizePage/route' import { Route as secretManagerIntegrationsAzureDevopsConfigurePageRouteImport } from './pages/secret-manager/integrations/AzureDevopsConfigurePage/route' import { Route as secretManagerIntegrationsAzureDevopsAuthorizePageRouteImport } from './pages/secret-manager/integrations/AzureDevopsAuthorizePage/route' import { Route as secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteImport } from './pages/secret-manager/integrations/AzureAppConfigurationConfigurePage/route' @@ -1352,6 +1353,14 @@ const secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute = AuthenticateInjectOrgDetailsSecretManagerProjectIdSecretManagerLayoutIntegrationsRoute, } as any) +const secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute = + secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteImport.update({ + id: '/azure-key-vault/authorize', + path: '/azure-key-vault/authorize', + getParentRoute: () => + AuthenticateInjectOrgDetailsSecretManagerProjectIdSecretManagerLayoutIntegrationsRoute, + } as any) + const secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute = secretManagerIntegrationsAzureDevopsConfigurePageRouteImport.update({ id: '/azure-devops/create', @@ -2251,6 +2260,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteImport parentRoute: typeof AuthenticateInjectOrgDetailsSecretManagerProjectIdSecretManagerLayoutIntegrationsImport } + '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize': { + id: '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize' + path: '/azure-key-vault/authorize' + fullPath: '/secret-manager/$projectId/integrations/azure-key-vault/authorize' + preLoaderRoute: typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteImport + parentRoute: typeof AuthenticateInjectOrgDetailsSecretManagerProjectIdSecretManagerLayoutIntegrationsImport + } '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/create': { id: '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/create' path: '/azure-key-vault/create' @@ -2944,6 +2960,7 @@ interface AuthenticateInjectOrgDetailsSecretManagerProjectIdSecretManagerLayoutI secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute: typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute + secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute: typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute: typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute secretManagerIntegrationsBitbucketConfigurePageRouteRoute: typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute secretManagerIntegrationsChecklyAuthorizePageRouteRoute: typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute @@ -3034,6 +3051,8 @@ const AuthenticateInjectOrgDetailsSecretManagerProjectIdSecretManagerLayoutInteg secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute, secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute: secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute, + secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute: + secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute, secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute: secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute, secretManagerIntegrationsBitbucketConfigurePageRouteRoute: @@ -3513,6 +3532,7 @@ export interface FileRoutesByFullPath { '/secret-manager/$projectId/integrations/azure-app-configuration/create': typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute '/secret-manager/$projectId/integrations/azure-devops/authorize': typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute '/secret-manager/$projectId/integrations/azure-devops/create': typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute + '/secret-manager/$projectId/integrations/azure-key-vault/authorize': typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute '/secret-manager/$projectId/integrations/azure-key-vault/create': typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute '/secret-manager/$projectId/integrations/bitbucket/create': typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute '/secret-manager/$projectId/integrations/checkly/authorize': typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute @@ -3676,6 +3696,7 @@ export interface FileRoutesByTo { '/secret-manager/$projectId/integrations/azure-app-configuration/create': typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute '/secret-manager/$projectId/integrations/azure-devops/authorize': typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute '/secret-manager/$projectId/integrations/azure-devops/create': typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute + '/secret-manager/$projectId/integrations/azure-key-vault/authorize': typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute '/secret-manager/$projectId/integrations/azure-key-vault/create': typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute '/secret-manager/$projectId/integrations/bitbucket/create': typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute '/secret-manager/$projectId/integrations/checkly/authorize': typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute @@ -3854,6 +3875,7 @@ export interface FileRoutesById { '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create': typeof secretManagerIntegrationsAzureAppConfigurationConfigurePageRouteRoute '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/authorize': typeof secretManagerIntegrationsAzureDevopsAuthorizePageRouteRoute '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/create': typeof secretManagerIntegrationsAzureDevopsConfigurePageRouteRoute + '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize': typeof secretManagerIntegrationsAzureKeyVaultAuthorizePageRouteRoute '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/create': typeof secretManagerIntegrationsAzureKeyVaultConfigurePageRouteRoute '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/bitbucket/create': typeof secretManagerIntegrationsBitbucketConfigurePageRouteRoute '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/checkly/authorize': typeof secretManagerIntegrationsChecklyAuthorizePageRouteRoute @@ -4024,6 +4046,7 @@ export interface FileRouteTypes { | '/secret-manager/$projectId/integrations/azure-app-configuration/create' | '/secret-manager/$projectId/integrations/azure-devops/authorize' | '/secret-manager/$projectId/integrations/azure-devops/create' + | '/secret-manager/$projectId/integrations/azure-key-vault/authorize' | '/secret-manager/$projectId/integrations/azure-key-vault/create' | '/secret-manager/$projectId/integrations/bitbucket/create' | '/secret-manager/$projectId/integrations/checkly/authorize' @@ -4186,6 +4209,7 @@ export interface FileRouteTypes { | '/secret-manager/$projectId/integrations/azure-app-configuration/create' | '/secret-manager/$projectId/integrations/azure-devops/authorize' | '/secret-manager/$projectId/integrations/azure-devops/create' + | '/secret-manager/$projectId/integrations/azure-key-vault/authorize' | '/secret-manager/$projectId/integrations/azure-key-vault/create' | '/secret-manager/$projectId/integrations/bitbucket/create' | '/secret-manager/$projectId/integrations/checkly/authorize' @@ -4362,6 +4386,7 @@ export interface FileRouteTypes { | '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create' | '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/authorize' | '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/create' + | '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize' | '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/create' | '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/bitbucket/create' | '/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/checkly/authorize' @@ -4925,6 +4950,7 @@ export const routeTree = rootRoute "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create", "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/authorize", "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/create", + "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize", "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/create", "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/bitbucket/create", "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/checkly/authorize", @@ -5105,6 +5131,10 @@ export const routeTree = rootRoute "filePath": "secret-manager/integrations/AzureDevopsConfigurePage/route.tsx", "parent": "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations" }, + "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize": { + "filePath": "secret-manager/integrations/AzureKeyVaultAuthorizePage/route.tsx", + "parent": "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations" + }, "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations/azure-key-vault/create": { "filePath": "secret-manager/integrations/AzureKeyVaultConfigurePage/route.tsx", "parent": "/_authenticate/_inject-org-details/secret-manager/$projectId/_secret-manager-layout/integrations" diff --git a/frontend/src/routes.ts b/frontend/src/routes.ts index 2dff3cc78..d8913ec66 100644 --- a/frontend/src/routes.ts +++ b/frontend/src/routes.ts @@ -75,6 +75,10 @@ const secretManagerRoutes = route("/secret-manager/$projectId", [ "/azure-devops/create", "secret-manager/integrations/AzureDevopsConfigurePage/route.tsx" ), + route( + "/azure-key-vault/authorize", + "secret-manager/integrations/AzureKeyVaultAuthorizePage/route.tsx" + ), route( "/azure-key-vault/oauth2/callback", "secret-manager/integrations/AzureKeyVaultOauthCallbackPage/route.tsx"