From 6b91643447398f13e01a4e02f8431e5263fc9bff Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Wed, 20 Feb 2008 09:22:09 +0000
Subject: [PATCH] Fix for issue 2962 (Setup should allow non-secure replication port while LDAP access is SSL-enabled)

---
 opends/src/ads/org/opends/admin/ads/util/ServerLoader.java |  121 +++++++++++++++++++++++++++++++--------
 1 files changed, 95 insertions(+), 26 deletions(-)

diff --git a/opends/src/ads/org/opends/admin/ads/util/ServerLoader.java b/opends/src/ads/org/opends/admin/ads/util/ServerLoader.java
index 40fd304..f8eda0b 100644
--- a/opends/src/ads/org/opends/admin/ads/util/ServerLoader.java
+++ b/opends/src/ads/org/opends/admin/ads/util/ServerLoader.java
@@ -27,6 +27,7 @@
 
 package org.opends.admin.ads.util;
 
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -60,6 +61,7 @@
   private ApplicationTrustManager trustManager;
   private String dn;
   private String pwd;
+  private LinkedHashSet<PreferredConnection> preferredLDAPURLs;
 
   private static final Logger LOG =
     Logger.getLogger(ServerLoader.class.getName());
@@ -72,14 +74,20 @@
    * @param pwd the password that we must use to bind to the server.
    * @param trustManager the ApplicationTrustManager to be used when we try
    * to connect to the server.
+   * @param preferredLDAPURLs the list of preferred LDAP URLs that we want
+   * to use to connect to the server.  They will be used only if they correspond
+   * to the URLs that we found in the the server properties.
    */
   public ServerLoader(Map<ServerProperty,Object> serverProperties,
-      String dn, String pwd, ApplicationTrustManager trustManager)
+      String dn, String pwd, ApplicationTrustManager trustManager,
+      LinkedHashSet<PreferredConnection> preferredLDAPURLs)
   {
     this.serverProperties = serverProperties;
     this.dn = dn;
     this.pwd = pwd;
     this.trustManager = trustManager;
+    this.preferredLDAPURLs =
+      new LinkedHashSet<PreferredConnection>(preferredLDAPURLs);
   }
 
   /**
@@ -115,14 +123,14 @@
     if (!isOver)
     {
       isInterrupted = true;
-      String ldapUrl = getLdapsUrl(serverProperties);
+      String ldapUrl = getLastLdapUrl();
       if (ldapUrl == null)
       {
-        ldapUrl = getStartTlsLdapUrl(serverProperties);
-      }
-      if (ldapUrl == null)
-      {
-        ldapUrl = getLdapUrl(serverProperties);
+        LinkedHashSet<PreferredConnection> urls = getLDAPURLsByPreference();
+        if (!urls.isEmpty())
+        {
+          ldapUrl = urls.iterator().next().getLDAPURL();
+        }
       }
       lastException = new TopologyCacheException(
           TopologyCacheException.Type.TIMEOUT,
@@ -246,30 +254,35 @@
       String host = (String)serverProperties.get(ServerProperty.HOST_NAME);
       trustManager.setHost(host);
     }
-    lastLdapUrl = getLdapsUrl(serverProperties);
 
-    if (lastLdapUrl == null)
+    /* Try to connect to the server in a certain order of preference.  If an
+     * URL fails, we will try with the others.
+     */
+    LinkedHashSet<PreferredConnection> conns = getLDAPURLsByPreference();
+
+    for (PreferredConnection connection : conns)
     {
-      lastLdapUrl = getStartTlsLdapUrl(serverProperties);
-      if (lastLdapUrl == null)
+      if (ctx == null)
       {
-        lastLdapUrl = getLdapUrl(serverProperties);
-        ctx = ConnectionUtils.createLdapContext(lastLdapUrl, dn, pwd,
-            ConnectionUtils.getDefaultLDAPTimeout(), null);
-      }
-      else
-      {
-        ctx = ConnectionUtils.createStartTLSContext(lastLdapUrl, dn, pwd,
-            ConnectionUtils.getDefaultLDAPTimeout(), null, trustManager,
-            null, null);
+        lastLdapUrl = connection.getLDAPURL();
+        switch (connection.getType())
+        {
+        case LDAPS:
+          ctx = ConnectionUtils.createLdapsContext(lastLdapUrl, dn, pwd,
+              ConnectionUtils.getDefaultLDAPTimeout(), null, trustManager,
+              null);
+          break;
+        case START_TLS:
+          ctx = ConnectionUtils.createStartTLSContext(lastLdapUrl, dn, pwd,
+              ConnectionUtils.getDefaultLDAPTimeout(), null, trustManager,
+              null, null);
+          break;
+        default:
+          ctx = ConnectionUtils.createLdapContext(lastLdapUrl, dn, pwd,
+              ConnectionUtils.getDefaultLDAPTimeout(), null);
+        }
       }
     }
-    else
-    {
-      ctx = ConnectionUtils.createLdapsContext(lastLdapUrl, dn, pwd,
-          ConnectionUtils.getDefaultLDAPTimeout(), null, trustManager, null);
-    }
-
     return ctx;
   }
 
@@ -384,4 +397,60 @@
     }
     return isAdministratorDn;
   }
+
+  /**
+   * Returns the list of LDAP URLs that can be used to connect to the server.
+   * They are ordered so that the first URL is the preferred URL to be used.
+   * @return the list of LDAP URLs that can be used to connect to the server.
+   * They are ordered so that the first URL is the preferred URL to be used.
+   */
+  private LinkedHashSet<PreferredConnection> getLDAPURLsByPreference()
+  {
+    LinkedHashSet<PreferredConnection> ldapUrls =
+      new LinkedHashSet<PreferredConnection>();
+
+    String ldapsUrl = getLdapsUrl(serverProperties);
+    String startTLSUrl = getStartTlsLdapUrl(serverProperties);
+    String ldapUrl = getLdapUrl(serverProperties);
+
+    /**
+     * Check the preferred connections passed in the constructor.
+     */
+    for (PreferredConnection connection : preferredLDAPURLs)
+    {
+      String url = connection.getLDAPURL();
+      if (url.equalsIgnoreCase(ldapsUrl) &&
+          connection.getType() == PreferredConnection.Type.LDAPS)
+      {
+        ldapUrls.add(connection);
+      }
+      else if (url.equalsIgnoreCase(startTLSUrl) &&
+          connection.getType() == PreferredConnection.Type.START_TLS)
+      {
+        ldapUrls.add(connection);
+      }
+      else if (url.equalsIgnoreCase(ldapUrl) &&
+          connection.getType() == PreferredConnection.Type.LDAP)
+      {
+        ldapUrls.add(connection);
+      }
+    }
+
+    if (ldapsUrl != null)
+    {
+      ldapUrls.add(
+          new PreferredConnection(ldapsUrl, PreferredConnection.Type.LDAPS));
+    }
+    if (startTLSUrl != null)
+    {
+      ldapUrls.add(new PreferredConnection(startTLSUrl,
+              PreferredConnection.Type.START_TLS));
+    }
+    if (ldapUrl != null)
+    {
+      ldapUrls.add(new PreferredConnection(ldapUrl,
+          PreferredConnection.Type.LDAP));
+    }
+    return ldapUrls;
+  }
 }

--
Gitblit v1.10.0