mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Matthew Swift
15.02.2011 73a7d442a169c828e015f3893828f3a55758136a
Fix OPENDJ-187: ldapsearch tool does not hide the password in the command line

Add readPassword method to ConsoleApplication class and use it in order to retrieve passwords. Also clean up unused methods.

Thanks to Nemanja Lukić for the bug report and suggested patch.

9 files modified
1307 ■■■■ changed files
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java 119 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ConnectionFactoryProvider.java 17 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ConsoleApplication.java 389 ●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java 126 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java 128 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java 132 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java 157 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java 120 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java 119 ●●●●● patch | view | raw | blame | history
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
@@ -34,8 +34,6 @@
import static com.forgerock.opendj.ldap.tools.ToolConstants.*;
import static com.forgerock.opendj.ldap.tools.Utils.filterExitCode;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -444,132 +442,27 @@
  public static void main(final String[] args)
  {
    final int retCode = mainAuthRate(args, System.in, System.out, System.err);
    final int retCode = new AuthRate().run(args);
    System.exit(filterExitCode(retCode));
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @return The error code.
   */
  static int mainAuthRate(final String[] args)
  {
    return mainAuthRate(args, System.in, System.out, System.err);
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @param inStream
   *          The input stream to use for standard input, or <CODE>null</CODE>
   *          if standard input is not needed.
   * @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 The error code.
   */
  static int mainAuthRate(final String[] args, final InputStream inStream,
      final OutputStream outStream, final OutputStream errStream)
  {
    return new AuthRate(inStream, outStream, errStream).run(args);
  }
  private BooleanArgument verbose;
  private BooleanArgument scriptFriendly;
  private AuthRate(final InputStream in, final OutputStream out,
      final OutputStream err)
  private AuthRate()
  {
    super(in, out, err);
    // Nothing to do.
  }
  /**
   * Indicates whether or not the user has requested advanced mode.
   *
   * @return Returns <code>true</code> if the user has requested advanced mode.
   */
  @Override
  public boolean isAdvancedMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested interactive behavior.
   *
   * @return Returns <code>true</code> if the user has requested interactive
   *         behavior.
   */
  @Override
  public boolean isInteractive()
  {
    return false;
  }
  /**
   * Indicates whether or not this console application is running in its
   * menu-driven mode. This can be used to dictate whether output should go to
   * the error stream or not. In addition, it may also dictate whether or not
   * sub-menus should display a cancel option as well as a quit option.
   *
   * @return Returns <code>true</code> if this console application is running in
   *         its menu-driven mode.
   */
  @Override
  public boolean isMenuDrivenMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested quiet output.
   *
   * @return Returns <code>true</code> if the user has requested quiet output.
   */
  @Override
  public boolean isQuiet()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested script-friendly output.
   *
   * @return Returns <code>true</code> if the user has requested script-friendly
   *         output.
   * {@inheritDoc}
   */
  @Override
  public boolean isScriptFriendly()
@@ -580,9 +473,7 @@
  /**
   * Indicates whether or not the user has requested verbose output.
   *
   * @return Returns <code>true</code> if the user has requested verbose output.
   * {@inheritDoc}
   */
  @Override
  public boolean isVerbose()
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ConnectionFactoryProvider.java
@@ -23,6 +23,7 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2011 ForgeRock AS
 */
package com.forgerock.opendj.ldap.tools;
@@ -596,7 +597,7 @@
            || bindPasswordArg.isPresent())
        {
          bindRequest = Requests.newSimpleBindRequest(getBindName(),
              getPassword().toCharArray());
              getPassword());
        }
      }
      else if (mech.equals(DigestMD5SASLBindRequest.SASL_MECHANISM_NAME))
@@ -769,22 +770,24 @@
   * @return The password stored into the specified file on by the command line
   *         argument, or null it if not specified.
   */
  private String getPassword() throws ArgumentException
  private char[] getPassword() throws ArgumentException
  {
    String value = "";
    char[] value = "".toCharArray();
    if (bindPasswordArg.isPresent())
    {
      value = bindPasswordArg.getValue();
      value = bindPasswordArg.getValue().toCharArray();
    }
    else if (bindPasswordFileArg.isPresent())
    {
      value = bindPasswordFileArg.getValue();
      value = bindPasswordFileArg.getValue().toCharArray();
    }
    if (value.length() == 0 && app.isInteractive())
    if (value.length == 0 && app.isInteractive())
    {
      try
      {
        value = app.readLineOfInput(LocalizableMessage.raw("Bind Password:"));
        value = app.readPassword(LocalizableMessage.raw("Bind Password:"));
      }
      catch(CLIException e)
      {
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ConsoleApplication.java
@@ -23,20 +23,18 @@
 *
 *
 *      Copyright 2008-2009 Sun Microsystems, Inc.
 *      Portions copyright 2011 ForgeRock AS
 *      Portions copyright 2011 Nemanja Lukić
 */
package com.forgerock.opendj.ldap.tools;
import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_ERROR_EMPTY_RESPONSE;
import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_MENU_PROMPT_RETURN_TO_CONTINUE;
import static com.forgerock.opendj.ldap.tools.ToolsMessages.INFO_PROMPT_SINGLE_DEFAULT;
import static com.forgerock.opendj.ldap.tools.ToolsMessages.*;
import static com.forgerock.opendj.ldap.tools.Utils.MAX_LINE_WIDTH;
import static com.forgerock.opendj.ldap.tools.Utils.wrapText;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.forgerock.i18n.LocalizableMessage;
@@ -48,202 +46,33 @@
 */
abstract class ConsoleApplication
{
  private static final class NullOutputStream extends OutputStream
  {
    /**
     * The singleton instance for this class.
     */
    private static final NullOutputStream INSTANCE = new NullOutputStream();
  private final PrintStream err = new PrintStream(System.out);
    /**
     * The singleton print stream tied to the null output stream.
     */
    private static final PrintStream PRINT_STREAM = new PrintStream(INSTANCE);
  private final BufferedReader reader = new BufferedReader(
      new InputStreamReader(System.in));
  private final InputStream in = System.in;
  private final PrintStream out = new PrintStream(System.out);
    /**
     * Retrieves a print stream using this null output stream.
     *
     * @return A print stream using this null output stream.
     */
    static PrintStream printStream()
    {
      return PRINT_STREAM;
    }
    /**
     * Creates a new instance of this null output stream.
     */
    private NullOutputStream()
    {
      // No implementation is required.
    }
    /**
     * Closes the output stream. This has no effect.
     */
    @Override
    public void close()
    {
      // No implementation is required.
    }
    /**
     * Flushes the output stream. This has no effect.
     */
    @Override
    public void flush()
    {
      // No implementation is required.
    }
    /**
     * Writes the provided data to this output stream. This has no effect.
     *
     * @param b
     *          The byte array containing the data to be written.
     */
    @Override
    public void write(final byte[] b)
    {
      // No implementation is required.
    }
    /**
     * Writes the provided data to this output stream. This has no effect.
     *
     * @param b
     *          The byte array containing the data to be written.
     * @param off
     *          The offset at which the real data begins.
     * @param len
     *          The number of bytes to be written.
     */
    @Override
    public void write(final byte[] b, final int off, final int len)
    {
      // No implementation is required.
    }
    /**
     * Writes the provided byte to this output stream. This has no effect.
     *
     * @param b
     *          The byte to be written.
     */
    @Override
    public void write(final int b)
    {
      // No implementation is required.
    }
  }
  /**
   * A null reader.
   */
  private static final class NullReader extends Reader
  {
    /**
     * {@inheritDoc}
     */
    @Override
    public void close() throws IOException
    {
      // Do nothing.
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public int read(final char[] cbuf, final int off, final int len)
        throws IOException
    {
      return -1;
    }
  }
  // The error stream which this application should use.
  private final PrintStream err;
  // The input stream reader which this application should use.
  private final BufferedReader reader;
  private final InputStream in;
  // The output stream which this application should use.
  private final PrintStream out;
  private final Console console = System.console();
  /**
   * Creates a new console application instance.
   *
   * @param in
   *          The application input stream.
   * @param out
   *          The application output stream.
   * @param err
   *          The application error stream.
   */
  ConsoleApplication(final InputStream in, final OutputStream out,
      final OutputStream err)
  ConsoleApplication()
  {
    this.in = in;
    if (in != null)
    {
      this.reader = new BufferedReader(new InputStreamReader(in));
    }
    else
    {
      this.reader = new BufferedReader(new NullReader());
    }
    if (out != null)
    {
      this.out = new PrintStream(out);
    }
    else
    {
      this.out = NullOutputStream.printStream();
    }
    if (err != null)
    {
      this.err = new PrintStream(err);
    }
    else
    {
      this.err = NullOutputStream.printStream();
    }
    // Nothing to do.
  }
  /**
   * Gets the application error stream.
   * Returns the application error stream.
   *
   * @return Returns the application error stream.
   * @return The application error stream.
   */
  final PrintStream getErrorStream()
  {
@@ -253,21 +82,9 @@
  /**
   * Gets the application input stream reader.
   * Returns the application input stream.
   *
   * @return Returns the application input stream.
   */
  final BufferedReader getInputReader()
  {
    return reader;
  }
  /**
   * Gets the application input stream.
   *
   * @return Returns the application input stream.
   * @return The application input stream.
   */
  final InputStream getInputStream()
  {
@@ -277,9 +94,9 @@
  /**
   * Gets the application output stream.
   * Returns the application output stream.
   *
   * @return Returns the application output stream.
   * @return The application output stream.
   */
  final PrintStream getOutputStream()
  {
@@ -289,62 +106,54 @@
  /**
   * Indicates whether or not the user has requested advanced mode.
   * Indicates whether or not the user has requested interactive behavior. The
   * default implementation returns {@code true}.
   *
   * @return Returns <code>true</code> if the user has requested advanced mode.
   * @return {@code true} if the user has requested interactive behavior.
   */
  abstract boolean isAdvancedMode();
  boolean isInteractive()
  {
    return true;
  }
  /**
   * Indicates whether or not the user has requested interactive behavior.
   * Indicates whether or not the user has requested quiet output. The default
   * implementation returns {@code false}.
   *
   * @return Returns <code>true</code> if the user has requested interactive
   *         behavior.
   * @return {@code true} if the user has requested quiet output.
   */
  abstract boolean isInteractive();
  boolean isQuiet()
  {
    return false;
  }
  /**
   * Indicates whether or not this console application is running in its
   * menu-driven mode. This can be used to dictate whether output should go to
   * the error stream or not. In addition, it may also dictate whether or not
   * sub-menus should display a cancel option as well as a quit option.
   * Indicates whether or not the user has requested script-friendly output. The
   * default implementation returns {@code false}.
   *
   * @return Returns <code>true</code> if this console application is running in
   *         its menu-driven mode.
   * @return {@code true} if the user has requested script-friendly output.
   */
  abstract boolean isMenuDrivenMode();
  boolean isScriptFriendly()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested quiet output.
   * Indicates whether or not the user has requested verbose output. The default
   * implementation returns {@code false}.
   *
   * @return Returns <code>true</code> if the user has requested quiet output.
   * @return {@code true} if the user has requested verbose output.
   */
  abstract boolean isQuiet();
  /**
   * Indicates whether or not the user has requested script-friendly output.
   *
   * @return Returns <code>true</code> if the user has requested script-friendly
   *         output.
   */
  abstract boolean isScriptFriendly();
  /**
   * Indicates whether or not the user has requested verbose output.
   *
   * @return Returns <code>true</code> if the user has requested verbose output.
   */
  abstract boolean isVerbose();
  boolean isVerbose()
  {
    return false;
  }
@@ -356,7 +165,8 @@
   */
  final void pressReturnToContinue()
  {
    final LocalizableMessage msg = INFO_MENU_PROMPT_RETURN_TO_CONTINUE.get();
    final LocalizableMessage msg = INFO_MENU_PROMPT_RETURN_TO_CONTINUE
        .get();
    try
    {
      readLineOfInput(msg);
@@ -422,35 +232,6 @@
  /**
   * Displays a blank line to the output stream if we are not in quiet mode.
   */
  final void printlnProgress()
  {
    if (!isQuiet())
    {
      out.println();
    }
  }
  /**
   * Displays a message to the output stream if we are not in quiet mode.
   *
   * @param msg
   *          The message.
   */
  final void printProgress(final LocalizableMessage msg)
  {
    if (!isQuiet())
    {
      out.print(msg);
    }
  }
  /**
   * Displays a message to the error stream if verbose mode is enabled.
   *
   * @param msg
@@ -467,29 +248,29 @@
  /**
   * Commodity method that interactively prompts (on error output) the user to
   * provide a string value. Any non-empty string will be allowed (the empty
   * string will indicate that the default should be used, if there is one).
   * Interactively prompts (on error output) the user to provide a string value.
   * Any non-empty string will be allowed (the empty string will indicate that
   * the default should be used, if there is one).
   *
   * @param prompt
   *          The prompt to present to the user.
   * @param defaultValue
   *          The default value to assume if the user presses ENTER without
   *          typing anything, or <CODE>null</CODE> if there should not be a
   *          default and the user must explicitly provide a value.
   *          typing anything, or {@code null} if there should not be a default
   *          and the user must explicitly provide a value.
   * @throws CLIException
   *           If the line of input could not be retrieved for some reason.
   * @return The string value read from the user.
   */
  final String readInput(LocalizableMessage prompt, final String defaultValue)
      throws CLIException
  final String readInput(LocalizableMessage prompt,
      final String defaultValue) throws CLIException
  {
    while (true)
    {
      if (defaultValue != null)
      {
        prompt = INFO_PROMPT_SINGLE_DEFAULT
            .get(prompt.toString(), defaultValue);
        prompt = INFO_PROMPT_SINGLE_DEFAULT.get(prompt.toString(),
            defaultValue);
      }
      final String response = readLineOfInput(prompt);
@@ -514,34 +295,43 @@
  /**
   * Commodity method that interactively prompts (on error output) the user to
   * provide a string value. Any non-empty string will be allowed (the empty
   * string will indicate that the default should be used, if there is one). If
   * an error occurs a message will be logged to the provided logger.
   * Interactively reads a password from the console.
   *
   * @param prompt
   *          The prompt to present to the user.
   * @param defaultValue
   *          The default value to assume if the user presses ENTER without
   *          typing anything, or <CODE>null</CODE> if there should not be a
   *          default and the user must explicitly provide a value.
   * @param logger
   *          the Logger to be used to log the error message.
   * @return The string value read from the user.
   *          The password prompt.
   * @return The password.
   * @throws CLIException
   *           If the password could not be retrieved for some reason.
   */
  final String readInput(final LocalizableMessage prompt,
      final String defaultValue, final Logger logger)
  final char[] readPassword(final LocalizableMessage prompt)
      throws CLIException
  {
    String s = defaultValue;
    try
    if (console != null)
    {
      s = readInput(prompt, defaultValue);
      if (prompt != null)
      {
        err.print(wrapText(prompt, MAX_LINE_WIDTH));
        err.print(" ");
      }
      try
      {
        final char[] password = console.readPassword();
        if (password == null)
        {
          throw new EOFException("End of input");
        }
        return password;
      }
      catch (final Throwable e)
      {
        throw CLIException.adaptInputException(e);
      }
    }
    catch (final CLIException ce)
    else
    {
      logger.log(Level.WARNING, "Error reading input: " + ce, ce);
      // FIXME: should go direct to char[] and avoid the String.
      return readLineOfInput(prompt).toCharArray();
    }
    return s;
  }
@@ -551,12 +341,11 @@
   *
   * @param prompt
   *          The prompt.
   * @return Returns the line of input, or <code>null</code> if the end of input
   *         has been reached.
   * @return The line of input.
   * @throws CLIException
   *           If the line of input could not be retrieved for some reason.
   */
  final String readLineOfInput(final LocalizableMessage prompt)
  private final String readLineOfInput(final LocalizableMessage prompt)
      throws CLIException
  {
    if (prompt != null)
@@ -569,8 +358,8 @@
      final String s = reader.readLine();
      if (s == null)
      {
        throw CLIException
            .adaptInputException(new EOFException("End of input"));
        throw CLIException.adaptInputException(new EOFException(
            "End of input"));
      }
      else
      {
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPCompare.java
@@ -23,6 +23,7 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2011 ForgeRock AS
 */
package com.forgerock.opendj.ldap.tools;
@@ -65,142 +66,25 @@
  public static void main(final String[] args)
  {
    final int retCode = mainCompare(args, System.in, System.out, System.err);
    final int retCode = new LDAPCompare().run(args);
    System.exit(filterExitCode(retCode));
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the LDAPModify tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @return The error code.
   */
  static int mainCompare(final String[] args)
  {
    return mainCompare(args, System.in, System.out, System.err);
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the LDAPModify tool.
   *
   * @param args
   *          The command-line arguments provided to this program. specified,
   *          the number of matching entries should be returned or not.
   * @param inStream
   *          The input stream to use for standard input, or <CODE>null</CODE>
   *          if standard input is not needed.
   * @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 The error code.
   */
  static int mainCompare(final String[] args, final InputStream inStream,
      final OutputStream outStream, final OutputStream errStream)
  {
    return new LDAPCompare(inStream, outStream, errStream).run(args);
  }
  private BooleanArgument verbose;
  private LDAPCompare(final InputStream in, final OutputStream out,
      final OutputStream err)
  private LDAPCompare()
  {
    super(in, out, err);
    // Nothing to do.
  }
  /**
   * Indicates whether or not the user has requested advanced mode.
   *
   * @return Returns <code>true</code> if the user has requested advanced mode.
   */
  @Override
  public boolean isAdvancedMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested interactive behavior.
   *
   * @return Returns <code>true</code> if the user has requested interactive
   *         behavior.
   */
  @Override
  public boolean isInteractive()
  {
    return false;
  }
  /**
   * Indicates whether or not this console application is running in its
   * menu-driven mode. This can be used to dictate whether output should go to
   * the error stream or not. In addition, it may also dictate whether or not
   * sub-menus should display a cancel option as well as a quit option.
   *
   * @return Returns <code>true</code> if this console application is running in
   *         its menu-driven mode.
   */
  @Override
  public boolean isMenuDrivenMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested quiet output.
   *
   * @return Returns <code>true</code> if the user has requested quiet output.
   */
  @Override
  public boolean isQuiet()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested script-friendly output.
   *
   * @return Returns <code>true</code> if the user has requested script-friendly
   *         output.
   */
  @Override
  public boolean isScriptFriendly()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested verbose output.
   *
   * @return Returns <code>true</code> if the user has requested verbose output.
   * {@inheritDoc}
   */
  @Override
  public boolean isVerbose()
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPModify.java
@@ -23,6 +23,7 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2011 ForgeRock AS
 */
package com.forgerock.opendj.ldap.tools;
@@ -36,8 +37,6 @@
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@@ -313,54 +312,12 @@
  public static void main(final String[] args)
  {
    final int retCode = mainModify(args, System.in, System.out, System.err);
    final int retCode = new LDAPModify().run(args);
    System.exit(filterExitCode(retCode));
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the LDAPModify tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @return The error code.
   */
  static int mainModify(final String[] args)
  {
    return mainModify(args, System.in, System.out, System.err);
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the LDAPModify tool.
   *
   * @param args
   *          The command-line arguments provided to this program. specified,
   *          the number of matching entries should be returned or not.
   * @param inStream
   *          The input stream to use for standard input, or <CODE>null</CODE>
   *          if standard input is not needed.
   * @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 The error code.
   */
  static int mainModify(final String[] args, final InputStream inStream,
      final OutputStream outStream, final OutputStream errStream)
  {
    return new LDAPModify(inStream, outStream, errStream).run(args);
  }
  private Connection connection;
  private EntryWriter writer;
@@ -371,90 +328,15 @@
  private LDAPModify(final InputStream in, final OutputStream out,
      final OutputStream err)
  private LDAPModify()
  {
    super(in, out, err);
    // Nothing to do.
  }
  /**
   * Indicates whether or not the user has requested advanced mode.
   *
   * @return Returns <code>true</code> if the user has requested advanced mode.
   */
  @Override
  public boolean isAdvancedMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested interactive behavior.
   *
   * @return Returns <code>true</code> if the user has requested interactive
   *         behavior.
   */
  @Override
  public boolean isInteractive()
  {
    return false;
  }
  /**
   * Indicates whether or not this console application is running in its
   * menu-driven mode. This can be used to dictate whether output should go to
   * the error stream or not. In addition, it may also dictate whether or not
   * sub-menus should display a cancel option as well as a quit option.
   *
   * @return Returns <code>true</code> if this console application is running in
   *         its menu-driven mode.
   */
  @Override
  public boolean isMenuDrivenMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested quiet output.
   *
   * @return Returns <code>true</code> if the user has requested quiet output.
   */
  @Override
  public boolean isQuiet()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested script-friendly output.
   *
   * @return Returns <code>true</code> if the user has requested script-friendly
   *         output.
   */
  @Override
  public boolean isScriptFriendly()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested verbose output.
   *
   * @return Returns <code>true</code> if the user has requested verbose output.
   * {@inheritDoc}
   */
  @Override
  public boolean isVerbose()
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPPasswordModify.java
@@ -23,6 +23,7 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2011 ForgeRock AS
 */
package com.forgerock.opendj.ldap.tools;
@@ -34,9 +35,6 @@
import static com.forgerock.opendj.ldap.tools.Utils.filterExitCode;
import static org.forgerock.opendj.ldap.ErrorResultException.newErrorResult;
import java.io.InputStream;
import java.io.OutputStream;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.ldap.*;
import org.forgerock.opendj.ldap.controls.Control;
@@ -70,145 +68,25 @@
   */
  public static void main(final String[] args)
  {
    final int retCode = mainPasswordModify(args, System.in, System.out,
        System.err);
    final int retCode = new LDAPPasswordModify().run(args);
    System.exit(filterExitCode(retCode));
  }
  /**
   * Parses the command-line arguments, establishes a connection to the
   * Directory Server, sends the password modify request, and reads the
   * response.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @return An integer value of zero if everything completed successfully, or a
   *         nonzero value if an error occurred.
   */
  static int mainPasswordModify(final String[] args)
  {
    return mainPasswordModify(args, System.in, System.out, System.err);
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the LDAPPasswordModify tool.
   *
   * @param args
   *          The command-line arguments provided to this program. specified,
   *          the number of matching entries should be returned or not.
   * @param inStream
   *          The input stream to use for standard input, or <CODE>null</CODE>
   *          if standard input is not needed.
   * @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 The error code.
   */
  static int mainPasswordModify(final String[] args,
      final InputStream inStream, final OutputStream outStream,
      final OutputStream errStream)
  {
    return new LDAPPasswordModify(inStream, outStream, errStream).run(args);
  }
  private BooleanArgument verbose;
  private LDAPPasswordModify(final InputStream in, final OutputStream out,
      final OutputStream err)
  private LDAPPasswordModify()
  {
    super(in, out, err);
    // Nothing to do.
  }
  /**
   * Indicates whether or not the user has requested advanced mode.
   *
   * @return Returns <code>true</code> if the user has requested advanced mode.
   */
  @Override
  public boolean isAdvancedMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested interactive behavior.
   *
   * @return Returns <code>true</code> if the user has requested interactive
   *         behavior.
   */
  @Override
  public boolean isInteractive()
  {
    return false;
  }
  /**
   * Indicates whether or not this console application is running in its
   * menu-driven mode. This can be used to dictate whether output should go to
   * the error stream or not. In addition, it may also dictate whether or not
   * sub-menus should display a cancel option as well as a quit option.
   *
   * @return Returns <code>true</code> if this console application is running in
   *         its menu-driven mode.
   */
  @Override
  public boolean isMenuDrivenMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested quiet output.
   *
   * @return Returns <code>true</code> if the user has requested quiet output.
   */
  @Override
  public boolean isQuiet()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested script-friendly output.
   *
   * @return Returns <code>true</code> if the user has requested script-friendly
   *         output.
   */
  @Override
  public boolean isScriptFriendly()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested verbose output.
   *
   * @return Returns <code>true</code> if the user has requested verbose output.
   * {@inheritDoc}
   */
  @Override
  public boolean isVerbose()
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
@@ -23,6 +23,7 @@
 *
 *
 *      Copyright 2010 Sun Microsystems, Inc.
 *      Portions copyright 2011 ForgeRock AS
 */
package com.forgerock.opendj.ldap.tools;
@@ -215,175 +216,27 @@
  public static void main(final String[] args)
  {
    final int retCode = mainSearch(args, false, System.in, System.out,
        System.err);
    final int retCode = new LDAPSearch().run(args, false);
    System.exit(filterExitCode(retCode));
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the ldapsearch tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @return The error code.
   */
  static int mainSearch(final String[] args)
  {
    return mainSearch(args, true, System.in, System.out, System.err);
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the ldapsearch tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @param returnMatchingEntries
   *          whether when the option --countEntries is specified, the number of
   *          matching entries should be returned or not.
   * @param inStream
   *          The input stream to use for standard input, or <CODE>null</CODE>
   *          if standard input is not needed.
   * @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 The error code.
   */
  static int mainSearch(final String[] args,
      final boolean returnMatchingEntries, final InputStream inStream,
      final OutputStream outStream, final OutputStream errStream)
  {
    return new LDAPSearch(inStream, outStream, errStream).run(args,
        returnMatchingEntries);
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the ldapsearch tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @param inStream
   *          The input stream to use for standard input, or <CODE>null</CODE>
   *          if standard input is not needed.
   * @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 The error code.
   */
  static int mainSearch(final String[] args, final InputStream inStream,
      final OutputStream outStream, final OutputStream errStream)
  {
    return mainSearch(args, true, inStream, outStream, errStream);
  }
  private BooleanArgument verbose;
  private EntryWriter ldifWriter;
  private LDAPSearch(final InputStream in, final OutputStream out,
      final OutputStream err)
  private LDAPSearch()
  {
    super(in, out, err);
    // Nothing to do.
  }
  /**
   * Indicates whether or not the user has requested advanced mode.
   *
   * @return Returns <code>true</code> if the user has requested advanced mode.
   */
  @Override
  public boolean isAdvancedMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested interactive behavior.
   *
   * @return Returns <code>true</code> if the user has requested interactive
   *         behavior.
   */
  @Override
  public boolean isInteractive()
  {
    return true;
  }
  /**
   * Indicates whether or not this console application is running in its
   * menu-driven mode. This can be used to dictate whether output should go to
   * the error stream or not. In addition, it may also dictate whether or not
   * sub-menus should display a cancel option as well as a quit option.
   *
   * @return Returns <code>true</code> if this console application is running in
   *         its menu-driven mode.
   */
  @Override
  public boolean isMenuDrivenMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested quiet output.
   *
   * @return Returns <code>true</code> if the user has requested quiet output.
   */
  @Override
  public boolean isQuiet()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested script-friendly output.
   *
   * @return Returns <code>true</code> if the user has requested script-friendly
   *         output.
   */
  @Override
  public boolean isScriptFriendly()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested verbose output.
   *
   * @return Returns <code>true</code> if the user has requested verbose output.
   * {@inheritDoc}
   */
  @Override
  public boolean isVerbose()
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
@@ -34,9 +34,6 @@
import static com.forgerock.opendj.ldap.tools.ToolConstants.*;
import static com.forgerock.opendj.ldap.tools.Utils.filterExitCode;
import java.io.InputStream;
import java.io.OutputStream;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.ldap.*;
import org.forgerock.opendj.ldap.requests.ModifyRequest;
@@ -163,132 +160,27 @@
  public static void main(final String[] args)
  {
    final int retCode = mainModRate(args, System.in, System.out, System.err);
    final int retCode = new ModRate().run(args);
    System.exit(filterExitCode(retCode));
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the modrate tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @return The error code.
   */
  static int mainModRate(final String[] args)
  {
    return mainModRate(args, System.in, System.out, System.err);
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the modrate tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @param inStream
   *          The input stream to use for standard input, or <CODE>null</CODE>
   *          if standard input is not needed.
   * @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 The error code.
   */
  static int mainModRate(final String[] args, final InputStream inStream,
      final OutputStream outStream, final OutputStream errStream)
  {
    return new ModRate(inStream, outStream, errStream).run(args);
  }
  private BooleanArgument verbose;
  private BooleanArgument scriptFriendly;
  private ModRate(final InputStream in, final OutputStream out,
      final OutputStream err)
  private ModRate()
  {
    super(in, out, err);
    // Nothing to do.
  }
  /**
   * Indicates whether or not the user has requested advanced mode.
   *
   * @return Returns <code>true</code> if the user has requested advanced mode.
   */
  @Override
  public boolean isAdvancedMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested interactive behavior.
   *
   * @return Returns <code>true</code> if the user has requested interactive
   *         behavior.
   */
  @Override
  public boolean isInteractive()
  {
    return false;
  }
  /**
   * Indicates whether or not this console application is running in its
   * menu-driven mode. This can be used to dictate whether output should go to
   * the error stream or not. In addition, it may also dictate whether or not
   * sub-menus should display a cancel option as well as a quit option.
   *
   * @return Returns <code>true</code> if this console application is running in
   *         its menu-driven mode.
   */
  @Override
  public boolean isMenuDrivenMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested quiet output.
   *
   * @return Returns <code>true</code> if the user has requested quiet output.
   */
  @Override
  public boolean isQuiet()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested script-friendly output.
   *
   * @return Returns <code>true</code> if the user has requested script-friendly
   *         output.
   * {@inheritDoc}
   */
  @Override
  public boolean isScriptFriendly()
@@ -299,9 +191,7 @@
  /**
   * Indicates whether or not the user has requested verbose output.
   *
   * @return Returns <code>true</code> if the user has requested verbose output.
   * {@inheritDoc}
   */
  @Override
  public boolean isVerbose()
opendj-sdk/opendj3/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/SearchRate.java
@@ -34,8 +34,6 @@
import static com.forgerock.opendj.ldap.tools.ToolConstants.*;
import static com.forgerock.opendj.ldap.tools.Utils.filterExitCode;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -215,55 +213,12 @@
  public static void main(final String[] args)
  {
    final int retCode = mainSearchRate(args, System.in, System.out, System.err);
    final int retCode = new SearchRate().run(args);
    System.exit(filterExitCode(retCode));
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the ldapsearch tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @return The error code.
   */
  static int mainSearchRate(final String[] args)
  {
    return mainSearchRate(args, System.in, System.out, System.err);
  }
  /**
   * Parses the provided command-line arguments and uses that information to run
   * the ldapsearch tool.
   *
   * @param args
   *          The command-line arguments provided to this program.
   * @param inStream
   *          The input stream to use for standard input, or <CODE>null</CODE>
   *          if standard input is not needed.
   * @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 The error code.
   */
  static int mainSearchRate(final String[] args, final InputStream inStream,
      final OutputStream outStream, final OutputStream errStream)
  {
    return new SearchRate(inStream, outStream, errStream).run(args);
  }
  private BooleanArgument verbose;
  private BooleanArgument scriptFriendly;
@@ -272,77 +227,15 @@
  private SearchRate(final InputStream in, final OutputStream out,
      final OutputStream err)
  private SearchRate()
  {
    super(in, out, err);
    // Nothing to do.
  }
  /**
   * Indicates whether or not the user has requested advanced mode.
   *
   * @return Returns <code>true</code> if the user has requested advanced mode.
   */
  @Override
  public boolean isAdvancedMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested interactive behavior.
   *
   * @return Returns <code>true</code> if the user has requested interactive
   *         behavior.
   */
  @Override
  public boolean isInteractive()
  {
    return false;
  }
  /**
   * Indicates whether or not this console application is running in its
   * menu-driven mode. This can be used to dictate whether output should go to
   * the error stream or not. In addition, it may also dictate whether or not
   * sub-menus should display a cancel option as well as a quit option.
   *
   * @return Returns <code>true</code> if this console application is running in
   *         its menu-driven mode.
   */
  @Override
  public boolean isMenuDrivenMode()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested quiet output.
   *
   * @return Returns <code>true</code> if the user has requested quiet output.
   */
  @Override
  public boolean isQuiet()
  {
    return false;
  }
  /**
   * Indicates whether or not the user has requested script-friendly output.
   *
   * @return Returns <code>true</code> if the user has requested script-friendly
   *         output.
   * {@inheritDoc}
   */
  @Override
  public boolean isScriptFriendly()
@@ -353,9 +246,7 @@
  /**
   * Indicates whether or not the user has requested verbose output.
   *
   * @return Returns <code>true</code> if the user has requested verbose output.
   * {@inheritDoc}
   */
  @Override
  public boolean isVerbose()