From affd68754461e0102f9390e5b5ae4bf40c8662ef Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Mon, 21 Nov 2016 10:43:14 +0000
Subject: [PATCH] OPENDJ-3476 Update schema config and add update task for move of subordinate-base-dn attribute

---
 opendj-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/GlobalConfiguration.xml |    8 ++--
 opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java                              |    1 
 opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java                         |   49 ++++++++++++++++++++++++
 opendj-server-legacy/resource/schema/02-config.ldif                                                          |    6 +-
 opendj-server-legacy/src/messages/org/opends/messages/tool.properties                                        |    6 ++
 5 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/opendj-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/GlobalConfiguration.xml b/opendj-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/GlobalConfiguration.xml
index e208322..f3f3183 100644
--- a/opendj-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/GlobalConfiguration.xml
+++ b/opendj-maven-plugin/src/main/resources/config/xml/org/forgerock/opendj/server/config/GlobalConfiguration.xml
@@ -886,14 +886,14 @@
   </adm:property>
   <adm:property name="subordinate-base-dn" multi-valued="true">
     <adm:synopsis>
-      Specifies the set of naming contexts that are accessible using a 
-      subtree search from base DN "". 
+      Specifies the set of base DNs used for singleLevel,
+      wholeSubtree, and subordinateSubtree searches based at the root
+      DSE.
     </adm:synopsis>
     <adm:default-behavior>
       <adm:alias>
         <adm:synopsis>
-          The set of all user-defined suffixes is used when searching
-          from base DN "".
+          The set of all user-defined suffixes is used.
         </adm:synopsis>
       </adm:alias>
     </adm:default-behavior>
diff --git a/opendj-server-legacy/resource/schema/02-config.ldif b/opendj-server-legacy/resource/schema/02-config.ldif
index 7d9f1fe..9196f03 100644
--- a/opendj-server-legacy/resource/schema/02-config.ldif
+++ b/opendj-server-legacy/resource/schema/02-config.ldif
@@ -4374,7 +4374,8 @@
         ds-cfg-max-allowed-client-connections $
         ds-cfg-max-psearches $
         ds-cfg-max-internal-buffer-size $
-        ds-cfg-trust-transaction-ids)
+        ds-cfg-trust-transaction-ids $
+        ds-cfg-subordinate-base-dn)
   X-ORIGIN 'OpenDS Directory Server' )
 objectClasses: ( 1.3.6.1.4.1.26027.1.2.40
   NAME 'ds-cfg-root-dn-user'
@@ -4387,8 +4388,7 @@
   SUP top
   STRUCTURAL
   MUST cn
-  MAY ( ds-cfg-subordinate-base-dn $
-        ds-cfg-show-all-attributes $
+  MAY ( ds-cfg-show-all-attributes $
         ds-cfg-show-subordinate-naming-contexts)
   X-ORIGIN 'OpenDS Directory Server' )
 objectClasses: ( 1.3.6.1.4.1.26027.1.2.42
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java
index 012296e..d640356 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java
@@ -610,6 +610,7 @@
             "add: objectClass",
             "objectClass: ds-cfg-local-backend")
     );
+    register("4.0.0", moveSubordinateBaseDnToGlobalConfiguration());
 
     /* All upgrades will refresh the server configuration schema and generate a new upgrade folder. */
     registerLast(
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java
index 25b8767..1fd0c29 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java
@@ -49,6 +49,8 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.Attribute;
+import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.Entry;
 import org.forgerock.opendj.ldap.Filter;
@@ -1472,4 +1474,51 @@
       }
     };
   }
+
+  /** Move subordinate-base-dn attribute from Root DSE config to Global config. */
+  static UpgradeTask moveSubordinateBaseDnToGlobalConfiguration()
+  {
+    return new AbstractUpgradeTask()
+    {
+      @Override
+      public void perform(UpgradeContext context) throws ClientException
+      {
+        final SearchRequest sr = Requests.newSearchRequest("cn=Root DSE,cn=config", SearchScope.BASE_OBJECT,
+                "(objectclass=ds-cfg-root-dse-backend)");
+        final Set<String> subordinateDns = new HashSet<>();
+        try (final EntryReader entryReader = searchConfigFile(sr))
+        {
+          if (!entryReader.hasNext())
+          {
+            return;
+          }
+          Entry entry = entryReader.readEntry();
+          Attribute attribute = entry.getAttribute("ds-cfg-subordinate-base-dn");
+          if (attribute == null || attribute.isEmpty())
+          {
+            return;
+          }
+          for (ByteString value : attribute)
+          {
+              subordinateDns.add(value.toString());
+          }
+        }
+        catch (IOException e)
+        {
+          throw new ClientException(ReturnCode.APPLICATION_ERROR, INFO_UPGRADE_TASK_MIGRATE_CONFIG_READ_FAIL.get(), e);
+        }
+        modifyConfigEntry(INFO_UPGRADE_TASK_DELETE_SUBORDINATE_BASE_DN_FROM_ROOT_DSE.get(),
+              "(objectClass=ds-cfg-root-dse-backend)",
+              "delete: ds-cfg-subordinate-base-dn");
+        List<String> ldif = new ArrayList<>();
+        ldif.add("add: ds-cfg-subordinate-base-dn");
+        for (String sub : subordinateDns)
+        {
+          ldif.add("ds-cfg-subordinate-base-dn: " + sub);
+        }
+        modifyConfigEntry(INFO_UPGRADE_TASK_ADD_SUBORDINATE_BASE_DN_TO_GLOBAL_CONFIG.get(),
+            "(objectClass=ds-cfg-root-config)", ldif.toArray(new String[0]));
+      }
+    };
+  }
 }
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
index 21fd901..ff7f7e8 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
@@ -2686,4 +2686,8 @@
 ERR_TRUSTING_CERTIFICATE_PERMANENTLY=Unable to trust the certificate permanently, \
  certificate will be trusted only for this session. Error details: %s
 ERR_UPGRADE_READING_CONF_FILE=An error occurred while reading configuration file: %s
-INFO_UPGRADE_TASK_ADD_LOCAL_BACKEND=Adding local backend object class
\ No newline at end of file
+INFO_UPGRADE_TASK_ADD_LOCAL_BACKEND=Adding local backend object class
+INFO_UPGRADE_TASK_DELETE_SUBORDINATE_BASE_DN_FROM_ROOT_DSE=Removing subordinate-base-dn attribute from \
+ Root DSE configuration
+INFO_UPGRADE_TASK_ADD_SUBORDINATE_BASE_DN_TO_GLOBAL_CONFIG=Adding subordinate-base-dn attribute to \
+ Global configuration
\ No newline at end of file

--
Gitblit v1.10.0