JNDI utilise-t-il la liste de recherche DNS?
Question
Je voudrais utiliser JNDI pour rechercher les enregistrements Kerberos SRV dans un réseau local. J'essaie de deviner le domaine local de manière, espérons-le, intelligente. Si cela échoue, je voudrais rechercher l'entrée simple, par exemple _kerberos._tcp
sans aucun suffixe et comptez sur la liste de recherche du domaine DNS pour trouver la bonne entrée. Cela fonctionne sur Windows avec nslookup -type=srv _kerberos._tcp
et linux avec host -t srv _kerberos._tcp
. Le domaine example.test
est annexé et l'entrée est trouvée.
Voici un exemple de programme pour effectuer des recherches DNS via JNDI:
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
public class JndiDnsTest {
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: " + JndiDnsTest.class.getName() +
" name record-types...");
return;
}
String name = args[0];
String[] recordTypes = new String[args.length - 1];
System.arraycopy(args, 1, recordTypes, 0, args.length - 1);
Hashtable<String, String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
try {
DirContext ctx = new InitialDirContext(env);
Attributes dnsQueryResult = ctx.getAttributes(name, recordTypes);
if (dnsQueryResult == null) {
System.out.println("Not found: '" + name + "'");
}
for (String rrType: recordTypes) {
Attribute rr = dnsQueryResult.get(rrType);
if (rr != null) {
for (NamingEnumeration<?> vals = rr.getAll(); vals.hasMoreElements();) {
System.out.print(rrType + "\t");
System.out.println(vals.nextElement());
}
}
}
} catch (NamingException e) {
e.printStackTrace(System.err);
}
System.out.println("\nThe DNS search list:");
for (Object entry: sun.net.dns.ResolverConfiguration.open().searchlist()) {
System.out.println(entry);
}
System.out.println("\nsun.net.spi.nameservice.domain = " +
System.getProperty("sun.net.spi.nameservice.domain"));
}
}
Il me semble que JNDI ne fait qu'une seule recherche pour le nom direct. Aucune entrée n'est trouvée là où les commandes ci-dessus réussissent. Il semble qu'il n'utilise pas la liste de recherche DNS. Cependant, son contenu est imprimé correctement en bas.
D'un autre côté Documentation des propriétés de réseautage dit ça
Si la propriété Sun.net.spi.NameService.Domain n'est pas définie, le fournisseur utilisera n'importe quelle liste de recherche de domaine ou de domaine configurée dans la configuration DNS de la plate-forme.
(La propriété n'est pas définie.) La version Java est Sun Java 1.6.0_20.
JNDI utilise-t-il la liste de recherche DNS ou non?
La solution
C'est un bug connu - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6427214