From 5c66e1a00d51de16492229ec4f65b25e1d4f327a Mon Sep 17 00:00:00 2001 From: Yuriy Movchan Date: Thu, 6 Apr 2023 19:37:12 +0300 Subject: [PATCH] feat: CR should support person loads from AD servers with different primary key attribute names #2333 --- .../ldap/cache/service/CacheRefreshTimer.java | 5 +-- .../external/ExternalCacheRefreshService.java | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/gluu/oxtrust/ldap/cache/service/CacheRefreshTimer.java b/server/src/main/java/org/gluu/oxtrust/ldap/cache/service/CacheRefreshTimer.java index 720bc8423..ea1f7700f 100644 --- a/server/src/main/java/org/gluu/oxtrust/ldap/cache/service/CacheRefreshTimer.java +++ b/server/src/main/java/org/gluu/oxtrust/ldap/cache/service/CacheRefreshTimer.java @@ -39,7 +39,6 @@ import org.gluu.model.SchemaEntry; import org.gluu.model.custom.script.model.bind.BindCredentials; import org.gluu.model.ldap.GluuLdapConfiguration; -import org.gluu.oxtrust.service.config.ConfigurationFactory; import org.gluu.oxtrust.ldap.cache.model.CacheCompoundKey; import org.gluu.oxtrust.ldap.cache.model.GluuInumMap; import org.gluu.oxtrust.ldap.cache.model.GluuSimplePerson; @@ -59,6 +58,7 @@ import org.gluu.oxtrust.service.PairwiseIdService; import org.gluu.oxtrust.service.PersonService; import org.gluu.oxtrust.service.cdi.event.CacheRefreshEvent; +import org.gluu.oxtrust.service.config.ConfigurationFactory; import org.gluu.oxtrust.service.external.ExternalCacheRefreshService; import org.gluu.oxtrust.util.OxTrustConstants; import org.gluu.oxtrust.util.PropertyUtil; @@ -68,7 +68,6 @@ import org.gluu.persist.exception.BasePersistenceException; import org.gluu.persist.exception.EntryPersistenceException; import org.gluu.persist.exception.operation.SearchException; -import org.gluu.persist.ldap.impl.LdapEntryManager; import org.gluu.persist.ldap.impl.LdapEntryManagerFactory; import org.gluu.persist.ldap.operation.LdapOperationService; import org.gluu.persist.model.SearchScope; @@ -920,6 +919,7 @@ private List loadSourceServerEntriesWithoutLimits( // Add to result and ignore root entry if needed for (GluuSimplePerson currentSourcePerson : currentSourcePersons) { currentSourcePerson.setSourceServerName(sourceServerName); + externalCacheRefreshService.executeExternalUpdateSourceUserMethods(currentSourcePerson); // if (!StringHelper.equalsIgnoreCase(baseDn, // currentSourcePerson.getDn())) { String currentSourcePersonDn = currentSourcePerson.getDn().toLowerCase(); @@ -969,6 +969,7 @@ private List loadSourceServerEntries(CacheRefreshConfiguration // Add to result and ignore root entry if needed for (GluuSimplePerson currentSourcePerson : currentSourcePersons) { currentSourcePerson.setSourceServerName(sourceServerName); + externalCacheRefreshService.executeExternalUpdateSourceUserMethods(currentSourcePerson); // if (!StringHelper.equalsIgnoreCase(baseDn, // currentSourcePerson.getDn())) { String currentSourcePersonDn = currentSourcePerson.getDn().toLowerCase(); diff --git a/server/src/main/java/org/gluu/oxtrust/service/external/ExternalCacheRefreshService.java b/server/src/main/java/org/gluu/oxtrust/service/external/ExternalCacheRefreshService.java index 00149aec5..5da32bf0b 100644 --- a/server/src/main/java/org/gluu/oxtrust/service/external/ExternalCacheRefreshService.java +++ b/server/src/main/java/org/gluu/oxtrust/service/external/ExternalCacheRefreshService.java @@ -16,6 +16,7 @@ import org.gluu.model.custom.script.conf.CustomScriptConfiguration; import org.gluu.model.custom.script.model.bind.BindCredentials; import org.gluu.model.custom.script.type.user.CacheRefreshType; +import org.gluu.oxtrust.ldap.cache.model.GluuSimplePerson; import org.gluu.oxtrust.model.GluuCustomPerson; import org.gluu.service.custom.script.ExternalScriptService; import org.gluu.util.StringHelper; @@ -49,6 +50,25 @@ public boolean executeExternalUpdateUserMethod(CustomScriptConfiguration customS return false; } + public boolean executeExternalUpdateSourceUserMethod(CustomScriptConfiguration customScriptConfiguration, GluuSimplePerson user) { + try { + CacheRefreshType externalType = (CacheRefreshType) customScriptConfiguration.getExternalType(); + Map configurationAttributes = customScriptConfiguration.getConfigurationAttributes(); + + // Execute only if API > 3 + if (externalType.getApiVersion() > 3) { + log.debug("Executing python 'updateSourceUser' method"); + + return externalType.updateSourceUser(user, configurationAttributes); + } + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + saveScriptError(customScriptConfiguration.getCustomScript(), ex); + } + + return false; + } + public BindCredentials executeExternalGetBindCredentialsMethod(CustomScriptConfiguration customScriptConfiguration, String configId) { try { log.debug("Executing python 'getBindCredentialsMethod' method"); @@ -97,6 +117,18 @@ public boolean executeExternalUpdateUserMethods(GluuCustomPerson user) { return result; } + public boolean executeExternalUpdateSourceUserMethods(GluuSimplePerson user) { + boolean result = true; + for (CustomScriptConfiguration customScriptConfiguration : this.customScriptConfigurations) { + result &= executeExternalUpdateSourceUserMethod(customScriptConfiguration, user); + if (!result) { + return result; + } + } + + return result; + } + public BindCredentials executeExternalGetBindCredentialsMethods(String configId) { BindCredentials result = null; for (CustomScriptConfiguration customScriptConfiguration : this.customScriptConfigurations) {