From 503283bea9d628b1d118107d62a7c0fd6df61fce Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Fri, 05 Apr 2013 09:21:58 +0000
Subject: [PATCH] OPENDJ-830 (CR-1505) Implement authentication and authorization for HTTP connection handler
---
opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java | 86 +++++++++++++++++++++++++-----------------
1 files changed, 51 insertions(+), 35 deletions(-)
diff --git a/opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java b/opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java
index d5d2c22..ed97979 100644
--- a/opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java
+++ b/opends/src/server/org/opends/server/protocols/http/SdkConnectionAdapter.java
@@ -31,6 +31,7 @@
import static org.opends.server.loggers.debug.DebugLogger.*;
import java.util.LinkedHashSet;
+import java.util.concurrent.atomic.AtomicInteger;
import org.forgerock.opendj.ldap.AbstractAsynchronousConnection;
import org.forgerock.opendj.ldap.ConnectionEventListener;
@@ -49,16 +50,20 @@
import org.forgerock.opendj.ldap.requests.ModifyDNRequest;
import org.forgerock.opendj.ldap.requests.ModifyRequest;
import org.forgerock.opendj.ldap.requests.SearchRequest;
+import org.forgerock.opendj.ldap.requests.SimpleBindRequest;
import org.forgerock.opendj.ldap.requests.UnbindRequest;
import org.forgerock.opendj.ldap.responses.BindResult;
import org.forgerock.opendj.ldap.responses.CompareResult;
import org.forgerock.opendj.ldap.responses.ExtendedResult;
import org.forgerock.opendj.ldap.responses.Result;
+import org.opends.server.core.BindOperationBasis;
import org.opends.server.core.QueueingStrategy;
import org.opends.server.core.SearchOperationBasis;
import org.opends.server.core.WorkQueueStrategy;
import org.opends.server.loggers.debug.DebugTracer;
+import org.opends.server.types.ByteString;
import org.opends.server.types.DebugLogLevel;
+import org.opends.server.types.Operation;
import com.forgerock.opendj.util.AsynchronousFutureResult;
@@ -76,11 +81,11 @@
/** The HTTP client connection being "adapted". */
private final HTTPClientConnection clientConnection;
- /** FIXME: do not use constants. */
- private int messageID;
-
- /** FIXME: do not use constants. */
- private long operationID;
+ /**
+ * The next message ID (and operation ID) that should be used for this
+ * connection.
+ */
+ private AtomicInteger nextMessageID = new AtomicInteger(0);
/** The queueing strategy used for this connection. */
private QueueingStrategy queueingStrategy = new WorkQueueStrategy();
@@ -102,6 +107,34 @@
this.clientConnection = clientConnection;
}
+ private <R extends Result> FutureResult<R> enqueueOperation(
+ Operation operation, ResultHandler<? super R> resultHandler)
+ {
+ // TODO JNR set requestID, but where to get it?
+ final AsynchronousFutureResult<R, ResultHandler<? super R>> futureResult =
+ new AsynchronousFutureResult<R, ResultHandler<? super R>>(resultHandler);
+
+ try
+ {
+ clientConnection.addOperationInProgress(operation,
+ (AsynchronousFutureResult) futureResult);
+
+ queueingStrategy.enqueueRequest(operation);
+ }
+ catch (Exception e)
+ {
+ if (debugEnabled())
+ {
+ TRACER.debugCaught(DebugLogLevel.ERROR, e);
+ }
+ clientConnection.removeOperationInProgress(operation.getMessageID());
+ // TODO JNR add error message??
+ futureResult.handleErrorResult(ErrorResultException.newErrorResult(
+ ResultCode.OPERATIONS_ERROR, e));
+ }
+ return futureResult;
+ }
+
/** {@inheritDoc} */
@Override
public FutureResult<Void> abandonAsync(AbandonRequest request)
@@ -146,12 +179,15 @@
IntermediateResponseHandler intermediateResponseHandler,
ResultHandler<? super BindResult> resultHandler)
{
- // BindOperationBasis operation =
- // new BindOperationBasis(clientConnection, operationID, messageID,
- // to(request.getControls()), "3", to(request.getName()), "",
- // getCredentials(new byte[] {}));
- // TODO Auto-generated method stub
- throw new RuntimeException("Not implemented");
+ int messageID = nextMessageID.get();
+ String userName = request.getName();
+ byte[] password = ((SimpleBindRequest) request).getPassword();
+ BindOperationBasis operation =
+ new BindOperationBasis(clientConnection, messageID, messageID,
+ to(request.getControls()), "3", to(userName), ByteString
+ .wrap(password));
+
+ return enqueueOperation(operation, resultHandler);
}
/** {@inheritDoc} */
@@ -243,35 +279,15 @@
{
// TODO JNR attributes
LinkedHashSet<String> attributes = null;
- SearchOperationBasis op2 =
- new SearchOperationBasis(clientConnection, operationID, messageID,
+ final int messageID = nextMessageID.getAndIncrement();
+ SearchOperationBasis operation =
+ new SearchOperationBasis(clientConnection, messageID, messageID,
to(request.getControls()), to(valueOf(request.getName())),
to(request.getScope()), to(request.getDereferenceAliasesPolicy()),
request.getSizeLimit(), request.getTimeLimit(), request
.isTypesOnly(), to(request.getFilter()), attributes);
- // TODO JNR set requestID
- final AsynchronousFutureResult<Result, SearchResultHandler> futureResult =
- new AsynchronousFutureResult<Result, SearchResultHandler>(resultHandler);
-
- try
- {
- clientConnection.addOperationInProgress(op2, futureResult);
-
- queueingStrategy.enqueueRequest(op2);
- }
- catch (Exception e)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- clientConnection.removeOperationInProgress(messageID);
- // TODO JNR add error message??
- futureResult.handleErrorResult(ErrorResultException.newErrorResult(
- ResultCode.OPERATIONS_ERROR, e));
- }
- return futureResult;
+ return enqueueOperation(operation, resultHandler);
}
/** {@inheritDoc} */
--
Gitblit v1.10.0