From 37eafc118d988c7635f02b3c9cb0187f3af7c60a Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 05 Apr 2016 09:45:19 +0000
Subject: [PATCH] OPENDJ-2819 Setup error (NPE)

---
 opendj-server-legacy/src/test/java/org/opends/server/types/HostPortTest.java                             |   10 +++
 opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java                              |   55 +++++++-----------
 opendj-server-legacy/src/main/java/org/opends/server/types/HostPort.java                                 |   55 ++++-------------
 opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java                           |    5 +
 opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/Installer.java                        |   35 ++---------
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java      |   11 +--
 opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java |    2 
 7 files changed, 61 insertions(+), 112 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
index b1bc801..7a826ef 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/datamodel/ControlPanelInfo.java
@@ -1087,13 +1087,10 @@
   }
 
   /**
-   * Returns <CODE>true</CODE> if the configuration must be deregistered and
-   * <CODE>false</CODE> otherwise.
-   * This is required when we use the ConfigFileHandler to update the
-   * configuration, in these cases cn=config must the deregistered from the
-   * ConfigFileHandler and after that register again.
-   * @return <CODE>true</CODE> if the configuration must be deregistered and
-   * <CODE>false</CODE> otherwise.
+   * Returns {@code true} if the configuration must be deregistered and {@code false} otherwise.
+   * This is required when we update the configuration, in these cases {@code cn=config}
+   * must the deregistered and after that register again.
+   * @return {@code true} if the configuration must be deregistered and {@code false} otherwise.
    */
   public boolean mustDeregisterConfig()
   {
diff --git a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java
index 66f412d..b13ecd8 100644
--- a/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java
+++ b/opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/task/DeleteBaseDNAndBackendTask.java
@@ -436,7 +436,7 @@
   {
     ConfigurationHandler configHandler = DirectoryServer.getConfigurationHandler();
     final Entry configEntry = configHandler.getEntry(entryDn);
-    final Entry newEntry = new LinkedHashMapEntry(configEntry);
+    final Entry newEntry = LinkedHashMapEntry.deepCopyOfEntry(configEntry);
     AttributeType attrType = Schema.getDefaultSchema().getAttributeType(
         attrName, CoreSchema.getDirectoryStringSyntax());
     newEntry.replaceAttribute(new LinkedAttribute(AttributeDescription.create(attrType), newBaseDNs));
diff --git a/opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/Installer.java b/opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/Installer.java
index 4f93d32..fa11e05 100644
--- a/opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/Installer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/quicksetup/installer/Installer.java
@@ -123,6 +123,7 @@
 import org.opends.server.tools.BackendTypeHelper.BackendTypeUIAdapter;
 import org.opends.server.types.HostPort;
 import org.opends.server.util.CertificateManager;
+import org.opends.server.util.CollectionUtils;
 import org.opends.server.util.DynamicConstants;
 import org.opends.server.util.SetupUtils;
 import org.opends.server.util.StaticUtils;
@@ -210,9 +211,6 @@
   private boolean createdRemoteAds;
   private String lastImportProgress;
 
-  /** A static String that contains the class name of ConfigFileHandler. */
-  protected static final String DEFAULT_CONFIG_CLASS_NAME = "org.opends.server.extensions.ConfigFileHandler";
-
   /** Aliases of self-signed certificates. */
   protected static final String SELF_SIGNED_CERT_ALIASES[] = new String[] {
     SecurityOptions.SELF_SIGNED_CERT_ALIAS,
@@ -823,18 +821,11 @@
     writeHostName();
     checkAbort();
 
-    List<String> argList = new ArrayList<>();
-    argList.add("-C");
-    argList.add(getConfigurationClassName());
-
-    argList.add("-c");
-    argList.add(getConfigurationFile());
-    argList.add("-h");
-    argList.add(getUserData().getHostName());
-    argList.add("-p");
-    argList.add(String.valueOf(getUserData().getServerPort()));
-    argList.add("--adminConnectorPort");
-    argList.add(String.valueOf(getUserData().getAdminConnectorPort()));
+    List<String> argList = CollectionUtils.newArrayList(
+        "-c", getConfigurationFile(),
+        "-h", getUserData().getHostName(),
+        "-p", String.valueOf(getUserData().getServerPort()),
+        "--adminConnectorPort", String.valueOf(getUserData().getAdminConnectorPort()));
 
     final SecurityOptions sec = getUserData().getSecurityOptions();
     // TODO: even if the user does not configure SSL maybe we should choose
@@ -2966,7 +2957,7 @@
     if (errorMsgs.isEmpty())
     {
       AuthenticationData auth = new AuthenticationData();
-      auth.setHostPort(new HostPort(host, port != null ? port : 0));
+      auth.setHostPort(new HostPort("".equals(host) ? null : host, port != null ? port : 0));
       auth.setDn(dn);
       auth.setPwd(pwd);
       auth.setUseSecureConnection(true);
@@ -4143,18 +4134,6 @@
     return getPath(getInstallation().getCurrentConfigurationFile());
   }
 
-  /**
-   * Returns the configuration class name to be used when invoking the
-   * command-lines.
-   *
-   * @return the configuration class name to be used when invoking the
-   *         command-lines.
-   */
-  private String getConfigurationClassName()
-  {
-    return DEFAULT_CONFIG_CLASS_NAME;
-  }
-
   private String getLocalReplicationServer()
   {
     return getUserData().getHostName() + ":" + getUserData().getReplicationOptions().getReplicationPort();
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java b/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
index 0718515..6a5808c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/core/DirectoryServer.java
@@ -5925,7 +5925,9 @@
       }
     }
 
-    directoryServer.configurationHandler.finalize();
+    if (directoryServer.configurationHandler != null) {
+      directoryServer.configurationHandler.finalize();
+    }
 
     EntryCache<?> ec = DirectoryServer.getEntryCache();
     if (ec != null)
@@ -6943,6 +6945,7 @@
     {
       theDirectoryServer.setEnvironmentConfig(environmentConfig);
       theDirectoryServer.bootstrapServer();
+      theDirectoryServer.initializeConfiguration();
     }
     catch (InitializationException ie)
     {
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
index f552e22..181976d 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/tools/ConfigureDS.java
@@ -51,7 +51,6 @@
 import org.forgerock.opendj.ldap.LinkedAttribute;
 import org.forgerock.opendj.ldap.LinkedHashMapEntry;
 import org.forgerock.opendj.ldap.AttributeDescription;
-import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.schema.AttributeType;
 import org.forgerock.opendj.ldap.schema.Syntax;
 import org.forgerock.opendj.server.config.client.BackendCfgClient;
@@ -74,6 +73,7 @@
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.NullOutputStream;
 import org.opends.server.util.LDIFReader;
+import org.opends.server.util.ServerConstants;
 
 import com.forgerock.opendj.cli.Argument;
 import com.forgerock.opendj.cli.ArgumentException;
@@ -720,7 +720,7 @@
       {
         try
         {
-          getConfigEntry(dn);
+          configHandler.getEntry(dn);
         }
         catch (final Exception e)
         {
@@ -767,7 +767,7 @@
         updateConfigEntryWithAttribute(
             DN_LDAP_CONNECTION_HANDLER, ATTR_LISTEN_PORT,
             DirectoryServer.getDefaultIntegerSyntax(),
-            ByteString.valueOfInt(ldapPort.getIntValue()));
+            ldapPort.getIntValue());
       }
       catch (final Exception e)
       {
@@ -786,7 +786,7 @@
             DN_ADMIN_CONNECTOR,
             ATTR_LISTEN_PORT,
             DirectoryServer.getDefaultIntegerSyntax(),
-            ByteString.valueOfInt(adminConnectorPort.getIntValue()));
+            adminConnectorPort.getIntValue());
       }
       catch (final Exception e)
       {
@@ -805,13 +805,13 @@
             DN_LDAPS_CONNECTION_HANDLER,
             ATTR_LISTEN_PORT,
             DirectoryServer.getDefaultIntegerSyntax(),
-            ByteString.valueOfInt(ldapsPort.getIntValue()));
+            ldapsPort.getIntValue());
 
         updateConfigEntryWithAttribute(
             DN_LDAPS_CONNECTION_HANDLER,
             ATTR_CONNECTION_HANDLER_ENABLED,
             DirectoryServer.getDefaultBooleanSyntax(),
-            ByteString.valueOfUtf8("TRUE"));
+            ServerConstants.TRUE_VALUE);
       }
       catch (final Exception e)
       {
@@ -830,13 +830,13 @@
             DN_JMX_CONNECTION_HANDLER,
             ATTR_LISTEN_PORT,
             DirectoryServer.getDefaultIntegerSyntax(),
-            ByteString.valueOfInt(jmxPort.getIntValue()));
+            jmxPort.getIntValue());
 
         updateConfigEntryWithAttribute(
             DN_JMX_CONNECTION_HANDLER,
             ATTR_CONNECTION_HANDLER_ENABLED,
             DirectoryServer.getDefaultBooleanSyntax(),
-            ByteString.valueOfUtf8("TRUE"));
+            ServerConstants.TRUE_VALUE);
       }
       catch (final Exception e)
       {
@@ -855,7 +855,7 @@
             DN_LDAP_CONNECTION_HANDLER,
             ATTR_ALLOW_STARTTLS,
             DirectoryServer.getDefaultBooleanSyntax(),
-            ByteString.valueOfUtf8("TRUE"));
+            ServerConstants.TRUE_VALUE);
       }
       catch (final Exception e)
       {
@@ -877,7 +877,7 @@
               keyManagerProviderDN.getValue(),
               ATTR_KEYMANAGER_ENABLED,
               DirectoryServer.getDefaultBooleanSyntax(),
-              ByteString.valueOfUtf8("TRUE"));
+              ServerConstants.TRUE_VALUE);
         }
         catch (final Exception e)
         {
@@ -897,7 +897,7 @@
               keyManagerProviderDN.getValue(),
               ATTR_KEYSTORE_FILE,
               DirectoryServer.getDefaultStringSyntax(),
-              ByteString.valueOfUtf8(keyManagerPath.getValue()));
+              keyManagerPath.getValue());
         }
         catch (final Exception e)
         {
@@ -918,7 +918,7 @@
             attributeDN,
             ATTR_KEYMANAGER_DN,
             DirectoryServer.getDefaultStringSyntax(),
-            ByteString.valueOfUtf8(keyManagerProviderDN.getValue()));
+            keyManagerProviderDN.getValue());
       }
       catch (final Exception e)
       {
@@ -939,7 +939,7 @@
               trustManagerProviderDN.getValue(),
               ATTR_TRUSTMANAGER_ENABLED,
               DirectoryServer.getDefaultBooleanSyntax(),
-              ByteString.valueOfUtf8("TRUE"));
+              ServerConstants.TRUE_VALUE);
         }
         catch (final Exception e)
         {
@@ -979,7 +979,7 @@
             attributeDN,
             ATTR_TRUSTMANAGER_DN,
             DirectoryServer.getDefaultStringSyntax(),
-            ByteString.valueOfUtf8(trustManagerProviderDN.getValue()));
+            trustManagerProviderDN.getValue());
       }
       catch (final Exception e)
       {
@@ -995,17 +995,11 @@
     {
       if (arg.isPresent())
       {
-        Object[] values = new ByteString[attrValues.size()];
-        int index = 0;
-        for (String attrValue : attrValues)
-        {
-          values[index++] = ByteString.valueOfUtf8(attrValue);
-        }
         updateConfigEntryWithAttribute(
             attributeDN,
             attrName,
             DirectoryServer.getDefaultStringSyntax(),
-            values);
+            attrValues.toArray(new Object[attrValues.size()]));
       }
       else
       {
@@ -1040,13 +1034,13 @@
             DN_ROOT_USER,
             ATTR_ROOTDN_ALTERNATE_BIND_DN,
             DirectoryServer.getDefaultStringSyntax(),
-            ByteString.valueOfUtf8(rootDN.toString()));
+            rootDN);
         final String encodedPassword = SaltedSHA512PasswordStorageScheme.encodeOffline(getBytes(rootPW));
         updateConfigEntryWithAttribute(
             DN_ROOT_USER,
             ATTR_USER_PASSWORD,
             DirectoryServer.getDefaultStringSyntax(),
-            ByteString.valueOfUtf8(encodedPassword));
+            encodedPassword);
       }
       catch (final Exception e)
       {
@@ -1064,7 +1058,7 @@
           DN_DIGEST_MD5_SASL_MECHANISM,
           "ds-cfg-server-fqdn",
           DirectoryServer.getDefaultStringSyntax(),
-          ByteString.valueOfUtf8(hostName.getValue()));
+          hostName.getValue());
     }
     catch (final Exception e)
     {
@@ -1114,7 +1108,7 @@
                 DN_CRYPTO_MANAGER,
                 ATTR_CRYPTO_CIPHER_KEY_WRAPPING_TRANSFORMATION,
                 DirectoryServer.getDefaultStringSyntax(),
-                ByteString.valueOfUtf8(alternativeCipher));
+                alternativeCipher);
           }
           catch (final Exception e)
           {
@@ -1129,7 +1123,7 @@
   private void updateConfigEntryWithAttribute(String entryDn, String attributeName, Syntax syntax, Object...values)
       throws DirectoryException, ConfigException
   {
-    org.forgerock.opendj.ldap.Entry configEntry = getConfigEntry(DN.valueOf(entryDn));
+    org.forgerock.opendj.ldap.Entry configEntry = configHandler.getEntry(DN.valueOf(entryDn));
     final org.forgerock.opendj.ldap.Entry newEntry = putAttribute(configEntry, attributeName, syntax, values);
     configHandler.replaceEntry(configEntry, newEntry);
   }
@@ -1138,16 +1132,11 @@
   private void updateConfigEntryByRemovingAttribute(String entryDn, String attributeName)
       throws DirectoryException, ConfigException
   {
-    final org.forgerock.opendj.ldap.Entry configEntry = getConfigEntry(DN.valueOf(entryDn));
+    final org.forgerock.opendj.ldap.Entry configEntry = configHandler.getEntry(DN.valueOf(entryDn));
     final Entry newEntry = removeAttribute(Converters.to(configEntry), attributeName);
     configHandler.replaceEntry(configEntry, Converters.from(newEntry));
   }
 
-  private org.forgerock.opendj.ldap.Entry getConfigEntry(DN dn) throws ConfigException
-  {
-    return configHandler.getEntry(dn);
-  }
-
   /**
    * Duplicate the provided entry, and put an attribute to the duplicated entry.
    * <p>
@@ -1158,7 +1147,7 @@
   private org.forgerock.opendj.ldap.Entry putAttribute(
       org.forgerock.opendj.ldap.Entry configEntry, String attrName, Syntax syntax, Object...values)
   {
-    org.forgerock.opendj.ldap.Entry newEntry = new LinkedHashMapEntry(configEntry);
+    org.forgerock.opendj.ldap.Entry newEntry = LinkedHashMapEntry.deepCopyOfEntry(configEntry);
     AttributeType attrType = DirectoryServer.getAttributeType(attrName, syntax);
     newEntry.replaceAttribute(new LinkedAttribute(AttributeDescription.create(attrType), values));
     return newEntry;
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/types/HostPort.java b/opendj-server-legacy/src/main/java/org/opends/server/types/HostPort.java
index af639d9..ec07ac7 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/types/HostPort.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/types/HostPort.java
@@ -157,7 +157,7 @@
    */
   public static HostPort allAddresses(int port)
   {
-    return new HostPort(port);
+    return new HostPort(WILDCARD_ADDRESS, port);
   }
 
   /**
@@ -175,22 +175,6 @@
   }
 
   /**
-   * Creates a new {@code HostPort} object with the specified port number but no
-   * host.
-   *
-   * @param port
-   *          The port number for this {@code HostPort} object.
-   */
-  private HostPort(int port)
-  {
-    this.host = null;
-    this.normalizedHost = null;
-    this.port = normalizePort(port);
-  }
-
-
-
-  /**
    * Creates a new {@code HostPort} object with the specified port
    * number but no explicit host.
    *
@@ -200,9 +184,14 @@
    */
   public HostPort(String host, int port)
   {
-    this.host = removeExtraChars(host);
-    this.normalizedHost = normalizeHost(this.host);
-    this.port = normalizePort(port);
+    if (host != null) {
+      this.host = removeExtraChars(host);
+      this.normalizedHost = normalizeHost(this.host);
+    } else {
+      this.host = null;
+      this.normalizedHost = null;
+    }
+    this.port = normalizePort(port, host);
   }
 
 
@@ -314,9 +303,9 @@
    *          the port number to validate
    * @return the port number if valid
    */
-  private int normalizePort(int port)
+  private int normalizePort(int port, String host)
   {
-    if (1 <= port && port <= 65535)
+    if ((1 <= port && port <= 65535) || (port == 0 && host == null))
     {
       return port;
     }
@@ -382,27 +371,11 @@
   @Override
   public String toString()
   {
-    return toString(host);
-  }
-
-  /**
-   * Inner computation for #toString() and {@link #toNormalizedString()}.
-   *
-   * @param hostName
-   *          the hostName to use for this computation
-   * @return the String representation fo4r this object
-   */
-  private String toString(String hostName)
-  {
-    if (hostName != null)
+    if (host != null && host.contains(":"))
     {
-      if (hostName.contains(":"))
-      {
-        return "[" + hostName + "]:" + port;
-      }
-      return hostName + ":" + port;
+      return "[" + host + "]:" + port;
     }
-    return WILDCARD_ADDRESS + ":" + port;
+    return host + ":" + port;
   }
 
   /**
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/types/HostPortTest.java b/opendj-server-legacy/src/test/java/org/opends/server/types/HostPortTest.java
index 17980f2..dbdc9bb 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/types/HostPortTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/types/HostPortTest.java
@@ -48,6 +48,14 @@
   }
 
   @Test
+  public void undefinedHostPort()
+  {
+    final HostPort hp = new HostPort(null, 0);
+    assertThat(hp.getHost()).isNull();
+    assertThat(hp.getPort()).isEqualTo(0);
+  }
+
+  @Test
   public void valueOfEqualsHashCodeIPv4()
   {
     final HostPort hp1 = HostPort.valueOf("home:1");
@@ -135,7 +143,7 @@
   @Test
   public void allAddressesNullHost() {
     HostPort hp = HostPort.allAddresses(1);
-    assertThat(hp.getHost()).isNull();
+    assertThat(hp.getHost()).isEqualTo("0.0.0.0");
     assertThat(hp.getPort()).isEqualTo(1);
   }
 

--
Gitblit v1.10.0