Hello all,
I am having a very strange problem with a JNDII
application I'm writing
which is connecting to an OpenLDAP 2.0.11
server. I have a lot of code
which reads/writes other attributes, but
when I try to read a
userPassword attribute, I get a ClassCastException
(I'm casting from
Object to String) and when I run an Object.getClass() on
the returned
object, it gives me garbage. Any suggestions? Is
this a JNDI bug,
OpenLDAP bug, or am I just doing something wrong? I
have attached some
code with comments below (including tests I ran).
Any suggestions would
be highly appreciated. TIA
//////// beginning of code
import javax.naming.Context;
import
javax.naming.directory.InitialDirContext;
import
javax.naming.directory.DirContext;
import
javax.naming.directory.Attributes;
import
javax.naming.NamingException;
import java.util.*;
public class test extends java.lang.Object
{
/** Creates new test
*/
public test()
{
DirContext
serverContext;
/*
* properly initialize
all environment settings
*
*/
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL,
"ldap://*****");
env.put(Context.SECURITY_PRINCIPAL,
"******************************");
env.put(Context.SECURITY_AUTHENTICATION,
"simple");
env.put(Context.SECURITY_CREDENTIALS, "*****");
/*
* establish connection
with ldap server
*
*/
try
{
serverContext = new
InitialDirContext(env);
} catch
(NamingException ne)
{
System.err.println(ne);
return;
}
/*
* get an arbitrary
attribute, in this case cn
*
*/
Attributes attributes = null;
try
{
attributes
=
serverContext.getAttributes("*****************************");
System.err.println("cn = "
+
(String)attributes.get("cn").get());
} catch (Exception e)
{
System.err.println(e);
}
/*
* now let's try
userPassword which is
encrypted
* specified in
schema file as
*
* attributetype (
2.5.4.35 NAME
'userPassword'
* EQUALITY
octetStringMatch
* SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128}
)
*
*/
try
{
System.err.println("userPassword = "
+
(String)attributes.get("userPassword").get());
} catch (Exception e)
{
System.err.println(e);
}
/*
* ok, got a
java.lang.ClassCastException. it should
be
reasonable
* to cast
it to a string, since it is one. let's get
the
object
* type
returned
*
*/
try
{
System.err.println("userPassword class = "
+
attributes.get("userPassword").get().getClass());
} catch (Exception e)
{
System.err.println(e);
}
/*
* strange, object type
returned = "[B" that's very
strange.
* sanity
check: let's see what object type is returned from a
normal type
(like cn)
*
*/
try
{
attributes
=
serverContext.getAttributes("*****************************");
System.err.println("cn object = "
+
attributes.get("cn").get().getClass());
} catch (Exception e)
{
System.err.println(e);
}
/*
* hmm,
java.lang.String, just like I
thought
*
*/
/*
* here is my
output:
*
* C:\TEST>java
test
* cn = Administrative
User
*
java.lang.ClassCastException:
[B
* userPassword class =
class [B
* cn object =
class java.lang.String
*/
}