fix: CAA records on non-existing domains
[gigi.git] / src / club / wpia / gigi / util / DNSUtil.java
1 package club.wpia.gigi.util;
2
3 import java.util.Arrays;
4 import java.util.Hashtable;
5
6 import javax.naming.Context;
7 import javax.naming.NameNotFoundException;
8 import javax.naming.NamingException;
9 import javax.naming.directory.Attribute;
10 import javax.naming.directory.Attributes;
11 import javax.naming.directory.InitialDirContext;
12
13 import club.wpia.gigi.util.CAA.CAARecord;
14
15 public class DNSUtil {
16
17     private static InitialDirContext context;
18     static {
19         Hashtable<String, String> env = new Hashtable<String, String>();
20         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
21         try {
22             context = new InitialDirContext(env);
23         } catch (NamingException e) {
24             e.printStackTrace();
25         }
26
27     }
28
29     public static String[] getNSNames(String name) throws NamingException {
30         Attributes dnsLookup = context.getAttributes(name, new String[] {
31                 "NS"
32         });
33         return extractTextEntries(dnsLookup.get("NS"));
34     }
35
36     public static String[] getTXTEntries(String name, String server) throws NamingException {
37         Hashtable<String, String> env = new Hashtable<String, String>();
38         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
39         env.put(Context.AUTHORITATIVE, "true");
40         env.put(Context.PROVIDER_URL, "dns://" + server);
41         InitialDirContext context = new InitialDirContext(env);
42         try {
43
44             Attributes dnsLookup = context.getAttributes(name, new String[] {
45                     "TXT"
46             });
47             return extractTextEntries(dnsLookup.get("TXT"));
48         } finally {
49             context.close();
50         }
51
52     }
53
54     private static String[] extractTextEntries(Attribute nsRecords) throws NamingException {
55         if (nsRecords == null) {
56             return new String[] {};
57         }
58         String[] result = new String[nsRecords.size()];
59         for (int i = 0; i < result.length; i++) {
60             result[i] = (String) nsRecords.get(i);
61         }
62         return result;
63     }
64
65     public static String[] getMXEntries(String domain) throws NamingException {
66         Attributes dnsLookup = context.getAttributes(domain, new String[] {
67                 "MX"
68         });
69         return extractTextEntries(dnsLookup.get("MX"));
70     }
71
72     public static CAARecord[] getCAAEntries(String domain) throws NamingException {
73         Hashtable<String, String> env = new Hashtable<String, String>();
74         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
75         InitialDirContext context = new InitialDirContext(env);
76         Attributes dnsLookup;
77         try {
78             dnsLookup = context.getAttributes(domain, new String[] {
79                     "257"
80             });
81         } catch (NameNotFoundException e) {
82             // We treat non-existing names as names without CAA-records
83             return new CAARecord[0];
84         }
85         Attribute nsRecords = dnsLookup.get("257");
86         if (nsRecords == null) {
87             return new CAARecord[] {};
88         }
89         CAA.CAARecord[] result = new CAA.CAARecord[nsRecords.size()];
90         for (int i = 0; i < result.length; i++) {
91             byte[] rec = (byte[]) nsRecords.get(i);
92
93             result[i] = new CAA.CAARecord(rec);
94         }
95         return result;
96     }
97
98     public static void main(String[] args) throws NamingException {
99         if (args[0].equals("MX")) {
100             System.out.println(Arrays.toString(getMXEntries(args[1])));
101         } else if (args[0].equals("NS")) {
102             System.out.println(Arrays.toString(getNSNames(args[1])));
103         } else if (args[0].equals("TXT")) {
104             System.out.println(Arrays.toString(getTXTEntries(args[1], args[2])));
105         } else if (args[0].equals("CAA")) {
106             System.out.println(Arrays.toString(getCAAEntries(args[1])));
107         }
108     }
109
110 }