From 80a4f838a1846f594d6f66471236b2c2c2892cef Mon Sep 17 00:00:00 2001 From: = Date: Thu, 29 Aug 2024 13:17:20 +0530 Subject: [PATCH 1/6] feat: completed mongo atlas dynamic secret backend logic --- .../dynamic-secret/providers/index.ts | 4 +- .../dynamic-secret/providers/models.ts | 43 +++++- .../dynamic-secret/providers/mongo-atlas.ts | 146 ++++++++++++++++++ backend/src/lib/axios/digest-auth.ts | 57 +++++++ 4 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 backend/src/ee/services/dynamic-secret/providers/mongo-atlas.ts create mode 100644 backend/src/lib/axios/digest-auth.ts diff --git a/backend/src/ee/services/dynamic-secret/providers/index.ts b/backend/src/ee/services/dynamic-secret/providers/index.ts index 1ee020625..e64b26d80 100644 --- a/backend/src/ee/services/dynamic-secret/providers/index.ts +++ b/backend/src/ee/services/dynamic-secret/providers/index.ts @@ -3,6 +3,7 @@ import { AwsIamProvider } from "./aws-iam"; import { CassandraProvider } from "./cassandra"; import { DynamicSecretProviders } from "./models"; import { RedisDatabaseProvider } from "./redis"; +import { MongoAtlasProvider } from "./mongo-atlas"; import { SqlDatabaseProvider } from "./sql-database"; export const buildDynamicSecretProviders = () => ({ @@ -10,5 +11,6 @@ export const buildDynamicSecretProviders = () => ({ [DynamicSecretProviders.Cassandra]: CassandraProvider(), [DynamicSecretProviders.AwsIam]: AwsIamProvider(), [DynamicSecretProviders.Redis]: RedisDatabaseProvider(), - [DynamicSecretProviders.AwsElastiCache]: AwsElastiCacheDatabaseProvider() + [DynamicSecretProviders.AwsElastiCache]: AwsElastiCacheDatabaseProvider(), + [DynamicSecretProviders.MongoAtlas]: MongoAtlasProvider() }); diff --git a/backend/src/ee/services/dynamic-secret/providers/models.ts b/backend/src/ee/services/dynamic-secret/providers/models.ts index 60cab6f80..06bc6a9ed 100644 --- a/backend/src/ee/services/dynamic-secret/providers/models.ts +++ b/backend/src/ee/services/dynamic-secret/providers/models.ts @@ -67,12 +67,50 @@ export const DynamicSecretAwsIamSchema = z.object({ policyArns: z.string().trim().optional() }); +export const DynamicSecretMongoAtlasSchema = z.object({ + adminPublicKey: z.string().trim().min(1).describe("Admin user public api key"), + adminPrivateKey: z.string().trim().min(1).describe("Admin user private api key"), + groupId: z + .string() + .trim() + .min(1) + .describe("Unique 24-hexadecimal digit string that identifies your project. This is same as project id"), + roles: z + .object({ + collectionName: z.string().optional().describe("Collection on which this role applies."), + databaseName: z.string().min(1).describe("Database to which the user is granted access privileges."), + roleName: z + .string() + .min(1) + .describe( + ' Enum: "atlasAdmin" "backup" "clusterMonitor" "dbAdmin" "dbAdminAnyDatabase" "enableSharding" "read" "readAnyDatabase" "readWrite" "readWriteAnyDatabase" "".Human-readable label that identifies a group of privileges assigned to a database user. This value can either be a built-in role or a custom role.' + ) + }) + .array() + .min(1), + scopes: z + .object({ + name: z + .string() + .min(1) + .describe( + "Human-readable label that identifies the cluster or MongoDB Atlas Data Lake that this database user can access." + ), + type: z + .string() + .min(1) + .describe("Category of resource that this database user can access. Enum: CLUSTER, DATA_LAKE, STREAM") + }) + .array() +}); + export enum DynamicSecretProviders { SqlDatabase = "sql-database", Cassandra = "cassandra", AwsIam = "aws-iam", Redis = "redis", - AwsElastiCache = "aws-elasticache" + AwsElastiCache = "aws-elasticache", + MongoAtlas = "mongo-db-atlas" } export const DynamicSecretProviderSchema = z.discriminatedUnion("type", [ @@ -80,7 +118,8 @@ export const DynamicSecretProviderSchema = z.discriminatedUnion("type", [ z.object({ type: z.literal(DynamicSecretProviders.Cassandra), inputs: DynamicSecretCassandraSchema }), z.object({ type: z.literal(DynamicSecretProviders.AwsIam), inputs: DynamicSecretAwsIamSchema }), z.object({ type: z.literal(DynamicSecretProviders.Redis), inputs: DynamicSecretRedisDBSchema }), - z.object({ type: z.literal(DynamicSecretProviders.AwsElastiCache), inputs: DynamicSecretAwsElastiCacheSchema }) + z.object({ type: z.literal(DynamicSecretProviders.AwsElastiCache), inputs: DynamicSecretAwsElastiCacheSchema }), + z.object({ type: z.literal(DynamicSecretProviders.MongoAtlas), inputs: DynamicSecretMongoAtlasSchema }) ]); export type TDynamicProviderFns = { diff --git a/backend/src/ee/services/dynamic-secret/providers/mongo-atlas.ts b/backend/src/ee/services/dynamic-secret/providers/mongo-atlas.ts new file mode 100644 index 000000000..69f54ce77 --- /dev/null +++ b/backend/src/ee/services/dynamic-secret/providers/mongo-atlas.ts @@ -0,0 +1,146 @@ +import axios, { AxiosError } from "axios"; +import { customAlphabet } from "nanoid"; +import { z } from "zod"; + +import { createDigestAuthRequestInterceptor } from "@app/lib/axios/digest-auth"; +import { alphaNumericNanoId } from "@app/lib/nanoid"; + +import { DynamicSecretMongoAtlasSchema, TDynamicProviderFns } from "./models"; + +const generatePassword = (size = 48) => { + const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~!*$#"; + return customAlphabet(charset, 48)(size); +}; + +const generateUsername = () => { + return alphaNumericNanoId(32); +}; + +export const MongoAtlasProvider = (): TDynamicProviderFns => { + const validateProviderInputs = async (inputs: unknown) => { + const providerInputs = await DynamicSecretMongoAtlasSchema.parseAsync(inputs); + return providerInputs; + }; + + const getClient = async (providerInputs: z.infer) => { + const client = axios.create({ + baseURL: "https://cloud.mongodb.com/api/atlas", + headers: { + Accept: "application/vnd.atlas.2023-02-01+json", + "Content-Type": "application/json" + } + }); + const digestAuth = createDigestAuthRequestInterceptor( + client, + providerInputs.adminPublicKey, + providerInputs.adminPrivateKey + ); + return digestAuth; + }; + + const validateConnection = async (inputs: unknown) => { + const providerInputs = await validateProviderInputs(inputs); + const client = await getClient(providerInputs); + + const isConnected = await client({ + method: "GET", + url: `v2/groups/${providerInputs.groupId}/databaseUsers`, + params: { itemsPerPage: 1 } + }) + .then(() => true) + .catch((error) => { + if ((error as AxiosError).response) { + throw new Error(JSON.stringify((error as AxiosError).response?.data)); + } + throw error; + }); + return isConnected; + }; + + const create = async (inputs: unknown, expireAt: number) => { + const providerInputs = await validateProviderInputs(inputs); + const client = await getClient(providerInputs); + + const username = generateUsername(); + const password = generatePassword(); + const expiration = new Date(expireAt).toISOString(); + await client({ + method: "POST", + url: `/v2/groups/${providerInputs.groupId}/databaseUsers`, + data: { + roles: providerInputs.roles, + scopes: providerInputs.scopes, + deleteAfterDate: expiration, + username, + password, + databaseName: "admin", + groupId: providerInputs.groupId + } + }).catch((error) => { + if ((error as AxiosError).response) { + throw new Error(JSON.stringify((error as AxiosError).response?.data)); + } + throw error; + }); + return { entityId: username, data: { DB_USERNAME: username, DB_PASSWORD: password } }; + }; + + const revoke = async (inputs: unknown, entityId: string) => { + const providerInputs = await validateProviderInputs(inputs); + const client = await getClient(providerInputs); + + const username = entityId; + const isExisting = await client({ + method: "GET", + url: `/v2/groups/${providerInputs.groupId}/databaseUsers/admin/${username}` + }).catch((err) => { + if ((err as AxiosError).response?.status === 404) return false; + throw err; + }); + if (isExisting) { + await client({ + method: "DELETE", + url: `/v2/groups/${providerInputs.groupId}/databaseUsers/admin/${username}` + }).catch((error) => { + if ((error as AxiosError).response) { + throw new Error(JSON.stringify((error as AxiosError).response?.data)); + } + throw error; + }); + } + + return { entityId: username }; + }; + + const renew = async (inputs: unknown, entityId: string, expireAt: number) => { + const providerInputs = await validateProviderInputs(inputs); + const client = await getClient(providerInputs); + + const username = entityId; + const expiration = new Date(expireAt).toISOString(); + + await client({ + method: "PATCH", + url: `/v2/groups/${providerInputs.groupId}/databaseUsers/admin/${username}`, + data: { + deleteAfterDate: expiration, + databaseName: "admin", + groupId: providerInputs.groupId + } + }).catch((error) => { + if ((error as AxiosError).response) { + throw new Error(JSON.stringify((error as AxiosError).response?.data)); + } + throw error; + }); + return { entityId: username }; + }; + + return { + validateProviderInputs, + validateConnection, + create, + revoke, + renew + }; +}; diff --git a/backend/src/lib/axios/digest-auth.ts b/backend/src/lib/axios/digest-auth.ts new file mode 100644 index 000000000..ee9dbd79b --- /dev/null +++ b/backend/src/lib/axios/digest-auth.ts @@ -0,0 +1,57 @@ +import crypto from "node:crypto"; + +import { AxiosError, AxiosInstance, AxiosRequestConfig } from "axios"; + +export const createDigestAuthRequestInterceptor = ( + axiosInstance: AxiosInstance, + username: string, + password: string +) => { + let nc = 0; + + return async (opts: AxiosRequestConfig) => { + try { + return await axiosInstance.request(opts); + } catch (err) { + const error = err as AxiosError; + const authHeader = (error?.response?.headers?.["www-authenticate"] as string) || ""; + + if (error?.response?.status !== 401 || !authHeader?.includes("nonce")) { + return Promise.reject(error.message); + } + + if (!error.config) { + return Promise.reject(error); + } + + const authDetails = authHeader.split(",").map((el) => el.split("=")); + nc += 1; + const nonceCount = nc.toString(16).padStart(8, "0"); + const cnonce = crypto.randomBytes(24).toString("hex"); + const realm = authDetails.find((el) => el[0].toLowerCase().indexOf("realm") > -1)?.[1].replace(/"/g, ""); + const nonce = authDetails.find((el) => el[0].toLowerCase().indexOf("nonce") > -1)?.[1].replace(/"/g, ""); + const ha1 = crypto.createHash("md5").update(`${username}:${realm}:${password}`).digest("hex"); + const path = opts.url; + + const ha2 = crypto + .createHash("md5") + .update(`${opts.method ?? "GET"}:${path}`) + .digest("hex"); + + const response = crypto + .createHash("md5") + .update(`${ha1}:${nonce}:${nonceCount}:${cnonce}:auth:${ha2}`) + .digest("hex"); + const authorization = `Digest username="${username}",realm="${realm}",nonce="${nonce}",uri="${path}",qop="auth",algorithm="MD5",response="${response}",nc="${nonceCount}",cnonce="${cnonce}"`; + + if (opts.headers) { + // eslint-disable-next-line + opts.headers.authorization = authorization; + } else { + // eslint-disable-next-line + opts.headers = { authorization }; + } + return axiosInstance.request(opts); + } + }; +}; From 1bc0e3087aa69224b931b60b3e999f38a877b513 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 29 Aug 2024 13:19:43 +0530 Subject: [PATCH 2/6] feat: completed atlas dynamic secret logic for ui --- frontend/package-lock.json | 187 ++++--- frontend/package.json | 1 + .../components/v2/FormControl/FormControl.tsx | 26 +- frontend/src/hooks/api/dynamicSecret/types.ts | 20 +- .../CreateDynamicSecretForm.tsx | 37 +- .../MongoAtlasInputForm.tsx | 455 +++++++++++++++++ .../CreateDynamicSecretLease.tsx | 3 +- .../EditDynamicSecretForm.tsx | 18 + .../EditDynamicSecretMongoAtlasForm.tsx | 465 ++++++++++++++++++ 9 files changed, 1095 insertions(+), 117 deletions(-) create mode 100644 frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx create mode 100644 frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretMongoAtlasForm.tsx diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 74f00b74d..3148f5da2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -4,6 +4,7 @@ "requires": true, "packages": { "": { + "name": "frontend", "dependencies": { "@casl/ability": "^6.5.0", "@casl/react": "^3.1.0", @@ -84,6 +85,7 @@ "react-grid-layout": "^1.3.4", "react-hook-form": "^7.43.0", "react-i18next": "^12.2.2", + "react-icons": "^5.3.0", "react-mailchimp-subscribe": "^2.1.3", "react-markdown": "^8.0.3", "react-redux": "^8.0.2", @@ -8609,26 +8611,6 @@ "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", @@ -9298,9 +9280,9 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -9320,9 +9302,9 @@ "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { @@ -9343,15 +9325,15 @@ "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -9379,28 +9361,28 @@ "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -9408,24 +9390,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -9434,12 +9416,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -12933,9 +12915,9 @@ "integrity": "sha512-JGmudTwg7yxMYvR/gWbalqqQiyu7WTFv2Xu3vw4cJHXPFxNgAk0oy8UHaer8nLF4lZJa+rNoj6GsrKIVJTV6Tw==" }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -12998,9 +12980,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -15867,11 +15849,11 @@ } }, "node_modules/infisical-node/node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", + "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -18133,12 +18115,12 @@ ] }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -20968,6 +20950,14 @@ } } }, + "node_modules/react-icons": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", + "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -24479,9 +24469,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -24506,34 +24496,33 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -24666,9 +24655,9 @@ "dev": true }, "node_modules/webpack/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -24677,10 +24666,10 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/webpack/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" diff --git a/frontend/package.json b/frontend/package.json index 994485252..a538e7cf1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -92,6 +92,7 @@ "react-grid-layout": "^1.3.4", "react-hook-form": "^7.43.0", "react-i18next": "^12.2.2", + "react-icons": "^5.3.0", "react-mailchimp-subscribe": "^2.1.3", "react-markdown": "^8.0.3", "react-redux": "^8.0.2", diff --git a/frontend/src/components/v2/FormControl/FormControl.tsx b/frontend/src/components/v2/FormControl/FormControl.tsx index 9711e3e68..8594cfd73 100644 --- a/frontend/src/components/v2/FormControl/FormControl.tsx +++ b/frontend/src/components/v2/FormControl/FormControl.tsx @@ -9,36 +9,42 @@ import { Tooltip } from "../Tooltip"; export type FormLabelProps = { id?: string; isRequired?: boolean; - isOptional?:boolean; + isOptional?: boolean; label?: ReactNode; icon?: ReactNode; className?: string; tooltipText?: string; + tooltipClassName?: string; }; -export const FormLabel = ({ id, label, isRequired, icon, className,isOptional, tooltipText }: FormLabelProps) => ( +export const FormLabel = ({ + id, + label, + isRequired, + icon, + className, + isOptional, + tooltipText, + tooltipClassName +}: FormLabelProps) => ( {label} {isRequired && *} - {isOptional && - Optional} + {isOptional && - Optional} {icon && !tooltipText && ( {icon} )} {tooltipText && ( - - + + )} diff --git a/frontend/src/hooks/api/dynamicSecret/types.ts b/frontend/src/hooks/api/dynamicSecret/types.ts index ff881e506..7076ea929 100644 --- a/frontend/src/hooks/api/dynamicSecret/types.ts +++ b/frontend/src/hooks/api/dynamicSecret/types.ts @@ -20,7 +20,8 @@ export enum DynamicSecretProviders { Cassandra = "cassandra", AwsIam = "aws-iam", Redis = "redis", - AwsElastiCache = "aws-elasticache" + AwsElastiCache = "aws-elasticache", + MongoAtlas = "mongo-db-atlas" } export enum SqlProviders { @@ -96,6 +97,23 @@ export type TDynamicSecretProvider = creationStatement: string; revocationStatement: string; ca?: string | undefined; + } + } +|{ + type: DynamicSecretProviders.MongoAtlas; + inputs: { + adminPublicKey: string; + adminPrivateKey: string; + groupId: string; + roles: { + databaseName: string; + roleName: string; + collectionName?: string; + }[]; + scopes?: { + name: string; + type: string; + }[]; }; }; diff --git a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/CreateDynamicSecretForm.tsx b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/CreateDynamicSecretForm.tsx index b28a07116..21a50019b 100644 --- a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/CreateDynamicSecretForm.tsx +++ b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/CreateDynamicSecretForm.tsx @@ -1,4 +1,5 @@ import { useState } from "react"; +import { SiApachecassandra,SiMongodb } from "react-icons/si"; import { faAws } from "@fortawesome/free-brands-svg-icons"; import { faDatabase } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -11,6 +12,7 @@ import { AwsElastiCacheInputForm } from "./AwsElastiCacheInputForm"; import { AwsIamInputForm } from "./AwsIamInputForm"; import { CassandraInputForm } from "./CassandraInputForm"; import { RedisInputForm } from "./RedisInputForm"; +import { MongoAtlasInputForm } from "./MongoAtlasInputForm"; import { SqlDatabaseInputForm } from "./SqlDatabaseInputForm"; type Props = { @@ -28,29 +30,34 @@ enum WizardSteps { const DYNAMIC_SECRET_LIST = [ { - icon: faDatabase, + icon: , provider: DynamicSecretProviders.SqlDatabase, title: "SQL\nDatabase" }, { - icon: faDatabase, + icon: , provider: DynamicSecretProviders.Cassandra, title: "Cassandra" }, { - icon: faDatabase, + icon: , provider: DynamicSecretProviders.Redis, title: "Redis" }, { - icon: faAws, + icon: , provider: DynamicSecretProviders.AwsElastiCache, title: "AWS ElastiCache" }, { - icon: faAws, + icon: , provider: DynamicSecretProviders.AwsIam, title: "AWS IAM" + }, + { + icon: , + provider: DynamicSecretProviders.MongoAtlas, + title: "Mongo Atlas" } ]; @@ -105,7 +112,7 @@ export const CreateDynamicSecretForm = ({ } }} > - + {icon}
{title}
))} @@ -202,6 +209,24 @@ export const CreateDynamicSecretForm = ({ /> )} + {wizardStep === WizardSteps.ProviderInputs && + selectedProvider === DynamicSecretProviders.MongoAtlas && ( + + + + )} diff --git a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx new file mode 100644 index 000000000..84024e387 --- /dev/null +++ b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx @@ -0,0 +1,455 @@ +import { Controller, useFieldArray, useForm } from "react-hook-form"; +import { faPlus, faTrash } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { zodResolver } from "@hookform/resolvers/zod"; +import ms from "ms"; +import { z } from "zod"; + +import { TtlFormLabel } from "@app/components/features"; +import { createNotification } from "@app/components/notifications"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, + Button, + FormControl, + FormLabel, + IconButton, + Input, + Select, + SelectItem +} from "@app/components/v2"; +import { useCreateDynamicSecret } from "@app/hooks/api"; +import { DynamicSecretProviders } from "@app/hooks/api/dynamicSecret/types"; + +const formSchema = z.object({ + provider: z.object({ + adminPublicKey: z.string().trim().min(1), + adminPrivateKey: z.string().trim().min(1), + groupId: z.string().trim().min(1), + roles: z + .object({ + collectionName: z.string().optional(), + databaseName: z.string().min(1), + roleName: z.string().min(1) + }) + .array() + .min(1), + scopes: z + .object({ + name: z.string().min(1), + type: z.string().min(1) + }) + .array() + }), + defaultTTL: z.string().superRefine((val, ctx) => { + const valMs = ms(val); + if (valMs < 60 * 1000) + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be a greater than 1min" }); + // a day + if (valMs > 24 * 60 * 60 * 1000) + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); + }), + maxTTL: z + .string() + .optional() + .superRefine((val, ctx) => { + if (!val) return; + const valMs = ms(val); + if (valMs < 60 * 1000) + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be a greater than 1min" }); + // a day + if (valMs > 24 * 60 * 60 * 1000) + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); + }), + name: z.string().refine((val) => val.toLowerCase() === val, "Must be lowercase") +}); +type TForm = z.infer; + +type Props = { + onCompleted: () => void; + onCancel: () => void; + secretPath: string; + projectSlug: string; + environment: string; +}; + +const ATLAS_SCOPE_TYPES = [ + { + label: "Cluster", + value: "CLUSTER" + }, + { + label: "Data Lake", + value: "DATA_LAKE" + }, + { + label: "Stream", + value: "STREAM" + } +]; + +export const MongoAtlasInputForm = ({ + onCompleted, + onCancel, + environment, + secretPath, + projectSlug +}: Props) => { + const { + control, + getValues, + setValue, + formState: { isSubmitting }, + handleSubmit + } = useForm({ + resolver: zodResolver(formSchema), + defaultValues: { + provider: { + roles: [{ databaseName: "", roleName: "" }] + } + } + }); + + const roleFields = useFieldArray({ + control, + name: "provider.roles" + }); + + const scopeFields = useFieldArray({ + control, + name: "provider.scopes" + }); + + const createDynamicSecret = useCreateDynamicSecret(); + + const handleCreateDynamicSecret = async ({ name, maxTTL, provider, defaultTTL }: TForm) => { + // wait till previous request is finished + if (createDynamicSecret.isLoading) return; + try { + await createDynamicSecret.mutateAsync({ + provider: { type: DynamicSecretProviders.MongoAtlas, inputs: provider }, + maxTTL, + name, + path: secretPath, + defaultTTL, + projectSlug, + environmentSlug: environment + }); + onCompleted(); + } catch (err) { + createNotification({ + type: "error", + text: "Failed to create dynamic secret" + }); + } + }; + + return ( +
+
+
+
+
+ ( + + + + )} + /> +
+
+ ( + } + isError={Boolean(error?.message)} + errorText={error?.message} + > + + + )} + /> +
+
+ ( + } + isError={Boolean(error?.message)} + errorText={error?.message} + > + + + )} + /> +
+
+
+
+ Configuration +
+
+
+ ( + + + + )} + /> + ( + + + + )} + /> +
+ ( + + + + )} + /> + +
+ {roleFields.fields.map(({ id: roleFieldId }, i) => ( +
+
+ {i === 0 && Database Name} + ( + + + + )} + /> +
+
+ {i === 0 && ( + + )} + ( + + + + )} + /> +
+
+ {i === 0 && ( + + )} + ( + + + + )} + /> +
+ { + const roles = getValues("provider.roles"); + if (roles && roles?.length > 1) { + roleFields.remove(i); + } else { + setValue("provider.roles", [{ databaseName: "", roleName: "" }]); + } + }} + > + + +
+ ))} +
+ +
+
+ + + Advance + + +
+ {scopeFields.fields.map(({ id: scopeFieldId }, i) => ( +
+
+ {i === 0 && ( + + )} + ( + + + + )} + /> +
+
+ {i === 0 && Type} + ( + + + + )} + /> +
+ { + scopeFields.remove(i); + }} + > + + +
+ ))} +
+ +
+
+
+
+
+
+
+
+
+ + +
+
+
+ ); +}; diff --git a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/CreateDynamicSecretLease.tsx b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/CreateDynamicSecretLease.tsx index 3cb709d59..800cf7747 100644 --- a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/CreateDynamicSecretLease.tsx +++ b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/CreateDynamicSecretLease.tsx @@ -57,7 +57,8 @@ const OutputDisplay = ({ const renderOutputForm = (provider: DynamicSecretProviders, data: unknown) => { if ( provider === DynamicSecretProviders.SqlDatabase || - provider === DynamicSecretProviders.Cassandra + provider === DynamicSecretProviders.Cassandra || + provider === DynamicSecretProviders.MongoAtlas ) { const { DB_PASSWORD, DB_USERNAME } = data as { DB_USERNAME: string; DB_PASSWORD: string }; return ( diff --git a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretForm.tsx b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretForm.tsx index 3309126ee..83500e2a9 100644 --- a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretForm.tsx +++ b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretForm.tsx @@ -8,6 +8,7 @@ import { EditDynamicSecretAwsElastiCacheProviderForm } from "./EditDynamicSecret import { EditDynamicSecretAwsIamForm } from "./EditDynamicSecretAwsIamForm"; import { EditDynamicSecretCassandraForm } from "./EditDynamicSecretCassandraForm"; import { EditDynamicSecretRedisProviderForm } from "./EditDynamicSecretRedisProviderForm"; +import { EditDynamicSecretMongoAtlasForm } from "./EditDynamicSecretMongoAtlasForm"; import { EditDynamicSecretSqlProviderForm } from "./EditDynamicSecretSqlProviderForm"; type Props = { @@ -128,6 +129,23 @@ export const EditDynamicSecretForm = ({ /> )} + {dynamicSecretDetails?.type === DynamicSecretProviders.MongoAtlas && ( + + + + )} ); }; diff --git a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretMongoAtlasForm.tsx b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretMongoAtlasForm.tsx new file mode 100644 index 000000000..8f6e3ba46 --- /dev/null +++ b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretMongoAtlasForm.tsx @@ -0,0 +1,465 @@ +import { Controller, useFieldArray, useForm } from "react-hook-form"; +import { faPlus, faTrash } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { zodResolver } from "@hookform/resolvers/zod"; +import ms from "ms"; +import { z } from "zod"; + +import { TtlFormLabel } from "@app/components/features"; +import { createNotification } from "@app/components/notifications"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, + Button, + FormControl, + FormLabel, + IconButton, + Input, + Select, + SelectItem} from "@app/components/v2"; +import { useUpdateDynamicSecret } from "@app/hooks/api"; +import { TDynamicSecret } from "@app/hooks/api/dynamicSecret/types"; + +const formSchema = z.object({ + inputs: z + .object({ + adminPublicKey: z.string().trim().min(1), + adminPrivateKey: z.string().trim().min(1), + groupId: z.string().trim().min(1), + roles: z + .object({ + collectionName: z.string().optional(), + databaseName: z.string().min(1), + roleName: z.string().min(1) + }) + .array() + .min(1), + scopes: z + .object({ + name: z.string().min(1), + type: z.string().min(1) + }) + .array() + }) + .partial(), + defaultTTL: z.string().superRefine((val, ctx) => { + const valMs = ms(val); + if (valMs < 60 * 1000) + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be a greater than 1min" }); + // a day + if (valMs > 24 * 60 * 60 * 1000) + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); + }), + maxTTL: z + .string() + .optional() + .superRefine((val, ctx) => { + if (!val) return; + const valMs = ms(val); + if (valMs < 60 * 1000) + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be a greater than 1min" }); + // a day + if (valMs > 24 * 60 * 60 * 1000) + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "TTL must be less than a day" }); + }) + .nullable(), + newName: z + .string() + .refine((val) => val.toLowerCase() === val, "Must be lowercase") + .optional() +}); +type TForm = z.infer; + +type Props = { + onClose: () => void; + dynamicSecret: TDynamicSecret & { inputs: unknown }; + secretPath: string; + environment: string; + projectSlug: string; +}; + +const ATLAS_SCOPE_TYPES = [ + { + label: "Cluster", + value: "CLUSTER" + }, + { + label: "Data Lake", + value: "DATA_LAKE" + }, + { + label: "Stream", + value: "STREAM" + } +]; + +export const EditDynamicSecretMongoAtlasForm = ({ + onClose, + dynamicSecret, + environment, + secretPath, + projectSlug +}: Props) => { + const { + control, + getValues, + setValue, + formState: { isSubmitting }, + handleSubmit + } = useForm({ + resolver: zodResolver(formSchema), + values: { + defaultTTL: dynamicSecret.defaultTTL, + maxTTL: dynamicSecret.maxTTL, + newName: dynamicSecret.name, + inputs: { + ...(dynamicSecret.inputs as TForm["inputs"]) + } + } + }); + + const roleFields = useFieldArray({ + control, + name: "inputs.roles" + }); + + const scopeFields = useFieldArray({ + control, + name: "inputs.scopes" + }); + + const updateDynamicSecret = useUpdateDynamicSecret(); + + const handleUpdateDynamicSecret = async ({ inputs, maxTTL, defaultTTL, newName }: TForm) => { + // wait till previous request is finished + if (updateDynamicSecret.isLoading) return; + try { + await updateDynamicSecret.mutateAsync({ + name: dynamicSecret.name, + path: secretPath, + projectSlug, + environmentSlug: environment, + data: { + maxTTL: maxTTL || undefined, + defaultTTL, + inputs, + newName: newName === dynamicSecret.name ? undefined : newName + } + }); + onClose(); + createNotification({ + type: "success", + text: "Successfully updated dynamic secret" + }); + } catch (err) { + createNotification({ + type: "error", + text: "Failed to update dynamic secret" + }); + } + }; + + return ( +
+
+
+
+ ( + + + + )} + /> +
+
+ ( + } + isError={Boolean(error?.message)} + errorText={error?.message} + > + + + )} + /> +
+
+ ( + } + isError={Boolean(error?.message)} + errorText={error?.message} + > + + + )} + /> +
+
+
+
+ Configuration +
+
+
+ ( + + + + )} + /> + ( + + + + )} + /> +
+ ( + + + + )} + /> + +
+ {roleFields.fields.map(({ id: roleFieldId }, i) => ( +
+
+ {i === 0 && Database Name} + ( + + + + )} + /> +
+
+ {i === 0 && ( + + )} + ( + + + + )} + /> +
+
+ {i === 0 && ( + + )} + ( + + + + )} + /> +
+ { + const roles = getValues("inputs.roles"); + if (roles && roles?.length > 1) { + roleFields.remove(i); + } else { + setValue("inputs.roles", [{ databaseName: "", roleName: "" }]); + } + }} + > + + +
+ ))} +
+ +
+
+ + + Advance + + +
+ {scopeFields.fields.map(({ id: scopeFieldId }, i) => ( +
+
+ {i === 0 && ( + + )} + ( + + + + )} + /> +
+
+ {i === 0 && Type} + ( + + + + )} + /> +
+ { + scopeFields.remove(i); + }} + > + + +
+ ))} +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+ ); +}; From fed60f7c03021c4f5fe1dfc029be41943a61e862 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 29 Aug 2024 13:28:45 +0530 Subject: [PATCH 3/6] feat: resolved lint fix after rebase --- backend/package-lock.json | 8 ++++---- backend/src/ee/services/dynamic-secret/providers/index.ts | 2 +- .../CreateDynamicSecretForm/CreateDynamicSecretForm.tsx | 2 +- .../EditDynamicSecretForm/EditDynamicSecretForm.tsx | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index b3eef6bd1..088e3b73e 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -13040,12 +13040,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { diff --git a/backend/src/ee/services/dynamic-secret/providers/index.ts b/backend/src/ee/services/dynamic-secret/providers/index.ts index e64b26d80..0eb613df2 100644 --- a/backend/src/ee/services/dynamic-secret/providers/index.ts +++ b/backend/src/ee/services/dynamic-secret/providers/index.ts @@ -2,8 +2,8 @@ import { AwsElastiCacheDatabaseProvider } from "./aws-elasticache"; import { AwsIamProvider } from "./aws-iam"; import { CassandraProvider } from "./cassandra"; import { DynamicSecretProviders } from "./models"; -import { RedisDatabaseProvider } from "./redis"; import { MongoAtlasProvider } from "./mongo-atlas"; +import { RedisDatabaseProvider } from "./redis"; import { SqlDatabaseProvider } from "./sql-database"; export const buildDynamicSecretProviders = () => ({ diff --git a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/CreateDynamicSecretForm.tsx b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/CreateDynamicSecretForm.tsx index 21a50019b..52b3170a2 100644 --- a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/CreateDynamicSecretForm.tsx +++ b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/CreateDynamicSecretForm.tsx @@ -11,8 +11,8 @@ import { DynamicSecretProviders } from "@app/hooks/api/dynamicSecret/types"; import { AwsElastiCacheInputForm } from "./AwsElastiCacheInputForm"; import { AwsIamInputForm } from "./AwsIamInputForm"; import { CassandraInputForm } from "./CassandraInputForm"; -import { RedisInputForm } from "./RedisInputForm"; import { MongoAtlasInputForm } from "./MongoAtlasInputForm"; +import { RedisInputForm } from "./RedisInputForm"; import { SqlDatabaseInputForm } from "./SqlDatabaseInputForm"; type Props = { diff --git a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretForm.tsx b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretForm.tsx index 83500e2a9..344d8183d 100644 --- a/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretForm.tsx +++ b/frontend/src/views/SecretMainPage/components/DynamicSecretListView/EditDynamicSecretForm/EditDynamicSecretForm.tsx @@ -7,8 +7,8 @@ import { DynamicSecretProviders } from "@app/hooks/api/dynamicSecret/types"; import { EditDynamicSecretAwsElastiCacheProviderForm } from "./EditDynamicSecretAwsElastiCacheProviderForm"; import { EditDynamicSecretAwsIamForm } from "./EditDynamicSecretAwsIamForm"; import { EditDynamicSecretCassandraForm } from "./EditDynamicSecretCassandraForm"; -import { EditDynamicSecretRedisProviderForm } from "./EditDynamicSecretRedisProviderForm"; import { EditDynamicSecretMongoAtlasForm } from "./EditDynamicSecretMongoAtlasForm"; +import { EditDynamicSecretRedisProviderForm } from "./EditDynamicSecretRedisProviderForm"; import { EditDynamicSecretSqlProviderForm } from "./EditDynamicSecretSqlProviderForm"; type Props = { From ad49e9eaf16322790c25f33f7106ab9d90a3f56a Mon Sep 17 00:00:00 2001 From: = Date: Thu, 29 Aug 2024 14:52:40 +0530 Subject: [PATCH 4/6] docs: updated doc for mongo atlas dynamic secret --- .../platform/dynamic-secrets/mongo-atlas.mdx | 114 ++++++++++++++++++ .../dynamic-secrets/advance-option-atlas.png | Bin 0 -> 18935 bytes .../dynamic-secret-atlas-modal.png | Bin 0 -> 51233 bytes .../dynamic-secret-modal-atlas.png | Bin 0 -> 78141 bytes docs/mint.json | 3 +- 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 docs/documentation/platform/dynamic-secrets/mongo-atlas.mdx create mode 100644 docs/images/platform/dynamic-secrets/advance-option-atlas.png create mode 100644 docs/images/platform/dynamic-secrets/dynamic-secret-atlas-modal.png create mode 100644 docs/images/platform/dynamic-secrets/dynamic-secret-modal-atlas.png diff --git a/docs/documentation/platform/dynamic-secrets/mongo-atlas.mdx b/docs/documentation/platform/dynamic-secrets/mongo-atlas.mdx new file mode 100644 index 000000000..4339e76a7 --- /dev/null +++ b/docs/documentation/platform/dynamic-secrets/mongo-atlas.mdx @@ -0,0 +1,114 @@ +--- +title: "Mongo Atlas" +description: "Learn how to dynamically generate Mongo Atlas Database user credentials." +--- + +The Infisical Mongo Atlas dynamic secret allows you to generate Mongo Atlas Database credentials on demand based on configured role. + +## Prerequisite +Create a project scopped API Key with the required permission in your Mongo Atlas following the [official doc](https://www.mongodb.com/docs/atlas/configure-api-access/#grant-programmatic-access-to-a-project). + + + The API Key must have permission to manage users in the project. + + +## Set up Dynamic Secrets with Mongo Atlas + + + + Open the Secret Overview dashboard and select the environment in which you would like to add a dynamic secret. + + + ![Add Dynamic Secret Button](../../../images/platform/dynamic-secrets/add-dynamic-secret-button.png) + + + ![Dynamic Secret Modal](../../../images/platform/dynamic-secrets/dynamic-secret-atlas-modal.png) + + + + Name by which you want the secret to be referenced + + + + Default time-to-live for a generated secret (it is possible to modify this value when a secret is generate) + + + + Maximum time-to-live for a generated secret + + + + Admin public API key + + + + Admin private API key + + + + Unique 24-hexadecimal digit string that identifies your project. This is same as project id + + + + List that provides the pairings of one role with one applicable database. + - **Database Name**: Database to which the user is granted access privileges. + - **Collection**: Collection on which this role applies. + - **Role Name**: Human-readable label that identifies a group of privileges assigned to a database user. This value can either be a built-in role or a custom role. + - Enum: `atlasAdmin` `backup` `clusterMonitor` `dbAdmin` `dbAdminAnyDatabase` `enableSharding` `read` `readAnyDatabase` `readWrite` `readWriteAnyDatabase` `
`. + + + ![Dynamic Secret Setup Modal](../../../images/platform/dynamic-secrets/dynamic-secret-modal-atlas.png) + + + + List that contains clusters, MongoDB Atlas Data Lakes, and MongoDB Atlas Streams Instances that this database user can access. If omitted, MongoDB Cloud grants the database user access to all the clusters, MongoDB Atlas Data Lakes, and MongoDB Atlas Streams Instances in the project. + + ![Modify Scope Modal](../../../images/platform/dynamic-secrets/advance-option-atlas.png) + - **Label**: Human-readable label that identifies the cluster or MongoDB Atlas Data Lake that this database user can access. + - **Type**: Category of resource that this database user can access. + + + After submitting the form, you will see a dynamic secret created in the dashboard. + + + If this step fails, you may have to add the CA certficate. + + + ![Dynamic Secret](../../../images/platform/dynamic-secrets/dynamic-secret.png) + + + Once you've successfully configured the dynamic secret, you're ready to generate on-demand credentials. + To do this, simply click on the 'Generate' button which appears when hovering over the dynamic secret item. + Alternatively, you can initiate the creation of a new lease by selecting 'New Lease' from the dynamic secret lease list section. + + ![Dynamic Secret](/images/platform/dynamic-secrets/dynamic-secret-generate.png) + ![Dynamic Secret](/images/platform/dynamic-secrets/dynamic-secret-lease-empty.png) + + When generating these secrets, it's important to specify a Time-to-Live (TTL) duration. This will dictate how long the credentials are valid for. + + ![Provision Lease](/images/platform/dynamic-secrets/provision-lease.png) + + + Ensure that the TTL for the lease fall within the maximum TTL defined when configuring the dynamic secret. + + + + Once you click the `Submit` button, a new secret lease will be generated and the credentials for it will be shown to you. + + ![Provision Lease](/images/platform/dynamic-secrets/lease-values.png) + + + +## Audit or Revoke Leases +Once you have created one or more leases, you will be able to access them by clicking on the respective dynamic secret item on the dashboard. +This will allow you see the expiration time of the lease or delete a lease before it's set time to live. + +![Provision Lease](/images/platform/dynamic-secrets/lease-data.png) + +## Renew Leases +To extend the life of the generated dynamic secret leases past its initial time to live, simply click on the **Renew** as illustrated below. +![Provision Lease](/images/platform/dynamic-secrets/dynamic-secret-lease-renew.png) + + + Lease renewals cannot exceed the maximum TTL set when configuring the dynamic secret + diff --git a/docs/images/platform/dynamic-secrets/advance-option-atlas.png b/docs/images/platform/dynamic-secrets/advance-option-atlas.png new file mode 100644 index 0000000000000000000000000000000000000000..91e476c188fdb65508ef2ea7ac74bf733921550e GIT binary patch literal 18935 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 $1Cz&nx-$NI)yvdf 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

RoHg`e?Q;NQQ`n?PnvCB~6QGDm9z2hJ~8*b1vz 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 Date: Mon, 2 Sep 2024 14:36:32 +0530 Subject: [PATCH 5/6] feat: changed text to advanced as review comment --- .../CreateDynamicSecretForm/MongoAtlasInputForm.tsx | 2 +- .../EditDynamicSecretMongoAtlasForm.tsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx index 84024e387..14f529fe0 100644 --- a/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx +++ b/frontend/src/views/SecretMainPage/components/ActionBar/CreateDynamicSecretForm/MongoAtlasInputForm.tsx @@ -348,7 +348,7 @@ export const MongoAtlasInputForm = ({ - Advance + Advanced - Advance + Advanced Date: Mon, 2 Sep 2024 14:43:11 +0530 Subject: [PATCH 6/6] docs: improved test as commented --- .../platform/dynamic-secrets/mongo-atlas.mdx | 6 +++--- ...on-atlas.png => advanced-option-atlas.png} | Bin 18935 -> 18936 bytes 2 files changed, 3 insertions(+), 3 deletions(-) rename docs/images/platform/dynamic-secrets/{advance-option-atlas.png => advanced-option-atlas.png} (99%) diff --git a/docs/documentation/platform/dynamic-secrets/mongo-atlas.mdx b/docs/documentation/platform/dynamic-secrets/mongo-atlas.mdx index 4339e76a7..f9352f2e5 100644 --- a/docs/documentation/platform/dynamic-secrets/mongo-atlas.mdx +++ b/docs/documentation/platform/dynamic-secrets/mongo-atlas.mdx @@ -38,11 +38,11 @@ Create a project scopped API Key with the required permission in your Mongo Atla - Admin public API key + The public key of your generated Atlas API Key. This acts as a username. - Admin private API key + The private key of your generated Atlas API Key. This acts as a password. @@ -63,7 +63,7 @@ Create a project scopped API Key with the required permission in your Mongo Atla List that contains clusters, MongoDB Atlas Data Lakes, and MongoDB Atlas Streams Instances that this database user can access. If omitted, MongoDB Cloud grants the database user access to all the clusters, MongoDB Atlas Data Lakes, and MongoDB Atlas Streams Instances in the project. - ![Modify Scope Modal](../../../images/platform/dynamic-secrets/advance-option-atlas.png) + ![Modify Scope Modal](../../../images/platform/dynamic-secrets/advanced-option-atlas.png) - **Label**: Human-readable label that identifies the cluster or MongoDB Atlas Data Lake that this database user can access. - **Type**: Category of resource that this database user can access. diff --git a/docs/images/platform/dynamic-secrets/advance-option-atlas.png b/docs/images/platform/dynamic-secrets/advanced-option-atlas.png similarity index 99% rename from docs/images/platform/dynamic-secrets/advance-option-atlas.png rename to docs/images/platform/dynamic-secrets/advanced-option-atlas.png index 91e476c188fdb65508ef2ea7ac74bf733921550e..50c9f89bd87b938733936c283722eb3cb75b975a 100644 GIT binary patch delta 11 Scmex9neoSD#tq*+8My!?Z3Pnm delta 9 Qcmew{neqE%#tq*+0UA^V2mk;8