From 6d509d85f4b39ab0fb6db83406222c27a619eff9 Mon Sep 17 00:00:00 2001 From: x032205 Date: Thu, 22 May 2025 13:13:47 -0400 Subject: [PATCH] feat(app-connections): 1Password App Connection --- backend/src/lib/api-docs/constants.ts | 7 + .../1password-connection-router.ts | 60 +++++++ .../app-connection-router.ts | 10 +- .../routes/v1/app-connection-routers/index.ts | 4 +- .../1password/1password-connection-enums.ts | 3 + .../1password/1password-connection-fns.ts | 66 ++++++++ .../1password/1password-connection-schemas.ts | 64 ++++++++ .../1password/1password-connection-service.ts | 28 ++++ .../1password/1password-connection-types.ts | 35 ++++ .../app-connection/1password/index.ts | 4 + .../app-connection/app-connection-enums.ts | 3 +- .../app-connection/app-connection-fns.ts | 15 +- .../app-connection/app-connection-maps.ts | 3 +- .../app-connection/app-connection-service.ts | 8 +- .../app-connection/app-connection-types.ts | 14 +- .../public/images/integrations/1Password.png | Bin 0 -> 94400 bytes frontend/src/helpers/appConnections.ts | 5 +- .../api/appConnections/1password/index.ts | 2 + .../api/appConnections/1password/queries.tsx | 37 +++++ .../api/appConnections/1password/types.ts | 12 ++ .../src/hooks/api/appConnections/enums.ts | 3 +- .../types/1password-connection.ts | 14 ++ .../hooks/api/appConnections/types/index.ts | 6 +- .../1PasswordConnectionForm.tsx | 150 ++++++++++++++++++ .../AppConnectionForm/AppConnectionForm.tsx | 5 + 25 files changed, 543 insertions(+), 15 deletions(-) create mode 100644 backend/src/server/routes/v1/app-connection-routers/1password-connection-router.ts create mode 100644 backend/src/services/app-connection/1password/1password-connection-enums.ts create mode 100644 backend/src/services/app-connection/1password/1password-connection-fns.ts create mode 100644 backend/src/services/app-connection/1password/1password-connection-schemas.ts create mode 100644 backend/src/services/app-connection/1password/1password-connection-service.ts create mode 100644 backend/src/services/app-connection/1password/1password-connection-types.ts create mode 100644 backend/src/services/app-connection/1password/index.ts create mode 100644 frontend/public/images/integrations/1Password.png create mode 100644 frontend/src/hooks/api/appConnections/1password/index.ts create mode 100644 frontend/src/hooks/api/appConnections/1password/queries.tsx create mode 100644 frontend/src/hooks/api/appConnections/1password/types.ts create mode 100644 frontend/src/hooks/api/appConnections/types/1password-connection.ts create mode 100644 frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/1PasswordConnectionForm.tsx diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 1a30923d5..42207e621 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -2084,6 +2084,10 @@ export const AppConnections = { region: "The region identifier in Oracle Cloud Infrastructure where the vault is located.", fingerprint: "The fingerprint of the public key uploaded to the user's API keys.", privateKey: "The private key content in PEM format used to sign API requests." + }, + ONEPASS: { + instanceUrl: "The URL of the 1Password Connect Server instance to authenticate with.", + apiToken: "The API token used to access the 1Password Connect Server." } } }; @@ -2237,6 +2241,9 @@ export const SecretSyncs = { compartmentOcid: "The OCID (Oracle Cloud Identifier) of the compartment where the vault is located.", vaultOcid: "The OCID (Oracle Cloud Identifier) of the vault to sync secrets to.", keyOcid: "The OCID (Oracle Cloud Identifier) of the encryption key to use when creating secrets in the vault." + }, + ONEPASS: { + vaultId: "The ID of the 1Password vault to sync secrets to." } } }; diff --git a/backend/src/server/routes/v1/app-connection-routers/1password-connection-router.ts b/backend/src/server/routes/v1/app-connection-routers/1password-connection-router.ts new file mode 100644 index 000000000..1100776d3 --- /dev/null +++ b/backend/src/server/routes/v1/app-connection-routers/1password-connection-router.ts @@ -0,0 +1,60 @@ +import z from "zod"; + +import { readLimit } from "@app/server/config/rateLimiter"; +import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { + CreateOnePassConnectionSchema, + SanitizedOnePassConnectionSchema, + UpdateOnePassConnectionSchema +} from "@app/services/app-connection/1password"; +import { AppConnection } from "@app/services/app-connection/app-connection-enums"; +import { AuthMode } from "@app/services/auth/auth-type"; + +import { registerAppConnectionEndpoints } from "./app-connection-endpoints"; + +export const registerOnePassConnectionRouter = async (server: FastifyZodProvider) => { + registerAppConnectionEndpoints({ + app: AppConnection.OnePass, + server, + sanitizedResponseSchema: SanitizedOnePassConnectionSchema, + createSchema: CreateOnePassConnectionSchema, + updateSchema: UpdateOnePassConnectionSchema + }); + + // The following endpoints are for internal Infisical App use only and not part of the public API + server.route({ + method: "GET", + url: `/:connectionId/vaults`, + config: { + rateLimit: readLimit + }, + schema: { + params: z.object({ + connectionId: z.string().uuid() + }), + response: { + 200: z + .object({ + id: z.string(), + name: z.string(), + type: z.string(), + items: z.number(), + + attributeVersion: z.number(), + contentVersion: z.number(), + + // Corresponds to ISO8601 date string + createdAt: z.string(), + updatedAt: z.string() + }) + .array() + } + }, + onRequest: verifyAuth([AuthMode.JWT]), + handler: async (req) => { + const { connectionId } = req.params; + const vaults = await server.services.appConnection.onepass.listVaults(connectionId, req.permission); + return vaults; + } + }); +}; diff --git a/backend/src/server/routes/v1/app-connection-routers/app-connection-router.ts b/backend/src/server/routes/v1/app-connection-routers/app-connection-router.ts index b9ce3deb8..1d8430601 100644 --- a/backend/src/server/routes/v1/app-connection-routers/app-connection-router.ts +++ b/backend/src/server/routes/v1/app-connection-routers/app-connection-router.ts @@ -4,6 +4,10 @@ import { EventType } from "@app/ee/services/audit-log/audit-log-types"; import { ApiDocsTags } from "@app/lib/api-docs"; import { readLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { + OnePassConnectionListItemSchema, + SanitizedOnePassConnectionSchema +} from "@app/services/app-connection/1password"; import { Auth0ConnectionListItemSchema, SanitizedAuth0ConnectionSchema } from "@app/services/app-connection/auth0"; import { AwsConnectionListItemSchema, SanitizedAwsConnectionSchema } from "@app/services/app-connection/aws"; import { @@ -78,7 +82,8 @@ const SanitizedAppConnectionSchema = z.union([ ...SanitizedWindmillConnectionSchema.options, ...SanitizedLdapConnectionSchema.options, ...SanitizedTeamCityConnectionSchema.options, - ...SanitizedOCIConnectionSchema.options + ...SanitizedOCIConnectionSchema.options, + ...SanitizedOnePassConnectionSchema.options ]); const AppConnectionOptionsSchema = z.discriminatedUnion("app", [ @@ -100,7 +105,8 @@ const AppConnectionOptionsSchema = z.discriminatedUnion("app", [ WindmillConnectionListItemSchema, LdapConnectionListItemSchema, TeamCityConnectionListItemSchema, - OCIConnectionListItemSchema + OCIConnectionListItemSchema, + OnePassConnectionListItemSchema ]); export const registerAppConnectionRouter = async (server: FastifyZodProvider) => { diff --git a/backend/src/server/routes/v1/app-connection-routers/index.ts b/backend/src/server/routes/v1/app-connection-routers/index.ts index 6f6fa1991..b0ceac986 100644 --- a/backend/src/server/routes/v1/app-connection-routers/index.ts +++ b/backend/src/server/routes/v1/app-connection-routers/index.ts @@ -1,5 +1,6 @@ import { AppConnection } from "@app/services/app-connection/app-connection-enums"; +import { registerOnePassConnectionRouter } from "./1password-connection-router"; import { registerAuth0ConnectionRouter } from "./auth0-connection-router"; import { registerAwsConnectionRouter } from "./aws-connection-router"; import { registerAzureAppConfigurationConnectionRouter } from "./azure-app-configuration-connection-router"; @@ -42,5 +43,6 @@ export const APP_CONNECTION_REGISTER_ROUTER_MAP: Record { + const instanceUrl = removeTrailingSlash(config.credentials.instanceUrl); + + await blockLocalAndPrivateIpAddresses(instanceUrl); + + return instanceUrl; +}; + +export const getOnePassConnectionListItem = () => { + return { + name: "1Password" as const, + app: AppConnection.OnePass as const, + methods: Object.values(OnePassConnectionMethod) as [OnePassConnectionMethod.ApiToken] + }; +}; + +export const validateOnePassConnectionCredentials = async (config: TOnePassConnectionConfig) => { + const instanceUrl = await getOnePassInstanceUrl(config); + + const { apiToken } = config.credentials; + + try { + await request.get(`${instanceUrl}/v1/vaults`, { + headers: { + Authorization: `Bearer ${apiToken}`, + Accept: "application/json" + } + }); + } catch (error: unknown) { + if (error instanceof AxiosError) { + throw new BadRequestError({ + message: `Failed to validate credentials: ${error.message || "Unknown error"}` + }); + } + throw new BadRequestError({ + message: "Unable to validate connection: verify credentials" + }); + } + + return config.credentials; +}; + +export const listOnePassVaults = async (appConnection: TOnePassConnection) => { + const instanceUrl = await getOnePassInstanceUrl(appConnection); + const { apiToken } = appConnection.credentials; + + const resp = await request.get(`${instanceUrl}/v1/vaults`, { + headers: { + Authorization: `Bearer ${apiToken}`, + Accept: "application/json" + } + }); + + return resp.data; +}; diff --git a/backend/src/services/app-connection/1password/1password-connection-schemas.ts b/backend/src/services/app-connection/1password/1password-connection-schemas.ts new file mode 100644 index 000000000..da63dc32a --- /dev/null +++ b/backend/src/services/app-connection/1password/1password-connection-schemas.ts @@ -0,0 +1,64 @@ +import z from "zod"; + +import { AppConnections } from "@app/lib/api-docs"; +import { AppConnection } from "@app/services/app-connection/app-connection-enums"; +import { + BaseAppConnectionSchema, + GenericCreateAppConnectionFieldsSchema, + GenericUpdateAppConnectionFieldsSchema +} from "@app/services/app-connection/app-connection-schemas"; + +import { OnePassConnectionMethod } from "./1password-connection-enums"; + +export const OnePassConnectionAccessTokenCredentialsSchema = z.object({ + apiToken: z.string().trim().min(1, "API Token required").describe(AppConnections.CREDENTIALS.ONEPASS.apiToken), + instanceUrl: z + .string() + .trim() + .url("Invalid Connect Server instance URL") + .min(1, "Instance URL required") + .describe(AppConnections.CREDENTIALS.ONEPASS.instanceUrl) +}); + +const BaseOnePassConnectionSchema = BaseAppConnectionSchema.extend({ app: z.literal(AppConnection.OnePass) }); + +export const OnePassConnectionSchema = BaseOnePassConnectionSchema.extend({ + method: z.literal(OnePassConnectionMethod.ApiToken), + credentials: OnePassConnectionAccessTokenCredentialsSchema +}); + +export const SanitizedOnePassConnectionSchema = z.discriminatedUnion("method", [ + BaseOnePassConnectionSchema.extend({ + method: z.literal(OnePassConnectionMethod.ApiToken), + credentials: OnePassConnectionAccessTokenCredentialsSchema.pick({ + instanceUrl: true + }) + }) +]); + +export const ValidateOnePassConnectionCredentialsSchema = z.discriminatedUnion("method", [ + z.object({ + method: z.literal(OnePassConnectionMethod.ApiToken).describe(AppConnections.CREATE(AppConnection.OnePass).method), + credentials: OnePassConnectionAccessTokenCredentialsSchema.describe( + AppConnections.CREATE(AppConnection.OnePass).credentials + ) + }) +]); + +export const CreateOnePassConnectionSchema = ValidateOnePassConnectionCredentialsSchema.and( + GenericCreateAppConnectionFieldsSchema(AppConnection.OnePass) +); + +export const UpdateOnePassConnectionSchema = z + .object({ + credentials: OnePassConnectionAccessTokenCredentialsSchema.optional().describe( + AppConnections.UPDATE(AppConnection.OnePass).credentials + ) + }) + .and(GenericUpdateAppConnectionFieldsSchema(AppConnection.OnePass)); + +export const OnePassConnectionListItemSchema = z.object({ + name: z.literal("1Password"), + app: z.literal(AppConnection.OnePass), + methods: z.nativeEnum(OnePassConnectionMethod).array() +}); diff --git a/backend/src/services/app-connection/1password/1password-connection-service.ts b/backend/src/services/app-connection/1password/1password-connection-service.ts new file mode 100644 index 000000000..eae9484e9 --- /dev/null +++ b/backend/src/services/app-connection/1password/1password-connection-service.ts @@ -0,0 +1,28 @@ +import { OrgServiceActor } from "@app/lib/types"; + +import { AppConnection } from "../app-connection-enums"; +import { listOnePassVaults } from "./1password-connection-fns"; +import { TOnePassConnection } from "./1password-connection-types"; + +type TGetAppConnectionFunc = ( + app: AppConnection, + connectionId: string, + actor: OrgServiceActor +) => Promise; + +export const onePassConnectionService = (getAppConnection: TGetAppConnectionFunc) => { + const listVaults = async (connectionId: string, actor: OrgServiceActor) => { + const appConnection = await getAppConnection(AppConnection.OnePass, connectionId, actor); + + try { + const vaults = await listOnePassVaults(appConnection); + return vaults; + } catch (error) { + return []; + } + }; + + return { + listVaults + }; +}; diff --git a/backend/src/services/app-connection/1password/1password-connection-types.ts b/backend/src/services/app-connection/1password/1password-connection-types.ts new file mode 100644 index 000000000..99d6bf94a --- /dev/null +++ b/backend/src/services/app-connection/1password/1password-connection-types.ts @@ -0,0 +1,35 @@ +import z from "zod"; + +import { DiscriminativePick } from "@app/lib/types"; + +import { AppConnection } from "../app-connection-enums"; +import { + CreateOnePassConnectionSchema, + OnePassConnectionSchema, + ValidateOnePassConnectionCredentialsSchema +} from "./1password-connection-schemas"; + +export type TOnePassConnection = z.infer; + +export type TOnePassConnectionInput = z.infer & { + app: AppConnection.OnePass; +}; + +export type TValidateOnePassConnectionCredentialsSchema = typeof ValidateOnePassConnectionCredentialsSchema; + +export type TOnePassConnectionConfig = DiscriminativePick & { + orgId: string; +}; + +export type TOnePassVault = { + id: string; + name: string; + type: string; + items: number; + + attributeVersion: number; + contentVersion: number; + + createdAt: string; + updatedAt: string; +}; diff --git a/backend/src/services/app-connection/1password/index.ts b/backend/src/services/app-connection/1password/index.ts new file mode 100644 index 000000000..333cc347e --- /dev/null +++ b/backend/src/services/app-connection/1password/index.ts @@ -0,0 +1,4 @@ +export * from "./1password-connection-enums"; +export * from "./1password-connection-fns"; +export * from "./1password-connection-schemas"; +export * from "./1password-connection-types"; diff --git a/backend/src/services/app-connection/app-connection-enums.ts b/backend/src/services/app-connection/app-connection-enums.ts index 6e09f1293..8d7920d12 100644 --- a/backend/src/services/app-connection/app-connection-enums.ts +++ b/backend/src/services/app-connection/app-connection-enums.ts @@ -17,7 +17,8 @@ export enum AppConnection { HCVault = "hashicorp-vault", LDAP = "ldap", TeamCity = "teamcity", - OCI = "oci" + OCI = "oci", + OnePass = "1password" } export enum AWSRegion { diff --git a/backend/src/services/app-connection/app-connection-fns.ts b/backend/src/services/app-connection/app-connection-fns.ts index f6fd894a6..061f4a2f7 100644 --- a/backend/src/services/app-connection/app-connection-fns.ts +++ b/backend/src/services/app-connection/app-connection-fns.ts @@ -8,6 +8,11 @@ import { } from "@app/services/app-connection/shared/sql"; import { KmsDataKey } from "@app/services/kms/kms-types"; +import { + getOnePassConnectionListItem, + OnePassConnectionMethod, + validateOnePassConnectionCredentials +} from "./1password"; import { AppConnection } from "./app-connection-enums"; import { TAppConnectionServiceFactoryDep } from "./app-connection-service"; import { @@ -93,7 +98,8 @@ export const listAppConnectionOptions = () => { getHCVaultConnectionListItem(), getLdapConnectionListItem(), getTeamCityConnectionListItem(), - getOCIConnectionListItem() + getOCIConnectionListItem(), + getOnePassConnectionListItem() ].sort((a, b) => a.name.localeCompare(b.name)); }; @@ -163,7 +169,8 @@ export const validateAppConnectionCredentials = async ( [AppConnection.HCVault]: validateHCVaultConnectionCredentials as TAppConnectionCredentialsValidator, [AppConnection.LDAP]: validateLdapConnectionCredentials as TAppConnectionCredentialsValidator, [AppConnection.TeamCity]: validateTeamCityConnectionCredentials as TAppConnectionCredentialsValidator, - [AppConnection.OCI]: validateOCIConnectionCredentials as TAppConnectionCredentialsValidator + [AppConnection.OCI]: validateOCIConnectionCredentials as TAppConnectionCredentialsValidator, + [AppConnection.OnePass]: validateOnePassConnectionCredentials as TAppConnectionCredentialsValidator }; return VALIDATE_APP_CONNECTION_CREDENTIALS_MAP[appConnection.app](appConnection); @@ -192,6 +199,7 @@ export const getAppConnectionMethodName = (method: TAppConnection["method"]) => case HumanitecConnectionMethod.ApiToken: case TerraformCloudConnectionMethod.ApiToken: case VercelConnectionMethod.ApiToken: + case OnePassConnectionMethod.ApiToken: return "API Token"; case PostgresConnectionMethod.UsernameAndPassword: case MsSqlConnectionMethod.UsernameAndPassword: @@ -255,5 +263,6 @@ export const TRANSITION_CONNECTION_CREDENTIALS_TO_PLATFORM: Record< [AppConnection.HCVault]: platformManagedCredentialsNotSupported, [AppConnection.LDAP]: platformManagedCredentialsNotSupported, // we could support this in the future [AppConnection.TeamCity]: platformManagedCredentialsNotSupported, - [AppConnection.OCI]: platformManagedCredentialsNotSupported + [AppConnection.OCI]: platformManagedCredentialsNotSupported, + [AppConnection.OnePass]: platformManagedCredentialsNotSupported }; diff --git a/backend/src/services/app-connection/app-connection-maps.ts b/backend/src/services/app-connection/app-connection-maps.ts index c32336453..e48523480 100644 --- a/backend/src/services/app-connection/app-connection-maps.ts +++ b/backend/src/services/app-connection/app-connection-maps.ts @@ -19,5 +19,6 @@ export const APP_CONNECTION_NAME_MAP: Record = { [AppConnection.HCVault]: "Hashicorp Vault", [AppConnection.LDAP]: "LDAP", [AppConnection.TeamCity]: "TeamCity", - [AppConnection.OCI]: "OCI" + [AppConnection.OCI]: "OCI", + [AppConnection.OnePass]: "1Password" }; diff --git a/backend/src/services/app-connection/app-connection-service.ts b/backend/src/services/app-connection/app-connection-service.ts index 85b63138a..e9e9c28c0 100644 --- a/backend/src/services/app-connection/app-connection-service.ts +++ b/backend/src/services/app-connection/app-connection-service.ts @@ -17,6 +17,8 @@ import { import { auth0ConnectionService } from "@app/services/app-connection/auth0/auth0-connection-service"; import { TKmsServiceFactory } from "@app/services/kms/kms-service"; +import { ValidateOnePassConnectionCredentialsSchema } from "./1password"; +import { onePassConnectionService } from "./1password/1password-connection-service"; import { TAppConnectionDALFactory } from "./app-connection-dal"; import { AppConnection } from "./app-connection-enums"; import { APP_CONNECTION_NAME_MAP } from "./app-connection-maps"; @@ -88,7 +90,8 @@ const VALIDATE_APP_CONNECTION_CREDENTIALS_MAP: Record>>; @@ -158,6 +165,7 @@ export type TAppConnectionInput = { id: string } & ( | TLdapConnectionInput | TTeamCityConnectionInput | TOCIConnectionInput + | TOnePassConnectionInput ); export type TSqlConnectionInput = TPostgresConnectionInput | TMsSqlConnectionInput; @@ -189,7 +197,8 @@ export type TAppConnectionConfig = | THCVaultConnectionConfig | TLdapConnectionConfig | TTeamCityConnectionConfig - | TOCIConnectionConfig; + | TOCIConnectionConfig + | TOnePassConnectionConfig; export type TValidateAppConnectionCredentialsSchema = | TValidateAwsConnectionCredentialsSchema @@ -210,7 +219,8 @@ export type TValidateAppConnectionCredentialsSchema = | TValidateHCVaultConnectionCredentialsSchema | TValidateLdapConnectionCredentialsSchema | TValidateTeamCityConnectionCredentialsSchema - | TValidateOCIConnectionCredentialsSchema; + | TValidateOCIConnectionCredentialsSchema + | TValidateOnePassConnectionCredentialsSchema; export type TListAwsConnectionKmsKeys = { connectionId: string; diff --git a/frontend/public/images/integrations/1Password.png b/frontend/public/images/integrations/1Password.png new file mode 100644 index 0000000000000000000000000000000000000000..8518b41e665f3d11c5d023c8e0b26630c41574c5 GIT binary patch literal 94400 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 z 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 E2MjtJhX4Qo literal 0 HcmV?d00001 diff --git a/frontend/src/helpers/appConnections.ts b/frontend/src/helpers/appConnections.ts index 8caa13a5b..8a6f29b08 100644 --- a/frontend/src/helpers/appConnections.ts +++ b/frontend/src/helpers/appConnections.ts @@ -26,6 +26,7 @@ import { PostgresConnectionMethod, TAppConnection, TeamCityConnectionMethod, + OnePassConnectionMethod, TerraformCloudConnectionMethod, VercelConnectionMethod, WindmillConnectionMethod @@ -63,7 +64,8 @@ export const APP_CONNECTION_MAP: Record< [AppConnection.HCVault]: { name: "Hashicorp Vault", image: "Vault.png", size: 65 }, [AppConnection.LDAP]: { name: "LDAP", image: "LDAP.png", size: 65 }, [AppConnection.TeamCity]: { name: "TeamCity", image: "TeamCity.png" }, - [AppConnection.OCI]: { name: "OCI", image: "Oracle.png" } + [AppConnection.OCI]: { name: "OCI", image: "Oracle.png" }, + [AppConnection.OnePass]: { name: "1Password", image: "1Password.png" } }; export const getAppConnectionMethodDetails = (method: TAppConnection["method"]) => { @@ -89,6 +91,7 @@ export const getAppConnectionMethodDetails = (method: TAppConnection["method"]) case HumanitecConnectionMethod.ApiToken: case TerraformCloudConnectionMethod.ApiToken: case VercelConnectionMethod.ApiToken: + case OnePassConnectionMethod.ApiToken: return { name: "API Token", icon: faKey }; case PostgresConnectionMethod.UsernameAndPassword: case MsSqlConnectionMethod.UsernameAndPassword: diff --git a/frontend/src/hooks/api/appConnections/1password/index.ts b/frontend/src/hooks/api/appConnections/1password/index.ts new file mode 100644 index 000000000..2c1906d36 --- /dev/null +++ b/frontend/src/hooks/api/appConnections/1password/index.ts @@ -0,0 +1,2 @@ +export * from "./queries"; +export * from "./types"; diff --git a/frontend/src/hooks/api/appConnections/1password/queries.tsx b/frontend/src/hooks/api/appConnections/1password/queries.tsx new file mode 100644 index 000000000..f73562652 --- /dev/null +++ b/frontend/src/hooks/api/appConnections/1password/queries.tsx @@ -0,0 +1,37 @@ +import { useQuery, UseQueryOptions } from "@tanstack/react-query"; + +import { apiRequest } from "@app/config/request"; + +import { appConnectionKeys } from "../queries"; +import { TOnePassVault } from "./types"; + +const onePassConnectionKeys = { + all: [...appConnectionKeys.all, "1password"] as const, + listVaults: (connectionId: string) => + [...onePassConnectionKeys.all, "vaults", connectionId] as const +}; + +export const useOnePassConnectionListVaults = ( + connectionId: string, + options?: Omit< + UseQueryOptions< + TOnePassVault[], + unknown, + TOnePassVault[], + ReturnType + >, + "queryKey" | "queryFn" + > +) => { + return useQuery({ + queryKey: onePassConnectionKeys.listVaults(connectionId), + queryFn: async () => { + const { data } = await apiRequest.get( + `/api/v1/app-connections/1password/${connectionId}/vaults` + ); + + return data; + }, + ...options + }); +}; diff --git a/frontend/src/hooks/api/appConnections/1password/types.ts b/frontend/src/hooks/api/appConnections/1password/types.ts new file mode 100644 index 000000000..9386e9ddd --- /dev/null +++ b/frontend/src/hooks/api/appConnections/1password/types.ts @@ -0,0 +1,12 @@ +export type TOnePassVault = { + id: string; + name: string; + type: string; + items: number; + + attributeVersion: number; + contentVersion: number; + + createdAt: string; + updatedAt: string; +}; diff --git a/frontend/src/hooks/api/appConnections/enums.ts b/frontend/src/hooks/api/appConnections/enums.ts index 06a5056af..d099936d6 100644 --- a/frontend/src/hooks/api/appConnections/enums.ts +++ b/frontend/src/hooks/api/appConnections/enums.ts @@ -17,5 +17,6 @@ export enum AppConnection { HCVault = "hashicorp-vault", LDAP = "ldap", TeamCity = "teamcity", - OCI = "oci" + OCI = "oci", + OnePass = "1password" } diff --git a/frontend/src/hooks/api/appConnections/types/1password-connection.ts b/frontend/src/hooks/api/appConnections/types/1password-connection.ts new file mode 100644 index 000000000..fcf307a15 --- /dev/null +++ b/frontend/src/hooks/api/appConnections/types/1password-connection.ts @@ -0,0 +1,14 @@ +import { AppConnection } from "@app/hooks/api/appConnections/enums"; +import { TRootAppConnection } from "@app/hooks/api/appConnections/types/root-connection"; + +export enum OnePassConnectionMethod { + ApiToken = "api-token" +} + +export type TOnePassConnection = TRootAppConnection & { app: AppConnection.OnePass } & { + method: OnePassConnectionMethod.ApiToken; + credentials: { + apiToken: string; + instanceUrl: string; + }; +}; diff --git a/frontend/src/hooks/api/appConnections/types/index.ts b/frontend/src/hooks/api/appConnections/types/index.ts index 2b29c2cd4..a2b83ab71 100644 --- a/frontend/src/hooks/api/appConnections/types/index.ts +++ b/frontend/src/hooks/api/appConnections/types/index.ts @@ -1,5 +1,6 @@ import { AppConnection } from "../enums"; import { TAppConnectionOption } from "./app-options"; +import { TOnePassConnection } from "./1password-connection"; import { TAuth0Connection } from "./auth0-connection"; import { TAwsConnection } from "./aws-connection"; import { TAzureAppConfigurationConnection } from "./azure-app-configuration-connection"; @@ -20,6 +21,7 @@ import { TTerraformCloudConnection } from "./terraform-cloud-connection"; import { TVercelConnection } from "./vercel-connection"; import { TWindmillConnection } from "./windmill-connection"; +export * from "./1password-connection"; export * from "./auth0-connection"; export * from "./aws-connection"; export * from "./azure-app-configuration-connection"; @@ -59,7 +61,8 @@ export type TAppConnection = | THCVaultConnection | TLdapConnection | TTeamCityConnection - | TOCIConnection; + | TOCIConnection + | TOnePassConnection; export type TAvailableAppConnection = Pick; @@ -106,4 +109,5 @@ export type TAppConnectionMap = { [AppConnection.LDAP]: TLdapConnection; [AppConnection.TeamCity]: TTeamCityConnection; [AppConnection.OCI]: TOCIConnection; + [AppConnection.OnePass]: TOnePassConnection; }; diff --git a/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/1PasswordConnectionForm.tsx b/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/1PasswordConnectionForm.tsx new file mode 100644 index 000000000..1c266aeee --- /dev/null +++ b/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/1PasswordConnectionForm.tsx @@ -0,0 +1,150 @@ +import { Controller, FormProvider, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; + +import { + Button, + FormControl, + Input, + ModalClose, + SecretInput, + Select, + SelectItem +} from "@app/components/v2"; +import { APP_CONNECTION_MAP, getAppConnectionMethodDetails } from "@app/helpers/appConnections"; +import { OnePassConnectionMethod, TOnePassConnection } from "@app/hooks/api/appConnections"; +import { AppConnection } from "@app/hooks/api/appConnections/enums"; + +import { + genericAppConnectionFieldsSchema, + GenericAppConnectionsFields +} from "./GenericAppConnectionFields"; + +type Props = { + appConnection?: TOnePassConnection; + onSubmit: (formData: FormData) => void; +}; + +const rootSchema = genericAppConnectionFieldsSchema.extend({ + app: z.literal(AppConnection.OnePass) +}); + +const formSchema = z.discriminatedUnion("method", [ + rootSchema.extend({ + method: z.literal(OnePassConnectionMethod.ApiToken), + credentials: z.object({ + apiToken: z.string().trim().min(1, "API Token required"), + instanceUrl: z.string().trim().url("Invalid Connect Server instance URL") + }) + }) +]); + +type FormData = z.infer; + +export const OnePassConnectionForm = ({ appConnection, onSubmit }: Props) => { + const isUpdate = Boolean(appConnection); + + const form = useForm({ + resolver: zodResolver(formSchema), + defaultValues: appConnection ?? { + app: AppConnection.OnePass, + method: OnePassConnectionMethod.ApiToken + } + }); + + const { + handleSubmit, + control, + formState: { isSubmitting, isDirty } + } = form; + + return ( + +

+ {!isUpdate && } + ( + + + + )} + /> + ( + + + + )} + /> + ( + + onChange(e.target.value)} + /> + + )} + /> +
+ + + + +
+ + + ); +}; diff --git a/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/AppConnectionForm.tsx b/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/AppConnectionForm.tsx index 238dc4e04..550a36989 100644 --- a/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/AppConnectionForm.tsx +++ b/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/AppConnectionForm.tsx @@ -25,6 +25,7 @@ import { MsSqlConnectionForm } from "./MsSqlConnectionForm"; import { OCIConnectionForm } from "./OCIConnectionForm"; import { PostgresConnectionForm } from "./PostgresConnectionForm"; import { TeamCityConnectionForm } from "./TeamCityConnectionForm"; +import { OnePassConnectionForm } from "./1PasswordConnectionForm"; import { TerraformCloudConnectionForm } from "./TerraformCloudConnectionForm"; import { VercelConnectionForm } from "./VercelConnectionForm"; import { WindmillConnectionForm } from "./WindmillConnectionForm"; @@ -104,6 +105,8 @@ const CreateForm = ({ app, onComplete }: CreateFormProps) => { return ; case AppConnection.OCI: return ; + case AppConnection.OnePass: + return ; default: throw new Error(`Unhandled App ${app}`); } @@ -178,6 +181,8 @@ const UpdateForm = ({ appConnection, onComplete }: UpdateFormProps) => { return ; case AppConnection.OCI: return ; + case AppConnection.OnePass: + return ; default: throw new Error(`Unhandled App ${(appConnection as TAppConnection).app}`);