I'm using InMemoryDirectoryServer from UnboundID SDK. How do I process ldap requests from ldap client?
Here's code I found (at How to get DN and password with UnboundID):
public class MyLDAPListenerRequestHandler extends LDAPListenerRequestHandler {
@Override
public LDAPListenerRequestHandler newInstance(
LDAPListenerClientConnection arg0) throws LDAPException {
System.out.println("New Instance.");
LDAPConnectionOptions option = new LDAPConnectionOptions();
LDAPConnection connection = new LDAPConnection(option, "yourIPadress", yourport);
System.out.println("Connected to : " + connection.getConnectedAddress()+ " " + connection.getConnectedPort());
return this;
}
@Override
public LDAPMessage processBindRequest(int arg0, BindRequestProtocolOp arg1,
List<Control> arg2) {
System.out.println(arg1.getBindDN());
System.out.println(arg1.getSimplePassword());
return null;
}
Is this a proper way to capture bind reqest and process it under
public LDAPMessage processBindRequest(int arg0, BindRequestProtocolOp arg1,
List<Control> arg2) {
function? After processing, do I have to manually send bind to InMemoryDirectoryServer instance?
Hi again,
based on: http://sourceforge.net/p/ldap-sdk/discussion/1001257/thread/796c129d
it looks to me that it is possible to modify InMemoryRequestHandler source and change how it replies ldap requests (search,modify,...).
For alias dereferencing, I modified
for (final SearchResultEntry e : entryList)
loop in function:
public synchronized LDAPMessage processSearchRequest(final int messageID, final SearchRequestProtocolOp request, final List controls) {
with this code:
for (final SearchResultEntry e : entryList)
{
// flag which is set if for loop finds an alias entry.
boolean aliasEntryFound = false;
// aliasedObjectName reference to real entry.
String aliasedObjectName = null;
// Check that dereferencing is turned on.
if (aliasDeref)
{
// check if entry is an alias entry.
for (String objectClass : e.getAttributeValues("objectClass"))
{
if (objectClass.equalsIgnoreCase("alias"))
{
// Put on flag.
aliasEntryFound = true;
// Get real entry path.
aliasedObjectName = e.getAttributeValue("aliasedObjectName");
}
}
}
// If entry e is actually alias entry, then ...
if (aliasEntryFound && aliasedObjectName != null)
{
// Build new SearchRequest query with aliasedObjectName as real DN.
final SearchRequestProtocolOp newRequest = new SearchRequestProtocolOp(
aliasedObjectName, request.getScope(), request.getDerefPolicy(),
request.getSizeLimit(), request.getTimeLimit(),
false, request.getFilter(), request.getAttributes());
// Call recursively processSearchRequest() with new request value.
processSearchRequest(messageID, newRequest, controls);
}
else
{
try {
connection.sendSearchResultEntry(messageID, e, e.getControls());
} catch (final LDAPException le) {
Debug.debugException(le);
return new LDAPMessage(messageID, new SearchResultDoneProtocolOp(le.getResultCode().intValue(), le.getMatchedDN(),
le.getDiagnosticMessage(), StaticUtils.toList(le.getReferralURLs())), le.getResponseControls());
}
}
}
...
}
Somewhere at the beginning of InMemoryRequestHandler class, I added:
private boolean aliasDeref = true;
which I just use as a flag to control if I want alias dereferencing or not.
My code is just an example how to do alias dereferencing on search request. With custom request handler, it is possible only to alert ldap requests, not ldap replies or results.
Let me know if there is a better way of doing this. thanks