package com.hwlcn.ldap.ldap.sdk;
import com.hwlcn.ldap.asn1.ASN1OctetString;
import com.hwlcn.core.annotation.NotMutable;
import com.hwlcn.ldap.util.StaticUtils;
import com.hwlcn.core.annotation.ThreadSafety;
import com.hwlcn.ldap.util.ThreadSafetyLevel;
/**
* This class provides a SASL EXTERNAL bind request implementation as described
* in <A HREF="http://www.ietf.org/rfc/rfc4422.txt">RFC 4422</A>. The
* EXTERNAL mechanism is used to authenticate using information that is
* available outside of the LDAP layer (e.g., a certificate presented by the
* client during SSL or StartTLS negotiation).
* <BR><BR>
* <H2>Example</H2>
* The following example demonstrates the process for performing an EXTERNAL
* bind against a directory server:
* <PRE>
* try
* {
* BindResult bindResult = connection.bind(new EXTERNALBindRequest());
* // If we get here, then the bind was successful.
* }
* catch (LDAPException le)
* {
* // The bind failed for some reason.
* }
* </PRE>
*/
@NotMutable()
@ThreadSafety(level=ThreadSafetyLevel.NOT_THREADSAFE)
public final class EXTERNALBindRequest
extends SASLBindRequest
{
public static final String EXTERNAL_MECHANISM_NAME = "EXTERNAL";
private static final long serialVersionUID = 7520760039662616663L;
private int messageID = -1;
private final String authzID;
public EXTERNALBindRequest()
{
this(null, StaticUtils.NO_CONTROLS);
}
public EXTERNALBindRequest(final String authzID)
{
this(authzID, StaticUtils.NO_CONTROLS);
}
public EXTERNALBindRequest(final Control... controls)
{
this(null, controls);
}
public EXTERNALBindRequest(final String authzID, final Control... controls)
{
super(controls);
this.authzID = authzID;
}
public String getAuthorizationID()
{
return authzID;
}
@Override()
public String getSASLMechanismName()
{
return EXTERNAL_MECHANISM_NAME;
}
@Override()
protected BindResult process(final LDAPConnection connection, final int depth)
throws LDAPException
{
messageID = connection.nextMessageID();
final ASN1OctetString creds;
if (authzID == null)
{
creds = null;
}
else
{
creds = new ASN1OctetString(authzID);
}
return sendBindRequest(connection, "", creds, getControls(),
getResponseTimeoutMillis(connection));
}
@Override()
public EXTERNALBindRequest getRebindRequest(final String host, final int port)
{
return new EXTERNALBindRequest(authzID, getControls());
}
@Override()
public int getLastMessageID()
{
return messageID;
}
@Override()
public EXTERNALBindRequest duplicate()
{
return duplicate(getControls());
}
@Override()
public EXTERNALBindRequest duplicate(final Control[] controls)
{
final EXTERNALBindRequest bindRequest =
new EXTERNALBindRequest(authzID, controls);
bindRequest.setResponseTimeoutMillis(getResponseTimeoutMillis(null));
return bindRequest;
}
@Override()
public void toString(final StringBuilder buffer)
{
buffer.append("EXTERNALBindRequest(");
boolean added = false;
if (authzID != null)
{
buffer.append("authzID='");
buffer.append(authzID);
buffer.append('\'');
added = true;
}
final Control[] controls = getControls();
if (controls.length > 0)
{
if (added)
{
buffer.append(", ");
}
buffer.append("controls={");
for (int i=0; i < controls.length; i++)
{
if (i > 0)
{
buffer.append(", ");
}
buffer.append(controls[i]);
}
buffer.append('}');
}
buffer.append(')');
}
}