Uwe Grawert has uploaded a new change for review. Change subject: Add support for OpenLDAP as domain provider ......................................................................
Add support for OpenLDAP as domain provider Change-Id: I7fa5c92088a34d8c3881ce839963a13fe9ca4f84 Signed-off-by: Uwe Grawert <graw...@b1-systems.de> --- 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/OpenLdapGroupAttributes.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapGroupContextMapper.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapLdapGuidEncoder.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSE.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSEAttributes.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSEContextMapper.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUPNLdapQueryExecutionFormatter.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUserAttributes.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUserContextMapper.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/RootDSEFactory.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/LdapProviderType.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/RootDSEQueryInfo.java A backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/OpenLdapUserContextMapper.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/JndiAction.java 15 files changed, 482 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/29/13829/1 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 e24fe1b..d03f5ef 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 @@ -16,6 +16,7 @@ private static EnumMap<SearchLangageLDAPTokens, String> ipaSearchSyntaxMap; private static EnumMap<SearchLangageLDAPTokens, String> dsSearchSyntaxMap; private static EnumMap<SearchLangageLDAPTokens, String> itdsSearchSyntaxMap; + private static EnumMap<SearchLangageLDAPTokens, String> openLdapSearchSyntaxMap; @Override public LdapQueryMetadata getLdapQueryMetadata(LdapProviderType providerType, LdapQueryData queryData) { @@ -38,6 +39,7 @@ Map<LdapQueryType, LdapQueryMetadata> ipaHashMap = setIPAMap(); Map<LdapQueryType, LdapQueryMetadata> dsHashMap = setDSMap(); Map<LdapQueryType, LdapQueryMetadata> itdsHashMap = setITDSMap(); + Map<LdapQueryType, LdapQueryMetadata> openLdapHashMap = setOpenLdapMap(); Map<LdapQueryType, LdapQueryMetadata> generalHashMap = setGeneralProviderMap(); queryMetadataMap = new HashMap<LdapProviderType, Map<LdapQueryType, LdapQueryMetadata>>(); @@ -45,6 +47,7 @@ queryMetadataMap.put(LdapProviderType.ipa, ipaHashMap); queryMetadataMap.put(LdapProviderType.rhds, dsHashMap); queryMetadataMap.put(LdapProviderType.itds, itdsHashMap); + queryMetadataMap.put(LdapProviderType.openLdap, openLdapHashMap); queryMetadataMap.put(LdapProviderType.general, generalHashMap); instance = new LdapQueryMetadataFactoryImpl(); @@ -466,6 +469,104 @@ } + private static HashMap<LdapQueryType, LdapQueryMetadata> setOpenLdapMap() { + HashMap<LdapQueryType, LdapQueryMetadata> openLdapHashMap = new HashMap<LdapQueryType, LdapQueryMetadata>(); + openLdapHashMap.put(LdapQueryType.getGroupByDN, new LdapQueryMetadataImpl( + "(cn=*)", + "%1$s", + new OpenLdapGroupContextMapper(), + SearchControls.OBJECT_SCOPE, + OpenLdapGroupContextMapper.GROUP_ATTRIBUTE_FILTER, + new SimpleLdapQueryExecutionFormatter(), + new OpenLdapLdapGuidEncoder())); + openLdapHashMap.put(LdapQueryType.getGroupByGuid, new LdapQueryMetadataImpl( + "(entryUUID=%1$s)", + "", + new OpenLdapGroupContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapGroupContextMapper.GROUP_ATTRIBUTE_FILTER, + new SimpleLdapQueryExecutionFormatter(), + new OpenLdapLdapGuidEncoder())); + openLdapHashMap.put(LdapQueryType.getUserByGuid, new LdapQueryMetadataImpl( + "(entryUUID=%1$s)", + "", + new OpenLdapUserContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapUserContextMapper.USERS_ATTRIBUTE_FILTER, + new SimpleLdapQueryExecutionFormatter(), + new OpenLdapLdapGuidEncoder())); + openLdapHashMap.put(LdapQueryType.getGroupByName, new LdapQueryMetadataImpl( + "(&(objectClass=groupOfNames)(cn=%1$s))", + "", + new OpenLdapGroupContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapGroupContextMapper.GROUP_ATTRIBUTE_FILTER, + new SimpleLdapQueryExecutionFormatter(), + new OpenLdapLdapGuidEncoder())); + openLdapHashMap.put(LdapQueryType.getUserByPrincipalName, new LdapQueryMetadataImpl( + "(uid=%1$s)", + "", + new OpenLdapUserContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapUserContextMapper.USERS_ATTRIBUTE_FILTER, + new SimpleLdapQueryExecutionFormatter(), + new OpenLdapLdapGuidEncoder())); + openLdapHashMap.put(LdapQueryType.getUserByName, new LdapQueryMetadataImpl( + "(uid=%1$s)", + "", + new OpenLdapUserContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapUserContextMapper.USERS_ATTRIBUTE_FILTER, + new SimpleLdapQueryExecutionFormatter(), + new OpenLdapLdapGuidEncoder())); + openLdapHashMap.put(LdapQueryType.rootDSE, new LdapQueryMetadataImpl( + "(objectClass=*)", + "", + new OpenLdapRootDSEContextMapper(), + SearchControls.OBJECT_SCOPE, + OpenLdapRootDSEContextMapper.ROOTDSE_ATTRIBUTE_FILTER, + new SimpleLdapQueryExecutionFormatter(), + new OpenLdapLdapGuidEncoder())); + openLdapHashMap.put(LdapQueryType.getGroupsByGroupNames, new LdapQueryMetadataImpl( + "(&(objectClass=groupOfNames)(cn=%1$s))", + "", + new OpenLdapGroupContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapGroupContextMapper.GROUP_ATTRIBUTE_FILTER, + new MultipleLdapQueryExecutionFormatter("(|", ")"), + new OpenLdapLdapGuidEncoder())); + openLdapHashMap.put(LdapQueryType.getUsersByUserGuids, new LdapQueryMetadataImpl( + "(uid=%1$s)", + "", + new OpenLdapUserContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapUserContextMapper.USERS_ATTRIBUTE_FILTER, + new MultipleLdapQueryExecutionFormatter("(|", ")"), + new OpenLdapLdapGuidEncoder())); + LdapQueryMetadataImpl OpenLdapSearchUsersMetadata = new LdapQueryMetadataImpl( + "this string is replaced by user input meta-query", + "", + new OpenLdapUserContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapUserContextMapper.USERS_ATTRIBUTE_FILTER, + new SearchQueryFotmatter(openLdapSearchSyntaxMap), + new OpenLdapLdapGuidEncoder()); + openLdapHashMap.put(LdapQueryType.searchUsers, OpenLdapSearchUsersMetadata); + + LdapQueryMetadataImpl OpenLdapSearchGroupsMetadata = new LdapQueryMetadataImpl( + "this string is replaced by user input meta-query", + "", + new OpenLdapGroupContextMapper(), + SearchControls.SUBTREE_SCOPE, + OpenLdapGroupContextMapper.GROUP_ATTRIBUTE_FILTER, + new SearchQueryFotmatter(openLdapSearchSyntaxMap), + new OpenLdapLdapGuidEncoder()); + openLdapHashMap.put(LdapQueryType.searchGroups, OpenLdapSearchGroupsMetadata); + + return openLdapHashMap; + + } + private static void prepareQueryFormatters() { activeDirectorySearchSyntaxMap = new EnumMap<SearchLangageLDAPTokens, String>(SearchLangageLDAPTokens.class); activeDirectorySearchSyntaxMap.put(SearchLangageLDAPTokens.$GIVENNAME, "givenname"); @@ -500,5 +601,13 @@ itdsSearchSyntaxMap.put(SearchLangageLDAPTokens.$LDAP_GROUP_CATEGORY, "objectClass=groupOfUniqueNames"); itdsSearchSyntaxMap.put(SearchLangageLDAPTokens.$CN, "cn"); itdsSearchSyntaxMap.put(SearchLangageLDAPTokens.$USER_ACCOUNT_NAME, "uid"); + + openLdapSearchSyntaxMap = new EnumMap<SearchLangageLDAPTokens, String>(SearchLangageLDAPTokens.class); + openLdapSearchSyntaxMap.put(SearchLangageLDAPTokens.$GIVENNAME, "givenname"); + openLdapSearchSyntaxMap.put(SearchLangageLDAPTokens.$USER_ACCOUNT_TYPE, "&(objectClass=person)"); + openLdapSearchSyntaxMap.put(SearchLangageLDAPTokens.$PRINCIPAL_NAME, "uid"); + openLdapSearchSyntaxMap.put(SearchLangageLDAPTokens.$LDAP_GROUP_CATEGORY, "objectClass=groupOfNames"); + openLdapSearchSyntaxMap.put(SearchLangageLDAPTokens.$CN, "cn"); + openLdapSearchSyntaxMap.put(SearchLangageLDAPTokens.$USER_ACCOUNT_NAME, "uid"); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapGroupAttributes.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapGroupAttributes.java new file mode 100644 index 0000000..dfd9211 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapGroupAttributes.java @@ -0,0 +1,6 @@ +package org.ovirt.engine.core.bll.adbroker; + +public enum OpenLdapGroupAttributes { + entryuuid, + memberof +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapGroupContextMapper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapGroupContextMapper.java new file mode 100644 index 0000000..2089162 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapGroupContextMapper.java @@ -0,0 +1,64 @@ +package org.ovirt.engine.core.bll.adbroker; + +import static org.ovirt.engine.core.bll.adbroker.OpenLdapGroupAttributes.entryuuid; +import static org.ovirt.engine.core.bll.adbroker.OpenLdapGroupAttributes.memberof; + +import java.util.ArrayList; +import java.util.List; + +import javax.naming.NamingEnumeration; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; + +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.log.Log; +import org.ovirt.engine.core.utils.log.LogFactory; +import org.springframework.ldap.core.ContextMapper; +import org.springframework.ldap.core.DirContextAdapter; + +public class OpenLdapGroupContextMapper implements ContextMapper { + + private static Log log = LogFactory.getLog(LdapBrokerImpl.class); + + public final static String[] GROUP_ATTRIBUTE_FILTER = { memberof.name(), entryuuid.name() }; + + @Override + public Object mapFromContext(Object ctx) { + if (ctx == null) { + return null; + } + + DirContextAdapter searchResult = (DirContextAdapter) ctx; + Attributes attributes = searchResult.getAttributes(); + + if (attributes == null) { + return null; + } + + if (attributes.get(entryuuid.name()) == null) { + return null; + } + + try { + List<String> memberOf = new ArrayList<String>(); + Attribute att = attributes.get(memberof.name()); + if (att != null) { + NamingEnumeration<?> groupsNames = att.getAll(); + while (groupsNames.hasMoreElements()) { + memberOf.add((String) groupsNames.nextElement()); + } + } + + String objectGuid = (String) attributes.get(entryuuid.name()).get(0); + + String distinguishedName = searchResult.getNameInNamespace(); + distinguishedName = LdapBrokerUtils.hadleNameEscaping(distinguishedName); + GroupSearchResult groupSearchResult = + new GroupSearchResult(Guid.createGuidFromString(objectGuid), memberOf, distinguishedName); + return groupSearchResult; + } catch (Exception ex) { + log.error("Failed populating group", ex); + return null; + } + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapLdapGuidEncoder.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapLdapGuidEncoder.java new file mode 100644 index 0000000..b10e499 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapLdapGuidEncoder.java @@ -0,0 +1,12 @@ +package org.ovirt.engine.core.bll.adbroker; + +import org.ovirt.engine.core.compat.Guid; + +public class OpenLdapLdapGuidEncoder implements LdapGuidEncoder { + + @Override + public String encodeGuid(Guid guid) { + return guid.toString(); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSE.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSE.java new file mode 100644 index 0000000..2466054 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSE.java @@ -0,0 +1,35 @@ +package org.ovirt.engine.core.bll.adbroker; + +import javax.naming.NamingException; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; + + +public class OpenLdapRootDSE implements RootDSE { + + private String defaultNamingContext; + + public OpenLdapRootDSE() { + } + + public OpenLdapRootDSE(String defaultNamingContext) { + this.defaultNamingContext = defaultNamingContext; + } + + public OpenLdapRootDSE(Attributes rootDseRecords) throws NamingException { + Attribute namingContexts = rootDseRecords.get(OpenLdapRootDSEAttributes.namingContexts.name()); + if ( namingContexts != null ) { + this.defaultNamingContext = namingContexts.get(0).toString(); + } + } + + @Override + public void setDefaultNamingContext(String defaultNamingContext) { + this.defaultNamingContext = defaultNamingContext; + } + + @Override + public String getDefaultNamingContext() { + return defaultNamingContext; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSEAttributes.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSEAttributes.java new file mode 100644 index 0000000..645687a --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSEAttributes.java @@ -0,0 +1,5 @@ +package org.ovirt.engine.core.bll.adbroker; + +public enum OpenLdapRootDSEAttributes { + namingContexts +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSEContextMapper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSEContextMapper.java new file mode 100644 index 0000000..6e75309 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapRootDSEContextMapper.java @@ -0,0 +1,44 @@ +package org.ovirt.engine.core.bll.adbroker; + +import static org.ovirt.engine.core.bll.adbroker.OpenLdapRootDSEAttributes.namingContexts; + +import javax.naming.NamingException; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; + +import org.ovirt.engine.core.utils.log.Log; +import org.ovirt.engine.core.utils.log.LogFactory; +import org.springframework.ldap.core.ContextMapper; +import org.springframework.ldap.core.DirContextAdapter; + +public class OpenLdapRootDSEContextMapper implements ContextMapper { + + private static Log log = LogFactory.getLog(OpenLdapRootDSEContextMapper.class); + + public final static String[] ROOTDSE_ATTRIBUTE_FILTER = { namingContexts.name() }; + + @Override + public Object mapFromContext(Object ctx) { + + DirContextAdapter searchResult = (DirContextAdapter) ctx; + Attributes attributes = searchResult.getAttributes(); + + if (attributes == null) { + return null; + } + + Attribute att = attributes.get(namingContexts.name()); + + if (att != null) { + try { + return (att.get(0)); + } catch (NamingException e) { + log.error("Failed getting naming contexts from root DSE", e); + return null; + } + } else { + return null; + } + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUPNLdapQueryExecutionFormatter.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUPNLdapQueryExecutionFormatter.java new file mode 100644 index 0000000..1e38f3c --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUPNLdapQueryExecutionFormatter.java @@ -0,0 +1,41 @@ +package org.ovirt.engine.core.bll.adbroker; + +/** + * OpenLdap doesn't have a UPN, so this formatter practically adjusts the query to search by user name instead of UPN + */ +public class OpenLdapUPNLdapQueryExecutionFormatter extends SimpleLdapQueryExecutionFormatter { + + /** + * Put the user name instead of the UPN in the filter + */ + protected String getFilter(LdapQueryMetadata queryMetadata) { + String userPrincipalName = (String)queryMetadata.getQueryData().getFilterParameters()[0]; + String userName = userPrincipalName.split("@")[0]; + return String.format(queryMetadata.getFilter(), userName); + } + + @Override + protected String getDisplayFilter(LdapQueryMetadata queryMetadata) { + return getFilter(queryMetadata); + } + + @Override + public LdapQueryExecution format(LdapQueryMetadata queryMetadata) { + + String filter = getFilter(queryMetadata); + + String baseDN = + String.format(queryMetadata.getBaseDN(), + getEncodedParameters(queryMetadata.getQueryData().getBaseDNParameters(), + queryMetadata.getLdapGuidEncoder())); + + return new LdapQueryExecution(filter, + getDisplayFilter(queryMetadata), + baseDN, + queryMetadata.getContextMapper(), + queryMetadata.getSearchScope(), + queryMetadata.getReturningAttributes(), + queryMetadata.getQueryData().getDomain()); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUserAttributes.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUserAttributes.java new file mode 100644 index 0000000..2e12840 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUserAttributes.java @@ -0,0 +1,11 @@ +package org.ovirt.engine.core.bll.adbroker; + +public enum OpenLdapUserAttributes { + entryuuid, + givenname, + title, + mail, + sn, + memberof, + uid +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUserContextMapper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUserContextMapper.java new file mode 100644 index 0000000..34af868 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/OpenLdapUserContextMapper.java @@ -0,0 +1,109 @@ +package org.ovirt.engine.core.bll.adbroker; + +import static org.ovirt.engine.core.bll.adbroker.OpenLdapUserAttributes.uid; +import static org.ovirt.engine.core.bll.adbroker.OpenLdapUserAttributes.givenname; +import static org.ovirt.engine.core.bll.adbroker.OpenLdapUserAttributes.entryuuid; +import static org.ovirt.engine.core.bll.adbroker.OpenLdapUserAttributes.mail; +import static org.ovirt.engine.core.bll.adbroker.OpenLdapUserAttributes.memberof; +import static org.ovirt.engine.core.bll.adbroker.OpenLdapUserAttributes.sn; +import static org.ovirt.engine.core.bll.adbroker.OpenLdapUserAttributes.title; + +import java.util.ArrayList; +import java.util.List; + +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; + +import org.springframework.ldap.core.ContextMapper; +import org.springframework.ldap.core.DirContextAdapter; + +import org.ovirt.engine.core.common.businessentities.LdapUser; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.log.Log; +import org.ovirt.engine.core.utils.log.LogFactory; + +public class OpenLdapUserContextMapper implements ContextMapper { + + private static Log log = LogFactory.getLog(LdapBrokerImpl.class); + + public final static String[] USERS_ATTRIBUTE_FILTER = { entryuuid.name(), + givenname.name(), uid.name(), title.name(), mail.name(), memberof.name(), + sn.name() }; + + @Override + public Object mapFromContext(Object ctx) { + + if (ctx == null) { + return null; + } + + DirContextAdapter searchResult = (DirContextAdapter) ctx; + Attributes attributes = searchResult.getAttributes(); + + if (attributes == null) { + return null; + } + + LdapUser user; + user = new LdapUser(); + + // user's Guid + String objectGuid; + try { + objectGuid = (String)attributes.get(entryuuid.name()).get(0); + user.setUserId(Guid.createGuidFromString(objectGuid)); + + // Getting other string properties + Attribute att = attributes.get(uid.name()); + if (att != null) { + user.setUserName((String) att.get(0)); + } else { + return null; + } + + att = attributes.get(givenname.name()); + if (att != null) { + user.setName((String) att.get(0)); + } + att = attributes.get(sn.name()); + if (att != null) { + user.setSurName((String) att.get(0)); + } + att = attributes.get(title.name()); + if (att != null) { + user.setTitle((String) att.get(0)); + } + + att = attributes.get(mail.name()); + if (att != null) { + user.setEmail((String) att.get(0)); + } + + att = attributes.get(memberof.name()); + if (att != null) { + NamingEnumeration<?> groupsNames = att.getAll(); + List<String> memberOf = new ArrayList<String>(); + while (groupsNames.hasMoreElements()) { + memberOf.add((String) groupsNames.nextElement()); + } + user.setMemberof(memberOf); + } else { + // In case the attribute is null, an empty list is set + // in the "memberOf" field in order to avoid a + // NullPointerException + // while traversing on the groups list in + // LdapBrokerCommandBase.ProceedGroupsSearchResult + + user.setMemberof(new ArrayList<String>()); + } + } catch (NamingException e) { + log.error("Failed populating user",e); + return null; + } + + return user; + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/RootDSEFactory.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/RootDSEFactory.java index 67d9a51..44c11ba 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/RootDSEFactory.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/adbroker/RootDSEFactory.java @@ -18,6 +18,8 @@ return new RHDSRootDSE(rootDseRecords); case itds: return new ITDSRootDSE(rootDseRecords); + case openLdap: + return new OpenLdapRootDSE(rootDseRecords); case general: default: return new GeneralRootDSE(rootDseRecords); diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/LdapProviderType.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/LdapProviderType.java index 67f54dd..96e3cfd 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/LdapProviderType.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/LdapProviderType.java @@ -5,6 +5,7 @@ ipa("389 Project"), rhds("Red Hat"), itds("IBM Tivoli Directory Server"), + openLdap("OpenLDAP"), general("Deprecated - for auto-detection usages"); // for rootDSE purpose private String vendorName; diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/RootDSEQueryInfo.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/RootDSEQueryInfo.java index 01294c6..60033ff 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/RootDSEQueryInfo.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/ldap/RootDSEQueryInfo.java @@ -21,8 +21,10 @@ * @return */ public static SearchControls createSearchControls() { + String[] returnAttributes = {NAMING_CONTEXTS_RESULT_ATTRIBUTE, DEFAULT_NAMING_CONTEXT_RESULT_ATTRIBUTE}; SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.OBJECT_SCOPE); + searchControls.setReturningAttributes(returnAttributes); // Added this in order to prevent a warning saying: "the returning obj flag wasn't set, setting it to true" searchControls.setReturningObjFlag(true); return searchControls; diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/OpenLdapUserContextMapper.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/OpenLdapUserContextMapper.java new file mode 100644 index 0000000..ee54708 --- /dev/null +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/OpenLdapUserContextMapper.java @@ -0,0 +1,34 @@ +package org.ovirt.engine.core.utils.ipa; + +import static org.ovirt.engine.core.utils.kerberos.InstallerConstants.ERROR_PREFIX; + +import javax.naming.NamingException; +import javax.naming.directory.Attributes; + +import org.springframework.ldap.core.ContextMapper; +import org.springframework.ldap.core.DirContextAdapter; + +public class OpenLdapUserContextMapper implements ContextMapper { + @Override + public Object mapFromContext(Object ctx) { + + if (ctx == null) { + return null; + } + + DirContextAdapter searchResult = (DirContextAdapter) ctx; + Attributes attributes = searchResult.getAttributes(); + + if (attributes == null) { + return null; + } + + try { + return attributes.get("uid").get(0); + } catch (NamingException e) { + System.err.println(ERROR_PREFIX + "Failed getting user GUID"); + return null; + } + } + +} diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/JndiAction.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/JndiAction.java index 201fb1d..af42b2d 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/JndiAction.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/JndiAction.java @@ -94,7 +94,7 @@ SearchControls controls = new SearchControls(); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Adding all the three attributes possible, as RHDS doesn't return the nsUniqueId by default - controls.setReturningAttributes(new String[]{"nsUniqueId", "ipaUniqueId","objectGuid","uniqueIdentifier"}); + controls.setReturningAttributes(new String[]{"nsUniqueId", "ipaUniqueId","objectGuid","uniqueIdentifier","entryuuid"}); // Added this in order to prevent a warning saying: "the returning obj flag wasn't set, setting it to true" controls.setReturningObjFlag(true); currentLdapServer = ldapQueryPath.toString(); @@ -195,6 +195,9 @@ } else if (ldapProviderType.equals(LdapProviderType.itds)) { String uniqueId = (String) sr.getAttributes().get("uniqueIdentifier").get(); guidString += uniqueId; + } else if (ldapProviderType.equals(LdapProviderType.openLdap)) { + String uniqueId = (String) sr.getAttributes().get("entryUUID").get(); + guidString += uniqueId; } else { Object objectGuid = sr.getAttributes().get("objectGUID").get(); byte[] guid = (byte[]) objectGuid; @@ -218,6 +221,9 @@ } else if (ldapProviderType.equals(LdapProviderType.itds)) { userName = userName.split("@")[0]; query = "(&(objectClass=person)(uid=" + userName + "))"; + } else if (ldapProviderType.equals(LdapProviderType.openLdap)) { + userName = userName.split("@")[0]; + query = "(uid=" + userName + ")"; } else { StringBuilder queryBase = new StringBuilder("(&(sAMAccountType=805306368)("); -- To view, visit http://gerrit.ovirt.org/13829 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7fa5c92088a34d8c3881ce839963a13fe9ca4f84 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Uwe Grawert <graw...@b1-systems.de> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches