From 61319d28a0a0129e3a81f4f9ca770d1b63e06233 Mon Sep 17 00:00:00 2001
From: jdemendi <jdemendi@localhost>
Date: Mon, 16 Jul 2007 08:02:35 +0000
Subject: [PATCH] This fix is the refactoring of the compare operation (issue #1886).
---
opends/src/server/org/opends/server/core/CompareOperation.java | 1134 +----------------------------------------------------------
1 files changed, 25 insertions(+), 1,109 deletions(-)
diff --git a/opends/src/server/org/opends/server/core/CompareOperation.java b/opends/src/server/org/opends/server/core/CompareOperation.java
index 1a3af75..6a302e5 100644
--- a/opends/src/server/org/opends/server/core/CompareOperation.java
+++ b/opends/src/server/org/opends/server/core/CompareOperation.java
@@ -26,188 +26,27 @@
*/
package org.opends.server.core;
-
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.locks.Lock;
-
-import org.opends.server.api.Backend;
-import org.opends.server.api.ClientConnection;
-import org.opends.server.api.plugin.PostOperationPluginResult;
-import org.opends.server.api.plugin.PreOperationPluginResult;
-import org.opends.server.api.plugin.PreParsePluginResult;
-import org.opends.server.controls.LDAPAssertionRequestControl;
-import org.opends.server.controls.ProxiedAuthV1Control;
-import org.opends.server.controls.ProxiedAuthV2Control;
-import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.types.AbstractOperation;
-import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeType;
-import org.opends.server.types.AttributeValue;
import org.opends.server.types.ByteString;
-import org.opends.server.types.CancelRequest;
-import org.opends.server.types.CancelResult;
-import org.opends.server.types.Control;
-import org.opends.server.types.DirectoryException;
-import org.opends.server.types.DisconnectReason;
import org.opends.server.types.DN;
-import org.opends.server.types.Entry;
-import org.opends.server.types.LDAPException;
-import org.opends.server.types.LockManager;
-import org.opends.server.types.OperationType;
-import org.opends.server.types.Privilege;
-import org.opends.server.types.ResultCode;
-import org.opends.server.types.SearchFilter;
-import org.opends.server.types.operation.PostOperationCompareOperation;
-import org.opends.server.types.operation.PostResponseCompareOperation;
-import org.opends.server.types.operation.PreOperationCompareOperation;
-import org.opends.server.types.operation.PreParseCompareOperation;
-
-import static org.opends.server.core.CoreConstants.*;
-import static org.opends.server.loggers.AccessLogger.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-
-import org.opends.server.loggers.debug.DebugLogger;
-import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.types.DebugLogLevel;
-import static org.opends.server.messages.CoreMessages.*;
-import static org.opends.server.messages.MessageHandler.*;
-import static org.opends.server.util.ServerConstants.*;
-import static org.opends.server.util.StaticUtils.*;
-
+import org.opends.server.types.Operation;
/**
- * This class defines an operation that may be used to determine whether a
+ * This interface defines an operation that may be used to determine whether a
* specified entry in the Directory Server contains a given attribute-value
* pair.
*/
-public class CompareOperation
- extends AbstractOperation
- implements PreParseCompareOperation, PreOperationCompareOperation,
- PostOperationCompareOperation, PostResponseCompareOperation
+public interface CompareOperation extends Operation
{
/**
- * The tracer object for the debug logger.
- */
- private static final DebugTracer TRACER = DebugLogger.getTracer();
-
- // The attribute type for this compare operation.
- private AttributeType attributeType;
-
- // The assertion value for the compare operation.
- private ByteString assertionValue;
-
- // The raw, unprocessed entry DN as included in the client request.
- private ByteString rawEntryDN;
-
- // The cancel request that has been issued for this compare operation.
- private CancelRequest cancelRequest;
-
- // The DN of the entry for the compare operation.
- private DN entryDN;
-
- // The proxied authorization target DN for this operation.
- private DN proxiedAuthorizationDN;
-
- // The entry to be compared.
- private Entry entry;
-
- // The set of response controls for this compare operation.
- private List<Control> responseControls;
-
- // The attribute type for the compare operation.
- private String rawAttributeType;
-
-
-
- /**
- * Creates a new compare operation with the provided information.
- *
- * @param clientConnection The client connection with which this operation
- * is associated.
- * @param operationID The operation ID for this operation.
- * @param messageID The message ID of the request with which this
- * operation is associated.
- * @param requestControls The set of controls included in the request.
- * @param rawEntryDN The raw, unprocessed entry DN as provided in the
- * client request. This may or may not be a valid
- * DN as no validation will have been performed yet.
- * @param rawAttributeType The raw attribute type for the compare operation.
- * @param assertionValue The assertion value for the compare operation.
- */
- public CompareOperation(ClientConnection clientConnection, long operationID,
- int messageID, List<Control> requestControls,
- ByteString rawEntryDN, String rawAttributeType,
- ByteString assertionValue)
- {
- super(clientConnection, operationID, messageID, requestControls);
-
-
- this.rawEntryDN = rawEntryDN;
- this.rawAttributeType = rawAttributeType;
- this.assertionValue = assertionValue;
-
- responseControls = new ArrayList<Control>();
- entry = null;
- entryDN = null;
- attributeType = null;
- cancelRequest = null;
- proxiedAuthorizationDN = null;
- }
-
-
-
- /**
- * Creates a new compare operation with the provided information.
- *
- * @param clientConnection The client connection with which this operation
- * is associated.
- * @param operationID The operation ID for this operation.
- * @param messageID The message ID of the request with which this
- * operation is associated.
- * @param requestControls The set of controls included in the request.
- * @param entryDN The entry DN for this compare operation.
- * @param attributeType The attribute type for this compare operation.
- * @param assertionValue The assertion value for the compare operation.
- */
- public CompareOperation(ClientConnection clientConnection, long operationID,
- int messageID, List<Control> requestControls,
- DN entryDN, AttributeType attributeType,
- ByteString assertionValue)
- {
- super(clientConnection, operationID, messageID, requestControls);
-
-
- this.entryDN = entryDN;
- this.attributeType = attributeType;
- this.assertionValue = assertionValue;
-
- responseControls = new ArrayList<Control>();
- rawEntryDN = new ASN1OctetString(entryDN.toString());
- rawAttributeType = attributeType.getNameOrOID();
- cancelRequest = null;
- entry = null;
- proxiedAuthorizationDN = null;
- }
-
-
-
- /**
* Retrieves the raw, unprocessed entry DN as included in the client request.
* The DN that is returned may or may not be a valid DN, since no validation
* will have been performed upon it.
*
* @return The raw, unprocessed entry DN as included in the client request.
*/
- public final ByteString getRawEntryDN()
- {
- return rawEntryDN;
- }
-
+ public ByteString getRawEntryDN();
/**
@@ -217,13 +56,7 @@
* @param rawEntryDN The raw, unprocessed entry DN as included in the client
* request.
*/
- public final void setRawEntryDN(ByteString rawEntryDN)
- {
- this.rawEntryDN = rawEntryDN;
-
- entryDN = null;
- }
-
+ public void setRawEntryDN(ByteString rawEntryDN);
/**
@@ -234,11 +67,7 @@
* @return The DN of the entry to compare, or <CODE>null</CODE> if the raw
* entry DN has not yet been processed.
*/
- public final DN getEntryDN()
- {
- return entryDN;
- }
-
+ public DN getEntryDN();
/**
@@ -246,11 +75,7 @@
*
* @return The raw attribute type for this compare operation.
*/
- public final String getRawAttributeType()
- {
- return rawAttributeType;
- }
-
+ public String getRawAttributeType();
/**
@@ -260,13 +85,7 @@
* @param rawAttributeType The raw attribute type for this compare
* operation.
*/
- public final void setRawAttributeType(String rawAttributeType)
- {
- this.rawAttributeType = rawAttributeType;
-
- attributeType = null;
- }
-
+ public void setRawAttributeType(String rawAttributeType);
/**
@@ -276,23 +95,23 @@
*
* @return The attribute type for this compare operation.
*/
- public final AttributeType getAttributeType()
- {
- return attributeType;
- }
+ public AttributeType getAttributeType();
+ /**
+ * Specifies the attribute type for this compare operation.
+ *
+ * @param attributeType The attribute type for this compare operation.
+ */
+ public void setAttributeType(AttributeType attributeType);
+
/**
* Retrieves the assertion value for this compare operation.
*
* @return The assertion value for this compare operation.
*/
- public final ByteString getAssertionValue()
- {
- return assertionValue;
- }
-
+ public ByteString getAssertionValue();
/**
@@ -301,926 +120,23 @@
*
* @param assertionValue The assertion value for this compare operation.
*/
- public final void setAssertionValue(ByteString assertionValue)
- {
- this.assertionValue = assertionValue;
- }
-
+ public void setAssertionValue(ByteString assertionValue);
/**
- * Retrieves the entry to target with the compare operation. This should not
- * be called by pre-parse plugins.
+ * Retrieves the proxied authorization target DN for this compare operation.
*
- * @return The entry to target with the compare operation, or
- * <CODE>null</CODE> if the entry is not yet available.
+ * @return The proxied authorization target DN for this compare operation
*/
- public final Entry getEntryToCompare()
- {
- return entry;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final OperationType getOperationType()
- {
- // Note that no debugging will be done in this method because it is a likely
- // candidate for being called by the logging subsystem.
-
- return OperationType.COMPARE;
- }
-
+ public DN getProxiedAuthorizationDN();
/**
- * {@inheritDoc}
- */
- @Override()
- public final void disconnectClient(DisconnectReason disconnectReason,
- boolean sendNotification, String message,
- int messageID)
- {
- // Before calling clientConnection.disconnect, we need to mark this
- // operation as cancelled so that the attempt to cancel it later won't cause
- // an unnecessary delay.
- setCancelResult(CancelResult.CANCELED);
-
- clientConnection.disconnect(disconnectReason, sendNotification, message,
- messageID);
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final String[][] getRequestLogElements()
- {
- // Note that no debugging will be done in this method because it is a likely
- // candidate for being called by the logging subsystem.
-
- return new String[][]
- {
- new String[] { LOG_ELEMENT_ENTRY_DN, String.valueOf(rawEntryDN) },
- new String[] { LOG_ELEMENT_COMPARE_ATTR, rawAttributeType }
- };
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final String[][] getResponseLogElements()
- {
- // Note that no debugging will be done in this method because it is a likely
- // candidate for being called by the logging subsystem.
-
- String resultCode = String.valueOf(getResultCode().getIntValue());
-
- String errorMessage;
- StringBuilder errorMessageBuffer = getErrorMessage();
- if (errorMessageBuffer == null)
- {
- errorMessage = null;
- }
- else
- {
- errorMessage = errorMessageBuffer.toString();
- }
-
- String matchedDNStr;
- DN matchedDN = getMatchedDN();
- if (matchedDN == null)
- {
- matchedDNStr = null;
- }
- else
- {
- matchedDNStr = matchedDN.toString();
- }
-
- String referrals;
- List<String> referralURLs = getReferralURLs();
- if ((referralURLs == null) || referralURLs.isEmpty())
- {
- referrals = null;
- }
- else
- {
- StringBuilder buffer = new StringBuilder();
- Iterator<String> iterator = referralURLs.iterator();
- buffer.append(iterator.next());
-
- while (iterator.hasNext())
- {
- buffer.append(", ");
- buffer.append(iterator.next());
- }
-
- referrals = buffer.toString();
- }
-
- String processingTime =
- String.valueOf(getProcessingTime());
-
- return new String[][]
- {
- new String[] { LOG_ELEMENT_RESULT_CODE, resultCode },
- new String[] { LOG_ELEMENT_ERROR_MESSAGE, errorMessage },
- new String[] { LOG_ELEMENT_MATCHED_DN, matchedDNStr },
- new String[] { LOG_ELEMENT_REFERRAL_URLS, referrals },
- new String[] { LOG_ELEMENT_PROCESSING_TIME, processingTime }
- };
- }
-
-
-
- /**
- * Retrieves the proxied authorization DN for this operation if proxied
- * authorization has been requested.
+ * Specifies the proxied authorization target DN for this compare operation.
*
- * @return The proxied authorization DN for this operation if proxied
- * authorization has been requested, or {@code null} if proxied
- * authorization has not been requested.
+ * @param proxiedAuthorizationDN The proxied authorization target DN for
+ * this compare operation
*/
- public DN getProxiedAuthorizationDN()
- {
- return proxiedAuthorizationDN;
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final List<Control> getResponseControls()
- {
- return responseControls;
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final void addResponseControl(Control control)
- {
- responseControls.add(control);
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final void removeResponseControl(Control control)
- {
- responseControls.remove(control);
- }
-
-
-
- /**
- * Performs the work of actually processing this operation. This
- * should include all processing for the operation, including
- * invoking plugins, logging messages, performing access control,
- * managing synchronization, and any other work that might need to
- * be done in the course of processing.
- */
- public final void run()
- {
- setResultCode(ResultCode.UNDEFINED);
-
-
- // Get the plugin config manager that will be used for invoking plugins.
- PluginConfigManager pluginConfigManager =
- DirectoryServer.getPluginConfigManager();
- boolean skipPostOperation = false;
-
-
- // Start the processing timer.
- setProcessingStartTime();
-
-
- // Check for and handle a request to cancel this operation.
- if (cancelRequest != null)
- {
- indicateCancelled(cancelRequest);
- setProcessingStopTime();
- return;
- }
-
-
- // Create a labeled block of code that we can break out of if a problem is
- // detected.
-compareProcessing:
- {
- // Invoke the pre-parse compare plugins.
- PreParsePluginResult preParseResult =
- pluginConfigManager.invokePreParseComparePlugins(this);
- if (preParseResult.connectionTerminated())
- {
- // There's no point in continuing with anything. Log the request and
- // result and return.
- setResultCode(ResultCode.CANCELED);
-
- int msgID = MSGID_CANCELED_BY_PREPARSE_DISCONNECT;
- appendErrorMessage(getMessage(msgID));
-
- setProcessingStopTime();
-
- logCompareRequest(this);
- logCompareResponse(this);
- pluginConfigManager.invokePostResponseComparePlugins(this);
- return;
- }
- else if (preParseResult.sendResponseImmediately())
- {
- skipPostOperation = true;
- logCompareRequest(this);
- break compareProcessing;
- }
- else if (preParseResult.skipCoreProcessing())
- {
- skipPostOperation = false;
- break compareProcessing;
- }
-
-
- // Log the compare request message.
- logCompareRequest(this);
-
-
- // Check for and handle a request to cancel this operation.
- if (cancelRequest != null)
- {
- indicateCancelled(cancelRequest);
- setProcessingStopTime();
- logCompareResponse(this);
- pluginConfigManager.invokePostResponseComparePlugins(this);
- return;
- }
-
-
- // Process the entry DN to convert it from the raw form to the form
- // required for the rest of the compare processing.
- try
- {
- if (entryDN == null)
- {
- entryDN = DN.decode(rawEntryDN);
- }
- }
- catch (DirectoryException de)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, de);
- }
-
- setResultCode(de.getResultCode());
- appendErrorMessage(de.getErrorMessage());
- skipPostOperation = true;
-
- break compareProcessing;
- }
-
-
- // If the target entry is in the server configuration, then make sure the
- // requester has the CONFIG_READ privilege.
- if (DirectoryServer.getConfigHandler().handlesEntry(entryDN) &&
- (! clientConnection.hasPrivilege(Privilege.CONFIG_READ, this)))
- {
- int msgID = MSGID_COMPARE_CONFIG_INSUFFICIENT_PRIVILEGES;
- appendErrorMessage(getMessage(msgID));
- setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
- skipPostOperation = true;
-
- break compareProcessing;
- }
-
-
- // Check for and handle a request to cancel this operation.
- if (cancelRequest != null)
- {
- indicateCancelled(cancelRequest);
- setProcessingStopTime();
- logCompareResponse(this);
- pluginConfigManager.invokePostResponseComparePlugins(this);
- return;
- }
-
-
- // Grab a read lock on the entry.
- Lock readLock = null;
- for (int i=0; i < 3; i++)
- {
- readLock = LockManager.lockRead(entryDN);
- if (readLock != null)
- {
- break;
- }
- }
-
- if (readLock == null)
- {
- int msgID = MSGID_COMPARE_CANNOT_LOCK_ENTRY;
- String message = getMessage(msgID, String.valueOf(entryDN));
-
- setResultCode(DirectoryServer.getServerErrorResultCode());
- appendErrorMessage(message);
- skipPostOperation = true;
- break compareProcessing;
- }
-
- try
- {
- // Get the entry. If it does not exist, then fail.
- try
- {
- entry = DirectoryServer.getEntry(entryDN);
-
- if (entry == null)
- {
- setResultCode(ResultCode.NO_SUCH_OBJECT);
- appendErrorMessage(getMessage(MSGID_COMPARE_NO_SUCH_ENTRY,
- String.valueOf(entryDN)));
-
- // See if one of the entry's ancestors exists.
- DN parentDN = entryDN.getParentDNInSuffix();
- while (parentDN != null)
- {
- try
- {
- if (DirectoryServer.entryExists(parentDN))
- {
- setMatchedDN(parentDN);
- break;
- }
- }
- catch (Exception e)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- break;
- }
-
- parentDN = parentDN.getParentDNInSuffix();
- }
-
- break compareProcessing;
- }
- }
- catch (DirectoryException de)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, de);
- }
-
- setResultCode(de.getResultCode());
- appendErrorMessage(de.getErrorMessage());
- break compareProcessing;
- }
-
- // Check to see if there are any controls in the request. If so, then
- // see if there is any special processing required.
- List<Control> requestControls = getRequestControls();
- if ((requestControls != null) && (! requestControls.isEmpty()))
- {
- for (int i=0; i < requestControls.size(); i++)
- {
- Control c = requestControls.get(i);
- String oid = c.getOID();
-
- if (oid.equals(OID_LDAP_ASSERTION))
- {
- LDAPAssertionRequestControl assertControl;
- if (c instanceof LDAPAssertionRequestControl)
- {
- assertControl = (LDAPAssertionRequestControl) c;
- }
- else
- {
- try
- {
- assertControl = LDAPAssertionRequestControl.decodeControl(c);
- requestControls.set(i, assertControl);
- }
- catch (LDAPException le)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, le);
- }
-
- setResultCode(ResultCode.valueOf(le.getResultCode()));
- appendErrorMessage(le.getMessage());
-
- break compareProcessing;
- }
- }
-
- try
- {
- // FIXME -- We need to determine whether the current user has
- // permission to make this determination.
- SearchFilter filter = assertControl.getSearchFilter();
- if (! filter.matchesEntry(entry))
- {
- setResultCode(ResultCode.ASSERTION_FAILED);
-
- appendErrorMessage(getMessage(MSGID_COMPARE_ASSERTION_FAILED,
- String.valueOf(entryDN)));
-
- break compareProcessing;
- }
- }
- catch (DirectoryException de)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, de);
- }
-
- setResultCode(ResultCode.PROTOCOL_ERROR);
-
- int msgID = MSGID_COMPARE_CANNOT_PROCESS_ASSERTION_FILTER;
- appendErrorMessage(getMessage(msgID, String.valueOf(entryDN),
- de.getErrorMessage()));
-
- break compareProcessing;
- }
- }
- else if (oid.equals(OID_PROXIED_AUTH_V1))
- {
- // The requester must have the PROXIED_AUTH privilige in order to
- // be able to use this control.
- if (! clientConnection.hasPrivilege(Privilege.PROXIED_AUTH, this))
- {
- int msgID = MSGID_PROXYAUTH_INSUFFICIENT_PRIVILEGES;
- appendErrorMessage(getMessage(msgID));
- setResultCode(ResultCode.AUTHORIZATION_DENIED);
- break compareProcessing;
- }
-
-
- ProxiedAuthV1Control proxyControl;
- if (c instanceof ProxiedAuthV1Control)
- {
- proxyControl = (ProxiedAuthV1Control) c;
- }
- else
- {
- try
- {
- proxyControl = ProxiedAuthV1Control.decodeControl(c);
- }
- catch (LDAPException le)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, le);
- }
-
- setResultCode(ResultCode.valueOf(le.getResultCode()));
- appendErrorMessage(le.getMessage());
-
- break compareProcessing;
- }
- }
-
-
- Entry authorizationEntry;
- try
- {
- authorizationEntry = proxyControl.getAuthorizationEntry();
- }
- catch (DirectoryException de)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, de);
- }
-
- setResultCode(de.getResultCode());
- appendErrorMessage(de.getErrorMessage());
-
- break compareProcessing;
- }
-
- if (AccessControlConfigManager.getInstance()
- .getAccessControlHandler().isProxiedAuthAllowed(this,
- authorizationEntry) == false) {
- setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
-
- int msgID = MSGID_COMPARE_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS;
- appendErrorMessage(getMessage(msgID, String.valueOf(entryDN)));
-
- skipPostOperation = true;
- break compareProcessing;
- }
- setAuthorizationEntry(authorizationEntry);
- if (authorizationEntry == null)
- {
- proxiedAuthorizationDN = DN.nullDN();
- }
- else
- {
- proxiedAuthorizationDN = authorizationEntry.getDN();
- }
- }
- else if (oid.equals(OID_PROXIED_AUTH_V2))
- {
- // The requester must have the PROXIED_AUTH privilige in order to
- // be able to use this control.
- if (! clientConnection.hasPrivilege(Privilege.PROXIED_AUTH, this))
- {
- int msgID = MSGID_PROXYAUTH_INSUFFICIENT_PRIVILEGES;
- appendErrorMessage(getMessage(msgID));
- setResultCode(ResultCode.AUTHORIZATION_DENIED);
- break compareProcessing;
- }
-
-
- ProxiedAuthV2Control proxyControl;
- if (c instanceof ProxiedAuthV2Control)
- {
- proxyControl = (ProxiedAuthV2Control) c;
- }
- else
- {
- try
- {
- proxyControl = ProxiedAuthV2Control.decodeControl(c);
- }
- catch (LDAPException le)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, le);
- }
-
- setResultCode(ResultCode.valueOf(le.getResultCode()));
- appendErrorMessage(le.getMessage());
-
- break compareProcessing;
- }
- }
-
-
- Entry authorizationEntry;
- try
- {
- authorizationEntry = proxyControl.getAuthorizationEntry();
- }
- catch (DirectoryException de)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, de);
- }
-
- setResultCode(de.getResultCode());
- appendErrorMessage(de.getErrorMessage());
-
- break compareProcessing;
- }
-
- if (AccessControlConfigManager.getInstance()
- .getAccessControlHandler().isProxiedAuthAllowed(this,
- authorizationEntry) == false) {
- setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
-
- int msgID = MSGID_COMPARE_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS;
- appendErrorMessage(getMessage(msgID, String.valueOf(entryDN)));
-
- skipPostOperation = true;
- break compareProcessing;
- }
- setAuthorizationEntry(authorizationEntry);
- if (authorizationEntry == null)
- {
- proxiedAuthorizationDN = DN.nullDN();
- }
- else
- {
- proxiedAuthorizationDN = authorizationEntry.getDN();
- }
- }
-
- // NYI -- Add support for additional controls.
- else if (c.isCritical())
- {
- Backend backend = DirectoryServer.getBackend(entryDN);
- if ((backend == null) || (! backend.supportsControl(oid)))
- {
- setResultCode(ResultCode.UNAVAILABLE_CRITICAL_EXTENSION);
-
- int msgID = MSGID_COMPARE_UNSUPPORTED_CRITICAL_CONTROL;
- appendErrorMessage(getMessage(msgID, String.valueOf(entryDN),
- oid));
-
- break compareProcessing;
- }
- }
- }
- }
-
-
- // Check to see if the client has permission to perform the
- // compare.
-
- // FIXME: for now assume that this will check all permission
- // pertinent to the operation. This includes proxy authorization
- // and any other controls specified.
-
- // FIXME: earlier checks to see if the entry already exists may
- // have already exposed sensitive information to the client.
- if (AccessControlConfigManager.getInstance()
- .getAccessControlHandler().isAllowed(this) == false) {
- setResultCode(ResultCode.INSUFFICIENT_ACCESS_RIGHTS);
-
- int msgID = MSGID_COMPARE_AUTHZ_INSUFFICIENT_ACCESS_RIGHTS;
- appendErrorMessage(getMessage(msgID, String.valueOf(entryDN)));
-
- skipPostOperation = true;
- break compareProcessing;
- }
-
- // Check for and handle a request to cancel this operation.
- if (cancelRequest != null)
- {
- indicateCancelled(cancelRequest);
- setProcessingStopTime();
- logCompareResponse(this);
- pluginConfigManager.invokePostResponseComparePlugins(this);
- return;
- }
-
-
- // Invoke the pre-operation compare plugins.
- PreOperationPluginResult preOpResult =
- pluginConfigManager.invokePreOperationComparePlugins(this);
- if (preOpResult.connectionTerminated())
- {
- // There's no point in continuing with anything. Log the request and
- // result and return.
- setResultCode(ResultCode.CANCELED);
-
- int msgID = MSGID_CANCELED_BY_PREOP_DISCONNECT;
- appendErrorMessage(getMessage(msgID));
-
- setProcessingStopTime();
- logCompareResponse(this);
- pluginConfigManager.invokePostResponseComparePlugins(this);
- return;
- }
- else if (preOpResult.sendResponseImmediately())
- {
- skipPostOperation = true;
- break compareProcessing;
- }
- else if (preOpResult.skipCoreProcessing())
- {
- skipPostOperation = false;
- break compareProcessing;
- }
-
-
- // Get the base attribute type and set of options.
- String baseName;
- HashSet<String> options;
- int semicolonPos = rawAttributeType.indexOf(';');
- if (semicolonPos > 0)
- {
- baseName = toLowerCase(rawAttributeType.substring(0, semicolonPos));
-
- options = new HashSet<String>();
- int nextPos = rawAttributeType.indexOf(';', semicolonPos+1);
- while (nextPos > 0)
- {
- options.add(rawAttributeType.substring(semicolonPos+1, nextPos));
- semicolonPos = nextPos;
- nextPos = rawAttributeType.indexOf(';', semicolonPos+1);
- }
-
- options.add(rawAttributeType.substring(semicolonPos+1));
- }
- else
- {
- baseName = toLowerCase(rawAttributeType);
- options = null;
- }
-
-
- // Actually perform the compare operation.
- List<Attribute> attrList = null;
- if (attributeType == null)
- {
- attributeType = DirectoryServer.getAttributeType(baseName);
- }
- if (attributeType == null)
- {
- attrList = entry.getAttribute(baseName, options);
- attributeType = DirectoryServer.getDefaultAttributeType(baseName);
- }
- else
- {
- attrList = entry.getAttribute(attributeType, options);
- }
-
- if ((attrList == null) || attrList.isEmpty())
- {
- setResultCode(ResultCode.NO_SUCH_ATTRIBUTE);
- if (options == null)
- {
- appendErrorMessage(getMessage(MSGID_COMPARE_OP_NO_SUCH_ATTR,
- String.valueOf(entryDN), baseName));
- }
- else
- {
- appendErrorMessage(getMessage(
- MSGID_COMPARE_OP_NO_SUCH_ATTR_WITH_OPTIONS,
- String.valueOf(entryDN), baseName));
- }
- }
- else
- {
- AttributeValue value = new AttributeValue(attributeType,
- assertionValue);
-
- boolean matchFound = false;
- for (Attribute a : attrList)
- {
- if (a.hasValue(value))
- {
- matchFound = true;
- break;
- }
- }
-
- if (matchFound)
- {
- setResultCode(ResultCode.COMPARE_TRUE);
- }
- else
- {
- setResultCode(ResultCode.COMPARE_FALSE);
- }
- }
- }
- finally
- {
- LockManager.unlock(entryDN, readLock);
- }
- }
-
-
- // Check for and handle a request to cancel this operation.
- if (cancelRequest != null)
- {
- indicateCancelled(cancelRequest);
- setProcessingStopTime();
- logCompareResponse(this);
- pluginConfigManager.invokePostResponseComparePlugins(this);
- return;
- }
-
-
- // Invoke the post-operation compare plugins.
- if (! skipPostOperation)
- {
- PostOperationPluginResult postOperationResult =
- pluginConfigManager.invokePostOperationComparePlugins(this);
- if (postOperationResult.connectionTerminated())
- {
- setResultCode(ResultCode.CANCELED);
-
- int msgID = MSGID_CANCELED_BY_POSTOP_DISCONNECT;
- appendErrorMessage(getMessage(msgID));
-
- setProcessingStopTime();
- logCompareResponse(this);
- pluginConfigManager.invokePostResponseComparePlugins(this);
- return;
- }
- }
-
-
- // Indicate that it is now too late to attempt to cancel the operation.
- setCancelResult(CancelResult.TOO_LATE);
-
-
- // Stop the processing timer.
- setProcessingStopTime();
-
-
- // Send the compare response to the client.
- clientConnection.sendResponse(this);
-
-
- // Log the compare response message.
- logCompareResponse(this);
-
-
- // Invoke the post-response compare plugins.
- pluginConfigManager.invokePostResponseComparePlugins(this);
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final CancelResult cancel(CancelRequest cancelRequest)
- {
- this.cancelRequest = cancelRequest;
-
- CancelResult cancelResult = getCancelResult();
- long stopWaitingTime = System.currentTimeMillis() + 5000;
- while ((cancelResult == null) &&
- (System.currentTimeMillis() < stopWaitingTime))
- {
- try
- {
- Thread.sleep(50);
- }
- catch (Exception e)
- {
- if (debugEnabled())
- {
- TRACER.debugCaught(DebugLogLevel.ERROR, e);
- }
- }
-
- cancelResult = getCancelResult();
- }
-
- if (cancelResult == null)
- {
- // This can happen in some rare cases (e.g., if a client disconnects and
- // there is still a lot of data to send to that client), and in this case
- // we'll prevent the cancel thread from blocking for a long period of
- // time.
- cancelResult = CancelResult.CANNOT_CANCEL;
- }
-
- return cancelResult;
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final CancelRequest getCancelRequest()
- {
- return cancelRequest;
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public boolean setCancelRequest(CancelRequest cancelRequest)
- {
- this.cancelRequest = cancelRequest;
- return true;
- }
-
-
-
- /**
- * {@inheritDoc}
- */
- @Override()
- public final void toString(StringBuilder buffer)
- {
- buffer.append("CompareOperation(connID=");
- buffer.append(clientConnection.getConnectionID());
- buffer.append(", opID=");
- buffer.append(operationID);
- buffer.append(", dn=");
- buffer.append(rawEntryDN);
- buffer.append(", attr=");
- buffer.append(rawAttributeType);
- buffer.append(")");
- }
+ public void setProxiedAuthorizationDN(DN proxiedAuthorizationDN);
}
-
--
Gitblit v1.10.0