From: Felix Dörre Date: Sun, 24 Aug 2014 05:10:32 +0000 (+0200) Subject: ADD: the daemon for pinging domains. (ping via email still missing) X-Git-Url: https://code.wpia.club/?p=gigi.git;a=commitdiff_plain;h=50c8c66dc1d3245e8eaedf17e273f8c0522f1435 ADD: the daemon for pinging domains. (ping via email still missing) --- diff --git a/doc/tableStructure.sql b/doc/tableStructure.sql index 2e4e5c04..6b2806da 100644 --- a/doc/tableStructure.sql +++ b/doc/tableStructure.sql @@ -74,19 +74,19 @@ CREATE TABLE `emailPinglog` ( 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; diff --git a/src/org/cacert/gigi/ping/DNSPinger.java b/src/org/cacert/gigi/ping/DNSPinger.java index ece3d1b9..3dc9ac60 100644 --- a/src/org/cacert/gigi/ping/DNSPinger.java +++ b/src/org/cacert/gigi/ping/DNSPinger.java @@ -9,8 +9,10 @@ import java.util.LinkedList; 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 }); @@ -27,7 +29,7 @@ public class DNSPinger extends DomainPinger { 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); @@ -40,7 +42,7 @@ public class DNSPinger extends DomainPinger { } found = true; token = line.substring(1, line.length() - 1); - if (token.equals(expToken)) { + if (token.equals(tokenParts[1])) { continue nameservers; } } @@ -55,15 +57,13 @@ public class DNSPinger extends DomainPinger { } 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 } } diff --git a/src/org/cacert/gigi/ping/DomainPinger.java b/src/org/cacert/gigi/ping/DomainPinger.java index c9c1584d..3044f34d 100644 --- a/src/org/cacert/gigi/ping/DomainPinger.java +++ b/src/org/cacert/gigi/ping/DomainPinger.java @@ -2,5 +2,9 @@ package org.cacert.gigi.ping; 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); } diff --git a/src/org/cacert/gigi/ping/HTTPFetch.java b/src/org/cacert/gigi/ping/HTTPFetch.java index de4990fc..3bb2d095 100644 --- a/src/org/cacert/gigi/ping/HTTPFetch.java +++ b/src/org/cacert/gigi/ping/HTTPFetch.java @@ -3,27 +3,33 @@ package org.cacert.gigi.ping; 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."; } } } diff --git a/src/org/cacert/gigi/ping/PingerDaemon.java b/src/org/cacert/gigi/ping/PingerDaemon.java new file mode 100644 index 00000000..595b6a6f --- /dev/null +++ b/src/org/cacert/gigi/ping/PingerDaemon.java @@ -0,0 +1,58 @@ +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 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(); + + } +} diff --git a/src/org/cacert/gigi/ping/SSLPinger.java b/src/org/cacert/gigi/ping/SSLPinger.java index 32434079..ccb05b84 100644 --- a/src/org/cacert/gigi/ping/SSLPinger.java +++ b/src/org/cacert/gigi/ping/SSLPinger.java @@ -27,7 +27,7 @@ public class SSLPinger extends DomainPinger { }; @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); @@ -49,9 +49,9 @@ public class SSLPinger extends DomainPinger { } } - test(sch, domain); + return test(sch, domain); } catch (IOException e) { - e.printStackTrace(); + return "Connecton failed"; } } @@ -130,7 +130,7 @@ public class SSLPinger extends DomainPinger { } } - private void test(SocketChannel sch, String domain) { + private String test(SocketChannel sch, String domain) { try { SSLContext sc = SSLContext.getDefault(); SSLEngine se = sc.createSSLEngine(); @@ -185,12 +185,16 @@ public class SSLPinger extends DomainPinger { 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"; } } }