package org.ovirt.engine.core.ldap; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; public class RootDSEData { private String domainDN = null; private LdapProviderType ldapProviderType = null; private final static String RHDS_NAMING_CONTEXT = "o=netscaperoot"; public static String getDefaultNamingContextFromNamingContexts(Attribute namingContexts) { for (int index = 0; index < namingContexts.size(); ++index) { String namingContext; try { namingContext = (String) namingContexts.get(index); } catch (NamingException e) { return null; } if (!RHDS_NAMING_CONTEXT.equalsIgnoreCase(namingContext)) { return namingContext; } } return null; } public boolean applyDomainAttributes(Attributes attributes) throws NamingException { boolean retVal = false; Attribute attribute = attributes.get(RootDSEQueryInfo.DEFAULT_NAMING_CONTEXT_RESULT_ATTRIBUTE); if (attribute != null) { domainDN = (String) attribute.get(); ldapProviderType = LdapProviderType.activeDirectory; retVal = true; } else { Attribute namingContextAttribute = attributes.get(RootDSEQueryInfo.NAMING_CONTEXTS_RESULT_ATTRIBUTE); Attribute rhdsAttribute = attributes.get(RootDSEQueryInfo.RHDS_PROPERTY); if (namingContextAttribute != null) { domainDN = getDefaultNamingContextFromNamingContexts(namingContextAttribute); if (rhdsAttribute != null) { ldapProviderType = LdapProviderType.rhds; } else { ldapProviderType = LdapProviderType.ipa; } retVal = true; } } return retVal; } public RootDSEData(DirContext dirContext) throws NamingException { // Queries the rootDSE and get the "defaultNamingContext" attribute value - // this attribute will be a part of the LDAP URL to perform users queries (i.e - search for a user) SearchControls controls = RootDSEQueryInfo.createSearchControls(); String query = RootDSEQueryInfo.ROOT_DSE_LDAP_QUERY; NamingEnumeration<SearchResult> searchResults = dirContext.search("", query, controls); boolean succeeded = false; // The information on base DN is located in the attribute "defaultNamingContext" while (searchResults.hasMoreElements() && !succeeded) { SearchResult searchResult = searchResults.nextElement(); Attributes attributes = searchResult.getAttributes(); succeeded = applyDomainAttributes(attributes); } } public String getDomainDN() { return domainDN; } public void setDomainDN(String domainDN) { this.domainDN = domainDN; } public LdapProviderType getLdapProviderType() { return ldapProviderType; } public void setLdapProviderType(LdapProviderType ldapProviderType) { this.ldapProviderType = ldapProviderType; } }