From f71f894de885352d911852637bb25892bc3744fb Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Thu, 24 Oct 2024 02:45:09 +0800 Subject: [PATCH] feat: added rotation handling for static ldap --- .../services/dynamic-secret/providers/ldap.ts | 75 +++++++++++++++---- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/backend/src/ee/services/dynamic-secret/providers/ldap.ts b/backend/src/ee/services/dynamic-secret/providers/ldap.ts index a4c6408cb..f94e61629 100644 --- a/backend/src/ee/services/dynamic-secret/providers/ldap.ts +++ b/backend/src/ee/services/dynamic-secret/providers/ldap.ts @@ -7,7 +7,7 @@ import { z } from "zod"; import { BadRequestError } from "@app/lib/errors"; import { alphaNumericNanoId } from "@app/lib/nanoid"; -import { LdapSchema, TDynamicProviderFns } from "./models"; +import { LdapCredentialType, LdapSchema, TDynamicProviderFns } from "./models"; const generatePassword = () => { const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~!*$#"; @@ -193,29 +193,76 @@ export const LdapProvider = (): TDynamicProviderFns => { const providerInputs = await validateProviderInputs(inputs); const client = await getClient(providerInputs); - const username = generateUsername(); - const password = generatePassword(); - const generatedLdif = generateLDIF({ username, password, ldifTemplate: providerInputs.creationLdif }); + if (providerInputs.credentialType === LdapCredentialType.Static) { + const dnMatch = providerInputs.rotationLdif.match(/^dn:\s*(.+)/m); - try { - const dnArray = await executeLdif(client, generatedLdif); + if (dnMatch) { + const username = dnMatch[1]; + const password = generatePassword(); - return { entityId: username, data: { DN_ARRAY: dnArray, USERNAME: username, PASSWORD: password } }; - } catch (err) { - if (providerInputs.rollbackLdif) { - const rollbackLdif = generateLDIF({ username, password, ldifTemplate: providerInputs.rollbackLdif }); - await executeLdif(client, rollbackLdif); + const generatedLdif = generateLDIF({ username, password, ldifTemplate: providerInputs.rotationLdif }); + + try { + const dnArray = await executeLdif(client, generatedLdif); + + return { entityId: username, data: { DN_ARRAY: dnArray, USERNAME: username, PASSWORD: password } }; + } catch (err) { + throw new BadRequestError({ message: (err as Error).message }); + } + } else { + throw new BadRequestError({ + message: "Invalid rotation LDIF, missing DN." + }); + } + } else { + const username = generateUsername(); + const password = generatePassword(); + const generatedLdif = generateLDIF({ username, password, ldifTemplate: providerInputs.creationLdif }); + + try { + const dnArray = await executeLdif(client, generatedLdif); + + return { entityId: username, data: { DN_ARRAY: dnArray, USERNAME: username, PASSWORD: password } }; + } catch (err) { + if (providerInputs.rollbackLdif) { + const rollbackLdif = generateLDIF({ username, password, ldifTemplate: providerInputs.rollbackLdif }); + await executeLdif(client, rollbackLdif); + } + throw new BadRequestError({ message: (err as Error).message }); } - throw new BadRequestError({ message: (err as Error).message }); } }; const revoke = async (inputs: unknown, entityId: string) => { const providerInputs = await validateProviderInputs(inputs); - const connection = await getClient(providerInputs); + const client = await getClient(providerInputs); + + if (providerInputs.credentialType === LdapCredentialType.Static) { + const dnMatch = providerInputs.rotationLdif.match(/^dn:\s*(.+)/m); + + if (dnMatch) { + const username = dnMatch[1]; + const password = generatePassword(); + + const generatedLdif = generateLDIF({ username, password, ldifTemplate: providerInputs.rotationLdif }); + + try { + const dnArray = await executeLdif(client, generatedLdif); + + return { entityId: username, data: { DN_ARRAY: dnArray, USERNAME: username, PASSWORD: password } }; + } catch (err) { + throw new BadRequestError({ message: (err as Error).message }); + } + } else { + throw new BadRequestError({ + message: "Invalid rotation LDIF, missing DN." + }); + } + } + const revocationLdif = generateLDIF({ username: entityId, ldifTemplate: providerInputs.revocationLdif }); - await executeLdif(connection, revocationLdif); + await executeLdif(client, revocationLdif); return { entityId }; };