import com.novell.ldap.*;
import javax.security.auth.callback.*;
import com.novell.security.sasl.*;
import java.io.IOException;
import java.util.*;
import java.security.*;
import java.util.Enumeration;
public class MD5Bind
{
public static void main( String[] args )
{
if (args.length != 4) {
System.err.println("Usage: java MD5Bind <host Name> "
+ "<port number> <login dn> <password>" );
System.err.println("Example: java MD5Bind Acme.com 389"
+ " \"cn=Admin,o=Acme\" secret\n");
System.exit(1);
}
int ldapVersion = LDAPConnection.LDAP_V3;
String ldapHost = args[0];
int ldapPort = Integer.parseInt(args[1]);
String loginDN = args[2];
final String password = args[3];
String[] mechanisms = {"DIGEST-MD5"};
LDAPConnection lc = new LDAPConnection();
try {
Security.addProvider(new
com.novell.sasl.client.SaslProvider());
}catch(Exception e) {
System.err.println("Error loading security provider (" +
e.getMessage() + ")");
}
try {
lc.connect( ldapHost, ldapPort );
lc.bind(loginDN,
"dn: " + loginDN,
mechanisms,
null,
new BindCallbackHandler(password));
System.out.println("Digest-MD5 Sasl bind was successful.");
lc.disconnect();
}catch( LDAPException e ) {
System.err.println("MD5Bind example failed");
System.err.println( "Error: " + e.toString() );
System.exit(1);
}
System.exit(0);
}
}
class BindCallbackHandler implements CallbackHandler{
private char[] m_password;
BindCallbackHandler(String password)
{
m_password = new char[password.length()];
password.getChars(0, password.length(), m_password, 0);
}
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException
{
for (int i=0; i<callbacks.length; i++)
{
if (callbacks[i] instanceof PasswordCallback)
{
((PasswordCallback)callbacks[i]).setPassword(m_password);
}
else if (callbacks[i] instanceof NameCallback)
{
((NameCallback)callbacks[i]).setName(
((NameCallback)callbacks[i]).getDefaultName());
}
else if(callbacks[i] instanceof RealmCallback)
{
((RealmCallback)callbacks[i]).setText(
((RealmCallback)callbacks[i]).getDefaultText());
}
else if (callbacks[i] instanceof RealmChoiceCallback)
{
((RealmChoiceCallback)callbacks[i]).setSelectedIndex(0);
}
}
}
}