From 959c9ded0c297d00500678a0c80d7d6d8a5265fe Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Tue, 10 Jul 2007 16:03:42 +0000
Subject: [PATCH] Fix a set of problems with the configuration interface in which there were a number of cases in which insufficient validation was performed.  In particular, if a new configuration object was added over protocol or an existing configuration object was changed from disabled to enabled, then the server would only perform generic validation for that component and would not have any way to perform more detailed validation that could detect larger numbers of problems.

---
 opends/src/server/org/opends/server/core/PluginConfigManager.java |   48 +++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/PluginConfigManager.java b/opends/src/server/org/opends/server/core/PluginConfigManager.java
index a5a75a2..12b2140 100644
--- a/opends/src/server/org/opends/server/core/PluginConfigManager.java
+++ b/opends/src/server/org/opends/server/core/PluginConfigManager.java
@@ -324,7 +324,7 @@
       {
         DirectoryServerPlugin<? extends PluginCfg> plugin =
              loadPlugin(pluginConfiguration.getPluginClass(), initTypes,
-                        pluginConfiguration);
+                        pluginConfiguration, true);
         registerPlugin(plugin, pluginConfiguration.dn(), initTypes);
       }
       catch (InitializationException ie)
@@ -351,8 +351,9 @@
    *                        which the server is running in a special mode that
    *                        only uses a minimal set of plugins (e.g., LDIF
    *                        import or export).
-   * @param  configuration  The configuration to use to initialize the plugin,
-   *                        or {@code null} if the plugin should not be
+   * @param  configuration  The configuration to use to initialize the plugin.
+   *                        It must not be {@code null}.
+   * @param  initialize     Indicates whether the plugin instance should be
    *                        initialized.
    *
    * @return  The possibly initialized plugin.
@@ -362,7 +363,7 @@
    */
   private DirectoryServerPlugin<? extends PluginCfg>
                loadPlugin(String className, Set<PluginType> pluginTypes,
-                          PluginCfg configuration)
+                          PluginCfg configuration, boolean initialize)
           throws InitializationException
   {
     try
@@ -377,7 +378,7 @@
            (DirectoryServerPlugin<? extends PluginCfg>)
            pluginClass.newInstance();
 
-      if (configuration != null)
+      if (initialize)
       {
         Method method = plugin.getClass().getMethod("initializeInternal",
                                                     DN.class, Set.class);
@@ -387,6 +388,35 @@
                       configuration.definition().getServerConfigurationClass());
         method.invoke(plugin, pluginTypes, configuration);
       }
+      else
+      {
+        Method method = plugin.getClass().getMethod("isConfigurationAcceptable",
+                                                    PluginCfg.class,
+                                                    List.class);
+
+        List<String> unacceptableReasons = new ArrayList<String>();
+        Boolean acceptable = (Boolean) method.invoke(plugin, configuration,
+                                                     unacceptableReasons);
+        if (! acceptable)
+        {
+          StringBuilder buffer = new StringBuilder();
+          if (! unacceptableReasons.isEmpty())
+          {
+            Iterator<String> iterator = unacceptableReasons.iterator();
+            buffer.append(iterator.next());
+            while (iterator.hasNext())
+            {
+              buffer.append(".  ");
+              buffer.append(iterator.next());
+            }
+          }
+
+          int    msgID   = MSGID_CONFIG_PLUGIN_CONFIG_NOT_ACCEPTABLE;
+          String message = getMessage(msgID, String.valueOf(configuration.dn()),
+                                      buffer.toString());
+          throw new InitializationException(msgID, message);
+        }
+      }
 
       return plugin;
     }
@@ -4936,7 +4966,7 @@
       String className = configuration.getPluginClass();
       try
       {
-        loadPlugin(className, pluginTypes, null);
+        loadPlugin(className, pluginTypes, configuration, false);
       }
       catch (InitializationException ie)
       {
@@ -4982,7 +5012,7 @@
     String className = configuration.getPluginClass();
     try
     {
-      plugin = loadPlugin(className, pluginTypes, configuration);
+      plugin = loadPlugin(className, pluginTypes, configuration, true);
     }
     catch (InitializationException ie)
     {
@@ -5056,7 +5086,7 @@
       String className = configuration.getPluginClass();
       try
       {
-        loadPlugin(className, pluginTypes, null);
+        loadPlugin(className, pluginTypes, configuration, false);
       }
       catch (InitializationException ie)
       {
@@ -5127,7 +5157,7 @@
     DirectoryServerPlugin<? extends PluginCfg> plugin = null;
     try
     {
-      plugin = loadPlugin(className, pluginTypes, configuration);
+      plugin = loadPlugin(className, pluginTypes, configuration, true);
     }
     catch (InitializationException ie)
     {

--
Gitblit v1.10.0