Yair Zaslavsky has uploaded a new change for review.

Change subject: tools: Don't ask for password, before DNS SRV records are 
returned.
......................................................................

tools: Don't ask for password, before DNS SRV records are returned.

This patch first performs DNS SRV query to get ldap servers (and KDCs) for 
domain,
and only if sucueesful, the user will be prompted to enter password

Change-Id: I9c5132300eb1f1fd94f771cab17efe5246dbeca8
Bug-Url: https://bugzilla/redhat.com/871591
Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com>
---
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/KerberosUpgrade.java
M 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomains.java
M 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomainsResultEnum.java
5 files changed, 74 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/49/9349/1

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 b61675e..a9210a9 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
@@ -32,13 +32,15 @@
     private final String domainName;
     private final LdapProviderType ldapProviderType;
     private final StringBuffer userGuid;
+    private DnsSRVResult ldapDnsResult;
     private final static Logger log = Logger.getLogger(JndiAction.class);
 
-    public JndiAction(String userName, String domainName, StringBuffer 
userGuid, LdapProviderType ldapProviderType) {
+    public JndiAction(String userName, String domainName, StringBuffer 
userGuid, LdapProviderType ldapProviderType, DnsSRVResult ldapDnsResult) {
         this.userName = userName;
         this.domainName = domainName;
         this.ldapProviderType = ldapProviderType;
         this.userGuid = userGuid;
+        this.ldapDnsResult = ldapDnsResult;
     }
 
     @Override
@@ -51,11 +53,12 @@
 
         // Send an SRV record DNS query to retrieve all the LDAP servers in 
the domain
         LdapSRVLocator locator = new LdapSRVLocator();
-        DnsSRVResult ldapDnsResult;
-        try {
-            ldapDnsResult = locator.getLdapServers(domainName);
-        } catch (Exception ex) {
-            return KerberosUtils.convertDNSException(ex);
+        if (ldapDnsResult == null) {
+            try {
+                ldapDnsResult = locator.getLdapServers(domainName);
+            } catch (Exception ex) {
+                return KerberosUtils.convertDNSException(ex);
+            }
         }
 
         DirContext ctx = null;
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 1adac5f..42dd86b 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
@@ -14,6 +14,7 @@
 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
@@ -21,6 +22,7 @@
  */
 public class KerberosConfigCheck {
     private LoginContext lc;
+    private final DnsSRVResult ldapDnsResult;
     private final static Logger log = 
Logger.getLogger(KerberosConfigCheck.class);
 
     public enum Arguments {
@@ -31,6 +33,10 @@
         jboss_dir,
         krb5_conf_path,
         ldapProviderType;
+    }
+
+    public KerberosConfigCheck(DnsSRVResult ldapDnsResult) {
+        this.ldapDnsResult = ldapDnsResult;
     }
 
     // This function gets the username and adjusts it doing the following:
@@ -109,7 +115,7 @@
     }
 
     public static void main(String[] args) {
-        KerberosConfigCheck util = new KerberosConfigCheck();
+        KerberosConfigCheck util = new KerberosConfigCheck(null);
         CLIParser parser = new CLIParser(args);
         if (!util.validate(parser)) {
             util.printUsage();
@@ -183,7 +189,7 @@
             authResult =
                     (AuthenticationResult) Subject.doAs(lc.getSubject(), new 
JndiAction(username,
                             realm.toLowerCase(),
-                            userGuid, ldapProviderType));
+                            userGuid, ldapProviderType,ldapDnsResult));
 
         } finally {
             if (lc != null) {
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosUpgrade.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosUpgrade.java
index 8c38476..d79e368 100644
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosUpgrade.java
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/KerberosUpgrade.java
@@ -91,7 +91,7 @@
             handleError(e, "Error in querying oVirt database for 
Active-Directory user, password and domains");
         }
 
-        KerberosConfigCheck configCheck = new KerberosConfigCheck();
+        KerberosConfigCheck configCheck = new KerberosConfigCheck(null);
         StringBuffer userGuid = new StringBuffer();
         // Check authentication and user information retrieval
         try {
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 948af3f..5477cf5 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
@@ -22,8 +22,11 @@
 import org.apache.log4j.Logger;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.ldap.LdapProviderType;
+import org.ovirt.engine.core.ldap.LdapSRVLocator;
 import org.ovirt.engine.core.utils.CLIParser;
 import org.ovirt.engine.core.utils.FileUtil;
+import org.ovirt.engine.core.utils.dns.DnsSRVLocator;
+import org.ovirt.engine.core.utils.dns.DnsSRVLocator.DnsSRVResult;
 import org.ovirt.engine.core.utils.ipa.ReturnStatus;
 import org.ovirt.engine.core.utils.ipa.SimpleAuthenticationCheck;
 
@@ -54,6 +57,7 @@
     private ManageDomainsDAOImpl daoImpl;
     private boolean reportAllErrors;
     private boolean addPermissions;
+    private DnsSRVResult ldapDnsResult;
     private final static Logger log = Logger.getLogger(ManageDomains.class);
 
     public enum Arguments {
@@ -195,13 +199,15 @@
         try {
             String engineConfigExecutable = 
utilityConfiguration.getEngineConfigExecutablePath();
             String adUserName = getConfigValue(engineConfigExecutable, 
engineConfigProperties, ConfigValues.AdUserName);
-            String adUserPassword =
-                    getConfigValue(engineConfigExecutable, 
engineConfigProperties, ConfigValues.AdUserPassword);
+            String domainName = getConfigValue(engineConfigExecutable, 
engineConfigProperties, ConfigValues.DomainName);
             String ldapSecurityAuthentication =
                     getConfigValue(engineConfigExecutable,
                             engineConfigProperties,
                             ConfigValues.LDAPSecurityAuthentication);
-            String domainName = getConfigValue(engineConfigExecutable, 
engineConfigProperties, ConfigValues.DomainName);
+            ldapDnsResult = validateLdapServers(domainName);
+            validateKdcServers(ldapSecurityAuthentication,domainName);
+            String adUserPassword =
+                    getConfigValue(engineConfigExecutable, 
engineConfigProperties, ConfigValues.AdUserPassword);
             String adUserId = getConfigValue(engineConfigExecutable, 
engineConfigProperties, ConfigValues.AdUserId);
             String ldapServers =
                     getConfigValue(engineConfigExecutable, 
engineConfigProperties, ConfigValues.LdapServers);
@@ -222,6 +228,49 @@
         } catch (Throwable e) {
             throw new 
ManageDomainsResult(ManageDomainsResultEnum.FAILED_READING_CURRENT_CONFIGURATION,
 e.getMessage());
         }
+    }
+
+    private void validateKdcServers(String ldapSecurityAuthentication, String 
domainName) throws ManageDomainsResult {
+        KDCLocator locator = new KDCLocator();
+        DnsSRVResult result = null;
+        boolean foundServers = true;
+        try
+        {
+            result = locator.getKdc(DnsSRVLocator.TCP, domainName);
+            if (result.getNumOfValidAddresses() == 0) {
+                result = locator.getKdc(DnsSRVLocator.UDP,domainName);
+                if (result.getNumOfValidAddresses() == 0) {
+                    foundServers =false;
+                }
+            }
+        } catch (Exception ex) {
+            foundServers = false;
+        }
+        if (!foundServers) {
+            throw new ManageDomainsResult("Could not locate KDC servers to be 
used to validate the input of the utility",
+                    ManageDomainsResultEnum.NO_KDC_SERVERS_FOR_DOMAIN, 
domainName);
+        }
+
+    }
+
+    private DnsSRVResult validateLdapServers(String domainName) throws 
ManageDomainsResult {
+        LdapSRVLocator locator = new LdapSRVLocator();
+        DnsSRVResult ldapDnsResult = null;
+        boolean foundServers = true;
+        try {
+            ldapDnsResult = locator.getLdapServers(domainName);
+            if (ldapDnsResult.getNumOfValidAddresses() == 0) {
+                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 {
@@ -613,7 +662,7 @@
             users.setValueForDomain(domain, constructUPN(currUserName, 
domain));
             try {
                 log.info("Testing kerberos configuration for domain: " + 
domain);
-                KerberosConfigCheck kerberosConfigCheck = new 
KerberosConfigCheck();
+                KerberosConfigCheck kerberosConfigCheck = new 
KerberosConfigCheck(ldapDnsResult);
                 StringBuffer userGuid = new StringBuffer();
                 kerberosConfigCheck.checkInstallation(domain,
                         users.getValueForDomain(domain),
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomainsResultEnum.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomainsResultEnum.java
index 5df1fed..0395950 100644
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomainsResultEnum.java
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/kerberos/ManageDomainsResultEnum.java
@@ -33,8 +33,9 @@
             "Operation failed due to exception. Details: %1$s",
             20),
     FAILURE_READING_PASSWORD_FILE("failed reading password from password 
file", 21),
-    EMPTY_PASSWORD_FILE("password file is empty", 22);
-
+    EMPTY_PASSWORD_FILE("password file is empty", 22),
+    NO_LDAP_SERVERS_FOR_DOMAIN("No ldap servers can be obtained for domain 
%1$s",23),
+    NO_KDC_SERVERS_FOR_DOMAIN("No KDC can be obtained for domain %1$s",24);
     private String detailedMessage;
     private final int exitCode;
 


--
To view, visit http://gerrit.ovirt.org/9349
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9c5132300eb1f1fd94f771cab17efe5246dbeca8
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

Reply via email to