Yair Zaslavsky has uploaded a new change for review. Change subject: core: pre processing for search-generated ldap filters ......................................................................
core: pre processing for search-generated ldap filters The search generates a uniform ldap uery in format that contains upper case keys with $ sign before them - for example ($PRINCIPAL_NAME=a...@ovirt.org) In case of open ldap and RHDS, principal name (i.e - user@domain) should not be passed to the ldap server as the ldap query that is being generated uses the "uid" attribute which is based on user name and not UPN. Furthermore, at least some of the versions of RHDS, and open ldap do not contain support for UPN upon out of the box installation. Instead of passing the UPN to the query, it should be split, and the ldap query should be run with a filter that contains only the user part. Change-Id: I35744eb423ca7f553bf7e9b20c72179bca4e6827 Bug-Url: https://bugzilla.redhat.com/991800 Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapFilterSearchEnginePreProcessor.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapQueryMetadataFactoryImpl.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/NoOpLdapFilterSearchEnginePreProcessor.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/SearchQueryFotmatter.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/UpnSplitterLdapFilterSearchEnginePreProcessor.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/adbroker/LdapFilterSearchEnginePreProcessorTest.java 6 files changed, 96 insertions(+), 11 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/94/17794/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapFilterSearchEnginePreProcessor.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapFilterSearchEnginePreProcessor.java new file mode 100644 index 0000000..6622095 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapFilterSearchEnginePreProcessor.java @@ -0,0 +1,9 @@ +package org.ovirt.engine.core.bll.adbroker; + +/** + * This defines the pre processing operation to be carried out on the filter of an LDAP query issued by the search + * mechanism + */ +public interface LdapFilterSearchEnginePreProcessor { + String preProcess(String filter); +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapQueryMetadataFactoryImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapQueryMetadataFactoryImpl.java index 0409bda..fd5d00c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapQueryMetadataFactoryImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/LdapQueryMetadataFactoryImpl.java @@ -17,6 +17,10 @@ private static EnumMap<SearchLangageLDAPTokens, String> dsSearchSyntaxMap; private static EnumMap<SearchLangageLDAPTokens, String> itdsSearchSyntaxMap; private static EnumMap<SearchLangageLDAPTokens, String> openLdapSearchSyntaxMap; + private static LdapFilterSearchEnginePreProcessor noOpFilterSearchEnginePreProcessor = + new NoOpLdapFilterSearchEnginePreProcessor(); + private static LdapFilterSearchEnginePreProcessor upnSplitterLdapFilterSearchEnginePreProcessor = + new UpnSplitterLdapFilterSearchEnginePreProcessor(); @Override public LdapQueryMetadata getLdapQueryMetadata(LdapProviderType providerType, LdapQueryData queryData) { @@ -157,7 +161,7 @@ new ADUserContextMapper(), SearchControls.SUBTREE_SCOPE, ADUserContextMapper.USERS_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(activeDirectorySearchSyntaxMap), + new SearchQueryFotmatter(activeDirectorySearchSyntaxMap, noOpFilterSearchEnginePreProcessor), ADLdapGuidEncoder.getInstance()); adHashMap.put(LdapQueryType.searchUsers, searchUsersMetadata); @@ -167,7 +171,7 @@ new ADGroupContextMapper(), SearchControls.SUBTREE_SCOPE, ADGroupContextMapper.GROUP_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(activeDirectorySearchSyntaxMap), + new SearchQueryFotmatter(activeDirectorySearchSyntaxMap, noOpFilterSearchEnginePreProcessor), ADLdapGuidEncoder.getInstance()); adHashMap.put(LdapQueryType.searchGroups, searchGroupsMetadata); return adHashMap; @@ -253,7 +257,7 @@ new IPAUserContextMapper(), SearchControls.SUBTREE_SCOPE, IPAUserContextMapper.USERS_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(ipaSearchSyntaxMap), + new SearchQueryFotmatter(ipaSearchSyntaxMap, noOpFilterSearchEnginePreProcessor), DefaultLdapGuidEncoder.getInstance()); ipaHashMap.put(LdapQueryType.searchUsers, ipaSearchUsersMetadata); @@ -263,7 +267,7 @@ new IPAGroupContextMapper(), SearchControls.SUBTREE_SCOPE, IPAGroupContextMapper.GROUP_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(ipaSearchSyntaxMap), + new SearchQueryFotmatter(ipaSearchSyntaxMap, noOpFilterSearchEnginePreProcessor), DefaultLdapGuidEncoder.getInstance()); ipaHashMap.put(LdapQueryType.searchGroups, ipaSearchGroupsMetadata); @@ -353,7 +357,7 @@ new RHDSUserContextMapper(), SearchControls.SUBTREE_SCOPE, RHDSUserContextMapper.USERS_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(dsSearchSyntaxMap), + new SearchQueryFotmatter(dsSearchSyntaxMap, upnSplitterLdapFilterSearchEnginePreProcessor), RHDSLdapGuidEncoder.getInstance()); dsHashMap.put(LdapQueryType.searchUsers, rhdsSearchUsersMetadata); @@ -363,7 +367,7 @@ new RHDSGroupContextMapper(), SearchControls.SUBTREE_SCOPE, RHDSGroupContextMapper.GROUP_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(dsSearchSyntaxMap), + new SearchQueryFotmatter(dsSearchSyntaxMap, noOpFilterSearchEnginePreProcessor), RHDSLdapGuidEncoder.getInstance()); dsHashMap.put(LdapQueryType.searchGroups, rhdsSearchGroupsMetadata); @@ -451,7 +455,7 @@ new ITDSUserContextMapper(), SearchControls.SUBTREE_SCOPE, ITDSUserContextMapper.USERS_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(itdsSearchSyntaxMap), + new SearchQueryFotmatter(itdsSearchSyntaxMap, noOpFilterSearchEnginePreProcessor), DefaultLdapGuidEncoder.getInstance()); itdsHashMap.put(LdapQueryType.searchUsers, itdsSearchUsersMetadata); @@ -461,7 +465,7 @@ new ITDSGroupContextMapper(), SearchControls.SUBTREE_SCOPE, ITDSGroupContextMapper.GROUP_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(itdsSearchSyntaxMap), + new SearchQueryFotmatter(itdsSearchSyntaxMap, noOpFilterSearchEnginePreProcessor), DefaultLdapGuidEncoder.getInstance()); itdsHashMap.put(LdapQueryType.searchGroups, itdsSearchGroupsMetadata); @@ -549,7 +553,7 @@ new OpenLdapUserContextMapper(), SearchControls.SUBTREE_SCOPE, OpenLdapUserContextMapper.USERS_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(openLdapSearchSyntaxMap), + new SearchQueryFotmatter(openLdapSearchSyntaxMap, upnSplitterLdapFilterSearchEnginePreProcessor), new DefaultGuidEncoder()); openLdapHashMap.put(LdapQueryType.searchUsers, OpenLdapSearchUsersMetadata); @@ -559,7 +563,7 @@ new OpenLdapGroupContextMapper(), SearchControls.SUBTREE_SCOPE, OpenLdapGroupContextMapper.GROUP_ATTRIBUTE_FILTER, - new SearchQueryFotmatter(openLdapSearchSyntaxMap), + new SearchQueryFotmatter(openLdapSearchSyntaxMap, noOpFilterSearchEnginePreProcessor), new DefaultGuidEncoder()); openLdapHashMap.put(LdapQueryType.searchGroups, OpenLdapSearchGroupsMetadata); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/NoOpLdapFilterSearchEnginePreProcessor.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/NoOpLdapFilterSearchEnginePreProcessor.java new file mode 100644 index 0000000..cc89adf --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/NoOpLdapFilterSearchEnginePreProcessor.java @@ -0,0 +1,10 @@ +package org.ovirt.engine.core.bll.adbroker; + +public class NoOpLdapFilterSearchEnginePreProcessor implements LdapFilterSearchEnginePreProcessor { + + @Override + public String preProcess(String filter) { + return filter; + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/SearchQueryFotmatter.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/SearchQueryFotmatter.java index 7a3a356..87b74ea 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/SearchQueryFotmatter.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/SearchQueryFotmatter.java @@ -8,9 +8,12 @@ public class SearchQueryFotmatter implements LdapQueryFormatter<LdapQueryExecution> { private final EnumMap<SearchLangageLDAPTokens, String> tokensToLDAPKeys; + private LdapFilterSearchEnginePreProcessor preProcessor; - public SearchQueryFotmatter(EnumMap<SearchLangageLDAPTokens, String> tokensToLDAPKeys) { + public SearchQueryFotmatter(EnumMap<SearchLangageLDAPTokens, String> tokensToLDAPKeys, + LdapFilterSearchEnginePreProcessor p) { this.tokensToLDAPKeys = tokensToLDAPKeys; + this.preProcessor = p; } /** @@ -23,6 +26,7 @@ public LdapQueryExecution format(LdapQueryMetadata queryMetadata) { String filter = (String) queryMetadata.getQueryData().getFilterParameters()[0]; + filter = preProcessor.preProcess(filter); for (Entry<SearchLangageLDAPTokens, String> tokenEntry : tokensToLDAPKeys.entrySet()) { filter = StringUtils.replace(filter, tokenEntry.getKey().name(), tokenEntry.getValue()); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/UpnSplitterLdapFilterSearchEnginePreProcessor.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/UpnSplitterLdapFilterSearchEnginePreProcessor.java new file mode 100644 index 0000000..7d7a4db --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/UpnSplitterLdapFilterSearchEnginePreProcessor.java @@ -0,0 +1,32 @@ +package org.ovirt.engine.core.bll.adbroker; + +/** + * The filter generated by the search mechanism contains the $PRINCIPAL_NAME entry + * to perform search by UPN. + * Thie filter takes the part after the equation sign (as the $PRINCIPAL_NAME part of + * the filter looks like ($PRINCIPAL_NAME=user@domain) + * and splits to user and domain. + * It composes back the filter, so the part of $PRINCIPAL_NAME will not look like + * ($PRINCIPAL_NAME=user) + * This is relevant for RHDS and OpenLdap + */ +public class UpnSplitterLdapFilterSearchEnginePreProcessor implements LdapFilterSearchEnginePreProcessor { + + @Override + public String preProcess(String filter) { + int principalNameIdx = filter.indexOf(SearchLangageLDAPTokens.$PRINCIPAL_NAME.toString()); + if (principalNameIdx != -1) { + int equalsIdx = filter.indexOf('=', principalNameIdx); + int closingParen = filter.indexOf(')', equalsIdx); + String user = filter.substring(equalsIdx + 1, closingParen); + if (user.indexOf('@') != -1) { // Indeed a principal name format + String[] parts = user.split("@"); + user = parts[0]; + } + filter = filter.substring(0, equalsIdx + 1) + user + filter.substring(closingParen); + + } + return filter; + } + +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/adbroker/LdapFilterSearchEnginePreProcessorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/adbroker/LdapFilterSearchEnginePreProcessorTest.java new file mode 100644 index 0000000..348517d --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/adbroker/LdapFilterSearchEnginePreProcessorTest.java @@ -0,0 +1,26 @@ +package org.ovirt.engine.core.bll.adbroker; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class LdapFilterSearchEnginePreProcessorTest { + + @Test + public void testNoOp() { + String filter = "(|($SN=oVirt)($DEPARTMENT=acme))"; + NoOpLdapFilterSearchEnginePreProcessor preProcessor = new NoOpLdapFilterSearchEnginePreProcessor(); + String result = preProcessor.preProcess(filter); + assertEquals(filter, result); + } + + @Test + public void testUpnSplit() { + String filter = "(|($EMAIL=a...@aovirt.org)($PRINCIPAL_NAME=test...@ovirt.org)($DUMMY=dummy)"; + UpnSplitterLdapFilterSearchEnginePreProcessor preProcessor = + new UpnSplitterLdapFilterSearchEnginePreProcessor(); + String result = preProcessor.preProcess(filter); + assertEquals("(|($EMAIL=a...@aovirt.org)($PRINCIPAL_NAME=testing)($DUMMY=dummy)", result); + } + +} -- To view, visit http://gerrit.ovirt.org/17794 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I35744eb423ca7f553bf7e9b20c72179bca4e6827 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches