DROP TABLE IF EXISTS `pingconfig`;
CREATE TABLE `pingconfig` (
+ `id` int(13) NOT NULL AUTO_INCREMENT,
`domainid` int(11) NOT NULL,
`type` enum('email', 'ssl', 'http', 'dns') NOT NULL,
- `info` varchar(255) NOT NULL
+ `info` varchar(255) NOT NULL,
+ PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `domainPinglog`;
CREATE TABLE `domainPinglog` (
- `when` datetime NOT NULL,
- `uid` int(11) NOT NULL,
- `domainid` int(11) NOT NULL,
- `type` enum('email', 'ssl', 'http', 'dns') NOT NULL,
- `status` enum('open', 'success', 'failed') NOT NULL,
+ `when` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `configId` int(13) NOT NULL,
+ `state` enum('open', 'success', 'failed') NOT NULL,
`result` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
public class DNSPinger extends DomainPinger {
@Override
- public void ping(String domain, String configuration, String expToken) {
+ public String ping(String domain, String expToken) {
try {
+ String[] tokenParts = expToken.split(":", 2);
+
Process p = Runtime.getRuntime().exec(new String[] {
"dig", "+short", "NS", domain
});
nameservers:
for (String NS : nameservers) {
String[] call = new String[] {
- "dig", "+short", "TXT", "cacert." + domain, NS
+ "dig", "@" + NS, "+short", "TXT", "cacert-" + tokenParts[0] + "." + domain
};
System.out.println(Arrays.toString(call));
p = Runtime.getRuntime().exec(call);
}
found = true;
token = line.substring(1, line.length() - 1);
- if (token.equals(expToken)) {
+ if (token.equals(tokenParts[1])) {
continue nameservers;
}
}
}
if ( !failed) {
- // Success
- return;
+ return PING_SUCCEDED;
}
- System.out.println(result.toString());
+ return result.toString();
} catch (IOException e) {
e.printStackTrace();
- // FAIL
+ return "Connection closed";
}
- // FAIL
}
}
public abstract class DomainPinger {
- public abstract void ping(String domain, String configuration, String token);
+ public static final String PING_STILL_PENDING = null;
+
+ public static final String PING_SUCCEDED = "";
+
+ public abstract String ping(String domain, String configuration);
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
import java.net.URL;
public class HTTPFetch extends DomainPinger {
@Override
- public void ping(String domain, String configuration, String expToken) {
+ public String ping(String domain, String expToken) {
try {
- URL u = new URL("http://" + domain + "/cacert_rai.txt");
- BufferedReader br = new BufferedReader(new InputStreamReader(u.openStream(), "UTF-8"));
+ String[] tokenParts = expToken.split(":", 2);
+ URL u = new URL("http://" + domain + "/cacert_" + tokenParts[0] + ".txt");
+ System.out.println(u.toString());
+ HttpURLConnection huc = (HttpURLConnection) u.openConnection();
+ if (huc.getResponseCode() != 200) {
+ return "Invalid status code.";
+ }
+ BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream(), "UTF-8"));
String line = br.readLine();
if (line == null) {
- // empty
- return;
+ return "No response from your server.";
}
- if (line.equals(expToken)) {
- // found
+ if (line.trim().equals(tokenParts[1])) {
+ return PING_SUCCEDED;
}
- // differ
+ return "Challange tokens differed.";
} catch (IOException e) {
e.printStackTrace();
- // error
+ return "Connection closed.";
}
}
}
--- /dev/null
+package org.cacert.gigi.ping;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Properties;
+
+import org.cacert.gigi.database.DatabaseConnection;
+
+public class PingerDaemon implements Runnable {
+
+ HashMap<String, DomainPinger> pingers = new HashMap<>();
+
+ public PingerDaemon() {
+ // pingers.put("email",);
+ pingers.put("ssl", new SSLPinger());
+ pingers.put("http", new HTTPFetch());
+ pingers.put("dns", new DNSPinger());
+
+ }
+
+ @Override
+ public void run() {
+ try {
+ PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT pingconfig.*, domains.domain FROM pingconfig LEFT JOIN domainPinglog ON domainPinglog.configId=pingconfig.id INNER JOIN domains ON domains.id=pingconfig.domainid WHERE domainPinglog.configId IS NULL ");
+ PreparedStatement result = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?");
+
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ String type = rs.getString("type");
+ String config = rs.getString("info");
+ System.out.println(type);
+ System.out.println(config);
+ DomainPinger dp = pingers.get(type);
+ if (dp != null) {
+ result.setInt(1, rs.getInt("id"));
+ String resp = dp.ping(rs.getString("domain"), config);
+ result.setString(2, resp == DomainPinger.PING_STILL_PENDING ? "open" : resp == DomainPinger.PING_SUCCEDED ? "success" : "failed");
+ result.setString(3, resp);
+ result.execute();
+ }
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+ Properties conf = new Properties();
+ conf.load(new FileReader("config/gigi.properties"));
+ DatabaseConnection.init(conf);
+ new PingerDaemon().run();
+
+ }
+}
};
@Override
- public void ping(String domain, String configuration, String expToken) {
+ public String ping(String domain, String configuration) {
try {
SocketChannel sch = SocketChannel.open();
String[] parts = configuration.split(":", 2);
}
}
- test(sch, domain);
+ return test(sch, domain);
} catch (IOException e) {
- e.printStackTrace();
+ return "Connecton failed";
}
}
}
}
- private void test(SocketChannel sch, String domain) {
+ private String test(SocketChannel sch, String domain) {
try {
SSLContext sc = SSLContext.getDefault();
SSLEngine se = sc.createSSLEngine();
for (X509Certificate x509Certificate : peerCertificateChain) {
System.out.println(x509Certificate.getSubjectDN().getName());
}
+ return PING_SUCCEDED;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
+ return "Security failed";
} catch (SSLException e) {
e.printStackTrace();
+ return "Security failed";
} catch (IOException e) {
e.printStackTrace();
+ return "Connection closed";
}
}
}