From cc0fa41d9e024164cb7562c2047aa49ce7bc2af7 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
---
opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java | 252 ++++++++++----------------------------------------
1 files changed, 52 insertions(+), 200 deletions(-)
diff --git a/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java b/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java
index 82df3c5..e2fd071 100644
--- a/opendj3-server-dev/src/server/org/opends/server/tools/dsconfig/LDAPManagementContextFactory.java
+++ b/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());
- }
- }
-
}
--
Gitblit v1.10.0