]> WPIA git - gigi.git/blob - src/org/cacert/gigi/ping/DNSPinger.java
35e17148908988dcd342a41c3cfb6b6675ad3128
[gigi.git] / src / org / cacert / gigi / ping / DNSPinger.java
1 package org.cacert.gigi.ping;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.util.LinkedList;
7
8 import org.cacert.gigi.Domain;
9 import org.cacert.gigi.User;
10
11 public class DNSPinger extends DomainPinger {
12
13     @Override
14     public String ping(Domain domain, String expToken, User u) {
15         try {
16             String[] tokenParts = expToken.split(":", 2);
17
18             Process p = Runtime.getRuntime().exec(new String[] {
19                     "dig", "+short", "NS", domain.getSuffix()
20             });
21             BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
22             String line;
23             LinkedList<String> nameservers = new LinkedList<String>();
24             while ((line = br.readLine()) != null) {
25                 nameservers.add(line);
26             }
27             p.destroy();
28             StringBuffer result = new StringBuffer();
29             result.append("failed: ");
30             boolean failed = nameservers.isEmpty();
31             nameservers:
32             for (String NS : nameservers) {
33                 String[] call = new String[] {
34                         "dig", "@" + NS, "+short", "TXT", "cacert-" + tokenParts[0] + "." + domain
35                 };
36                 p = Runtime.getRuntime().exec(call);
37                 br = new BufferedReader(new InputStreamReader(p.getInputStream()));
38                 String token = null;
39                 boolean found = false;
40                 while ((line = br.readLine()) != null) {
41                     if (line.isEmpty()) {
42                         continue;
43                     }
44                     found = true;
45                     token = line.substring(1, line.length() - 1);
46                     if (token.equals(tokenParts[1])) {
47                         continue nameservers;
48                     }
49                 }
50                 p.destroy();
51                 result.append(NS);
52                 if (found) {
53                     result.append(" DIFFER;");
54                 } else {
55                     result.append(" EMPTY;");
56                 }
57                 failed = true;
58
59             }
60             if ( !failed) {
61                 return PING_SUCCEDED;
62             }
63             return result.toString();
64         } catch (IOException e) {
65             e.printStackTrace();
66             return "Connection closed";
67         }
68     }
69
70 }