Yair Zaslavsky has uploaded a new change for review. Change subject: tools: Adding Setting ldap servers for domain ......................................................................
tools: Adding Setting ldap servers for domain This patch adds support for setting ldap servers for a given domain when adding/editting a domain Bug-url: https://bugzilla.redhat.com/894681 change-id: Ic0904f9f6d9432ecac1cebee2790dae902a1329c Signed-off-by: Yair Zaslavsky <[email protected]> --- M backend/manager/conf/kerberos/engine-manage-domains M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/SimpleAuthenticationCheck.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ConfigurationProvider.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/DomainsConfigurationEntry.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/JndiAction.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosConfigCheck.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomains.java 7 files changed, 170 insertions(+), 139 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/65/11065/1 diff --git a/backend/manager/conf/kerberos/engine-manage-domains b/backend/manager/conf/kerberos/engine-manage-domains index 0be51ab..8d9c8fc 100755 --- a/backend/manager/conf/kerberos/engine-manage-domains +++ b/backend/manager/conf/kerberos/engine-manage-domains @@ -44,7 +44,7 @@ usage () { printf "engine-manage-domains: add/edit/delete/validate/list domains\n" printf "USAGE:\n" - printf "\tengine-manage-domains -action=ACTION [-domain=DOMAIN -provider=PROVIDER -user=USER -passwordFile=PASSWORD_FILE -interactive -configFile=PATH -addPermissions -forceDelete] -report\n" + printf "\tengine-manage-domains -action=ACTION [-domain=DOMAIN -provider=PROVIDER -user=USER -passwordFile=PASSWORD_FILE -interactive -configFile=PATH -addPermissions -forceDelete -ldapServers=LDAP_SERVERS] -report\n" printf "Where:\n" printf "\tACTION action to perform (add/edit/delete/validate/list). See details below.\n" printf "\tDOMAIN (mandatory for add, edit and delete) the domain you wish to perform the action on.\n" @@ -53,6 +53,7 @@ printf "\tPASSWORD_FILE (optional for edit, mandatory for add) a file containing the password in the first line.\n" printf "\tinteractive alternative for using -passwordFile - read the password interactively.\n" printf "\tPATH (optional) use the given alternate configuration file.\n" + printf "\tLDAP_SERVERS (optional) a comma delimited list of ldap servers to be set to the domain.\n" printf "\n" printf "\tAvailable actions:\n" printf "\tadd\n" @@ -79,7 +80,7 @@ return 0 } -if [ "$#" -gt 6 -o "$#" -lt 1 ]; then +if [ "$#" -gt 7 -o "$#" -lt 1 ]; then usage exit 1 fi diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/SimpleAuthenticationCheck.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/SimpleAuthenticationCheck.java index 529d425..0255b47 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/SimpleAuthenticationCheck.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ipa/SimpleAuthenticationCheck.java @@ -12,8 +12,8 @@ import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; +import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.ldap.LdapProviderType; -import org.ovirt.engine.core.utils.CLIParser; import org.springframework.ldap.AuthenticationException; import org.springframework.ldap.core.ContextMapper; import org.springframework.ldap.core.LdapTemplate; @@ -30,65 +30,38 @@ ldapProviderType } - private void printUsage() { - System.out.println("Usage:"); - System.out - .println("SimpleAuthenticationCheck: -domain=<domains> -user=<user> -password=<password> -ldapProviderType=<ldapProviderType>"); - } private String getLdapUrl(String ldapServer) { return "ldap://" + ldapServer; } - private boolean validate(CLIParser parser) { - Arguments[] argsToValidate = - { Arguments.domain, Arguments.user, Arguments.password }; - for (Arguments argument : argsToValidate) { - if (!parser.hasArg(argument.name())) { - System.out.println(argument.name() + " is required"); - return false; - } - } - if (LdapProviderType.valueOf(parser.getArg(Arguments.ldapProviderType.name())) == null) { - System.out.println(Arguments.ldapProviderType.name() + " must be one of "); - for (LdapProviderType type : LdapProviderType.values()) { - System.out.println(type.name()); - } - } - return true; - } - public static void main(String[] args) { - SimpleAuthenticationCheck util = new SimpleAuthenticationCheck(); - CLIParser parser = new CLIParser(args); - if (!util.validate(parser)) { - util.printUsage(); - System.exit(ReturnStatus.INPUT_VALIDATION_FAILURE.ordinal()); - } - String username = parser.getArg(Arguments.user.name()); - String password = parser.getArg(Arguments.password.name()); - String domain = parser.getArg(Arguments.domain.name()); - LdapProviderType ldapProviderType = LdapProviderType.valueOf(parser.getArg(Arguments.ldapProviderType.name())); - StringBuffer userGuid = new StringBuffer(); - - ReturnStatus status = - util.printUserGuid(domain, username, password, "localhost:389", userGuid, ldapProviderType); - - System.exit(status.ordinal()); - } - - public ReturnStatus printUserGuid(String domain, + public Pair<ReturnStatus,String> printUserGuid(String domain, String username, String password, - String ldapServerUrl, - StringBuffer userGuid, LdapProviderType ldapProviderType) { + StringBuffer userGuid, LdapProviderType ldapProviderType, List<String> ldapServers) { + Pair<ReturnStatus,String> status = null; + for (String ldapServerUrl:ldapServers) { + status = checkSimpleLdapServer(domain, username, password, userGuid, ldapProviderType, ldapServerUrl); + if (status.getFirst().getExitCode() == ReturnStatus.OK.getExitCode()) { + return status; + } + } + return status; + } + + private Pair<ReturnStatus,String> checkSimpleLdapServer(String domain, + String username, + String password, + StringBuffer userGuid, + LdapProviderType ldapProviderType, + String ldapServerUrl) { LdapContextSource contextSource = getContextSource(domain, ldapProviderType, username, password, ldapServerUrl); try { contextSource.afterPropertiesSet(); } catch (Exception e) { - System.err.println(ERROR_PREFIX + "Failed setting LDAP context for domain " + domain); - return ReturnStatus.LDAP_CONTEXT_FAILURE; + return new Pair(ReturnStatus.LDAP_CONTEXT_FAILURE,ERROR_PREFIX + "Failed setting LDAP context for domain " + domain); } LdapTemplate ldapTemplate = new LdapTemplate(contextSource); @@ -115,8 +88,7 @@ List searchResult = ldapTemplate.search("", query, contextMapper); if (searchResult == null) { - System.err.println(ERROR_PREFIX + "Cannot query user " + username + " from domain " + domain); - return ReturnStatus.CANNOT_QUERY_USER; + return new Pair(ReturnStatus.CANNOT_QUERY_USER,ERROR_PREFIX + "Cannot query user " + username + " from domain " + domain); } else { userGuid.append((String) searchResult.get(0)); System.out.println("User guid is: " + userGuid.toString()); @@ -124,12 +96,11 @@ } catch (org.springframework.ldap.AuthenticationException authEx) { return authenticationReturnStatus(authEx, username, domain); } catch (Exception ex) { - System.err.println(ERROR_PREFIX + "Cannot query user " + username + " from domain " + domain + return new Pair(ReturnStatus.CANNOT_QUERY_USER,ERROR_PREFIX + "Cannot query user " + username + " from domain " + domain + ", details: " + ex.getMessage()); - return ReturnStatus.CANNOT_QUERY_USER; } - return ReturnStatus.OK; + return new Pair(ReturnStatus.OK,""); } /*** @@ -138,20 +109,21 @@ * * @param authEx */ - private ReturnStatus authenticationReturnStatus(AuthenticationException authEx, String userName, String domain) { + private Pair<ReturnStatus,String> authenticationReturnStatus(AuthenticationException authEx, String userName, String domain) { ReturnStatus returnStatus = ReturnStatus.CANNOT_AUTHENTICATE_USER; String authExMessage = authEx.getMessage(); // Using contains() since the AuthenticationException does not have an error code property + String msg = null; if (authExMessage != null && authExMessage.contains(INVALID_CREDENTIALS_ERROR_CODE)) { - System.err.println(ERROR_PREFIX + "Invalid credentials for " + userName + " and domain " + domain - + ", details: " + authEx.getMessage()); + msg = ERROR_PREFIX + "Invalid credentials for " + userName + " and domain " + domain + + ", details: " + authEx.getMessage(); returnStatus = ReturnStatus.INVALID_CREDENTIALS; } else { - System.err.println(ERROR_PREFIX + "Cannot authenticate user " + userName + " to domain " + domain - + ", details: " + authEx.getMessage()); + msg = ERROR_PREFIX + "Cannot authenticate user " + userName + " to domain " + domain + + ", details: " + authEx.getMessage(); } - return returnStatus; + return new Pair(returnStatus, msg); } private static String domainToDN(String domain) { diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ConfigurationProvider.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ConfigurationProvider.java index 1e43dac..774c876 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ConfigurationProvider.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ConfigurationProvider.java @@ -32,7 +32,7 @@ String adUserId, String ldapProviderTypes, String engineConfigExecutable, - String engineConfigProperties) { + String engineConfigProperties, String ldapServerPort) { super(); configVals.put(AdUserName, adUserName); configVals.put(AdUserPassword, adUserPassword); @@ -41,6 +41,7 @@ configVals.put(LdapServers, ldapServers); configVals.put(AdUserId, adUserId); configVals.put(LDAPProviderTypes, ldapProviderTypes); + configVals.put(ConfigValues.LDAPServerPort, ldapServerPort); this.engineConfigExecutable = engineConfigExecutable; this.engineConfigProperties = engineConfigProperties; } diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/DomainsConfigurationEntry.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/DomainsConfigurationEntry.java index a455765..71b972f 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/DomainsConfigurationEntry.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/DomainsConfigurationEntry.java @@ -85,6 +85,10 @@ return valuePerDomain.entrySet(); } + public boolean contains(String domain) { + return valuePerDomain.containsKey(domain); + } + public Set<String> getDomainNames() { return valuePerDomain.keySet(); } 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 0d6126b..0ac9a85 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 @@ -3,6 +3,7 @@ import java.net.URI; import java.security.PrivilegedAction; import java.util.Hashtable; +import java.util.List; import javax.naming.AuthenticationException; import javax.naming.CommunicationException; @@ -19,7 +20,6 @@ import org.ovirt.engine.core.ldap.LdapProviderType; import org.ovirt.engine.core.ldap.LdapSRVLocator; import org.ovirt.engine.core.ldap.RootDSEData; -import org.ovirt.engine.core.utils.dns.DnsSRVLocator.DnsSRVResult; import org.ovirt.engine.core.utils.ipa.RHDSUserContextMapper; /** @@ -32,15 +32,17 @@ private final String domainName; private final LdapProviderType ldapProviderType; private final StringBuffer userGuid; - private DnsSRVResult ldapDnsResult; + private List<String> ldapServers; + private String defaultLdapServerPort; private final static Logger log = Logger.getLogger(JndiAction.class); - public JndiAction(String userName, String domainName, StringBuffer userGuid, LdapProviderType ldapProviderType, DnsSRVResult ldapDnsResult) { + public JndiAction(String userName, String domainName, StringBuffer userGuid, LdapProviderType ldapProviderType, List<String> ldapServers, String defaultLdapServerPort) { this.userName = userName; this.domainName = domainName; this.ldapProviderType = ldapProviderType; this.userGuid = userGuid; - this.ldapDnsResult = ldapDnsResult; + this.ldapServers= ldapServers; + this.defaultLdapServerPort = defaultLdapServerPort; } @Override @@ -53,9 +55,9 @@ // Send an SRV record DNS query to retrieve all the LDAP servers in the domain LdapSRVLocator locator = new LdapSRVLocator(); - if (ldapDnsResult == null) { + if (ldapServers == null) { try { - ldapDnsResult = locator.getLdapServers(domainName); + ldapServers = locator.getServersList(locator.getLdapServers(domainName)); } catch (Exception ex) { return KerberosUtils.convertDNSException(ex); } @@ -65,20 +67,21 @@ String currentLdapServer = null; - if (ldapDnsResult == null || ldapDnsResult.getNumOfValidAddresses() == 0) { + if (ldapServers == null || ldapServers.size() == 0) { return AuthenticationResult.CANNOT_FIND_LDAP_SERVER_FOR_DOMAIN; } // Goes over all the retrieved LDAP servers - for (int counter = 0; counter < ldapDnsResult.getNumOfValidAddresses(); counter++) { - String address = ldapDnsResult.getAddresses()[counter]; + for (String address:ldapServers) { try { // Constructs an LDAP url in a format of ldap://hostname:port (based on the data in the SRV record // This URL is not enough in order to query for user - as for querying users, we should also provide a // base dn, for example: ldap://hostname:389/DC=abc,DC=com . However, this URL (ldap:hostname:port) // suffices for // getting the rootDSE information, which includes the baseDN. - URI uri = locator.constructURI("LDAP", address); + System.out.println("debug!!! going to construct address " + address); + URI uri = locator.constructURI("LDAP", address, defaultLdapServerPort); + System.out.println("debug!!! result of constructed address "+ uri.toString()); env.put(Context.PROVIDER_URL, uri.toString()); ctx = new InitialDirContext(env); diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosConfigCheck.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosConfigCheck.java index 918fa99..f8559ec 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosConfigCheck.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosConfigCheck.java @@ -2,6 +2,8 @@ import static org.ovirt.engine.core.utils.kerberos.InstallerConstants.ERROR_PREFIX; +import java.util.List; + import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; @@ -14,7 +16,6 @@ import org.apache.log4j.Logger; import org.ovirt.engine.core.ldap.LdapProviderType; import org.ovirt.engine.core.utils.CLIParser; -import org.ovirt.engine.core.utils.dns.DnsSRVLocator.DnsSRVResult; /** * Utility to verify Kerberos installation @@ -22,7 +23,8 @@ */ public class KerberosConfigCheck { private LoginContext lc; - private final DnsSRVResult ldapDnsResult; + private final List<String> ldapServers; + private String defaultLdapServerPort; private final static Logger log = Logger.getLogger(KerberosConfigCheck.class); public enum Arguments { @@ -35,12 +37,13 @@ ldapProviderType; } - public KerberosConfigCheck(DnsSRVResult ldapDnsResult) { - this.ldapDnsResult = ldapDnsResult; + public KerberosConfigCheck(List<String> ldapServers, String defaultLdapServerPort) { + this.ldapServers = ldapServers; + this.defaultLdapServerPort = defaultLdapServerPort; } public KerberosConfigCheck() { - this(null); + this(null,null); } // This function gets the username and adjusts it doing the following: @@ -118,28 +121,6 @@ return true; } - public static void main(String[] args) { - KerberosConfigCheck util = new KerberosConfigCheck(); - CLIParser parser = new CLIParser(args); - if (!util.validate(parser)) { - util.printUsage(); - System.exit(1); - } - String username = adjustUserName(parser.getArg(Arguments.user.name())); - String password = parser.getArg(Arguments.password.name()); - String jaasFile = parser.getArg(Arguments.jaas_file.name()); - String krb5ConfFile = parser.getArg(Arguments.krb5_conf_path.name()); - String domains = parser.getArg(Arguments.domains.name()); - StringBuffer userGuid = new StringBuffer(); - LdapProviderType ldapProviderType = LdapProviderType.valueOf(Arguments.ldapProviderType.name()); - try { - util.checkInstallation(domains, username, password, jaasFile, krb5ConfFile, userGuid, ldapProviderType); - } catch (AuthenticationException e) { - System.err.println(ERROR_PREFIX + e.getMessage()); - System.exit(e.getAuthResult().getExitCode()); - } - } - public void checkInstallation(String domains, String username, String password, @@ -193,7 +174,7 @@ authResult = (AuthenticationResult) Subject.doAs(lc.getSubject(), new JndiAction(username, realm.toLowerCase(), - userGuid, ldapProviderType,ldapDnsResult)); + userGuid, ldapProviderType,ldapServers,defaultLdapServerPort)); } finally { if (lc != null) { diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomains.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomains.java index a417d4f..bb3b857 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomains.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomains.java @@ -10,8 +10,12 @@ import java.io.InputStream; import java.sql.SQLException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.Set; @@ -21,6 +25,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.ldap.LdapProviderType; import org.ovirt.engine.core.ldap.LdapSRVLocator; import org.ovirt.engine.core.utils.CLIParser; @@ -57,10 +62,11 @@ private ManageDomainsDAOImpl daoImpl; private boolean reportAllErrors; private boolean addPermissions; - private DnsSRVResult ldapDnsResult; private boolean useDnsLookup; + private List<String> ldapServers; private final static Logger log = Logger.getLogger(ManageDomains.class); + private static final String DEFAULT_LDAP_SERVER_PORT = "389"; public enum Arguments { action, @@ -74,7 +80,8 @@ interactive, addPermissions, provider, - forceDelete + forceDelete, + ldapServers, } public enum ActionType { @@ -207,6 +214,12 @@ getConfigValue(engineConfigExecutable, engineConfigProperties, ConfigValues.LdapServers); String ldapProviderTypes = getConfigValue(engineConfigExecutable, engineConfigProperties, ConfigValues.LDAPProviderTypes); + String ldapPort = + getConfigValue(engineConfigExecutable, engineConfigProperties, ConfigValues.LDAPServerPort); + if (ldapPort == null) + { + ldapPort = DEFAULT_LDAP_SERVER_PORT; + } configurationProvider = new ConfigurationProvider(adUserName, @@ -217,7 +230,7 @@ adUserId, ldapProviderTypes, utilityConfiguration.getEngineConfigExecutablePath(), - engineConfigProperties); + engineConfigProperties, ldapPort); } catch (Throwable e) { throw new ManageDomainsResult(ManageDomainsResultEnum.FAILED_READING_CURRENT_CONFIGURATION, e.getMessage()); @@ -249,26 +262,6 @@ private boolean foundSrvRecords(DnsSRVResult result) { return result != null && result.getNumOfValidAddresses() > 0; - } - - private DnsSRVResult validateLdapServers(String domainName) throws ManageDomainsResult { - LdapSRVLocator locator = new LdapSRVLocator(); - DnsSRVResult ldapDnsResult = null; - boolean foundServers = true; - try { - ldapDnsResult = locator.getLdapServers(domainName); - if (!foundSrvRecords(ldapDnsResult)) { - foundServers = false; - } - } catch (Exception ex) { - foundServers = false; - } - if (!foundServers) { - throw new ManageDomainsResult("Could not locate LDAP servers to be used to validate the input of the utility", - ManageDomainsResultEnum.NO_LDAP_SERVERS_FOR_DOMAIN, domainName); - - } - return ldapDnsResult; } private void runCommand(CLIParser parser) throws ManageDomainsResult { @@ -378,6 +371,9 @@ String currentAuthModeEntry = configurationProvider.getConfigValue(ConfigValues.LDAPSecurityAuthentication); String currentAdUserIdEntry = configurationProvider.getConfigValue(ConfigValues.AdUserId); String currentLdapProviderTypesEntry = configurationProvider.getConfigValue(ConfigValues.LDAPProviderTypes); + String currentLdapServersEntry = configurationProvider.getConfigValue(ConfigValues.LdapServers); + String ldapServerPort = configurationProvider.getConfigValue(ConfigValues.LDAPServerPort); + DomainsConfigurationEntry domainNameEntry = new DomainsConfigurationEntry(currentDomainNameEntry, DOMAIN_SEPERATOR, null); @@ -392,6 +388,10 @@ DomainsConfigurationEntry ldapProviderTypeEntry = new DomainsConfigurationEntry(currentLdapProviderTypesEntry, DOMAIN_SEPERATOR, VALUE_SEPERATOR); + DomainsConfigurationEntry ldapServersEntry = + new DomainsConfigurationEntry(currentLdapServersEntry, DOMAIN_SEPERATOR, VALUE_SEPERATOR); + + testConfiguration(null, domainNameEntry, adUserNameEntry, @@ -399,6 +399,8 @@ authModeEntry, adUserIdEntry, ldapProviderTypeEntry, + ldapServersEntry, + ldapServerPort, false, true); } @@ -423,6 +425,37 @@ } } + protected List<String> getLdapServers(CLIParser parser, String domainName) throws ManageDomainsResult { + System.out.println("debug!!! getLdapServers!!!!!!"); + String argValue = parser.getArg(Arguments.ldapServers.toString().toLowerCase()); + if (StringUtils.isEmpty(argValue)) { + System.out.println("debug!!! gettting ldap servers from dns!!"); + LdapSRVLocator locator = new LdapSRVLocator(); + DnsSRVResult ldapDnsResult = null; + boolean foundServers = true; + try { + ldapDnsResult = locator.getLdapServers(domainName); + if (!foundSrvRecords(ldapDnsResult)) { + foundServers = false; + } + } catch (Exception ex) { + foundServers = false; + } + if (!foundServers) { + throw new ManageDomainsResult("Could not locate LDAP servers to be used to validate the input of the utility", + ManageDomainsResultEnum.NO_LDAP_SERVERS_FOR_DOMAIN, domainName); + + } + ArrayList<String> result = new ArrayList<String>(); + for (int counter = 0; counter < ldapDnsResult.getNumOfValidAddresses(); counter++) { + result.add(ldapDnsResult.getAddresses()[counter]); + } + System.out.println("debug!!! getLdapServers!! result is " + result); + return result; + } + return new ArrayList<String>(Arrays.asList(argValue.split(","))); + } + public void addDomain(CLIParser parser) throws ManageDomainsResult { String authMode = LdapAuthModeEnum.GSSAPI.name(); String currentDomains = configurationProvider.getConfigValue(ConfigValues.DomainName); @@ -433,7 +466,7 @@ if (domainNameEntry.doesDomainExist(domainName)) { throw new ManageDomainsResult(ManageDomainsResultEnum.DOMAIN_ALREADY_EXISTS_IN_CONFIGURATION, domainName); } - ldapDnsResult = validateLdapServers(domainName); + ldapServers = getLdapServers(parser,domainName); validateKdcServers(authMode,domainName); domainNameEntry.setValueForDomain(domainName, null); @@ -443,6 +476,7 @@ String currentLdapServersEntry = configurationProvider.getConfigValue(ConfigValues.LdapServers); String currentAdUserIdEntry = configurationProvider.getConfigValue(ConfigValues.AdUserId); String currentLDAPProviderTypes = configurationProvider.getConfigValue(ConfigValues.LDAPProviderTypes); + String ldapServerPort = configurationProvider.getConfigValue(ConfigValues.LDAPServerPort); DomainsConfigurationEntry adUserNameEntry = new DomainsConfigurationEntry(currentAdUserNameEntry, DOMAIN_SEPERATOR, VALUE_SEPERATOR); @@ -463,9 +497,15 @@ authModeEntry.setValueForDomain(domainName, authMode); ldapProviderTypesEntry.setValueForDomain(domainName, ldapProviderType.name()); - if (authMode.equalsIgnoreCase(LdapAuthModeEnum.SIMPLE.name())) { - ldapServersEntry.setValueForDomain(domainName, utilityConfiguration.getLocalHostEntry()); + String ldapServersStr = parser.getArg(Arguments.ldapServers.name()); + if (!StringUtils.isEmpty(ldapServersStr)) { + //Replacing "," with ";" - from user perspective of the utility, passing comma delimited string makes more sense and more natural + //But "," is used as domain separate character when storing to DB. + ldapServersStr = ldapServersStr.replace(',',';'); + System.out.println("debug!!! getLdapServers!! result is " + ldapServersStr); + ldapServersEntry.setValueForDomain(domainName, ldapServersStr); } + testConfiguration(domainName, domainNameEntry, @@ -474,6 +514,8 @@ authModeEntry, adUserIdEntry, ldapProviderTypesEntry, + ldapServersEntry, + ldapServerPort, true, false); @@ -528,7 +570,7 @@ String authMode; String domainName = parser.getArg(Arguments.domain.toString()).toLowerCase(); authMode = getDomainAuthMode(domainName); - ldapDnsResult = validateLdapServers(domainName); + ldapServers = getLdapServers(parser, domainName); validateKdcServers(authMode,domainName); String currentDomains = configurationProvider.getConfigValue(ConfigValues.DomainName); String userName = parser.getArg(Arguments.user.toString()); @@ -548,6 +590,8 @@ String currentLdapServersEntry = configurationProvider.getConfigValue(ConfigValues.LdapServers); String currentAdUserIdEntry = configurationProvider.getConfigValue(ConfigValues.AdUserId); String currentLdapProviderTypeEntry = configurationProvider.getConfigValue(ConfigValues.LDAPProviderTypes); + String ldapServerPort = configurationProvider.getConfigValue(ConfigValues.LDAPServerPort); + DomainsConfigurationEntry adUserNameEntry = new DomainsConfigurationEntry(currentAdUserNameEntry, DOMAIN_SEPERATOR, VALUE_SEPERATOR); @@ -585,6 +629,8 @@ authModeEntry, adUserIdEntry, ldapProviderTypeEntry, + ldapServersEntry, + ldapServerPort, true, false); @@ -630,8 +676,9 @@ DomainsConfigurationEntry gssapiDomains, DomainsConfigurationEntry userIds, DomainsConfigurationEntry ldapProviderTypes, + Map<String,List<String>> ldapServersPerDomainMap, String kerberosConfigFile, - boolean isValidate) throws ManageDomainsResult { + String ldapServerPort, boolean isValidate) throws ManageDomainsResult { Set<Entry<String, String>> gssapiDomainValues = gssapiDomains.getValues(); @@ -642,7 +689,8 @@ users.setValueForDomain(domain, constructUPN(currUserName, domain)); try { log.info("Testing kerberos configuration for domain: " + domain); - KerberosConfigCheck kerberosConfigCheck = new KerberosConfigCheck(ldapDnsResult); + List<String> ldapServersPerDomain = ldapServersPerDomainMap.get(ldapServers); + KerberosConfigCheck kerberosConfigCheck = new KerberosConfigCheck(ldapServersPerDomain, ldapServerPort); StringBuffer userGuid = new StringBuffer(); kerberosConfigCheck.checkInstallation(domain, users.getValueForDomain(domain), @@ -693,15 +741,15 @@ private ManageDomainsResult checkSimple(String domain, String userName, String password, - String address, - StringBuffer userGuid, LdapProviderType ldapProviderType) { + StringBuffer userGuid, LdapProviderType ldapProviderType, List<String> ldapServers) { log.info("Testing domain " + domain); SimpleAuthenticationCheck simpleAuthenticationCheck = new SimpleAuthenticationCheck(); - ReturnStatus returnStatus = - simpleAuthenticationCheck.printUserGuid(domain, userName, password, address, userGuid, ldapProviderType); - if (!returnStatus.equals(ReturnStatus.OK)) { + Pair<ReturnStatus,String> simpleCheckResult = + simpleAuthenticationCheck.printUserGuid(domain, userName, password, userGuid, ldapProviderType, ldapServers); + if (!simpleCheckResult.getFirst().equals(ReturnStatus.OK)) { + System.err.println(simpleCheckResult.getSecond()); return new ManageDomainsResult(ManageDomainsResultEnum.FAILURE_WHILE_TESTING_DOMAIN, - new String[] { domain, returnStatus.getDetailedMessage() }); + new String[] { domain, simpleCheckResult.getFirst().getDetailedMessage() }); } log.info("Successfully tested domain " + domain); return OK_RESULT; @@ -713,18 +761,18 @@ DomainsConfigurationEntry simpleDomains, DomainsConfigurationEntry userIds, DomainsConfigurationEntry ldapProviderType, - String address, + Map<String,List<String>> ldapServersMapPerDomainMap, boolean isValidate) throws ManageDomainsResult { Set<Entry<String, String>> simpleDomainValues = simpleDomains.getValues(); StringBuffer userGuid = new StringBuffer(); for (Entry<String, String> currDomain : simpleDomainValues) { String domain = currDomain.getKey(); + List<String> domainLdapServers = ldapServersMapPerDomainMap.get(domain); ManageDomainsResult result = checkSimple(domain, users.getValueForDomain(domain), passwords.getValueForDomain(domain), - address, - userGuid, LdapProviderType.valueOf(ldapProviderType.getValueForDomain(domain))); + userGuid, LdapProviderType.valueOf(ldapProviderType.getValueForDomain(domain)), domainLdapServers); if (!result.isSuccessful()) { if (isValidate || ((domainName != null) && !domain.equals(domainName))) { if (reportAllErrors) { @@ -754,13 +802,15 @@ DomainsConfigurationEntry authModes, DomainsConfigurationEntry userIds, DomainsConfigurationEntry ldapProviderType, - boolean reconfigure, + DomainsConfigurationEntry ldapServersEntry, + String ldapServerPort, boolean reconfigure, boolean isValidate) throws ManageDomainsResult { Set<Entry<String, String>> domainValues = domains.getValues(); DomainsConfigurationEntry gssapiDomains = new DomainsConfigurationEntry("", DOMAIN_SEPERATOR, null); DomainsConfigurationEntry simpleDomains = new DomainsConfigurationEntry("", DOMAIN_SEPERATOR, null); + for (Entry<String, String> currDomain : domainValues) { String domain = currDomain.getKey(); @@ -775,13 +825,30 @@ } } + Map<String,List<String>> ldapServersPerSimpleDomains = new HashMap<String, List<String>>(); + Map<String,List<String>> ldapServersPerGSSAPIDomains = new HashMap<String, List<String>>(); + + + for (Entry<String,String> currLdapServerEntry: ldapServersEntry.getValues()) { + System.out.println("current ldap server entry. domain " + currLdapServerEntry.getKey() + " server " + currLdapServerEntry.getValue()); + if (gssapiDomains.contains(currLdapServerEntry.getKey())) { + ldapServersPerGSSAPIDomains.put(currLdapServerEntry.getKey(), + new ArrayList<String>(Arrays.asList(currLdapServerEntry.getValue().split(",")))); + } else + { + ldapServersPerSimpleDomains.put(currLdapServerEntry.getKey(), + new ArrayList<String>(Arrays.asList(currLdapServerEntry.getValue().split(",")))); + + } + } + checkSimpleDomains(domainName, users, passwords, simpleDomains, userIds, ldapProviderType, - utilityConfiguration.getLocalHostEntry(), + ldapServersPerSimpleDomains, isValidate); boolean domainIsGssapi = gssapiDomains.doesDomainExist(domainName); @@ -800,7 +867,9 @@ gssapiDomains, userIds, ldapProviderType, + ldapServersPerGSSAPIDomains, kerberosConfigFile, + ldapServerPort, isValidate); if (domainIsGssapi && reconfigure) { applyKerberosConfiguration(); -- To view, visit http://gerrit.ovirt.org/11065 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic0904f9f6d9432ecac1cebee2790dae902a1329c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yair Zaslavsky <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
