diff --git a/backend/src/ee/services/dynamic-secret/providers/cassandra.ts b/backend/src/ee/services/dynamic-secret/providers/cassandra.ts index 5e4250a35..0b6d50146 100644 --- a/backend/src/ee/services/dynamic-secret/providers/cassandra.ts +++ b/backend/src/ee/services/dynamic-secret/providers/cassandra.ts @@ -21,7 +21,12 @@ const generateUsername = () => { export const CassandraProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretCassandraSchema.parseAsync(inputs); - const [hostIp] = await verifyHostInputValidity(providerInputs.host); + const hostIps = await Promise.all( + providerInputs.host + .split(",") + .filter(Boolean) + .map((el) => verifyHostInputValidity(el).then((ip) => ip[0])) + ); validateHandlebarTemplate("Cassandra creation", providerInputs.creationStatement, { allowedExpressions: (val) => ["username", "password", "expiration", "keyspace"].includes(val) }); @@ -34,10 +39,10 @@ export const CassandraProvider = (): TDynamicProviderFns => { allowedExpressions: (val) => ["username"].includes(val) }); - return { ...providerInputs, host: hostIp }; + return { ...providerInputs, hostIps }; }; - const $getClient = async (providerInputs: z.infer) => { + const $getClient = async (providerInputs: z.infer & { hostIps: string[] }) => { const sslOptions = providerInputs.ca ? { rejectUnauthorized: false, ca: providerInputs.ca } : undefined; const client = new cassandra.Client({ sslOptions, @@ -50,7 +55,7 @@ export const CassandraProvider = (): TDynamicProviderFns => { }, keyspace: providerInputs.keyspace, localDataCenter: providerInputs?.localDataCenter, - contactPoints: providerInputs.host.split(",").filter(Boolean) + contactPoints: providerInputs.hostIps }); return client; }; diff --git a/backend/src/ee/services/dynamic-secret/providers/elastic-search.ts b/backend/src/ee/services/dynamic-secret/providers/elastic-search.ts index e3ad9c112..6c1affa39 100644 --- a/backend/src/ee/services/dynamic-secret/providers/elastic-search.ts +++ b/backend/src/ee/services/dynamic-secret/providers/elastic-search.ts @@ -20,13 +20,13 @@ export const ElasticSearchProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretElasticSearchSchema.parseAsync(inputs); const [hostIp] = await verifyHostInputValidity(providerInputs.host); - return { ...providerInputs, host: hostIp }; + return { ...providerInputs, hostIp }; }; - const $getClient = async (providerInputs: z.infer) => { + const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { const connection = new ElasticSearchClient({ node: { - url: new URL(`${providerInputs.host}:${providerInputs.port}`), + url: new URL(`${providerInputs.hostIp}:${providerInputs.port}`), ...(providerInputs.ca && { ssl: { rejectUnauthorized: false, diff --git a/backend/src/ee/services/dynamic-secret/providers/mongo-db.ts b/backend/src/ee/services/dynamic-secret/providers/mongo-db.ts index 42fea268d..bee29bfc4 100644 --- a/backend/src/ee/services/dynamic-secret/providers/mongo-db.ts +++ b/backend/src/ee/services/dynamic-secret/providers/mongo-db.ts @@ -20,14 +20,14 @@ export const MongoDBProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretMongoDBSchema.parseAsync(inputs); const [hostIp] = await verifyHostInputValidity(providerInputs.host); - return { ...providerInputs, host: hostIp }; + return { ...providerInputs, hostIp }; }; - const $getClient = async (providerInputs: z.infer) => { + const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { const isSrv = !providerInputs.port; const uri = isSrv - ? `mongodb+srv://${providerInputs.host}` - : `mongodb://${providerInputs.host}:${providerInputs.port}`; + ? `mongodb+srv://${providerInputs.hostIp}` + : `mongodb://${providerInputs.hostIp}:${providerInputs.port}`; const client = new MongoClient(uri, { auth: { diff --git a/backend/src/ee/services/dynamic-secret/providers/rabbit-mq.ts b/backend/src/ee/services/dynamic-secret/providers/rabbit-mq.ts index a259c6bde..f6c73ba54 100644 --- a/backend/src/ee/services/dynamic-secret/providers/rabbit-mq.ts +++ b/backend/src/ee/services/dynamic-secret/providers/rabbit-mq.ts @@ -3,7 +3,6 @@ import https from "https"; import { customAlphabet } from "nanoid"; import { z } from "zod"; -import { removeTrailingSlash } from "@app/lib/fn"; import { logger } from "@app/lib/logger"; import { alphaNumericNanoId } from "@app/lib/nanoid"; @@ -80,12 +79,12 @@ export const RabbitMqProvider = (): TDynamicProviderFns => { const validateProviderInputs = async (inputs: unknown) => { const providerInputs = await DynamicSecretRabbitMqSchema.parseAsync(inputs); const [hostIp] = await verifyHostInputValidity(providerInputs.host); - return { ...providerInputs, host: hostIp }; + return { ...providerInputs, hostIp }; }; - const $getClient = async (providerInputs: z.infer) => { + const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { const axiosInstance = axios.create({ - baseURL: `${removeTrailingSlash(providerInputs.host)}:${providerInputs.port}/api`, + baseURL: `${providerInputs.hostIp}:${providerInputs.port}/api`, auth: { username: providerInputs.username, password: providerInputs.password diff --git a/backend/src/ee/services/dynamic-secret/providers/redis.ts b/backend/src/ee/services/dynamic-secret/providers/redis.ts index 78efe98e3..f180dd607 100644 --- a/backend/src/ee/services/dynamic-secret/providers/redis.ts +++ b/backend/src/ee/services/dynamic-secret/providers/redis.ts @@ -65,15 +65,15 @@ export const RedisDatabaseProvider = (): TDynamicProviderFns => { allowedExpressions: (val) => ["username"].includes(val) }); - return { ...providerInputs, host: hostIp }; + return { ...providerInputs, hostIp }; }; - const $getClient = async (providerInputs: z.infer) => { + const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { let connection: Redis | null = null; try { connection = new Redis({ username: providerInputs.username, - host: providerInputs.host, + host: providerInputs.hostIp, port: providerInputs.port, password: providerInputs.password, ...(providerInputs.ca && { diff --git a/backend/src/ee/services/dynamic-secret/providers/sap-ase.ts b/backend/src/ee/services/dynamic-secret/providers/sap-ase.ts index 37e0eb36c..a1c3c941b 100644 --- a/backend/src/ee/services/dynamic-secret/providers/sap-ase.ts +++ b/backend/src/ee/services/dynamic-secret/providers/sap-ase.ts @@ -37,13 +37,16 @@ export const SapAseProvider = (): TDynamicProviderFns => { allowedExpressions: (val) => ["username"].includes(val) }); } - return { ...providerInputs, host: hostIp }; + return { ...providerInputs, hostIp }; }; - const $getClient = async (providerInputs: z.infer, useMaster?: boolean) => { + const $getClient = async ( + providerInputs: z.infer & { hostIp: string }, + useMaster?: boolean + ) => { const connectionString = `DRIVER={FreeTDS};` + - `SERVER=${providerInputs.host};` + + `SERVER=${providerInputs.hostIp};` + `PORT=${providerInputs.port};` + `DATABASE=${useMaster ? "master" : providerInputs.database};` + `UID=${providerInputs.username};` + diff --git a/backend/src/ee/services/dynamic-secret/providers/sap-hana.ts b/backend/src/ee/services/dynamic-secret/providers/sap-hana.ts index 7ef114c5f..1ad24473c 100644 --- a/backend/src/ee/services/dynamic-secret/providers/sap-hana.ts +++ b/backend/src/ee/services/dynamic-secret/providers/sap-hana.ts @@ -41,12 +41,12 @@ export const SapHanaProvider = (): TDynamicProviderFns => { validateHandlebarTemplate("SAP Hana revoke", providerInputs.revocationStatement, { allowedExpressions: (val) => ["username"].includes(val) }); - return { ...providerInputs, host: hostIp }; + return { ...providerInputs, hostIp }; }; - const $getClient = async (providerInputs: z.infer) => { + const $getClient = async (providerInputs: z.infer & { hostIp: string }) => { const client = hdb.createClient({ - host: providerInputs.host, + host: providerInputs.hostIp, port: providerInputs.port, user: providerInputs.username, password: providerInputs.password, diff --git a/backend/src/ee/services/dynamic-secret/providers/sql-database.ts b/backend/src/ee/services/dynamic-secret/providers/sql-database.ts index 852a844ce..178ca4ef9 100644 --- a/backend/src/ee/services/dynamic-secret/providers/sql-database.ts +++ b/backend/src/ee/services/dynamic-secret/providers/sql-database.ts @@ -132,7 +132,7 @@ export const SqlDatabaseProvider = ({ gatewayService }: TSqlDatabaseProviderDTO) allowedExpressions: (val) => ["username", "database"].includes(val) }); - return { ...providerInputs, host: hostIp }; + return { ...providerInputs, hostIp }; }; const $getClient = async (providerInputs: z.infer) => { @@ -193,7 +193,7 @@ export const SqlDatabaseProvider = ({ gatewayService }: TSqlDatabaseProviderDTO) const validateConnection = async (inputs: unknown) => { const providerInputs = await validateProviderInputs(inputs); let isConnected = false; - const gatewayCallback = async (host = providerInputs.host, port = providerInputs.port) => { + const gatewayCallback = async (host = providerInputs.hostIp, port = providerInputs.port) => { const db = await $getClient({ ...providerInputs, port, host }); // oracle needs from keyword const testStatement = providerInputs.client === SqlProviders.Oracle ? "SELECT 1 FROM DUAL" : "SELECT 1";