1 package org.cacert.gigi.util;
3 import java.util.Arrays;
4 import java.util.Hashtable;
6 import javax.naming.Context;
7 import javax.naming.NamingException;
8 import javax.naming.directory.Attribute;
9 import javax.naming.directory.Attributes;
10 import javax.naming.directory.InitialDirContext;
12 import org.cacert.gigi.util.CAA.CAARecord;
14 public class DNSUtil {
16 private static InitialDirContext context;
18 Hashtable<String, String> env = new Hashtable<String, String>();
19 env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
21 context = new InitialDirContext(env);
22 } catch (NamingException e) {
28 public static String[] getNSNames(String name) throws NamingException {
29 Attributes dnsLookup = context.getAttributes(name, new String[] {
32 return extractTextEntries(dnsLookup.get("NS"));
35 public static String[] getTXTEntries(String name, String server) throws NamingException {
36 Hashtable<String, String> env = new Hashtable<String, String>();
37 env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
38 env.put(Context.AUTHORITATIVE, "true");
39 env.put(Context.PROVIDER_URL, "dns://" + server);
40 InitialDirContext context = new InitialDirContext(env);
43 Attributes dnsLookup = context.getAttributes(name, new String[] {
46 return extractTextEntries(dnsLookup.get("TXT"));
53 private static String[] extractTextEntries(Attribute nsRecords) throws NamingException {
54 if (nsRecords == null) {
55 return new String[] {};
57 String[] result = new String[nsRecords.size()];
58 for (int i = 0; i < result.length; i++) {
59 result[i] = (String) nsRecords.get(i);
64 public static String[] getMXEntries(String domain) throws NamingException {
65 Attributes dnsLookup = context.getAttributes(domain, new String[] {
68 return extractTextEntries(dnsLookup.get("MX"));
71 public static CAARecord[] getCAAEntries(String domain) throws NamingException {
72 Hashtable<String, String> env = new Hashtable<String, String>();
73 env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
74 InitialDirContext context = new InitialDirContext(env);
76 Attributes dnsLookup = context.getAttributes(domain, new String[] {
79 Attribute nsRecords = dnsLookup.get("257");
80 if (nsRecords == null) {
81 return new CAARecord[] {};
83 CAA.CAARecord[] result = new CAA.CAARecord[nsRecords.size()];
84 for (int i = 0; i < result.length; i++) {
85 byte[] rec = (byte[]) nsRecords.get(i);
87 result[i] = new CAA.CAARecord(rec);
92 public static void main(String[] args) throws NamingException {
93 if (args[0].equals("MX")) {
94 System.out.println(Arrays.toString(getMXEntries(args[1])));
95 } else if (args[0].equals("NS")) {
96 System.out.println(Arrays.toString(getNSNames(args[1])));
97 } else if (args[0].equals("TXT")) {
98 System.out.println(Arrays.toString(getTXTEntries(args[1], args[2])));
99 } else if (args[0].equals("CAA")) {
100 System.out.println(Arrays.toString(getCAAEntries(args[1])));