/*
* 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
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* 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
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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
*
*
* Portions Copyright 2006 Sun Microsystems, Inc.
*/
package org.opends.server.extensions;
import org.opends.server.api.SASLMechanismHandler;
import org.opends.server.config.ConfigEntry;
import org.opends.server.config.ConfigException;
import org.opends.server.core.BindOperation;
import org.opends.server.core.DirectoryServer;
import org.opends.server.types.AuthenticationInfo;
import org.opends.server.types.ByteString;
import org.opends.server.types.ErrorLogCategory;
import org.opends.server.types.ErrorLogSeverity;
import org.opends.server.types.InitializationException;
import org.opends.server.types.ResultCode;
import static org.opends.server.loggers.Debug.*;
import static org.opends.server.loggers.Error.*;
import static org.opends.server.messages.ExtensionsMessages.*;
import static org.opends.server.util.ServerConstants.*;
/**
* This class provides an implementation of a SASL mechanism, as defined in RFC
* 4505, that does not perform any authentication. That is, anyone attempting
* to bind with this SASL mechanism will be successful and will be given the
* rights of an unauthenticated user. The request may or may not include a set
* of SASL credentials which will serve as trace information. If provided,
* then that trace information will be written to the server error log.
*/
public class AnonymousSASLMechanismHandler
extends SASLMechanismHandler
{
/**
* The fully-qualified name of this class for debugging purposes.
*/
private static final String CLASS_NAME =
"org.opends.server.extensions.AnonymousSASLMechanismHandler";
/**
* Creates a new instance of this SASL mechanism handler. No initialization
* should be done in this method, as it should all be performed in the
* initializeSASLMechanismHandler method.
*/
public AnonymousSASLMechanismHandler()
{
super();
assert debugConstructor(CLASS_NAME);
}
/**
* Initializes this SASL mechanism handler based on the information in the
* provided configuration entry. It should also register itself with the
* Directory Server for the particular kinds of SASL mechanisms that it
* will process.
*
* @param configEntry The configuration entry that contains the information
* to use to initialize this SASL mechanism handler.
*
* @throws ConfigException If an unrecoverable problem arises in the
* process of performing the initialization.
*
* @throws InitializationException If a problem occurs during initialization
* that is not related to the server
* configuration.
*/
public void initializeSASLMechanismHandler(ConfigEntry configEntry)
throws ConfigException, InitializationException
{
assert debugEnter(CLASS_NAME, "initializeSASLMechanismHandler",
String.valueOf(configEntry));
// No real implementation is required. Simply register with the Directory
// Server for the ANONYMOUS mechanism.
DirectoryServer.registerSASLMechanismHandler(SASL_MECHANISM_ANONYMOUS,
this);
}
/**
* Performs any finalization that may be necessary for this SASL mechanism
* handler.
*/
public void finalizeSASLMechanismHandler()
{
assert debugEnter(CLASS_NAME, "finalizeSASLMechanismHandler");
DirectoryServer.deregisterSASLMechanismHandler(SASL_MECHANISM_ANONYMOUS);
}
/**
* Processes the provided SASL bind operation. Note that if the SASL
* processing gets far enough to be able to map the associated request to a
* user entry (regardless of whether the authentication is ultimately
* successful), then this method must call the
* BindOperation.setSASLAuthUserEntry to provide it with the
* entry for the user that attempted to authenticate.
*
* @param bindOperation The SASL bind operation to be processed.
*/
public void processSASLBind(BindOperation bindOperation)
{
assert debugEnter(CLASS_NAME, "processSASLBind",
String.valueOf(bindOperation));
// See if the client provided SASL credentials including trace information.
// If so, then log it to the error log.
ByteString saslCredentials = bindOperation.getSASLCredentials();
if (saslCredentials != null)
{
String credString = saslCredentials.stringValue();
if (credString.length() > 0)
{
logError(ErrorLogCategory.REQUEST_HANDLING,
ErrorLogSeverity.INFORMATIONAL, MSGID_SASLANONYMOUS_TRACE,
bindOperation.getConnectionID(),
bindOperation.getOperationID(), credString);
}
}
// Authenticate the client anonymously and indicate that the bind was
// successful.
AuthenticationInfo authInfo = new AuthenticationInfo();
bindOperation.getClientConnection().setAuthenticationInfo(authInfo);
bindOperation.setResultCode(ResultCode.SUCCESS);
}
/**
* Indicates whether the specified SASL mechanism is password-based or uses
* some other form of credentials (e.g., an SSL client certificate or Kerberos
* ticket).
*
* @param mechanism The name of the mechanism for which to make the
* determination. This will only be invoked with names of
* mechanisms for which this handler has previously
* registered.
*
* @return true if this SASL mechanism is password-based, or
* false if it uses some other form of credentials.
*/
public boolean isPasswordBased(String mechanism)
{
assert debugEnter(CLASS_NAME, "isPasswordBased", String.valueOf(mechanism));
// This is not a password-based mechanism.
return false;
}
/**
* Indicates whether the specified SASL mechanism should be considered secure
* (i.e., it does not expose the authentication credentials in a manner that
* is useful to a third-party observer, and other aspects of the
* authentication are generally secure).
*
* @param mechanism The name of the mechanism for which to make the
* determination. This will only be invoked with names of
* mechanisms for which this handler has previously
* registered.
*
* @return true if this SASL mechanism should be considered
* secure, or false if not.
*/
public boolean isSecure(String mechanism)
{
assert debugEnter(CLASS_NAME, "isSecure", String.valueOf(mechanism));
// This is not a secure mechanism.
return false;
}
}