From 11c5b708d2668174a94512c0936dbcbc3cfeeca8 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Fri, 02 Nov 2007 16:04:31 +0000
Subject: [PATCH] Update the server root DSE to include the supportedLDAPVersion attribute.

---
 opends/src/server/org/opends/server/core/DirectoryServer.java                 |   79 ++++++++++++++++++++++++++
 opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java |   20 ++++++
 opends/src/server/org/opends/server/backends/RootDSEBackend.java              |   27 +++++++++
 opends/resource/config/config.ldif                                            |    2 
 opends/src/server/org/opends/server/util/ServerConstants.java                 |   18 ++++++
 5 files changed, 145 insertions(+), 1 deletions(-)

diff --git a/opends/resource/config/config.ldif b/opends/resource/config/config.ldif
index de2f857..f63a96b 100644
--- a/opends/resource/config/config.ldif
+++ b/opends/resource/config/config.ldif
@@ -72,7 +72,7 @@
 ds-cfg-global-aci: (targetattr!="userPassword||authPassword")(version 3.0; acl "Anonymous read access"; allow (read,search,compare) userdn="ldap:///anyone";)
 ds-cfg-global-aci: (targetattr="*")(version 3.0; acl "Self entry modification"; allow (write) userdn="ldap:///self";)
 ds-cfg-global-aci: (target="ldap:///cn=schema")(targetscope="base")(targetattr="attributeTypes||dITContentRules||dITStructureRules||ldapSyntaxes||matchingRules||matchingRuleUse||nameForms||objectClasses")(version 3.0; acl "User-Visible Schema Operational Attributes"; allow (read,search,compare) userdn="ldap:///anyone";)
-ds-cfg-global-aci: (target="ldap:///")(targetscope="base")(targetattr="namingContexts||supportedAuthPasswordSchemes||supportedControl||supportedExtension||supportedFeatures||supportedSASLMechanisms||vendorName||vendorVersion")(version 3.0; acl "User-Visible Root DSE Operational Attributes"; allow (read,search,compare) userdn="ldap:///anyone";)
+ds-cfg-global-aci: (target="ldap:///")(targetscope="base")(targetattr="namingContexts||supportedAuthPasswordSchemes||supportedControl||supportedExtension||supportedFeatures||supportedLDAPVersion||supportedSASLMechanisms||vendorName||vendorVersion")(version 3.0; acl "User-Visible Root DSE Operational Attributes"; allow (read,search,compare) userdn="ldap:///anyone";)
 ds-cfg-global-aci: (targetattr="createTimestamp||creatorsName||modifiersName||modifyTimestamp||entryDN||entryUUID||subschemaSubentry")(version 3.0; acl "User-Visible Operational Attributes"; allow (read,search,compare) userdn="ldap:///anyone";)
 cn: Access Control Handler
 ds-cfg-java-class: org.opends.server.authorization.dseecompat.AciHandler
diff --git a/opends/src/server/org/opends/server/backends/RootDSEBackend.java b/opends/src/server/org/opends/server/backends/RootDSEBackend.java
index 83138eb..959d022 100644
--- a/opends/src/server/org/opends/server/backends/RootDSEBackend.java
+++ b/opends/src/server/org/opends/server/backends/RootDSEBackend.java
@@ -36,6 +36,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.opends.messages.Message;
@@ -636,6 +637,32 @@
     }
 
 
+    // Add the "supportedLDAPVersions" attribute.
+    TreeSet<String> versionStrings = new TreeSet<String>();
+    for (Integer ldapVersion : DirectoryServer.getSupportedLDAPVersions())
+    {
+      versionStrings.add(ldapVersion.toString());
+    }
+    Attribute supportedLDAPVersionAttr =
+         createAttribute(ATTR_SUPPORTED_LDAP_VERSION,
+                         ATTR_SUPPORTED_LDAP_VERSION_LC,
+                         versionStrings);
+    ArrayList<Attribute> supportedLDAPVersionAttrs =
+         new ArrayList<Attribute>(1);
+    supportedLDAPVersionAttrs.add(supportedLDAPVersionAttr);
+    if (showAllAttributes ||
+        (! supportedLDAPVersionAttr.getAttributeType().isOperational()))
+    {
+      dseUserAttrs.put(supportedLDAPVersionAttr.getAttributeType(),
+                       supportedLDAPVersionAttrs);
+    }
+    else
+    {
+      dseOperationalAttrs.put(supportedLDAPVersionAttr.getAttributeType(),
+                              supportedLDAPVersionAttrs);
+    }
+
+
     // Add the "supportedAuthPasswordSchemes" attribute.
     Set<String> authPWSchemes =
          DirectoryServer.getAuthPasswordStorageSchemes().keySet();
diff --git a/opends/src/server/org/opends/server/core/DirectoryServer.java b/opends/src/server/org/opends/server/core/DirectoryServer.java
index 3305fc7..10a98cc 100644
--- a/opends/src/server/org/opends/server/core/DirectoryServer.java
+++ b/opends/src/server/org/opends/server/core/DirectoryServer.java
@@ -438,6 +438,10 @@
   // policy implementation.
   private ConcurrentHashMap<DN, RetentionPolicy> retentionPolicies;
 
+  // The set supported LDAP protocol versions.
+  private ConcurrentHashMap<Integer,List<ConnectionHandler>>
+               supportedLDAPVersions;
+
   // The set of extended operation handlers registered with the server (mapped
   // between the OID of the extended operation and the handler).
   private ConcurrentHashMap<String,ExtendedOperationHandler>
@@ -924,6 +928,8 @@
                                    <SynchronizationProviderCfg>>();
       directoryServer.supportedControls = new TreeSet<String>();
       directoryServer.supportedFeatures = new TreeSet<String>();
+      directoryServer.supportedLDAPVersions =
+           new ConcurrentHashMap<Integer,List<ConnectionHandler>>();
       directoryServer.virtualAttributes =
            new CopyOnWriteArrayList<VirtualAttributeRule>();
       directoryServer.connectionHandlers =
@@ -7050,6 +7056,79 @@
 
 
   /**
+   * Retrieves the supported LDAP versions for the Directory Server.
+   *
+   * @return  The supported LDAP versions for the Directory Server.
+   */
+  public static Set<Integer> getSupportedLDAPVersions()
+  {
+    return directoryServer.supportedLDAPVersions.keySet();
+  }
+
+
+
+  /**
+   * Registers the provided LDAP protocol version as supported within the
+   * Directory Server.
+   *
+   * @param  supportedLDAPVersion  The LDAP protocol version to register as
+   *                               supported.
+   * @param  connectionHandler     The connection handler that supports the
+   *                               provided LDAP version.  Note that multiple
+   *                               connection handlers can provide support for
+   *                               the same LDAP versions.
+   */
+  public static synchronized void registerSupportedLDAPVersion(
+                                       int supportedLDAPVersion,
+                                       ConnectionHandler connectionHandler)
+  {
+    List<ConnectionHandler> handlers =
+         directoryServer.supportedLDAPVersions.get(supportedLDAPVersion);
+    if (handlers == null)
+    {
+      handlers = new LinkedList<ConnectionHandler>();
+      handlers.add(connectionHandler);
+      directoryServer.supportedLDAPVersions.put(supportedLDAPVersion, handlers);
+    }
+    else
+    {
+      if (! handlers.contains(connectionHandler))
+      {
+        handlers.add(connectionHandler);
+      }
+    }
+  }
+
+
+
+  /**
+   * Deregisters the provided LDAP protocol version as supported within the
+   * Directory Server.
+   *
+   * @param  supportedLDAPVersion  The LDAP protocol version to deregister.
+   * @param  connectionHandler     The connection handler that no longer
+   *                               supports the provided LDAP version.
+   */
+  public static synchronized void deregisterSupportedLDAPVersion(
+                                       int supportedLDAPVersion,
+                                       ConnectionHandler connectionHandler)
+  {
+    List<ConnectionHandler> handlers =
+         directoryServer.supportedLDAPVersions.get(supportedLDAPVersion);
+    if (handlers != null)
+    {
+      handlers.remove(connectionHandler);
+      if (handlers.isEmpty())
+      {
+        directoryServer.supportedLDAPVersions.remove(supportedLDAPVersion);
+      }
+    }
+  }
+
+
+
+
+  /**
    * Retrieves the set of identity mappers defined in the Directory Server
    * configuration, as a mapping between the DN of the configuration entry and
    * the identity mapper.
diff --git a/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java b/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
index 20d188e..2cb92b1 100644
--- a/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
+++ b/opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
@@ -289,6 +289,15 @@
       enabledSSLProtocols = protocols.toArray(new String[0]);
     }
 
+    if (config.isAllowLDAPV2())
+    {
+      DirectoryServer.registerSupportedLDAPVersion(2, this);
+    }
+    else
+    {
+      DirectoryServer.deregisterSupportedLDAPVersion(2, this);
+    }
+
     return new ConfigChangeResult(resultCode, adminActionRequired,
         messages);
   }
@@ -317,6 +326,9 @@
     shutdownRequested = true;
     currentConfig.removeLDAPChangeListener(this);
 
+    DirectoryServer.deregisterSupportedLDAPVersion(2, this);
+    DirectoryServer.deregisterSupportedLDAPVersion(3, this);
+
     try {
       selector.wakeup();
     } catch (Exception e) {
@@ -744,6 +756,14 @@
     }
 
 
+    // Register the set of supported LDAP versions.
+    DirectoryServer.registerSupportedLDAPVersion(3, this);
+    if (config.isAllowLDAPV2())
+    {
+      DirectoryServer.registerSupportedLDAPVersion(2, this);
+    }
+
+
     // Register this as a change listener.
     config.addLDAPChangeListener(this);
   }
diff --git a/opends/src/server/org/opends/server/util/ServerConstants.java b/opends/src/server/org/opends/server/util/ServerConstants.java
index 8a557d7..eb68b8f 100644
--- a/opends/src/server/org/opends/server/util/ServerConstants.java
+++ b/opends/src/server/org/opends/server/util/ServerConstants.java
@@ -468,6 +468,24 @@
 
   /**
    * The name of the standard attribute that is used to specify the names of the
+   * LDAP protocol versions supported by the server, formatted in camel case.
+   */
+  public static final String ATTR_SUPPORTED_LDAP_VERSION =
+       "supportedLDAPVersion";
+
+
+
+  /**
+   * The name of the standard attribute that is used to specify the names of the
+   * LDAP protocol versions supported by the server, formatted in all lowercase.
+   */
+  public static final String ATTR_SUPPORTED_LDAP_VERSION_LC =
+       "supportedldapversion";
+
+
+
+  /**
+   * The name of the standard attribute that is used to specify the names of the
    * SASL mechanisms supported by the server, formatted in camel case.
    */
   public static final String ATTR_SUPPORTED_SASL_MECHANISMS =

--
Gitblit v1.10.0