From a0843f89806c512784a1752421fe384a97a35810 Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Sat, 17 Oct 2009 01:07:40 +0000
Subject: [PATCH] Fix for issue 4295 (Issues with dsreplication interactive mode)

---
 opends/src/server/org/opends/server/util/cli/ConsoleApplication.java |  132 +++++++++++++++++++++++---------------------
 1 files changed, 69 insertions(+), 63 deletions(-)

diff --git a/opends/src/server/org/opends/server/util/cli/ConsoleApplication.java b/opends/src/server/org/opends/server/util/cli/ConsoleApplication.java
index 09d51e8..50ab495 100644
--- a/opends/src/server/org/opends/server/util/cli/ConsoleApplication.java
+++ b/opends/src/server/org/opends/server/util/cli/ConsoleApplication.java
@@ -57,6 +57,7 @@
 import javax.net.ssl.SSLHandshakeException;
 import javax.net.ssl.TrustManager;
 
+import org.opends.admin.ads.ServerDescriptor;
 import org.opends.admin.ads.util.ApplicationTrustManager;
 import org.opends.admin.ads.util.ConnectionUtils;
 import org.opends.admin.ads.util.OpendsCertificateException;
@@ -890,12 +891,9 @@
         {
           if ( isInteractive() && ci.isTrustStoreInMemory())
           {
-            if ((e.getRootCause() != null)
-                && (e.getRootCause().getCause()
-                    instanceof OpendsCertificateException))
+            OpendsCertificateException oce = getCertificateRootException(e);
+            if (oce != null)
             {
-              OpendsCertificateException oce =
-                (OpendsCertificateException) e.getRootCause().getCause();
               String authType = null;
               if (trustManager instanceof ApplicationTrustManager)
               {
@@ -903,31 +901,29 @@
                   (ApplicationTrustManager)trustManager;
                 authType = appTrustManager.getLastRefusedAuthType();
               }
-                if (ci.checkServerCertificate(oce.getChain(), authType,
-                    hostName))
-                {
-                  // If the certificate is trusted, update the trust manager.
-                  trustManager = ci.getTrustManager();
+              if (ci.checkServerCertificate(oce.getChain(), authType,
+                  hostName))
+              {
+                // If the certificate is trusted, update the trust manager.
+                trustManager = ci.getTrustManager();
 
-                  // Try to connect again.
-                  continue ;
-                }
-                else
-                {
-                  // Assume user cancelled.
-                  return null;
-                }
+                // Try to connect again.
+                continue;
+              }
+              else
+              {
+                // Assume user canceled.
+                return null;
+              }
             }
           }
-          if (e.getRootCause() != null)
+          if (e.getCause() != null)
           {
-            if (e.getRootCause().getCause() != null &&
-                !ci.isTrustStoreInMemory() &&
+            if (!ci.isTrustStoreInMemory() &&
                 !ci.isTrustAll())
             {
-              if (((e.getRootCause().getCause()
-                instanceof OpendsCertificateException)) ||
-                (e.getRootCause() instanceof SSLHandshakeException))
+              if (getCertificateRootException(e) != null ||
+                (e.getCause() instanceof SSLHandshakeException))
               {
                 Message message =
                   ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT_NOT_TRUSTED.get(
@@ -936,7 +932,7 @@
                   LDAPResultCode.CLIENT_SIDE_CONNECT_ERROR, message);
               }
             }
-            if (e.getRootCause() instanceof SSLException)
+            if (e.getCause() instanceof SSLException)
             {
               Message message =
                 ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT_WRONG_PORT.get(
@@ -945,8 +941,9 @@
                 LDAPResultCode.CLIENT_SIDE_CONNECT_ERROR, message);
             }
           }
-          Message message = ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT.get(
-              hostName, String.valueOf(portNumber));
+          String hostPort =
+            ServerDescriptor.getServerRepresentation(hostName, portNumber);
+          Message message = Utils.getMessageForException(e, hostPort);
           throw new ClientException(
               LDAPResultCode.CLIENT_SIDE_CONNECT_ERROR, message);
         }
@@ -969,9 +966,8 @@
         {
           if ( isInteractive() && ci.isTrustStoreInMemory())
           {
-            if ((e.getRootCause() != null)
-                && (e.getRootCause().getCause()
-                    instanceof OpendsCertificateException))
+            OpendsCertificateException oce = getCertificateRootException(e);
+            if (oce != null)
             {
               String authType = null;
               if (trustManager instanceof ApplicationTrustManager)
@@ -980,22 +976,21 @@
                   (ApplicationTrustManager)trustManager;
                 authType = appTrustManager.getLastRefusedAuthType();
               }
-              OpendsCertificateException oce =
-                (OpendsCertificateException) e.getRootCause().getCause();
-                if (ci.checkServerCertificate(oce.getChain(), authType,
-                    hostName))
-                {
-                  // If the certificate is trusted, update the trust manager.
-                  trustManager = ci.getTrustManager();
 
-                  // Try to connect again.
-                  continue ;
-                }
-                else
-                {
-                  // Assume user cancelled.
-                  return null;
-                }
+              if (ci.checkServerCertificate(oce.getChain(), authType,
+                  hostName))
+              {
+                // If the certificate is trusted, update the trust manager.
+                trustManager = ci.getTrustManager();
+
+                // Try to connect again.
+                continue ;
+              }
+              else
+              {
+                // Assume user cancelled.
+                return null;
+              }
             }
             else
             {
@@ -1028,9 +1023,8 @@
         {
           if ( isInteractive() && ci.isTrustStoreInMemory())
           {
-            if ((e.getRootCause() != null)
-                && (e.getRootCause().getCause()
-                    instanceof OpendsCertificateException))
+            OpendsCertificateException oce = getCertificateRootException(e);
+            if (oce != null)
             {
               String authType = null;
               if (trustManager instanceof ApplicationTrustManager)
@@ -1039,22 +1033,20 @@
                   (ApplicationTrustManager)trustManager;
                 authType = appTrustManager.getLastRefusedAuthType();
               }
-              OpendsCertificateException oce =
-                (OpendsCertificateException) e.getRootCause().getCause();
-                if (ci.checkServerCertificate(oce.getChain(), authType,
-                    hostName))
-                {
-                  // If the certificate is trusted, update the trust manager.
-                  trustManager = ci.getTrustManager();
+              if (ci.checkServerCertificate(oce.getChain(), authType,
+                  hostName))
+              {
+                // If the certificate is trusted, update the trust manager.
+                trustManager = ci.getTrustManager();
 
-                  // Try to connect again.
-                  continue ;
-                }
-                else
-                {
-                  // Assume user cancelled.
-                  return null;
-                }
+                // Try to connect again.
+                continue;
+              }
+              else
+              {
+                // Assume user canceled.
+                return null;
+              }
             }
             else
             {
@@ -1252,4 +1244,18 @@
       pointAdderStopped = true;
     }
   }
+
+  private OpendsCertificateException getCertificateRootException(Throwable t)
+  {
+    OpendsCertificateException oce = null;
+    while (t != null && oce == null)
+    {
+      t = t.getCause();
+      if (t instanceof OpendsCertificateException)
+      {
+        oce = (OpendsCertificateException)t;
+      }
+    }
+    return oce;
+  }
 }

--
Gitblit v1.10.0