From 1c9478ef0e17ca6b49dfd1af88fd30776fdc66f9 Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Tue, 14 Nov 2006 17:23:19 +0000
Subject: [PATCH] Make a number of changes to the encode-password tool:

---
 opends/src/server/org/opends/server/tools/EncodePassword.java |  603 +++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 408 insertions(+), 195 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/EncodePassword.java b/opends/src/server/org/opends/server/tools/EncodePassword.java
index c0ba48d..cdd26cb 100644
--- a/opends/src/server/org/opends/server/tools/EncodePassword.java
+++ b/opends/src/server/org/opends/server/tools/EncodePassword.java
@@ -28,6 +28,8 @@
 
 
 
+import java.io.OutputStream;
+import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.concurrent.ConcurrentHashMap;
@@ -39,10 +41,13 @@
 import org.opends.server.core.PasswordStorageSchemeConfigManager;
 import org.opends.server.extensions.ConfigFileHandler;
 import org.opends.server.protocols.asn1.ASN1OctetString;
+import org.opends.server.protocols.ldap.LDAPResultCode;
 import org.opends.server.schema.AuthPasswordSyntax;
+import org.opends.server.schema.UserPasswordSyntax;
 import org.opends.server.types.ByteString;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InitializationException;
+import org.opends.server.types.NullOutputStream;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.ArgumentParser;
 import org.opends.server.util.args.BooleanArgument;
@@ -74,17 +79,80 @@
    */
   public static void main(String[] args)
   {
+    int returnCode = encodePassword(args, true, System.out, System.err);
+    if (returnCode != 0)
+    {
+      System.exit(returnCode);
+    }
+  }
+
+
+
+  /**
+   * Processes the command-line arguments and performs the requested action.
+   *
+   * @param  args  The command-line arguments provided to this program.
+   *
+   * @return  An integer value that indicates whether processing was successful.
+   */
+  public static int encodePassword(String[] args)
+  {
+    return encodePassword(args, true, System.out, System.err);
+  }
+
+
+
+  /**
+   * Processes the command-line arguments and performs the requested action.
+   *
+   * @param  args              The command-line arguments provided to this
+   *                           program.
+   * @param  initializeServer  Indicates whether to initialize the server.
+   * @param  outStream         The output stream to use for standard output, or
+   *                           <CODE>null</CODE> if standard output is not
+   *                           needed.
+   * @param  errStream         The output stream to use for standard error, or
+   *                           <CODE>null</CODE> if standard error is not
+   *                           needed.
+   *
+   * @return  An integer value that indicates whether processing was successful.
+   */
+  public static int encodePassword(String[] args, boolean initializeServer,
+                                   OutputStream outStream,
+                                   OutputStream errStream)
+  {
+    PrintStream out;
+    if (outStream == null)
+    {
+      out = NullOutputStream.printStream();
+    }
+    else
+    {
+      out = new PrintStream(outStream);
+    }
+
+    PrintStream err;
+    if (errStream == null)
+    {
+      err = NullOutputStream.printStream();
+    }
+    else
+    {
+      err = new PrintStream(errStream);
+    }
+
     // Define the command-line arguments that may be used with this program.
-    BooleanArgument   authPasswordSyntax  = null;
-    BooleanArgument   listSchemes         = null;
-    BooleanArgument   showUsage           = null;
-    StringArgument    clearPassword       = null;
-    FileBasedArgument clearPasswordFile   = null;
-    StringArgument    encodedPassword     = null;
-    FileBasedArgument encodedPasswordFile = null;
-    StringArgument    configClass         = null;
-    StringArgument    configFile          = null;
-    StringArgument    schemeName          = null;
+    BooleanArgument   authPasswordSyntax   = null;
+    BooleanArgument   useCompareResultCode = null;
+    BooleanArgument   listSchemes          = null;
+    BooleanArgument   showUsage            = null;
+    StringArgument    clearPassword        = null;
+    FileBasedArgument clearPasswordFile    = null;
+    StringArgument    encodedPassword      = null;
+    FileBasedArgument encodedPasswordFile  = null;
+    StringArgument    configClass          = null;
+    StringArgument    configFile           = null;
+    StringArgument    schemeName           = null;
 
 
     // Create the command-line argument parser for use with this program.
@@ -158,18 +226,25 @@
       argParser.addArgument(authPasswordSyntax);
 
 
+      useCompareResultCode =
+           new BooleanArgument("usecompareresultcode", 'r',
+                               "useCompareResultCode",
+                               MSGID_ENCPW_DESCRIPTION_USE_COMPARE_RESULT);
+      argParser.addArgument(useCompareResultCode);
+
+
       showUsage = new BooleanArgument("usage", 'H', "help",
                                       MSGID_ENCPW_DESCRIPTION_USAGE);
       argParser.addArgument(showUsage);
-      argParser.setUsageArgument(showUsage);
+      argParser.setUsageArgument(showUsage, out);
     }
     catch (ArgumentException ae)
     {
       int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_ARGS;
       String message = getMessage(msgID, ae.getMessage());
 
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
     }
 
 
@@ -183,21 +258,43 @@
       int    msgID   = MSGID_ENCPW_ERROR_PARSING_ARGS;
       String message = getMessage(msgID, ae.getMessage());
 
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.err.println(argParser.getUsage());
-      System.exit(1);
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      err.println(argParser.getUsage());
+      return 1;
     }
 
 
-    // If we should just display usage information, then print it and exit.
+    // If we should just display usage information, then we've already done it
+    // so just return without doing anything else.
     if (showUsage.isPresent())
     {
-      System.exit(0);
+      return 0;
     }
 
 
-    // If we are not going to just list the storage schemes, then the clear
-    // password and scheme name must have been provided.
+    // Check for conflicting arguments.
+    if (clearPassword.isPresent() && clearPasswordFile.isPresent())
+    {
+      int    msgID   = MSGID_TOOL_CONFLICTING_ARGS;
+      String message = getMessage(msgID, clearPassword.getLongIdentifier(),
+                                  clearPasswordFile.getLongIdentifier());
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+    if (encodedPassword.isPresent() && encodedPasswordFile.isPresent())
+    {
+      int    msgID   = MSGID_TOOL_CONFLICTING_ARGS;
+      String message = getMessage(msgID, encodedPassword.getLongIdentifier(),
+                                  encodedPasswordFile.getLongIdentifier());
+      err.println(wrapText(message, MAX_LINE_WIDTH));
+      return 1;
+    }
+
+
+    // If we are not going to just list the storage schemes, then the clear-text
+    // password must have been provided.  If we're going to encode a password,
+    // then the scheme must have also been provided.
     ASN1OctetString clearPW = null;
     if (! listSchemes.isPresent())
     {
@@ -214,18 +311,18 @@
         int    msgID = MSGID_ENCPW_NO_CLEAR_PW;
         String message = getMessage(msgID, clearPassword.getLongIdentifier(),
                                     clearPasswordFile.getLongIdentifier());
-        System.err.println(wrapText(message, MAX_LINE_WIDTH));
-        System.err.println(argParser.getUsage());
-        System.exit(1);
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        err.println(argParser.getUsage());
+        return 1;
       }
 
-      if (! schemeName.hasValue())
+      if ((! encodedPassword.isPresent()) && (! schemeName.isPresent()))
       {
         int    msgID   = MSGID_ENCPW_NO_SCHEME;
         String message = getMessage(msgID, schemeName.getLongIdentifier());
-        System.err.println(wrapText(message, MAX_LINE_WIDTH));
-        System.err.println(argParser.getUsage());
-        System.exit(1);
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        err.println(argParser.getUsage());
+        return 1;
       }
     }
 
@@ -249,125 +346,128 @@
     // configuration.
     DirectoryServer directoryServer = DirectoryServer.getInstance();
 
-    try
+    if (initializeServer)
     {
-      directoryServer.bootstrapClient();
-      directoryServer.initializeJMX();
-    }
-    catch (Exception e)
-    {
-      int msgID = MSGID_ENCPW_SERVER_BOOTSTRAP_ERROR;
-      String message = getMessage(msgID, stackTraceToSingleLineString(e));
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
+      try
+      {
+        directoryServer.bootstrapClient();
+        directoryServer.initializeJMX();
+      }
+      catch (Exception e)
+      {
+        int msgID = MSGID_ENCPW_SERVER_BOOTSTRAP_ERROR;
+        String message = getMessage(msgID, stackTraceToSingleLineString(e));
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
 
-    try
-    {
-      directoryServer.initializeConfiguration(configClass.getValue(),
-                                              configFile.getValue());
-    }
-    catch (InitializationException ie)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_LOAD_CONFIG;
-      String message = getMessage(msgID, ie.getMessage());
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
-    catch (Exception e)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_LOAD_CONFIG;
-      String message = getMessage(msgID, stackTraceToSingleLineString(e));
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
+      try
+      {
+        directoryServer.initializeConfiguration(configClass.getValue(),
+                                                configFile.getValue());
+      }
+      catch (InitializationException ie)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_LOAD_CONFIG;
+        String message = getMessage(msgID, ie.getMessage());
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
+      catch (Exception e)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_LOAD_CONFIG;
+        String message = getMessage(msgID, stackTraceToSingleLineString(e));
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
 
 
 
-    // Initialize the Directory Server schema elements.
-    try
-    {
-      directoryServer.initializeSchema();
-    }
-    catch (ConfigException ce)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_LOAD_SCHEMA;
-      String message = getMessage(msgID, ce.getMessage());
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
-    catch (InitializationException ie)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_LOAD_SCHEMA;
-      String message = getMessage(msgID, ie.getMessage());
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
-    catch (Exception e)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_LOAD_SCHEMA;
-      String message = getMessage(msgID, stackTraceToSingleLineString(e));
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
+      // Initialize the Directory Server schema elements.
+      try
+      {
+        directoryServer.initializeSchema();
+      }
+      catch (ConfigException ce)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_LOAD_SCHEMA;
+        String message = getMessage(msgID, ce.getMessage());
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
+      catch (InitializationException ie)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_LOAD_SCHEMA;
+        String message = getMessage(msgID, ie.getMessage());
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
+      catch (Exception e)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_LOAD_SCHEMA;
+        String message = getMessage(msgID, stackTraceToSingleLineString(e));
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
 
 
-    // Initialize the Directory Server core configuration.
-    try
-    {
-      CoreConfigManager coreConfigManager = new CoreConfigManager();
-      coreConfigManager.initializeCoreConfig();
-    }
-    catch (ConfigException ce)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_CORE_CONFIG;
-      String message = getMessage(msgID, ce.getMessage());
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
-    catch (InitializationException ie)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_CORE_CONFIG;
-      String message = getMessage(msgID, ie.getMessage());
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
-    catch (Exception e)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_CORE_CONFIG;
-      String message = getMessage(msgID, stackTraceToSingleLineString(e));
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
+      // Initialize the Directory Server core configuration.
+      try
+      {
+        CoreConfigManager coreConfigManager = new CoreConfigManager();
+        coreConfigManager.initializeCoreConfig();
+      }
+      catch (ConfigException ce)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_CORE_CONFIG;
+        String message = getMessage(msgID, ce.getMessage());
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
+      catch (InitializationException ie)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_CORE_CONFIG;
+        String message = getMessage(msgID, ie.getMessage());
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
+      catch (Exception e)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_CORE_CONFIG;
+        String message = getMessage(msgID, stackTraceToSingleLineString(e));
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
 
 
-    // Initialize the password storage schemes.
-    try
-    {
-      PasswordStorageSchemeConfigManager storageSchemeConfigManager =
-           new PasswordStorageSchemeConfigManager();
-      storageSchemeConfigManager.initializePasswordStorageSchemes();
-    }
-    catch (ConfigException ce)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_STORAGE_SCHEMES;
-      String message = getMessage(msgID, ce.getMessage());
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
-    catch (InitializationException ie)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_STORAGE_SCHEMES;
-      String message = getMessage(msgID, ie.getMessage());
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
-    }
-    catch (Exception e)
-    {
-      int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_STORAGE_SCHEMES;
-      String message = getMessage(msgID, stackTraceToSingleLineString(e));
-      System.err.println(wrapText(message, MAX_LINE_WIDTH));
-      System.exit(1);
+      // Initialize the password storage schemes.
+      try
+      {
+        PasswordStorageSchemeConfigManager storageSchemeConfigManager =
+             new PasswordStorageSchemeConfigManager();
+        storageSchemeConfigManager.initializePasswordStorageSchemes();
+      }
+      catch (ConfigException ce)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_STORAGE_SCHEMES;
+        String message = getMessage(msgID, ce.getMessage());
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
+      catch (InitializationException ie)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_STORAGE_SCHEMES;
+        String message = getMessage(msgID, ie.getMessage());
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
+      catch (Exception e)
+      {
+        int    msgID   = MSGID_ENCPW_CANNOT_INITIALIZE_STORAGE_SCHEMES;
+        String message = getMessage(msgID, stackTraceToSingleLineString(e));
+        err.println(wrapText(message, MAX_LINE_WIDTH));
+        return 1;
+      }
     }
 
 
@@ -382,7 +482,7 @@
         {
           int msgID = MSGID_ENCPW_NO_STORAGE_SCHEMES;
           String message = getMessage(msgID);
-          System.err.println(wrapText(message, MAX_LINE_WIDTH));
+          err.println(wrapText(message, MAX_LINE_WIDTH));
         }
         else
         {
@@ -400,11 +500,11 @@
 
           for (String storageSchemeName : nameArray)
           {
-            System.out.println(storageSchemeName);
+            out.println(storageSchemeName);
           }
         }
 
-        System.exit(0);
+        return 0;
       }
       else
       {
@@ -414,7 +514,7 @@
         {
           int msgID = MSGID_ENCPW_NO_STORAGE_SCHEMES;
           String message = getMessage(msgID);
-          System.err.println(wrapText(message, MAX_LINE_WIDTH));
+          err.println(wrapText(message, MAX_LINE_WIDTH));
         }
         else
         {
@@ -432,39 +532,11 @@
 
           for (String storageSchemeName : nameArray)
           {
-            System.out.println(storageSchemeName);
+            out.println(storageSchemeName);
           }
         }
 
-        System.exit(0);
-      }
-    }
-
-
-    // Try to get a reference to the requested password storage scheme.
-    PasswordStorageScheme storageScheme;
-    if (authPasswordSyntax.isPresent())
-    {
-      String scheme = schemeName.getValue();
-      storageScheme = DirectoryServer.getAuthPasswordStorageScheme(scheme);
-      if (storageScheme == null)
-      {
-        int    msgID   = MSGID_ENCPW_NO_SUCH_AUTH_SCHEME;
-        String message = getMessage(msgID, scheme);
-        System.err.println(wrapText(message, MAX_LINE_WIDTH));
-        System.exit(1);
-      }
-    }
-    else
-    {
-      String scheme = toLowerCase(schemeName.getValue());
-      storageScheme = DirectoryServer.getPasswordStorageScheme(scheme);
-      if (storageScheme == null)
-      {
-        int    msgID   = MSGID_ENCPW_NO_SUCH_SCHEME;
-        String message = getMessage(msgID, scheme);
-        System.err.println(wrapText(message, MAX_LINE_WIDTH));
-        System.exit(1);
+        return 0;
       }
     }
 
@@ -473,15 +545,20 @@
     // compare the clear-text password against the encoded password.
     if (compareMode)
     {
+      // Check to see if the provided password value was encoded.  If so, then
+      // break it down into its component parts and use that to perform the
+      // comparison.  Otherwise, the user must have provided the storage scheme.
       if (authPasswordSyntax.isPresent())
       {
-        String authInfo  = null;
-        String authValue = null;
+        String scheme;
+        String authInfo;
+        String authValue;
+
         try
         {
-          String encodedPWString = encodedPassword.getValue();
           StringBuilder[] authPWElements =
-               AuthPasswordSyntax.decodeAuthPassword(encodedPWString);
+               AuthPasswordSyntax.decodeAuthPassword(encodedPW.stringValue());
+          scheme    = authPWElements[0].toString();
           authInfo  = authPWElements[1].toString();
           authValue = authPWElements[2].toString();
         }
@@ -489,48 +566,181 @@
         {
           int    msgID   = MSGID_ENCPW_INVALID_ENCODED_AUTHPW;
           String message = getMessage(msgID, de.getErrorMessage());
-          System.err.println(wrapText(message, MAX_LINE_WIDTH));
-          System.exit(1);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
         }
         catch (Exception e)
         {
           int    msgID   = MSGID_ENCPW_INVALID_ENCODED_AUTHPW;
-          String message = getMessage(msgID, e);
-          System.err.println(wrapText(message, MAX_LINE_WIDTH));
-          System.exit(1);
+          String message = getMessage(msgID, String.valueOf(e));
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
+        }
+
+        PasswordStorageScheme storageScheme =
+             DirectoryServer.getAuthPasswordStorageScheme(scheme);
+        if (storageScheme == null)
+        {
+          int    msgID   = MSGID_ENCPW_NO_SUCH_AUTH_SCHEME;
+          String message = getMessage(msgID, scheme);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
         }
 
         if (storageScheme.authPasswordMatches(clearPW, authInfo, authValue))
         {
           int    msgID   = MSGID_ENCPW_PASSWORDS_MATCH;
           String message = getMessage(msgID);
-          System.out.println(wrapText(message, MAX_LINE_WIDTH));
+          out.println(message);
+
+          if (useCompareResultCode.isPresent())
+          {
+            return LDAPResultCode.COMPARE_TRUE;
+          }
+          else
+          {
+            return 0;
+          }
         }
         else
         {
           int    msgID   = MSGID_ENCPW_PASSWORDS_DO_NOT_MATCH;
           String message = getMessage(msgID);
-          System.out.println(wrapText(message, MAX_LINE_WIDTH));
+          out.println(message);
+
+          if (useCompareResultCode.isPresent())
+          {
+            return LDAPResultCode.COMPARE_FALSE;
+          }
+          else
+          {
+            return 0;
+          }
         }
       }
       else
       {
-        if (storageScheme.passwordMatches(clearPW, encodedPW))
+        PasswordStorageScheme storageScheme;
+        String                encodedPWString;
+
+        if (UserPasswordSyntax.isEncoded(encodedPW))
+        {
+          try
+          {
+            String[] userPWElements =
+                 UserPasswordSyntax.decodeUserPassword(encodedPW.stringValue());
+            encodedPWString = userPWElements[1];
+
+            storageScheme =
+                 DirectoryServer.getPasswordStorageScheme(userPWElements[0]);
+            if (storageScheme == null)
+            {
+              int    msgID   = MSGID_ENCPW_NO_SUCH_SCHEME;
+              String message = getMessage(msgID, userPWElements[0]);
+              err.println(wrapText(message, MAX_LINE_WIDTH));
+              return 1;
+            }
+          }
+          catch (DirectoryException de)
+          {
+            int    msgID   = MSGID_ENCPW_INVALID_ENCODED_USERPW;
+            String message = getMessage(msgID, de.getErrorMessage());
+            err.println(wrapText(message, MAX_LINE_WIDTH));
+            return 1;
+          }
+          catch (Exception e)
+          {
+            int    msgID   = MSGID_ENCPW_INVALID_ENCODED_USERPW;
+            String message = getMessage(msgID, String.valueOf(e));
+            err.println(wrapText(message, MAX_LINE_WIDTH));
+            return 1;
+          }
+        }
+        else
+        {
+          if (! schemeName.isPresent())
+          {
+            int    msgID   = MSGID_ENCPW_NO_SCHEME;
+            String message = getMessage(msgID, schemeName.getLongIdentifier());
+            err.println(wrapText(message, MAX_LINE_WIDTH));
+            return 1;
+          }
+
+          encodedPWString = encodedPW.toString();
+
+          String scheme = toLowerCase(schemeName.getValue());
+          storageScheme = directoryServer.getPasswordStorageScheme(scheme);
+          if (storageScheme == null)
+          {
+            int    msgID   = MSGID_ENCPW_NO_SUCH_SCHEME;
+            String message = getMessage(msgID, scheme);
+            err.println(wrapText(message, MAX_LINE_WIDTH));
+            return 1;
+          }
+        }
+
+        if (storageScheme.passwordMatches(clearPW,
+                                          new ASN1OctetString(encodedPWString)))
         {
           int    msgID   = MSGID_ENCPW_PASSWORDS_MATCH;
           String message = getMessage(msgID);
-          System.out.println(wrapText(message, MAX_LINE_WIDTH));
+          out.println(message);
+
+          if (useCompareResultCode.isPresent())
+          {
+            return LDAPResultCode.COMPARE_TRUE;
+          }
+          else
+          {
+            return 0;
+          }
         }
         else
         {
           int    msgID   = MSGID_ENCPW_PASSWORDS_DO_NOT_MATCH;
           String message = getMessage(msgID);
-          System.out.println(wrapText(message, MAX_LINE_WIDTH));
+          out.println(message);
+
+          if (useCompareResultCode.isPresent())
+          {
+            return LDAPResultCode.COMPARE_FALSE;
+          }
+          else
+          {
+            return 0;
+          }
         }
       }
     }
     else
     {
+      // Try to get a reference to the requested password storage scheme.
+      PasswordStorageScheme storageScheme;
+      if (authPasswordSyntax.isPresent())
+      {
+        String scheme = schemeName.getValue();
+        storageScheme = DirectoryServer.getAuthPasswordStorageScheme(scheme);
+        if (storageScheme == null)
+        {
+          int    msgID   = MSGID_ENCPW_NO_SUCH_AUTH_SCHEME;
+          String message = getMessage(msgID, scheme);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
+        }
+      }
+      else
+      {
+        String scheme = toLowerCase(schemeName.getValue());
+        storageScheme = DirectoryServer.getPasswordStorageScheme(scheme);
+        if (storageScheme == null)
+        {
+          int    msgID   = MSGID_ENCPW_NO_SUCH_SCHEME;
+          String message = getMessage(msgID, scheme);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
+        }
+      }
+
       if (authPasswordSyntax.isPresent())
       {
         try
@@ -539,21 +749,21 @@
 
           int    msgID   = MSGID_ENCPW_ENCODED_PASSWORD;
           String message = getMessage(msgID, encodedPW.stringValue());
-          System.out.println(message);
+          out.println(message);
         }
         catch (DirectoryException de)
         {
           int msgID = MSGID_ENCPW_CANNOT_ENCODE;
           String message = getMessage(msgID, de.getErrorMessage());
-          System.err.println(wrapText(message, MAX_LINE_WIDTH));
-          System.exit(1);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
         }
         catch (Exception e)
         {
           int msgID = MSGID_ENCPW_CANNOT_ENCODE;
           String message = getMessage(msgID, stackTraceToSingleLineString(e));
-          System.err.println(wrapText(message, MAX_LINE_WIDTH));
-          System.exit(1);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
         }
       }
       else
@@ -564,24 +774,27 @@
 
           int    msgID   = MSGID_ENCPW_ENCODED_PASSWORD;
           String message = getMessage(msgID, encodedPW.stringValue());
-          System.out.println(message);
+          out.println(message);
         }
         catch (DirectoryException de)
         {
           int msgID = MSGID_ENCPW_CANNOT_ENCODE;
           String message = getMessage(msgID, de.getErrorMessage());
-          System.err.println(wrapText(message, MAX_LINE_WIDTH));
-          System.exit(1);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
         }
         catch (Exception e)
         {
           int msgID = MSGID_ENCPW_CANNOT_ENCODE;
           String message = getMessage(msgID, stackTraceToSingleLineString(e));
-          System.err.println(wrapText(message, MAX_LINE_WIDTH));
-          System.exit(1);
+          err.println(wrapText(message, MAX_LINE_WIDTH));
+          return 1;
         }
       }
     }
+
+    // If we've gotten here, then all processing completed successfully.
+    return 0;
   }
 }
 

--
Gitblit v1.10.0