
org.ldaptive.control.SessionTrackingControl Maven / Gradle / Ivy
/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.control;
import java.util.ArrayList;
import java.util.List;
import org.ldaptive.LdapUtils;
import org.ldaptive.asn1.AbstractParseHandler;
import org.ldaptive.asn1.ConstructedDEREncoder;
import org.ldaptive.asn1.DERBuffer;
import org.ldaptive.asn1.DEREncoder;
import org.ldaptive.asn1.DERParser;
import org.ldaptive.asn1.DERPath;
import org.ldaptive.asn1.OctetStringType;
import org.ldaptive.asn1.UniversalDERTag;
/**
* Request/response control for session tracking. See https://tools.ietf.org/html/draft-wahl-ldap-session-03.
* Control is defined as:
*
*
LDAPString ::= OCTET STRING -- UTF-8 encoded
LDAPOID ::= OCTET STRING -- Constrained to numericoid
SessionIdentifierControlValue ::= SEQUENCE {
sessionSourceIp LDAPString,
sessionSourceName LDAPString,
formatOID LDAPOID,
sessionTrackingIdentifier LDAPString
}
*
*
* Note that criticality must be either false or absent.
*
* @author Middleware Services
*/
public class SessionTrackingControl extends AbstractControl implements RequestControl, ResponseControl
{
/** OID of this control. */
public static final String OID = "1.3.6.1.4.1.21008.108.63.1";
/** OID for the Acct-Session-Id RADIUS attribute format. */
public static final String RADIUS_ACCT_OID = "1.3.6.1.4.1.21008.108.63.1.1";
/** OID for the Acct-Multi-Session-Id RADIUS attribute format. */
public static final String RADIUS_ACCT_MULTI_OID = "1.3.6.1.4.1.21008.108.63.1.2";
/** OID for the SASL authorization identity string format. */
public static final String USERNAME_ACCT_OID = "1.3.6.1.4.1.21008.108.63.1.3";
/** hash code seed. */
private static final int HASH_CODE_SEED = 7027;
/** Session source ip. */
private String sessionSourceIp;
/** Session source name. */
private String sessionSourceName;
/** Format OID. */
private String formatOID;
/** Session tracking identifier. */
private String sessionTrackingIdentifier;
/** Default constructor. */
public SessionTrackingControl()
{
super(OID);
}
/**
* Creates a new session tracking control.
*
* @param critical whether this control is critical
*/
public SessionTrackingControl(final boolean critical)
{
super(OID, critical);
}
/**
* Creates a new session tracking control.
*
* @param sourceIP session source ip
* @param sourceName session source name
* @param oid format OID
* @param trackingIdentifier session tracking identifier
*/
public SessionTrackingControl(
final String sourceIP,
final String sourceName,
final String oid,
final String trackingIdentifier)
{
this(sourceIP, sourceName, oid, trackingIdentifier, false);
}
/**
* Creates a new session tracking control.
*
* @param sourceIP session source ip
* @param sourceName session source name
* @param oid format OID
* @param trackingIdentifier session tracking identifier
* @param critical whether this control is critical
*/
public SessionTrackingControl(
final String sourceIP,
final String sourceName,
final String oid,
final String trackingIdentifier,
final boolean critical)
{
super(OID, critical);
setSessionSourceIp(sourceIP);
setSessionSourceName(sourceName);
setFormatOID(oid);
setSessionTrackingIdentifier(trackingIdentifier);
}
@Override
public boolean hasValue()
{
return true;
}
/**
* Returns the session source ip.
*
* @return session source ip
*/
public String getSessionSourceIp()
{
return sessionSourceIp;
}
/**
* Sets the session source ip.
*
* @param s session source ip
*/
public void setSessionSourceIp(final String s)
{
sessionSourceIp = s;
}
/**
* Returns the session source name.
*
* @return session source name
*/
public String getSessionSourceName()
{
return sessionSourceName;
}
/**
* Sets the session source name.
*
* @param s session source name
*/
public void setSessionSourceName(final String s)
{
sessionSourceName = s;
}
/**
* Returns the format OID.
*
* @return format OID
*/
public String getFormatOID()
{
return formatOID;
}
/**
* Sets the format OID.
*
* @param s format OID
*/
public void setFormatOID(final String s)
{
formatOID = s;
}
/**
* Returns the session tracking identifier.
*
* @return session tracking identifier
*/
public String getSessionTrackingIdentifier()
{
return sessionTrackingIdentifier;
}
/**
* Sets the session tracking identifier.
*
* @param s session tracking identifier
*/
public void setSessionTrackingIdentifier(final String s)
{
sessionTrackingIdentifier = s;
}
@Override
public boolean equals(final Object o)
{
if (o == this) {
return true;
}
if (o instanceof SessionTrackingControl && super.equals(o)) {
final SessionTrackingControl v = (SessionTrackingControl) o;
return LdapUtils.areEqual(sessionSourceIp, v.sessionSourceIp) &&
LdapUtils.areEqual(sessionSourceName, v.sessionSourceName) &&
LdapUtils.areEqual(formatOID, v.formatOID) &&
LdapUtils.areEqual(sessionTrackingIdentifier, v.sessionTrackingIdentifier);
}
return false;
}
@Override
public int hashCode()
{
return
LdapUtils.computeHashCode(
HASH_CODE_SEED,
getOID(),
getCriticality(),
sessionSourceIp,
sessionSourceName,
formatOID,
sessionTrackingIdentifier);
}
@Override
public String toString()
{
return "[" +
getClass().getName() + "@" + hashCode() + "::" +
"criticality=" + getCriticality() + ", " +
"sessionSourceIp=" + sessionSourceIp + ", " +
"sessionSourceName=" + sessionSourceName + ", " +
"formatOID=" + formatOID + ", " +
"sessionTrackingIdentifier=" + sessionTrackingIdentifier + "]";
}
@Override
public byte[] encode()
{
final List l = new ArrayList<>();
l.add(new OctetStringType(getSessionSourceIp()));
l.add(new OctetStringType(getSessionSourceName()));
l.add(new OctetStringType(getFormatOID()));
l.add(new OctetStringType(getSessionTrackingIdentifier()));
final ConstructedDEREncoder se = new ConstructedDEREncoder(UniversalDERTag.SEQ, l.toArray(new DEREncoder[0]));
return se.encode();
}
@Override
public void decode(final DERBuffer encoded)
{
final DERParser parser = new DERParser();
parser.registerHandler(SourceIpHandler.PATH, new SourceIpHandler(this));
parser.registerHandler(SourceNameHandler.PATH, new SourceNameHandler(this));
parser.registerHandler(FormatOIDHandler.PATH, new FormatOIDHandler(this));
parser.registerHandler(TrackingIdentifierHandler.PATH, new TrackingIdentifierHandler(this));
parser.parse(encoded);
}
/** Parse handler implementation for the source ip. */
private static class SourceIpHandler extends AbstractParseHandler
{
/** DER path to source ip value. */
public static final DERPath PATH = new DERPath("/SEQ/OCTSTR[0]");
/**
* Creates a new source ip handler.
*
* @param control to configure
*/
SourceIpHandler(final SessionTrackingControl control)
{
super(control);
}
@Override
public void handle(final DERParser parser, final DERBuffer encoded)
{
getObject().setSessionSourceIp(OctetStringType.decode(encoded));
}
}
/** Parse handler implementation for the source name. */
private static class SourceNameHandler extends AbstractParseHandler
{
/** DER path to source name value. */
public static final DERPath PATH = new DERPath("/SEQ/OCTSTR[1]");
/**
* Creates a new source name handler.
*
* @param control to configure
*/
SourceNameHandler(final SessionTrackingControl control)
{
super(control);
}
@Override
public void handle(final DERParser parser, final DERBuffer encoded)
{
getObject().setSessionSourceName(OctetStringType.decode(encoded));
}
}
/** Parse handler implementation for the format oid. */
private static class FormatOIDHandler extends AbstractParseHandler
{
/** DER path to format oid value. */
public static final DERPath PATH = new DERPath("/SEQ/OCTSTR[2]");
/**
* Creates a new format oid handler.
*
* @param control to configure
*/
FormatOIDHandler(final SessionTrackingControl control)
{
super(control);
}
@Override
public void handle(final DERParser parser, final DERBuffer encoded)
{
getObject().setFormatOID(OctetStringType.decode(encoded));
}
}
/** Parse handler implementation for the tracking identifier. */
private static class TrackingIdentifierHandler extends AbstractParseHandler
{
/** DER path to source name value. */
public static final DERPath PATH = new DERPath("/SEQ/OCTSTR[3]");
/**
* Creates a new tracking identifier handler.
*
* @param control to configure
*/
TrackingIdentifierHandler(final SessionTrackingControl control)
{
super(control);
}
@Override
public void handle(final DERParser parser, final DERBuffer encoded)
{
getObject().setSessionTrackingIdentifier(OctetStringType.decode(encoded));
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy