Hi Rob,
Most of the code changes looks fine except new code will throw NPE if
"ServiceLocator.mapDnToDomainName(ldapUrl.getDN())" is not able to map.
you have to check for null in LdapCtxFactory.java class as follows.
if(ServiceLocator.mapDnToDomainName(ldapUrl.getDN())!=null){
((LdapCtx) ctx).setDomainName(
ServiceLocator.mapDnToDomainName(ldapUrl.getDN()));
}
##############################
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Hashtable.put(Hashtable.java:474)
at
java.naming/com.sun.jndi.ldap.LdapCtx.setDomainName(LdapCtx.java:2346)
at
java.naming/com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:210)
################################
Thanks,
Vyom
On Friday 03 February 2017 03:44 AM, Rob McKenna wrote:
Thanks Daniel,
New webrev at http://cr.openjdk.java.net/~robm/8160768/webrev.04/
In addition to your comments below I've added the package access check
we discussed.
Note: when a provider returns multiple results we create an LdapCtx
based on the first of those. I think it might be useful to extend
LdapClient to accept a list of addresses which can be iterated over in the
event of a connection failure but I'll tackle that separately.
-Rob
On 02/02/17 11:01, Daniel Fuchs wrote:
Hi Rob,
This is not a code I know well - but here are a couple
of comments:
LdapCtxFactory.java:
168 NamingException ne = new NamingException();
232 NamingException ne = new NamingException();
Creating an exception is somewhat costly as it records the
backtrace in the Throwable constructor. I don't know if
it's an issue there but I thought I'd mention it. It might
be better to create the exception only if you're actually
going to throw it.
186 } catch (Exception e) {
187 ne.setRootCause(e);
188 }
This will catch the NamingException thrown at line 173
and set it at the cause of another NamingException that
has no message. Maybe it would be better to have two
catch clauses:
186 } catch (NamingException e) {
187 throw e;
186 } catch (Exception e) {
... transform it to NamingException ...
In getDnsUrls:
198 if (env.containsKey(LdapCtx.DNS_PROVIDER)
199 && env.get(LdapCtx.DNS_PROVIDER) != null
200 && !env.get(LdapCtx.DNS_PROVIDER).equals(""))
I'd suggest to simplify this and make a single lookup:
String providerClass = env.get(LdapCtx.DNS_PROVIDER);
if (providerClass != null && !providerClass.isEmpty()) {
...
Class<?> cls = Class.forName(providerClass, true, cl);
best regards,
-- daniel
On 01/02/17 20:05, Rob McKenna wrote:
New webrev with updated test here:
http://cr.openjdk.java.net/~robm/8160768/webrev.03/
-Rob
On 26/01/17 04:03, Rob McKenna wrote:
Ack, apologies, thats what I get for rushing. (which I suppose I'm doing
again) That code was actually supposed to be in the getDnsUrls method.
Updated in place:
http://cr.openjdk.java.net/~robm/8160768/webrev.02/
I'll add a couple of tests for the SecurityManager along with some input
checking tests too.
-Rob
On 25/01/17 05:50, Daniel Fuchs wrote:
Hi Rob,
I believe you should move the security check to before
the class is actually loaded, before the call to
171 List<String> urls = getDnsUrls(url, env);
best regards,
-- daniel
On 25/01/17 17:44, Rob McKenna wrote:
I neglected to include a security check so I've cribbed the one from
OBJECT_FACTORIES (NamingManager.setObjectFactoryBuilder()) - see:
http://cr.openjdk.java.net/~robm/8160768/webrev.02/
Note, this wraps the SecurityException in a NamingException. Presumably
its better to throw something than simply leave the default value in
place, but feedback appreciated!
-Rob
On 25/01/17 04:31, Rob McKenna wrote:
Hi folks,
I'm looking for feedback on this suggested fix for the following bug:
https://bugs.openjdk.java.net/browse/JDK-816076
http://cr.openjdk.java.net/~robm/8160768/webrev.01/
This is something that has come up a few times. Basically in certain
environments (e.g. MS Active Directory) there is a dependence on
DNS records to provide a pointer to the actual ldap server to be used
for a given LdapCtx.PROVIDER_URL where the url itself simply points to the
domain name.
This fix add a new Ldap context property which allows a user to specify a
class (implementing BiFunction) which can perform any necessary extra steps
to derive the ldap servers hostname/port from the PROVIDER_URL.
-Rob