From e7dfa40c0ada0bb2d3bcbf7f153e496b5454f1cd Mon Sep 17 00:00:00 2001
From: Violette Roche-Montane <violette.roche-montane@forgerock.com>
Date: Thu, 10 Apr 2014 11:32:37 +0000
Subject: [PATCH] Checkpoint for OPENDJ-1303 "opendj-cli" - OPENDJ-1343 Migrate dsconfig Rewritten DSConfig connection. dsconfig package. - Removed from dsconfig package the dependency on the SecureconnectionCliArgs and LDAPConsoleInteraction. - Removed unused class InternalManagementContextFactory
---
/dev/null | 102 ------
opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java | 13
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java | 252 +++-----------
opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java | 290 +++++++++++-----
opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java | 13
opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tools/dsconfig/DsconfigLdapConnectionTestCase.java | 49 ++
opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java | 16
opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java | 13
opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties | 6
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/DSConfig.java | 156 ++++----
opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/ManagementContextFactory.java | 52 --
opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java | 25
12 files changed, 445 insertions(+), 542 deletions(-)
diff --git a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java
index f1ac91e..dcabc64 100644
--- a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java
+++ b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConnectionFactoryProvider.java
@@ -29,6 +29,7 @@
import static com.forgerock.opendj.cli.ArgumentConstants.*;
import static com.forgerock.opendj.cli.CliMessages.*;
import static com.forgerock.opendj.cli.CliConstants.DEFAULT_LDAP_PORT;
+import static com.forgerock.opendj.cli.Utils.getHostNameForLdapUrl;
import java.io.File;
import java.io.FileInputStream;
@@ -39,7 +40,7 @@
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
-import java.util.logging.Logger;
+import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
@@ -47,6 +48,7 @@
import javax.net.ssl.X509TrustManager;
import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ConnectionFactory;
import org.forgerock.opendj.ldap.KeyManagers;
import org.forgerock.opendj.ldap.LDAPConnectionFactory;
@@ -66,90 +68,62 @@
/**
* A connection factory designed for use with command line tools.
*/
-public class ConnectionFactoryProvider {
- /**
- * The Logger.
- */
- static final Logger LOG = Logger.getLogger(ConnectionFactoryProvider.class.getName());
+public final class ConnectionFactoryProvider {
+ /** The Logger. */
+ static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
- /**
- * The 'hostName' global argument.
- */
+ /** The 'hostName' global argument. */
private StringArgument hostNameArg = null;
- /**
- * The 'port' global argument.
- */
+ /** The 'port' global argument. */
private IntegerArgument portArg = null;
- /**
- * The 'bindDN' global argument.
- */
+ /** The 'bindDN' global argument. */
private StringArgument bindNameArg = null;
- /**
- * The 'bindPasswordFile' global argument.
- */
+ /** The 'bindPasswordFile' global argument. */
private FileBasedArgument bindPasswordFileArg = null;
- /**
- * The 'bindPassword' global argument.
- */
+ /** The 'password' value. */
+ private char[] password = null;
+
+ /** The 'bindPassword' global argument. */
private StringArgument bindPasswordArg = null;
- /**
- * The 'trustAllArg' global argument.
- */
+ /** The 'connectTimeOut' global argument. */
+ private IntegerArgument connectTimeOut = null;
+
+ /** The 'trustAllArg' global argument. */
private BooleanArgument trustAllArg = null;
- /**
- * The 'trustStore' global argument.
- */
+ /** The 'trustStore' global argument. */
private StringArgument trustStorePathArg = null;
- /**
- * The 'trustStorePassword' global argument.
- */
+ /** The 'trustStorePassword' global argument. */
private StringArgument trustStorePasswordArg = null;
- /**
- * The 'trustStorePasswordFile' global argument.
- */
+ /** The 'trustStorePasswordFile' global argument. */
private FileBasedArgument trustStorePasswordFileArg = null;
- /**
- * The 'keyStore' global argument.
- */
+ /** The 'keyStore' global argument. */
private StringArgument keyStorePathArg = null;
- /**
- * The 'keyStorePassword' global argument.
- */
+ /** The 'keyStorePassword' global argument. */
private StringArgument keyStorePasswordArg = null;
- /**
- * The 'keyStorePasswordFile' global argument.
- */
+ /** The 'keyStorePasswordFile' global argument. */
private FileBasedArgument keyStorePasswordFileArg = null;
- /**
- * The 'certNicknameArg' global argument.
- */
+ /** The 'certNicknameArg' global argument. */
private StringArgument certNicknameArg = null;
- /**
- * The 'useSSLArg' global argument.
- */
+ /** The 'useSSLArg' global argument. */
private BooleanArgument useSSLArg = null;
- /**
- * The 'useStartTLSArg' global argument.
- */
+ /** The 'useStartTLSArg' global argument. */
private BooleanArgument useStartTLSArg = null;
- /**
- * Argument indicating a SASL option.
- */
+ /** Argument indicating a SASL option. */
private StringArgument saslOptionArg = null;
/**
@@ -163,23 +137,33 @@
*/
private final BooleanArgument usePasswordPolicyControlArg;
+ /** The port number to used to connect. */
private int port = DEFAULT_LDAP_PORT;
+ /** The SSL context linked to this connection. */
private SSLContext sslContext;
+ /** The basic connection factory. */
private ConnectionFactory connFactory;
/** The authenticated connection factory. */
protected ConnectionFactory authenticatedConnFactory;
+ /** The bind request to connect with. */
private BindRequest bindRequest = null;
+ /** The console application linked to this connection in interactive mode. */
private final ConsoleApplication app;
+ /** The LDAP options for this connection. */
private LDAPOptions options;
+ /** If this connection should be an admin connection. */
+ private boolean isAdminConnection = false;
+
/**
- * Default constructor to create a connection factory designed for use with command line tools.
+ * Default constructor to create a connection factory designed for use with command line tools,
+ * adding basic LDAP connection arguments to the specified parser (e.g: hostname, bindname...etc).
*
* @param argumentParser
* The argument parser.
@@ -190,11 +174,12 @@
*/
public ConnectionFactoryProvider(final ArgumentParser argumentParser,
final ConsoleApplication app) throws ArgumentException {
- this(argumentParser, app, "cn=Directory Manager", DEFAULT_LDAP_PORT, false, null);
+ this(argumentParser, app, CliConstants.DEFAULT_ROOT_USER_DN, DEFAULT_LDAP_PORT, false, null);
}
/**
- * Default constructor to create a connection factory designed for use with command line tools.
+ * Default constructor to create a connection factory designed for use with command line tools,
+ * adding basic LDAP connection arguments to the specified parser (e.g: hostname, bindname...etc).
*
* @param argumentParser
* The argument parser.
@@ -205,13 +190,14 @@
* @throws ArgumentException
* If an error occurs during parsing the arguments.
*/
- public ConnectionFactoryProvider(final ArgumentParser argumentParser,
- final ConsoleApplication app, final LDAPOptions options) throws ArgumentException {
- this(argumentParser, app, "cn=Directory Manager", DEFAULT_LDAP_PORT, false, options);
+ public ConnectionFactoryProvider(final ArgumentParser argumentParser, final ConsoleApplication app,
+ final LDAPOptions options) throws ArgumentException {
+ this(argumentParser, app, CliConstants.DEFAULT_ROOT_USER_DN, DEFAULT_LDAP_PORT, false, options);
}
/**
- * Constructor to create a connection factory designed for use with command line tools.
+ * Constructor to create a connection factory designed for use with command line tools,
+ * adding basic LDAP connection arguments to the specified parser (e.g: hostname, bindname...etc).
*
* @param argumentParser
* The argument parser.
@@ -303,6 +289,9 @@
reportAuthzIDArg = CommonArguments.getReportAuthzId();
argumentParser.addArgument(reportAuthzIDArg);
+ connectTimeOut = CommonArguments.getConnectTimeOut();
+ argumentParser.addArgument(connectTimeOut);
+
usePasswordPolicyControlArg =
new BooleanArgument("usepwpolicycontrol", null, OPTION_LONG_USE_PW_POLICY_CTL,
INFO_DESCRIPTION_USE_PWP_CONTROL.get());
@@ -311,15 +300,50 @@
}
/**
- * Returns the host name.
+ * Returns the connect time out.
+ *
+ * @return The connect time out value.
+ */
+ public int getConnectTimeout() {
+ if (connectTimeOut.isPresent()) {
+ try {
+ return connectTimeOut.getIntValue();
+ } catch (ArgumentException e) {
+ return Integer.valueOf(connectTimeOut.getDefaultValue());
+ }
+ }
+ return Integer.valueOf(connectTimeOut.getDefaultValue());
+ }
+
+
+ /**
+ * Returns the host name if the argument is present otherwise, if the application
+ * is interactive, prompt the user for it.
*
* @return The host name value.
+ * @throws ArgumentException
+ * If the host name cannot be retrieved.
*/
- public String getHostname() {
+ public String getHostname() throws ArgumentException {
+ String value = "";
+
if (hostNameArg.isPresent()) {
- return hostNameArg.getValue();
+ value = hostNameArg.getValue();
+ } else if (app.isInteractive()) {
+ try {
+ value = app.readInput(INFO_DESCRIPTION_HOST.get(),
+ hostNameArg.getDefaultValue() == null ? value : hostNameArg.getDefaultValue());
+ app.println();
+ hostNameArg.addValue(value);
+ hostNameArg.setPresent(true);
+ } catch (ClientException e) {
+ throw new ArgumentException(ERR_ERROR_CANNOT_READ_HOST_NAME.get(), e);
+ }
+ } else {
+ return hostNameArg.getDefaultValue() == null ? value : hostNameArg.getDefaultValue();
}
- return hostNameArg.getDefaultValue();
+
+ return getHostNameForLdapUrl(value);
}
/**
@@ -357,20 +381,46 @@
}
/**
- * Checks if any conflicting arguments are present, build the connection with
- * selected arguments and returns the connection factory.
+ * Checks if any conflicting arguments are present, build the connection with selected arguments and returns the
+ * connection factory. If the application is interactive, it will prompt the user for missing parameters.
*
* @return The connection factory.
* @throws ArgumentException
- * If an error occurs during the parsing of the arguments. (conflicting
- * arguments or if an error occurs during building SSL context).
+ * If an error occurs during the parsing of the arguments.
+ * (conflicting arguments or if an error occurs during building SSL context).
*/
public ConnectionFactory getConnectionFactory() throws ArgumentException {
if (connFactory == null) {
- port = portArg.getIntValue();
+ port = portArg.isPresent() ? portArg.getIntValue() : 0;
checkForConflictingArguments();
+ if (app.isInteractive()) {
+ if (!hostNameArg.isPresent() || port == 0 || !bindNameArg.isPresent()
+ || (!bindPasswordArg.isPresent() && !bindPasswordFileArg.isPresent())) {
+ app.printHeader(INFO_LDAP_CONN_HEADING_CONNECTION_PARAMETERS.get());
+ }
+ if (!hostNameArg.isPresent()) {
+ getHostname();
+ }
+ if (port == 0) {
+ LocalizableMessage portMsg;
+ if (isAdminConnection) {
+ portMsg = INFO_DESCRIPTION_ADMIN_PORT.get();
+ } else {
+ portMsg = INFO_DESCRIPTION_PORT.get();
+ }
+ port = app.askPort(portMsg, Integer.valueOf(portArg.getDefaultValue()), logger);
+ app.println();
+ }
+ if (!bindNameArg.isPresent()) {
+ getBindName();
+ }
+ if (!bindPasswordArg.isPresent() && !bindPasswordFileArg.isPresent()) {
+ getPassword();
+ }
+ }
+
try {
if (useSSLArg.isPresent() || useStartTLSArg.isPresent()) {
String clientAlias;
@@ -403,13 +453,14 @@
if (sslContext != null) {
options.setSSLContext(sslContext).setUseStartTLS(useStartTLSArg.isPresent());
}
+ options.setConnectTimeout(getConnectTimeout(), TimeUnit.MILLISECONDS);
connFactory = new LDAPConnectionFactory(hostNameArg.getValue(), port, options);
}
return connFactory;
}
/**
- * Verifies if the arguments are not conflicting together or if they are readable.
+ * Verifies if the connection arguments are not conflicting together or if they are readable.
*
* @throws ArgumentException
* If arguments are conflicting or if the files cannot be read,
@@ -502,13 +553,13 @@
}
/**
- * Returns <CODE>true</CODE> if we can read on the provided path and
- * <CODE>false</CODE> otherwise.
+ * Returns {@code true} if we can read on the provided path and
+ * {@code false} otherwise.
*
* @param path
* the path.
- * @return <CODE>true</CODE> if we can read on the provided path and
- * <CODE>false</CODE> otherwise.
+ * @return {@code true} if we can read on the provided path and
+ * {@code false} otherwise.
*/
private boolean canReadPath(final String path) {
final File file = new File(path);
@@ -555,17 +606,34 @@
return value;
}
- private String getBindName() throws ArgumentException {
+ /**
+ * Returns the bind name if the argument is present otherwise, in interactive mode, it
+ * will prompt the user.
+ *
+ * @return The bind name used for this connection.
+ * @throws ArgumentException
+ * If the bind name cannot be retrieved.
+ */
+ public String getBindName() throws ArgumentException {
String value = "";
if (bindNameArg.isPresent()) {
value = bindNameArg.getValue();
} else if (app.isInteractive()) {
+ LocalizableMessage bindMsg;
+ if (isAdminConnection) {
+ bindMsg = INFO_DESCRIPTION_ADMIN_BINDDN.get();
+ } else {
+ bindMsg = INFO_DESCRIPTION_BINDDN.get();
+ }
try {
- value =
- app.readInput(LocalizableMessage.raw("Bind name:"), bindNameArg
- .getDefaultValue() == null ? value : bindNameArg.getDefaultValue());
+ value = app.readInput(bindMsg,
+ bindNameArg.getDefaultValue() == null ? value : bindNameArg.getDefaultValue());
+ app.println();
+ bindNameArg.clearValues();
+ bindNameArg.addValue(value);
+ bindNameArg.setPresent(true);
} catch (ClientException e) {
- throw new ArgumentException(LocalizableMessage.raw("Unable to read bind name"), e);
+ throw new ArgumentException(ERR_ERROR_CANNOT_READ_BIND_NAME.get(), e);
}
}
@@ -669,9 +737,14 @@
* interactions requiring access to a key manager.
* @throws java.security.KeyStoreException
* If a problem occurs while interacting with the key store.
+ * @throws IOException
+ * If there is an I/O or format problem with the keystore data.
+ * @throws NoSuchAlgorithmException
+ * If a problem occurs while loading with the key store.
+ * @throws CertificateException
+ * If a problem occurs while loading with the key store.
*/
-
- private X509KeyManager getKeyManager(String keyStoreFile) throws KeyStoreException,
+ public X509KeyManager getKeyManager(String keyStoreFile) throws KeyStoreException,
IOException, NoSuchAlgorithmException, CertificateException {
if (keyStoreFile == null) {
// Lookup the file name through the JDK property.
@@ -725,29 +798,40 @@
}
/**
- * Get the password which has to be used for the command. If no password was
- * specified, return null.
+ * Get the password which has to be used for the command. In interactive mode, if
+ * the password arguments are missing, the user will be prompted.
*
* @return The password stored into the specified file on by the command
- * line argument, or null it if not specified.
+ * line argument, or empty it if not specified.
+ * @throws ArgumentException
+ * If a problem occurs while interacting with the password.
*/
- private char[] getPassword() throws ArgumentException {
+ public char[] getPassword() throws ArgumentException {
char[] value = "".toCharArray();
if (bindPasswordArg.isPresent()) {
value = bindPasswordArg.getValue().toCharArray();
} else if (bindPasswordFileArg.isPresent()) {
value = bindPasswordFileArg.getValue().toCharArray();
+ } else if (password != null) {
+ return password;
}
if (value.length == 0 && app.isInteractive()) {
- try {
- value = app.readPassword(LocalizableMessage.raw("Bind Password:"));
- } catch (ClientException e) {
- throw new ArgumentException(LocalizableMessage.raw("Unable to read password"), e);
+ LocalizableMessage msg;
+ if (isAdminConnection) {
+ msg = INFO_LDAPAUTH_PASSWORD_PROMPT.get(getBindName());
+ } else {
+ msg = INFO_DESCRIPTION_BINDPASSWORD.get();
}
+ try {
+ value = app.readPassword(msg);
+ app.println();
+ } catch (ClientException e) {
+ throw new ArgumentException(ERR_ERROR_CANNOT_READ_PASSWORD.get(), e);
+ }
+ password = value;
}
-
return value;
}
@@ -791,7 +875,7 @@
return new PromptingTrustManager(app, tm);
}
- return null;
+ return tm;
}
/**
@@ -831,4 +915,26 @@
return option.substring(equalPos + 1, option.length());
}
+
+ /**
+ * Specifies if this connection should be an administrator connection. If sets as one, the messages prompted to the
+ * user will be different as a normal connection. E.g if set :
+ *
+ * <pre>
+ * >>>> Specify OpenDJ LDAP connection parameters
+ *
+ * Directory server administration port number [4444]:
+ * </pre>
+ *
+ * vs normal mode
+ *
+ * <pre>
+ * >>>> Specify OpenDJ LDAP connection parameters
+ *
+ * Directory server port number [1389]:
+ * </pre>
+ */
+ public void setIsAnAdminConnection() {
+ isAdminConnection = true;
+ }
}
diff --git a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
index bc7d765..e2c926b 100755
--- a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
+++ b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/ConsoleApplication.java
@@ -819,4 +819,17 @@
}
return port;
}
+
+ /**
+ * Prints a header in the console application.
+ *
+ * @param header
+ * The message to display as a header.
+ */
+ void printHeader(final LocalizableMessage header) {
+ println();
+ println();
+ println(header);
+ println();
+ }
}
diff --git a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
index d685dea..7e9ce8f 100644
--- a/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
+++ b/opendj-sdk/opendj-cli/src/main/java/com/forgerock/opendj/cli/SubCommandArgumentParser.java
@@ -363,6 +363,22 @@
addGlobalArgument(argument, null);
}
+
+ /**
+ * Adds the provided argument to the set of arguments handled by this parser and puts the argument in the LDAP
+ * connection group.
+ *
+ * @param argument
+ * The argument to add to this sub command.
+ * @throws ArgumentException
+ * If the provided argument conflicts with another global or subcommand argument that has already been
+ * defined.
+ */
+ @Override
+ public void addLdapConnectionArgument(final Argument argument) throws ArgumentException {
+ addGlobalArgument(argument, null);
+ }
+
/**
* Adds the provided argument to the set of global arguments handled by this parser.
*
diff --git a/opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties b/opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
index 3dfc2eb..5dbc5b5 100755
--- a/opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
+++ b/opendj-sdk/opendj-cli/src/main/resources/com/forgerock/opendj/cli/cli.properties
@@ -467,6 +467,7 @@
ERR_CANNOT_READ_KEYSTORE=Cannot access key store '%s'. Verify \
that the provided key store exists and that you have read access rights to it
INFO_DESCRIPTION_ADMIN_PORT=Directory server administration port number
+INFO_DESCRIPTION_ADMIN_BINDDN=Administrator user bind DN
ERR_LDAPCOMPARE_ERROR_READING_FILE=An error occurred reading file \
'%s'. Check that the file exists and that you have read access rights to \
it. Details: %s
@@ -959,4 +960,9 @@
ERR_ERROR_INCOMPATIBLE_PROPERTY_MOD=The property \
modification "%s" is incompatible with another modification to the same \
property
+INFO_LDAP_CONN_HEADING_CONNECTION_PARAMETERS=>>>> Specify OpenDJ LDAP \
+ connection parameters
+ERR_ERROR_CANNOT_READ_PASSWORD=Unable to read password
+ERR_ERROR_CANNOT_READ_BIND_NAME=Unable to read bind name
+ERR_ERROR_CANNOT_READ_HOST_NAME=Cannot read the host name
\ No newline at end of file
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
index efe4c9b..dd4d3e3 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/AuthRate.java
@@ -356,17 +356,18 @@
// Nothing to do.
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ public boolean isInteractive() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override
public boolean isScriptFriendly() {
return scriptFriendly.isPresent();
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public boolean isVerbose() {
return verbose.isPresent();
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
index 3b6ee7b..c1053de 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/LDAPSearch.java
@@ -95,9 +95,7 @@
private class LDAPSearchResultHandler implements SearchResultHandler {
private int entryCount = 0;
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
public boolean handleEntry(final SearchResultEntry entry) {
entryCount++;
@@ -179,24 +177,18 @@
return true;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
public boolean handleReference(final SearchResultReference reference) {
println(LocalizableMessage.raw(reference.toString()));
return true;
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
public void handleErrorResult(ErrorResultException error) {
// Ignore.
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
public void handleResult(Result result) {
// Ignore.
}
@@ -222,9 +214,12 @@
// Nothing to do.
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ public boolean isInteractive() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override
public boolean isVerbose() {
return verbose.isPresent();
diff --git a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
index 1e809dc..6c872fd 100644
--- a/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
+++ b/opendj-sdk/opendj-ldap-toolkit/src/main/java/com/forgerock/opendj/ldap/tools/ModRate.java
@@ -138,17 +138,18 @@
// Nothing to do.
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
+ public boolean isInteractive() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override
public boolean isScriptFriendly() {
return scriptFriendly.isPresent();
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
@Override
public boolean isVerbose() {
return verbose.isPresent();
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/DSConfig.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/DSConfig.java
index 4e482bf..99ca1e3 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/DSConfig.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/DSConfig.java
@@ -80,14 +80,17 @@
import com.forgerock.opendj.cli.ArgumentException;
import com.forgerock.opendj.cli.ArgumentGroup;
import com.forgerock.opendj.cli.BooleanArgument;
+import com.forgerock.opendj.cli.CliConstants;
import com.forgerock.opendj.cli.ClientException;
import com.forgerock.opendj.cli.CommandBuilder;
import com.forgerock.opendj.cli.CommonArguments;
+import com.forgerock.opendj.cli.ConnectionFactoryProvider;
import com.forgerock.opendj.cli.ConsoleApplication;
import com.forgerock.opendj.cli.Menu;
import com.forgerock.opendj.cli.MenuBuilder;
import com.forgerock.opendj.cli.MenuCallback;
import com.forgerock.opendj.cli.MenuResult;
+import com.forgerock.opendj.cli.ReturnCode;
import com.forgerock.opendj.cli.StringArgument;
import com.forgerock.opendj.cli.SubCommand;
import com.forgerock.opendj.cli.SubCommandArgumentParser;
@@ -332,8 +335,7 @@
{
JDKLogging.disableLogging();
DSConfig app =
- new DSConfig(System.in, outStream, errStream,
- new LDAPManagementContextFactory());
+ new DSConfig(System.in, outStream, errStream);
app.sessionStartTime = System.currentTimeMillis();
/*
* FIXME: obtain path info from system properties.
@@ -363,7 +365,7 @@
* The factory which the application should use to retrieve its management
* context.
*/
- private final ManagementContextFactory factory;
+ private ManagementContextFactory factory = null;
/**
* Flag indicating whether or not the global arguments have already been
@@ -407,9 +409,7 @@
/** The argument which should be used to request quiet output. */
private BooleanArgument quietArgument;
- /**
- * The argument which should be used to request script-friendly output.
- */
+ /** The argument which should be used to request script-friendly output. */
private BooleanArgument scriptFriendlyArgument;
/** The argument which should be used to request usage information. */
@@ -428,7 +428,7 @@
private BooleanArgument noPropertiesFileArgument;
/**
- * Creates a new dsconfig application instance.
+ * Creates a new DSConfig application instance.
*
* @param in
* The application input stream.
@@ -440,14 +440,11 @@
* The factory which this application instance should use
* for obtaining management contexts.
*/
- private DSConfig(InputStream in, OutputStream out, OutputStream err,
- ManagementContextFactory factory) {
+ private DSConfig(InputStream in, OutputStream out, OutputStream err) {
super(new PrintStream(out), new PrintStream(err));
this.parser = new SubCommandArgumentParser(getClass().getName(),
INFO_DSCFG_TOOL_DESCRIPTION.get(), false);
-
- this.factory = factory;
}
@@ -572,11 +569,6 @@
parser.addGlobalArgument(noPropertiesFileArgument);
parser.setNoPropertiesFileArgument(noPropertiesFileArgument);
- // Register any global arguments required by the management
- // context factory.
- factory.setRawArguments(args);
- factory.registerGlobalArguments(parser);
-
globalArgumentsInitialized = true;
}
}
@@ -672,64 +664,32 @@
return 1;
}
- // Parse the command-line arguments provided to this program.
- try {
+ ConnectionFactoryProvider cfp = null;
+ try
+ {
+ cfp =
+ new ConnectionFactoryProvider(parser, this,
+ CliConstants.DEFAULT_ROOT_USER_DN,
+ CliConstants.DEFAULT_ADMINISTRATION_CONNECTOR_PORT, true, null);
+ cfp.setIsAnAdminConnection();
+
+ // Parse the command-line arguments provided to this program.
parser.parseArguments(args);
- } catch (ArgumentException ae) {
+ checkForConflictingArguments();
+ }
+ catch (ArgumentException ae)
+ {
LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(ae.getMessage());
displayMessageAndUsageReference(message);
- return 1;
+ return ReturnCode.CONFLICTING_ARGS.get();
}
// If the usage/version argument was provided, then we don't need
// to do anything else.
if (parser.usageOrVersionDisplayed()) {
- return 0;
+ return ReturnCode.SUCCESS.get();
}
- // Check for conflicting arguments.
- if (quietArgument.isPresent() && verboseArgument.isPresent()) {
- LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(quietArgument
- .getLongIdentifier(), verboseArgument.getLongIdentifier());
- displayMessageAndUsageReference(message);
- return 1;
- }
-
- if (batchFileArgument.isPresent() && !noPromptArgument.isPresent()) {
- LocalizableMessage message =
- ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE.get(
- batchFileArgument.getLongIdentifier(), noPromptArgument
- .getLongIdentifier());
- displayMessageAndUsageReference(message);
- return 1;
- }
-
- if (quietArgument.isPresent() && !noPromptArgument.isPresent()) {
- LocalizableMessage message = ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE.get(
- quietArgument.getLongIdentifier(), noPromptArgument
- .getLongIdentifier());
- displayMessageAndUsageReference(message);
- return 1;
- }
-
- if (scriptFriendlyArgument.isPresent() && verboseArgument.isPresent()) {
- LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(scriptFriendlyArgument
- .getLongIdentifier(), verboseArgument.getLongIdentifier());
- displayMessageAndUsageReference(message);
- return 1;
- }
-
- if (noPropertiesFileArgument.isPresent()
- && propertiesFileArgument.isPresent())
- {
- LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
- noPropertiesFileArgument.getLongIdentifier(),
- propertiesFileArgument.getLongIdentifier());
- displayMessageAndUsageReference(message);
- return 1;
- }
-
-
// Checks the version - if upgrade required, the tool is unusable
try
{
@@ -749,31 +709,36 @@
if (!canWrite(file))
{
println(ERR_DSCFG_CANNOT_WRITE_EQUIVALENT_COMMAND_LINE_FILE.get(file));
- return 1;
+ return ReturnCode.ERROR_UNEXPECTED.get();
}
else
{
if (new File(file).isDirectory())
{
println(ERR_DSCFG_EQUIVALENT_COMMAND_LINE_FILE_DIRECTORY.get(file));
- return 1;
+ return ReturnCode.ERROR_UNEXPECTED.get();
}
}
}
-
- // Make sure that management context's arguments are valid.
- try {
- factory.validateGlobalArguments();
- } catch (ArgumentException e) {
- println(e.getMessageObject());
- return 1;
+ // Creates the management context factory which is based on the connection
+ // provider factory and an authenticated connection factory.
+ try
+ {
+ factory = new LDAPManagementContextFactory(cfp);
}
+ catch (ArgumentException e)
+ {
+ LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(e.getMessage());
+ displayMessageAndUsageReference(message);
+ return ReturnCode.CONFLICTING_ARGS.get();
+ }
+
// Handle batch file if any
if (batchFileArgument.isPresent()) {
handleBatchFile(args);
// don't need to do anything else
- return 0;
+ return ReturnCode.SUCCESS.get();
}
int retCode = 0;
@@ -807,6 +772,45 @@
return retCode;
}
+ private void checkForConflictingArguments() throws ArgumentException
+ {
+ if (quietArgument.isPresent() && verboseArgument.isPresent()) {
+ final LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(quietArgument
+ .getLongIdentifier(), verboseArgument.getLongIdentifier());
+ throw new ArgumentException(message);
+ }
+
+ if (batchFileArgument.isPresent() && !noPromptArgument.isPresent()) {
+ final LocalizableMessage message =
+ ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE.get(
+ batchFileArgument.getLongIdentifier(), noPromptArgument
+ .getLongIdentifier());
+ throw new ArgumentException(message);
+ }
+
+ if (quietArgument.isPresent() && !noPromptArgument.isPresent()) {
+ final LocalizableMessage message = ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE.get(
+ quietArgument.getLongIdentifier(), noPromptArgument
+ .getLongIdentifier());
+ throw new ArgumentException(message);
+ }
+
+ if (scriptFriendlyArgument.isPresent() && verboseArgument.isPresent()) {
+ final LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(scriptFriendlyArgument
+ .getLongIdentifier(), verboseArgument.getLongIdentifier());
+ throw new ArgumentException(message);
+ }
+
+ if (noPropertiesFileArgument.isPresent()
+ && propertiesFileArgument.isPresent())
+ {
+ final LocalizableMessage message = ERR_TOOL_CONFLICTING_ARGS.get(
+ noPropertiesFileArgument.getLongIdentifier(),
+ propertiesFileArgument.getLongIdentifier());
+ throw new ArgumentException(message);
+ }
+ }
+
/** Run the top-level interactive console. */
@@ -893,6 +897,8 @@
try {
// Force retrieval of management context.
factory.getManagementContext(app);
+
+
} catch (ArgumentException e) {
app.println(e.getMessageObject());
return 1;
@@ -908,7 +914,7 @@
MenuResult<Integer> result = menu.run();
if (result.isQuit()) {
- return 0;
+ return ReturnCode.SUCCESS.get();
} else {
return result.getValue();
}
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/InternalManagementContextFactory.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/InternalManagementContextFactory.java
deleted file mode 100644
index ac32ecd..0000000
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/InternalManagementContextFactory.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
- * or http://forgerock.org/license/CDDLv1.0.html.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at legal-notices/CDDLv1_0.txt.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information:
- * Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- *
- *
- * Copyright 2007-2009 Sun Microsystems, Inc.
- * Portions Copyright 2014 ForgeRock AS
- */
-package org.opends.server.tools.dsconfig;
-
-import org.forgerock.opendj.config.client.ManagementContext;
-
-import com.forgerock.opendj.cli.ClientException;
-import com.forgerock.opendj.cli.ArgumentException;
-import com.forgerock.opendj.cli.SubCommandArgumentParser;
-import com.forgerock.opendj.cli.CommandBuilder;
-import com.forgerock.opendj.cli.ConsoleApplication;
-
-
-
-/**
- * A management context factory which uses a pre-defined management
- * context.
- */
-public final class InternalManagementContextFactory implements
- ManagementContextFactory {
-
- /** The pre-defined management context. */
- private final ManagementContext context;
-
-
-
- /**
- * Creates a new internal management context factory using the
- * provided management context.
- *
- * @param context
- * The management context.
- */
- public InternalManagementContextFactory(ManagementContext context) {
- this.context = context;
- }
-
- /** {@inheritDoc} */
- public void close()
- {
- // No implementation required.
- // We let the user of this InternalManagementContextFactory close
- // his/her context.
- }
-
- /** {@inheritDoc} */
- public ManagementContext getManagementContext(ConsoleApplication app)
- throws ArgumentException, ClientException {
- return context;
- }
-
-
-
- /** {@inheritDoc} */
- public void registerGlobalArguments(SubCommandArgumentParser parser)
- throws ArgumentException {
- // No implementation required.
- }
-
-
-
- /** {@inheritDoc} */
- public void validateGlobalArguments() throws ArgumentException {
- // No implementation required.
- }
-
- /** {@inheritDoc} */
- public CommandBuilder getContextCommandBuilder() {
- // No implementation required.
- return new CommandBuilder(null, null);
- }
-
- /** {@inheritDoc} */
- public void setRawArguments(String[] args) {
- // No implementation required.
- }
-
-}
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java
index 82df3c5..e2fd071 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java
@@ -26,56 +26,30 @@
*/
package org.opends.server.tools.dsconfig;
-import static com.forgerock.opendj.cli.ArgumentConstants.OPTION_LONG_HELP;
-import static com.forgerock.opendj.cli.ArgumentConstants.OPTION_SHORT_HELP;
import static com.forgerock.opendj.dsconfig.DsconfigMessages.*;
import static com.forgerock.opendj.cli.CliMessages.*;
import static org.forgerock.util.Utils.closeSilently;
-import java.security.GeneralSecurityException;
-import java.security.cert.CertificateException;
-import java.security.cert.X509Certificate;
-import java.util.LinkedHashSet;
-import java.util.concurrent.TimeUnit;
-
-import javax.naming.AuthenticationException;
-import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLException;
-import javax.net.ssl.TrustManager;
-
-import org.forgerock.i18n.LocalizableMessageBuilder;
import org.forgerock.opendj.config.LDAPProfile;
import org.forgerock.opendj.config.client.ManagementContext;
import org.forgerock.opendj.config.client.ldap.LDAPManagementContext;
-import org.forgerock.opendj.config.server.ConfigException;
-import org.forgerock.opendj.ldap.ErrorResultException;
-import org.forgerock.opendj.ldap.AuthorizationException;
import org.forgerock.opendj.ldap.Connection;
-import org.forgerock.opendj.ldap.LDAPConnectionFactory;
-import org.forgerock.opendj.ldap.LDAPOptions;
-import org.forgerock.opendj.ldap.SSLContextBuilder;
-import org.forgerock.opendj.ldap.TrustManagers;
-import org.opends.admin.ads.util.ApplicationTrustManager;
-import org.opends.admin.ads.util.ConnectionUtils;
-import org.opends.server.admin.client.cli.SecureConnectionCliArgs;
-import org.opends.server.util.cli.LDAPConnectionConsoleInteraction;
+import org.forgerock.opendj.ldap.ConnectionFactory;
+import org.forgerock.opendj.ldap.ErrorResultException;
-import com.forgerock.opendj.cli.Argument;
import com.forgerock.opendj.cli.ArgumentException;
import com.forgerock.opendj.cli.ClientException;
import com.forgerock.opendj.cli.CommandBuilder;
+import com.forgerock.opendj.cli.ConnectionFactoryProvider;
import com.forgerock.opendj.cli.ConsoleApplication;
import com.forgerock.opendj.cli.ReturnCode;
-import com.forgerock.opendj.cli.SubCommandArgumentParser;
/**
* An LDAP management context factory.
*/
-public final class LDAPManagementContextFactory implements
- ManagementContextFactory {
-
- /** The SecureConnectionCliArgsList object. */
- private SecureConnectionCliArgs secureArgsList;
+public final class LDAPManagementContextFactory implements ManagementContextFactory
+{
/** The management context. */
private ManagementContext context;
@@ -83,31 +57,26 @@
/** The connection parameters command builder. */
private CommandBuilder contextCommandBuilder;
- /** Raw arguments. */
- private String[] rawArgs;
+ /** The connection factory provider. */
+ private final ConnectionFactoryProvider provider;
+
+ /** The connection factory. */
+ private final ConnectionFactory factory;
/**
- * Creates a new LDAP management context factory.
+ * Creates a new LDAP management context factory based on an authenticated
+ * connection factory.
+ *
+ * @param cfp
+ * The connection factory provider which should be used in this
+ * context.
+ * @throws ArgumentException
+ * If an exception occurs when creating the authenticated connection
+ * factory linked to this context.
*/
- public LDAPManagementContextFactory() {
- // Nothing to do.
- }
-
- /** {@inheritDoc} */
- @Override
- public ManagementContext getManagementContext(ConsoleApplication app)
- throws ArgumentException, ClientException
- {
- // Lazily create the LDAP management context.
- if (context == null)
- {
- LDAPConnectionConsoleInteraction ci =
- new LDAPConnectionConsoleInteraction(app, secureArgsList);
- ci.run();
- context = getManagementContext(app, ci);
- contextCommandBuilder = ci.getCommandBuilder();
- }
- return context;
+ public LDAPManagementContextFactory(ConnectionFactoryProvider cfp) throws ArgumentException {
+ this.provider = cfp;
+ factory = cfp.getAuthenticatedConnectionFactory();
}
/** {@inheritDoc} */
@@ -126,13 +95,10 @@
/**
* Gets the management context which sub-commands should use in
- * order to manage the directory server. Implementations can use the
- * application instance for retrieving passwords interactively.
+ * order to manage the directory server.
*
* @param app
- * The application instance.
- * @param ci the LDAPConsoleInteraction object to be used. The code assumes
- * that the LDAPConsoleInteraction has already been run.
+ * The console application instance.
* @return Returns the management context which sub-commands should
* use in order to manage the directory server.
* @throws ArgumentException
@@ -141,162 +107,48 @@
* @throws ClientException
* If the management context could not be created.
*/
- public ManagementContext getManagementContext(ConsoleApplication app,
- LDAPConnectionConsoleInteraction ci)
+ public ManagementContext getManagementContext(ConsoleApplication app)
throws ArgumentException, ClientException
{
// Lazily create the LDAP management context.
if (context == null)
{
- // Interact with the user though the console to get
- // LDAP connection information
- final String hostName = ConnectionUtils.getHostNameForLdapUrl(ci.getHostName());
- final Integer portNumber = ci.getPortNumber();
- final String bindDN = ci.getBindDN();
- final String bindPassword = ci.getBindPassword();
- TrustManager trustManager = ci.getTrustManager();
- final KeyManager keyManager = ci.getKeyManager();
-
- final LDAPOptions options = new LDAPOptions();
- options.setConnectTimeout(ci.getConnectTimeout(), TimeUnit.MILLISECONDS);
- LDAPConnectionFactory factory = null;
- Connection connection = null;
- while (true)
+ Connection connection;
+ final String hostName = provider.getHostname();
+ final int port = provider.getPort();
+ try
{
- try
- {
- final SSLContextBuilder sslBuilder = new SSLContextBuilder();
- sslBuilder.setTrustManager((trustManager == null ? TrustManagers
- .trustAll() : trustManager));
- sslBuilder.setKeyManager(keyManager);
- options.setUseStartTLS(ci.useStartTLS());
- options.setSSLContext(sslBuilder.getSSLContext());
-
- factory = new LDAPConnectionFactory(hostName, portNumber, options);
- connection = factory.getConnection();
- connection.bind(bindDN, bindPassword.toCharArray());
- break;
- }
- catch (ErrorResultException e)
- {
- final Throwable cause = e.getCause();
- if (app.isInteractive() && ci.isTrustStoreInMemory() && cause != null
- && cause instanceof SSLException
- && cause.getCause() instanceof CertificateException)
- {
- String authType = null;
- if (trustManager instanceof ApplicationTrustManager)
- { // FIXME use PromptingTrustManager
- ApplicationTrustManager appTrustManager =
- (ApplicationTrustManager) trustManager;
- authType = appTrustManager.getLastRefusedAuthType();
- X509Certificate[] cert = appTrustManager.getLastRefusedChain();
-
- if (ci.checkServerCertificate(cert, authType, hostName))
- {
- // If the certificate is trusted, update the trust manager.
- trustManager = ci.getTrustManager();
- // Try to connect again.
- continue;
- }
- }
- }
- if (cause instanceof SSLException)
- {
- throw new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR,
- ERR_FAILED_TO_CONNECT_NOT_TRUSTED.get(hostName, portNumber));
- }
- throw couldNotConnect(cause, hostName, portNumber, bindDN);
- }
- catch (GeneralSecurityException e)
+ connection = factory.getConnection();
+ }
+ catch (ErrorResultException e)
+ {
+ if (e.getCause() instanceof SSLException)
{
throw new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR,
- ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT.get(hostName, portNumber));
- } finally {
- closeSilently(factory);
+ ERR_FAILED_TO_CONNECT_NOT_TRUSTED.get(hostName, String
+ .valueOf(port)));
+ }
+ else
+ {
+ throw new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR,
+ ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT.get(hostName, String
+ .valueOf(port)));
}
}
+ catch (Exception ex)
+ {
+ throw new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR,
+ ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT.get(hostName, port));
+ }
+ finally
+ {
+ closeSilently(factory);
+ }
+
context =
LDAPManagementContext.newManagementContext(connection, LDAPProfile
.getInstance());
}
return context;
}
-
- private ClientException couldNotConnect(Throwable cause, String hostName,
- Integer portNumber, String bindDN)
- {
- if (cause instanceof AuthorizationException)
- {
- return new ClientException(ReturnCode.AUTH_METHOD_NOT_SUPPORTED,
- ERR_DSCFG_ERROR_LDAP_SIMPLE_BIND_NOT_SUPPORTED.get());
- }
- else if (cause instanceof AuthenticationException)
- {
- return new ClientException(ReturnCode.INVALID_CREDENTIALS,
- ERR_DSCFG_ERROR_LDAP_SIMPLE_BIND_FAILED.get(bindDN));
- }
- return new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR,
- ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT.get(hostName, portNumber));
- }
-
- /** {@inheritDoc} */
- @Override
- public void setRawArguments(String[] args) {
- this.rawArgs = args;
-
- }
-
- /** {@inheritDoc} */
- @Override
- public void registerGlobalArguments(SubCommandArgumentParser parser)
- throws ArgumentException {
- // Create the global arguments.
- secureArgsList = new SecureConnectionCliArgs(true);
- LinkedHashSet<Argument> args = secureArgsList.createGlobalArguments();
-
-
- // Register the global arguments.
- for (Argument arg : args)
- {
- parser.addGlobalArgument(arg);
- }
-
- try
- {
- if (rawArgs != null) {
- for (String rawArg : rawArgs) {
- if (rawArg.length() < 2) {
- // This is not a help command
- continue;
- }
- if (rawArg.contains(OPTION_LONG_HELP) ||
- rawArg.charAt(1) == OPTION_SHORT_HELP || rawArg.charAt(1) == '?') {
- // used for usage help default values only
- secureArgsList.initArgumentsWithConfiguration();
- }
- }
- }
- }
- catch (ConfigException ce)
- {
- // Ignore.
- }
- }
-
-
-
- /** {@inheritDoc} */
- @Override
- public void validateGlobalArguments() throws ArgumentException {
- // Make sure that the user didn't specify any conflicting
- // arguments.
- LocalizableMessageBuilder buf = new LocalizableMessageBuilder();
- int v = secureArgsList.validateGlobalOptions(buf);
- if (v != ReturnCode.SUCCESS.get())
- {
- throw new ArgumentException(buf.toMessage());
- }
- }
-
}
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/ManagementContextFactory.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/ManagementContextFactory.java
index 48c74e3..265c947 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/ManagementContextFactory.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/ManagementContextFactory.java
@@ -32,23 +32,21 @@
import com.forgerock.opendj.cli.ClientException;
import com.forgerock.opendj.cli.CommandBuilder;
import com.forgerock.opendj.cli.ConsoleApplication;
-import com.forgerock.opendj.cli.SubCommandArgumentParser;
/**
- * A factory for retrieving the management context which should be
- * used by the dsconfig application.
+ * A factory for retrieving the management context which should be used by the
+ * DSConfig application.
* <p>
- * Factory implementations are responsible for registering their
- * required global options during initialization.
+ * Factory implementations are responsible for registering their required global
+ * options during initialization.
*/
public interface ManagementContextFactory {
/**
* Gets the management context which sub-commands should use in
- * order to manage the directory server. Implementations can use the
- * application instance for retrieving passwords interactively.
+ * order to manage the directory server.
*
* @param app
* The application instance.
@@ -63,53 +61,17 @@
ManagementContext getManagementContext(ConsoleApplication app)
throws ArgumentException, ClientException;
-
/**
* Closes this management context.
*/
void close();
-
- /**
- * Initializes this management context factory using the provided
- * parser. The management context factory can register global
- * options with the parser if required.
- *
- * @param parser
- * The application sub-command argument parser.
- * @throws ArgumentException
- * If the factory failed to register its required global
- * options.
- */
- void registerGlobalArguments(SubCommandArgumentParser parser)
- throws ArgumentException;
-
-
-
- /**
- * Set the raw arguments (used for default value setting).
- *
- * @param args raw arguments.
- */
- void setRawArguments(String[] args);
-
-
- /**
- * Validates any global arguments passed to the application.
- * Implementations of this method should check that the values
- * passed to their global arguments are valid and are not
- * incompatible with each other.
- *
- * @throws ArgumentException
- * If the global arguments are invalid for some reason.
- */
- void validateGlobalArguments() throws ArgumentException;
-
/**
* Returns the command builder that provides the equivalent arguments in
* interactive mode to get the management context.
+ *
* @return the command builder that provides the equivalent arguments in
- * interactive mode to get the management context.
+ * interactive mode to get the management context.
*/
CommandBuilder getContextCommandBuilder();
}
diff --git a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tools/dsconfig/DsconfigLdapConnectionTestCase.java b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tools/dsconfig/DsconfigLdapConnectionTestCase.java
index db50c38..9e6b0fa 100644
--- a/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tools/dsconfig/DsconfigLdapConnectionTestCase.java
+++ b/opendj-sdk/opendj3-server-dev/tests/unit-tests-testng/src/server/org/opends/server/tools/dsconfig/DsconfigLdapConnectionTestCase.java
@@ -129,7 +129,53 @@
assertFalse(DSConfig.main(args, System.out, System.err) == SUCCESS.get());
}
+
+ /**
+ * --bindPassword and the --bindPasswordFile arguments can not be provided
+ * together.
+ */
+ @Test()
+ public void testConflictualArgumentsPasswordAndFilePassword()
+ {
+ String[] args =
+ {
+ "-n",
+ "--noPropertiesFile",
+ "-Q",
+ "list-connection-handlers",
+ "-p", String.valueOf(TestCaseUtils.getServerAdminPort()),
+ "-D", "cn=Directory Manager",
+ "-w", "password",
+ "-j", validPasswordFile,
+ "-X"
+ };
+ assertTrue(DSConfig.main(args, System.out, System.err) == CONFLICTING_ARGS.get());
+ }
+
+ /**
+ * Quiet mode and verbose arguments can not be provided
+ * together.
+ */
+ @Test()
+ public void testConflictualArgumentsQuietAndVerbose()
+ {
+ String[] args =
+ {
+ "-n",
+ "--noPropertiesFile",
+ "-Q",
+ "list-connection-handlers",
+ "-p", String.valueOf(TestCaseUtils.getServerAdminPort()),
+ "-D", "cn=Directory Manager",
+ "-w", "password",
+ "-v",
+ "-X"
+ };
+
+ assertTrue(DSConfig.main(args, System.out, System.err) == CONFLICTING_ARGS.get());
+ }
+
/**
* Tests list-connection-handlers with an invalid password.
*/
@@ -229,7 +275,7 @@
{
String trustStorePath = DirectoryServer.getInstanceRoot() + File.separator +
"config" + File.separator + "admin-truststore";
-
+
String[] args =
{
"-n",
@@ -237,6 +283,7 @@
"-Q",
"list-connection-handlers",
"-p", String.valueOf(TestCaseUtils.getServerAdminPort()),
+ "-D", "cn=Directory Manager",
"-w", "password",
"-P", trustStorePath
};
--
Gitblit v1.10.0