diff --git a/.changeset/short-pumpkins-prove.md b/.changeset/short-pumpkins-prove.md new file mode 100644 index 0000000000..be5f6ce078 --- /dev/null +++ b/.changeset/short-pumpkins-prove.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-ldap': minor +--- + +Add support for optional configuration of `dnAttributeName` and `uuidAttributeName` in LDAP vendor settings diff --git a/plugins/catalog-backend-module-ldap/src/ldap/client.ts b/plugins/catalog-backend-module-ldap/src/ldap/client.ts index 867a49b16a..8703eee1ef 100644 --- a/plugins/catalog-backend-module-ldap/src/ldap/client.ts +++ b/plugins/catalog-backend-module-ldap/src/ldap/client.ts @@ -226,12 +226,47 @@ export class LdapClient { * * @see https://ldapwiki.com/wiki/Determine%20LDAP%20Server%20Vendor */ - async getVendor(vendorConfig: VendorConfig): Promise { + async getVendor(vendorConfig: VendorConfig | undefined): Promise { if (this.vendor) { return this.vendor; } this.vendor = this.getRootDSE() .then(root => { + if (!vendorConfig) { + if (root && root.raw?.forestFunctionality) { + // ActiveDirectoryVendor + return CreateLdapVendor( + { + dnAttributeName: 'distinguishedName', + uuidAttributeName: 'objectGUID', + }, + true, + ); + } else if (root && root.raw?.ipaDomainLevel) { + // FreeIpaVendor + return CreateLdapVendor( + { + dnAttributeName: 'dn', + uuidAttributeName: 'ipaUniqueID', + }, + false, + ); + } else if (root && 'aeRoot' in root.raw) { + // AEDirVendor + return CreateLdapVendor( + { dnAttributeName: 'dn', uuidAttributeName: 'entryUUID' }, + false, + ); + } + // DefaultLdapVendor + return CreateLdapVendor( + { + dnAttributeName: 'entryDN', + uuidAttributeName: 'entryUUID', + }, + !!(root && root.raw?.forestFunctionality), + ); + } return CreateLdapVendor( vendorConfig, !!(root && root.raw?.forestFunctionality), diff --git a/plugins/catalog-backend-module-ldap/src/ldap/config.test.ts b/plugins/catalog-backend-module-ldap/src/ldap/config.test.ts index 229ad9bd2a..598bcc8839 100644 --- a/plugins/catalog-backend-module-ldap/src/ldap/config.test.ts +++ b/plugins/catalog-backend-module-ldap/src/ldap/config.test.ts @@ -78,10 +78,6 @@ describe('readLdapConfig', () => { }, }, ], - vendor: { - dnAttributeName: 'entryDN', - uuidAttributeName: 'entryUUID', - }, }, ]; expect(actual).toEqual(expected); @@ -155,10 +151,6 @@ describe('readLdapConfig', () => { }, }, ], - vendor: { - dnAttributeName: 'entryDN', - uuidAttributeName: 'entryUUID', - }, }, ]; expect(actual).toEqual(expected); @@ -299,10 +291,6 @@ describe('readLdapConfig', () => { }, }, ], - vendor: { - dnAttributeName: 'entryDN', - uuidAttributeName: 'entryUUID', - }, }, ]; expect(actual).toEqual(expected); diff --git a/plugins/catalog-backend-module-ldap/src/ldap/config.ts b/plugins/catalog-backend-module-ldap/src/ldap/config.ts index ec6a944eb9..1fbe93c533 100644 --- a/plugins/catalog-backend-module-ldap/src/ldap/config.ts +++ b/plugins/catalog-backend-module-ldap/src/ldap/config.ts @@ -50,7 +50,7 @@ export type LdapProviderConfig = { // Configuration for LDAP vendor-specific attributes. If not specified, the default values will be used: // - `dnAttributeName`: `entryDN` // - `uuidAttributeName`: `entryUUID` - vendor: VendorConfig; + vendor?: VendorConfig; }; /** @@ -253,10 +253,7 @@ function readVendorConfig( c: Config | undefined, ): LdapProviderConfig['vendor'] | undefined { if (!c) { - return { - dnAttributeName: `entryDN`, - uuidAttributeName: `entryUUID`, - }; + return undefined; } return { dnAttributeName: c.getString('dn'), diff --git a/plugins/catalog-backend-module-ldap/src/ldap/read.ts b/plugins/catalog-backend-module-ldap/src/ldap/read.ts index 28cca0ad72..3b59ac35ac 100644 --- a/plugins/catalog-backend-module-ldap/src/ldap/read.ts +++ b/plugins/catalog-backend-module-ldap/src/ldap/read.ts @@ -105,7 +105,7 @@ export async function defaultUserTransformer( export async function readLdapUsers( client: LdapClient, userConfig: UserConfig[], - vendorConfig: VendorConfig, + vendorConfig: VendorConfig | undefined, opts?: { transformer?: UserTransformer }, ): Promise<{ users: UserEntity[]; // With all relations empty @@ -212,7 +212,7 @@ export async function defaultGroupTransformer( export async function readLdapGroups( client: LdapClient, groupConfig: GroupConfig[], - vendorConfig: VendorConfig, + vendorConfig: VendorConfig | undefined, opts?: { transformer?: GroupTransformer; }, @@ -277,7 +277,7 @@ export async function readLdapOrg( client: LdapClient, userConfig: UserConfig[], groupConfig: GroupConfig[], - vendorConfig: VendorConfig, + vendorConfig: VendorConfig | undefined, options: { groupTransformer?: GroupTransformer; userTransformer?: UserTransformer;