import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
public class LDAP3bind {
public static void main(String[] args) {
String host = "servername";
int port = 389;
int searchScope = SearchControls.SUBTREE_SCOPE;
String baseDN = "o=organisation,c=de";
String filter = "objectclass=*";
// String filter = "sn=Grizzly";
String returningAttributes[] = {"userPassword"};
Hashtable ldapProps = new Hashtable(11);
ldapProps.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ldapProps.put(Context.PROVIDER_URL, "ldap://" + host + ":" + Integer.toString(port).trim() + "/");
ldapProps.put("com.sun.jndi.connect.timeout", "10");
// Authentication: none, simple, strong
ldapProps.put(Context.SECURITY_AUTHENTICATION, "simple");
// Password
//ldapProps.put(Context.SECURITY_CREDENTIALS, "password");
// User
//ldapProps.put(Context.SECURITY_PRINCIPAL, "cn=Grizzly,ou=organisationunit," + baseDN);
// Security Protocol like e.g. SSL
ldapProps.put(Context.SECURITY_PROTOCOL, "SSL");
ldapProps.put("java.naming.ldap.attributes.binary", "userPassword");
LdapContext lctx = null;
try {
lctx = new InitialLdapContext(ldapProps, null);
}
catch (NamingException exp) {
System.err.println("Exception while creating Context:\n" + exp);
exp.printStackTrace();
}
try {
SearchControls ctls = new SearchControls();
ctls.setSearchScope(searchScope);
ctls.setReturningAttributes(returningAttributes);
NamingEnumeration answer = lctx.search(baseDN, filter, ctls);
System.out.println();
while(answer.hasMore()) {
printSearchResult(answer.next(), baseDN);
}
System.out.println();
}
catch (NamingException exp) {
System.err.println("Exception while reading from Context:\n" + exp);
exp.printStackTrace();
}
try {
lctx.close();
}
catch (NamingException exp) {
System.err.println("Exception while closing Context:\n" + exp);
exp.printStackTrace();
}
}
public static void printSearchResult(Object sres, String baseDN) {
String objectName;
try {
SearchResult sr = (SearchResult)sres;
if (sr.isRelative()) {
if (sr.getName().equals("")) {
objectName = baseDN;
}
else {
objectName = sr.getName() + "," + baseDN;
}
}
else {
objectName = sr.getName();
}
System.out.println("\n---- " + objectName + " ----");
System.out.println("Name : " + sr.getName());
System.out.println("ClassName : " + sr.getClassName());
System.out.println("Relative : " + sr.isRelative());
System.out.println("----------------------------------------");
Attributes attrs = sr.getAttributes();
NamingEnumeration ids = attrs.getIDs();
try {
while(ids.hasMore()) {
Object id = ids.nextElement();
// System.out.println("" + id + " : " + attrs.get(id.toString()).get());
System.out.println("\t" + id + " :");
NamingEnumeration values = attrs.get(id.toString()).getAll();
while (values.hasMore()) {
Object value = values.nextElement();
System.out.print("\t\t" + value);
System.out.println(" (" + getPlainText((String)id, value) + ")");
}
}
}
catch (NamingException exp) {
exp.printStackTrace();
}
System.out.println("----------------------------------------");
}
catch (ClassCastException exc) {
System.out.println("Unexpected Class: " + sres.getClass().getName());
System.out.println(sres.toString());
}
}
public static String getPlainText(String id, Object value) {
byte byteArray[];
String result = "";
if (id.equals("userPassword")) {
byteArray = (byte[])value;
if (byteArray.length > 0) {
result = "Binary(" + byteArray.length + ") = ";
for (int index = 0; index < byteArray.length; index++) {
result += (char)byteArray[index];
}
}
}
else {
result = (String)value;
}
return result;
}
}