]> WPIA git - gigi.git/commitdiff
ADD: simple pinger daemon.
authorFelix Dörre <felix@dogcraft.de>
Sun, 24 Aug 2014 07:33:11 +0000 (09:33 +0200)
committerFelix Dörre <felix@dogcraft.de>
Sun, 24 Aug 2014 08:23:11 +0000 (10:23 +0200)
15 files changed:
doc/tableStructure.sql
src/org/cacert/gigi/Domain.java
src/org/cacert/gigi/EmailAddress.java
src/org/cacert/gigi/Gigi.java
src/org/cacert/gigi/User.java
src/org/cacert/gigi/email/MailProbe.java [new file with mode: 0644]
src/org/cacert/gigi/email/Sendmail.java
src/org/cacert/gigi/pages/Verify.java
src/org/cacert/gigi/pages/account/DomainAddForm.java
src/org/cacert/gigi/ping/DNSPinger.java
src/org/cacert/gigi/ping/DomainPinger.java
src/org/cacert/gigi/ping/EmailPinger.java [new file with mode: 0644]
src/org/cacert/gigi/ping/HTTPFetch.java
src/org/cacert/gigi/ping/PingerDaemon.java
src/org/cacert/gigi/ping/SSLPinger.java

index 6b2806da4cf1f46159ccf67a0cb6bcb2dfca9e16..2d5fa6c38421d2f304f8d9dc8ef524ae0ed4b88c 100644 (file)
@@ -87,7 +87,8 @@ CREATE TABLE `domainPinglog` (
   `when` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `configId` int(13) NOT NULL,
   `state` 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
+  `challenge` varchar(16) NOT NULL,
+  `result` varchar(255)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 DROP TABLE IF EXISTS `baddomains`;
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 DROP TABLE IF EXISTS `baddomains`;
index 89a3d2b6a021c6cd2e38865184aa5950ee3d8112..3eb628aacb0b8f1d47bd07cc56faa05a9289f219 100644 (file)
@@ -115,4 +115,15 @@ public class Domain {
             throw new GigiApiException(e);
         }
     }
             throw new GigiApiException(e);
         }
     }
+
+    public void verify(String hash) throws GigiApiException {
+        try {
+            PreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE domainPinglog SET state='success' WHERE challenge=? AND configId IN (SELECT id FROM pingconfig WHERE domainId=?)");
+            ps.setString(1, hash);
+            ps.setInt(2, id);
+            ps.executeUpdate();
+        } catch (SQLException e) {
+            throw new GigiApiException(e);
+        }
+    }
 }
 }
index 480da6f49b70b2f8f625afcb8773e31ddf9ba9a4..5259fbcdaf7aee47de93cb8627a139c29371e994 100644 (file)
@@ -7,9 +7,9 @@ import java.sql.SQLException;
 
 import org.cacert.gigi.database.DatabaseConnection;
 import org.cacert.gigi.email.EmailProvider;
 
 import org.cacert.gigi.database.DatabaseConnection;
 import org.cacert.gigi.email.EmailProvider;
+import org.cacert.gigi.email.MailProbe;
 import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.util.RandomToken;
 import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.util.RandomToken;
-import org.cacert.gigi.util.ServerConstants;
 
 public class EmailAddress {
 
 
 public class EmailAddress {
 
@@ -56,19 +56,7 @@ public class EmailAddress {
             ps.setString(3, address);
             ps.execute();
             id = DatabaseConnection.lastInsertId(ps);
             ps.setString(3, address);
             ps.execute();
             id = DatabaseConnection.lastInsertId(ps);
-            StringBuffer body = new StringBuffer();
-            body.append(l.getTranslation("Thanks for signing up with CAcert.org, below is the link you need to open to verify your account. Once your account is verified you will be able to start issuing certificates till your hearts' content!"));
-            body.append("\n\nhttps://");
-            body.append(ServerConstants.getWwwHostNamePort());
-            body.append("/verify?type=email&id=");
-            body.append(id);
-            body.append("&hash=");
-            body.append(hash);
-            body.append("\n\n");
-            body.append(l.getTranslation("Best regards"));
-            body.append("\n");
-            body.append(l.getTranslation("CAcert.org Support!"));
-            EmailProvider.getInstance().sendmail(address, "[CAcert.org] " + l.getTranslation("Mail Probe"), body.toString(), "support@cacert.org", null, null, null, null, false);
+            MailProbe.sendMailProbe(l, "email", id, hash, address);
         } catch (SQLException e) {
             e.printStackTrace();
         } catch (IOException e) {
         } catch (SQLException e) {
             e.printStackTrace();
         } catch (IOException e) {
index 3d9022815b9bc10e431d437476cba611397e9442..1e7ee0f99c72a8be115da691be0348f008e8685a 100644 (file)
@@ -37,6 +37,7 @@ import org.cacert.gigi.pages.error.PageNotFound;
 import org.cacert.gigi.pages.main.RegisterPage;
 import org.cacert.gigi.pages.wot.AssurePage;
 import org.cacert.gigi.pages.wot.MyPoints;
 import org.cacert.gigi.pages.main.RegisterPage;
 import org.cacert.gigi.pages.wot.AssurePage;
 import org.cacert.gigi.pages.wot.MyPoints;
+import org.cacert.gigi.ping.PingerDaemon;
 import org.cacert.gigi.util.ServerConstants;
 
 public class Gigi extends HttpServlet {
 import org.cacert.gigi.util.ServerConstants;
 
 public class Gigi extends HttpServlet {
@@ -61,12 +62,15 @@ public class Gigi extends HttpServlet {
 
     private static Gigi instance;
 
 
     private static Gigi instance;
 
+    private PingerDaemon pinger = new PingerDaemon();
+
     public Gigi(Properties conf) {
         if (instance != null) {
             new IllegalStateException("Multiple Gigi instances!");
         }
         instance = this;
         DatabaseConnection.init(conf);
     public Gigi(Properties conf) {
         if (instance != null) {
             new IllegalStateException("Multiple Gigi instances!");
         }
         instance = this;
         DatabaseConnection.init(conf);
+        pinger.start();
     }
 
     @Override
     }
 
     @Override
index e251a987a036c98008a79ccf0088a09e8e76ea95..ca1c8ff8d6dddd721a5b1c7153433a6d8e2709ef 100644 (file)
@@ -8,6 +8,7 @@ import java.util.Calendar;
 
 import org.cacert.gigi.database.DatabaseConnection;
 import org.cacert.gigi.util.Notary;
 
 import org.cacert.gigi.database.DatabaseConnection;
 import org.cacert.gigi.util.Notary;
+import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.util.PasswordHash;
 import org.cacert.gigi.util.PasswordStrengthChecker;
 
 import org.cacert.gigi.util.PasswordHash;
 import org.cacert.gigi.util.PasswordStrengthChecker;
 
@@ -445,4 +446,8 @@ public class User {
             update.executeUpdate();
         }
     }
             update.executeUpdate();
         }
     }
+
+    public Language getPrefferedLanguage() {
+        return Language.getInstance("de");
+    }
 }
 }
diff --git a/src/org/cacert/gigi/email/MailProbe.java b/src/org/cacert/gigi/email/MailProbe.java
new file mode 100644 (file)
index 0000000..7bca705
--- /dev/null
@@ -0,0 +1,28 @@
+package org.cacert.gigi.email;
+
+import java.io.IOException;
+
+import org.cacert.gigi.localisation.Language;
+import org.cacert.gigi.util.ServerConstants;
+
+public class MailProbe {
+
+    public static void sendMailProbe(Language l, String type, int id, String hash, String address) throws IOException {
+        StringBuffer body = new StringBuffer();
+        body.append(l.getTranslation("Thanks for signing up with CAcert.org, below is the link you need to open to verify your account. Once your account is verified you will be able to start issuing certificates till your hearts' content!"));
+        body.append("\n\nhttps://");
+        body.append(ServerConstants.getWwwHostNamePort());
+        body.append("/verify?type=");
+        body.append(type);
+        body.append("&id=");
+        body.append(id);
+        body.append("&hash=");
+        body.append(hash);
+        body.append("\n\n");
+        body.append(l.getTranslation("Best regards"));
+        body.append("\n");
+        body.append(l.getTranslation("CAcert.org Support!"));
+        EmailProvider.getInstance().sendmail(address, "[CAcert.org] " + l.getTranslation("Mail Probe"), body.toString(), "support@cacert.org", null, null, null, null, false);
+    }
+
+}
index 812de6bd5b4cecd92758f9f19356b31ac478e3cd..601130500e96719c1fe913db1b61f7240a5dd94d 100644 (file)
@@ -95,6 +95,7 @@ public class Sendmail extends EmailProvider {
     private static void readResponse(BufferedReader in) throws IOException {
         String line;
         while ((line = in.readLine()) != null && line.matches("\\d+-")) {
     private static void readResponse(BufferedReader in) throws IOException {
         String line;
         while ((line = in.readLine()) != null && line.matches("\\d+-")) {
+            System.out.println(line);
         }
 
     }
         }
 
     }
index fff626282e029d5a7790daeb18e528404bf7aa5f..f64c21458ef991241c0af2fa06682d0c4f99da6c 100644 (file)
@@ -2,9 +2,11 @@ package org.cacert.gigi.pages;
 
 import java.io.IOException;
 import java.io.PrintWriter;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.cacert.gigi.Domain;
 import org.cacert.gigi.EmailAddress;
 import org.cacert.gigi.GigiApiException;
 
 import org.cacert.gigi.EmailAddress;
 import org.cacert.gigi.GigiApiException;
 
@@ -37,6 +39,16 @@ public class Verify extends Page {
             } catch (GigiApiException e) {
                 e.format(out, getLanguage(req));
             }
             } catch (GigiApiException e) {
                 e.format(out, getLanguage(req));
             }
+        } else if ("domain".equals(type)) {
+            try {
+                Domain ea = Domain.getById(Integer.parseInt(id));
+                ea.verify(hash);
+                out.println("Domain verification completed.");
+            } catch (IllegalArgumentException e) {
+                out.println(translate(req, "The domain address is invalid."));
+            } catch (GigiApiException e) {
+                e.format(out, getLanguage(req));
+            }
         }
     }
 
         }
     }
 
index edf729e57e54923dbf4b6f299a0c8c6b3f511b6b..e37dbaaa8dad39e234f8eb6e0604a46459e506e3 100644 (file)
@@ -47,7 +47,7 @@ public class DomainAddForm extends Form {
             d.insert();
             if (req.getParameter("emailType") != null) {
                 String mail = AUTHORATIVE_EMAILS[Integer.parseInt(req.getParameter("email"))];
             d.insert();
             if (req.getParameter("emailType") != null) {
                 String mail = AUTHORATIVE_EMAILS[Integer.parseInt(req.getParameter("email"))];
-                d.addPing("email", mail + "@" + d.getSuffix());
+                d.addPing("email", mail);
             }
             if (req.getParameter("DNSType") != null) {
                 d.addPing("dns", tokenName + ":" + tokenValue);
             }
             if (req.getParameter("DNSType") != null) {
                 d.addPing("dns", tokenName + ":" + tokenValue);
@@ -56,7 +56,6 @@ public class DomainAddForm extends Form {
                 d.addPing("http", tokenName + ":" + tokenValue);
             }
             if (req.getParameter("SSLType") != null) {
                 d.addPing("http", tokenName + ":" + tokenValue);
             }
             if (req.getParameter("SSLType") != null) {
-                System.out.println("ssl");
                 List<String> types = Arrays.asList(SSLPinger.TYPES);
                 for (int i = 0; i < MAX_SSL_TESTS; i++) {
                     String type = req.getParameter("ssl-type-" + i);
                 List<String> types = Arrays.asList(SSLPinger.TYPES);
                 for (int i = 0; i < MAX_SSL_TESTS; i++) {
                     String type = req.getParameter("ssl-type-" + i);
index 3dc9ac60a8b51d23e915f28997cf02c1a416e2e7..35e17148908988dcd342a41c3cfb6b6675ad3128 100644 (file)
@@ -3,18 +3,20 @@ package org.cacert.gigi.ping;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.util.Arrays;
 import java.util.LinkedList;
 
 import java.util.LinkedList;
 
+import org.cacert.gigi.Domain;
+import org.cacert.gigi.User;
+
 public class DNSPinger extends DomainPinger {
 
     @Override
 public class DNSPinger extends DomainPinger {
 
     @Override
-    public String ping(String domain, String expToken) {
+    public String ping(Domain domain, String expToken, User u) {
         try {
             String[] tokenParts = expToken.split(":", 2);
 
             Process p = Runtime.getRuntime().exec(new String[] {
         try {
             String[] tokenParts = expToken.split(":", 2);
 
             Process p = Runtime.getRuntime().exec(new String[] {
-                    "dig", "+short", "NS", domain
+                    "dig", "+short", "NS", domain.getSuffix()
             });
             BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
             String line;
             });
             BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
             String line;
@@ -31,7 +33,6 @@ public class DNSPinger extends DomainPinger {
                 String[] call = new String[] {
                         "dig", "@" + NS, "+short", "TXT", "cacert-" + tokenParts[0] + "." + domain
                 };
                 String[] call = new String[] {
                         "dig", "@" + NS, "+short", "TXT", "cacert-" + tokenParts[0] + "." + domain
                 };
-                System.out.println(Arrays.toString(call));
                 p = Runtime.getRuntime().exec(call);
                 br = new BufferedReader(new InputStreamReader(p.getInputStream()));
                 String token = null;
                 p = Runtime.getRuntime().exec(call);
                 br = new BufferedReader(new InputStreamReader(p.getInputStream()));
                 String token = null;
index 3044f34db3992e47c9edaa92a8102cb48fb2f475..c9b8a9bb976dc65e6e280b980080d33d8fe556df 100644 (file)
@@ -1,10 +1,13 @@
 package org.cacert.gigi.ping;
 
 package org.cacert.gigi.ping;
 
+import org.cacert.gigi.Domain;
+import org.cacert.gigi.User;
+
 public abstract class DomainPinger {
 
     public static final String PING_STILL_PENDING = null;
 
     public static final String PING_SUCCEDED = "";
 
 public abstract class DomainPinger {
 
     public static final String PING_STILL_PENDING = null;
 
     public static final String PING_SUCCEDED = "";
 
-    public abstract String ping(String domain, String configuration);
+    public abstract String ping(Domain domain, String configuration, User user);
 }
 }
diff --git a/src/org/cacert/gigi/ping/EmailPinger.java b/src/org/cacert/gigi/ping/EmailPinger.java
new file mode 100644 (file)
index 0000000..ea63c0b
--- /dev/null
@@ -0,0 +1,23 @@
+package org.cacert.gigi.ping;
+
+import java.io.IOException;
+import org.cacert.gigi.Domain;
+import org.cacert.gigi.User;
+import org.cacert.gigi.email.MailProbe;
+
+public class EmailPinger extends DomainPinger {
+
+    @Override
+    public String ping(Domain domain, String configuration, User u) {
+        String[] parts = configuration.split(":", 2);
+        String mail = parts[0] + "@" + domain.getSuffix();
+        try {
+            MailProbe.sendMailProbe(u.getPrefferedLanguage(), "domain", domain.getId(), parts[1], mail);
+        } catch (IOException e) {
+            e.printStackTrace();
+            return "Mail connection interrupted";
+        }
+        return PING_STILL_PENDING;
+    }
+
+}
index 3bb2d095d3dd598c4f6c86f5fd594983fcbf48c9..5450f265181520b169f7e8dc8e00f5e8ae064d5c 100644 (file)
@@ -6,14 +6,16 @@ import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.URL;
 
 import java.net.HttpURLConnection;
 import java.net.URL;
 
+import org.cacert.gigi.Domain;
+import org.cacert.gigi.User;
+
 public class HTTPFetch extends DomainPinger {
 
     @Override
 public class HTTPFetch extends DomainPinger {
 
     @Override
-    public String ping(String domain, String expToken) {
+    public String ping(Domain domain, String expToken, User user) {
         try {
             String[] tokenParts = expToken.split(":", 2);
         try {
             String[] tokenParts = expToken.split(":", 2);
-            URL u = new URL("http://" + domain + "/cacert_" + tokenParts[0] + ".txt");
-            System.out.println(u.toString());
+            URL u = new URL("http://" + domain.getSuffix() + "/cacert-" + tokenParts[0] + ".txt");
             HttpURLConnection huc = (HttpURLConnection) u.openConnection();
             if (huc.getResponseCode() != 200) {
                 return "Invalid status code.";
             HttpURLConnection huc = (HttpURLConnection) u.openConnection();
             if (huc.getResponseCode() != 200) {
                 return "Invalid status code.";
index 595b6a6f1b7e86439f7fb770fe465db66324c930..253780cbe19a041926b204d78b5c1f89b9ee7ad9 100644 (file)
@@ -8,44 +8,66 @@ import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.Properties;
 
 import java.util.HashMap;
 import java.util.Properties;
 
+import org.cacert.gigi.Domain;
+import org.cacert.gigi.User;
 import org.cacert.gigi.database.DatabaseConnection;
 import org.cacert.gigi.database.DatabaseConnection;
+import org.cacert.gigi.util.RandomToken;
 
 
-public class PingerDaemon implements Runnable {
+public class PingerDaemon extends Thread {
 
     HashMap<String, DomainPinger> pingers = new HashMap<>();
 
 
     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());
+    private PreparedStatement searchNeededPings;
 
 
-    }
+    private PreparedStatement enterPingResult;
 
     @Override
     public void run() {
         try {
 
     @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();
-                }
-            }
+            searchNeededPings = DatabaseConnection.getInstance().prepare("SELECT pingconfig.*, domains.domain, domains.memid FROM pingconfig LEFT JOIN domainPinglog ON domainPinglog.configId=pingconfig.id INNER JOIN domains ON domains.id=pingconfig.domainid WHERE domainPinglog.configId IS NULL ");
+            enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
+            pingers.put("email", new EmailPinger());
+            pingers.put("ssl", new SSLPinger());
+            pingers.put("http", new HTTPFetch());
+            pingers.put("dns", new DNSPinger());
         } catch (SQLException e) {
             e.printStackTrace();
         }
         } catch (SQLException e) {
             e.printStackTrace();
         }
+        while (true) {
+            try {
+                execute();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(5000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private void execute() throws SQLException {
+
+        ResultSet rs = searchNeededPings.executeQuery();
+        while (rs.next()) {
+            String type = rs.getString("type");
+            String config = rs.getString("info");
+            DomainPinger dp = pingers.get(type);
+            if (dp != null) {
+                String token = null;
+                if (dp instanceof EmailPinger) {
+                    token = RandomToken.generateToken(16);
+                    config = config + ":" + token;
+                }
+                enterPingResult.setInt(1, rs.getInt("id"));
+                String resp = dp.ping(Domain.getById(rs.getInt("domainid")), config, User.getById(rs.getInt("memid")));
+                enterPingResult.setString(2, resp == DomainPinger.PING_STILL_PENDING ? "open" : resp == DomainPinger.PING_SUCCEDED ? "success" : "failed");
+                enterPingResult.setString(3, resp);
+                enterPingResult.setString(4, token);
+                enterPingResult.execute();
+            }
+        }
     }
 
     public static void main(String[] args) throws IOException {
     }
 
     public static void main(String[] args) throws IOException {
index ccb05b84a218761293a76b6ea5ce26a383e41858..81c739372ca4a2925b2c852f9be92b263d5c9255 100644 (file)
@@ -20,6 +20,9 @@ import javax.net.ssl.SSLEngineResult.HandshakeStatus;
 import javax.net.ssl.SSLParameters;
 import javax.security.cert.X509Certificate;
 
 import javax.net.ssl.SSLParameters;
 import javax.security.cert.X509Certificate;
 
+import org.cacert.gigi.Domain;
+import org.cacert.gigi.User;
+
 public class SSLPinger extends DomainPinger {
 
     public static final String[] TYPES = new String[] {
 public class SSLPinger extends DomainPinger {
 
     public static final String[] TYPES = new String[] {
@@ -27,18 +30,18 @@ public class SSLPinger extends DomainPinger {
     };
 
     @Override
     };
 
     @Override
-    public String ping(String domain, String configuration) {
+    public String ping(Domain domain, String configuration, User u) {
         try {
             SocketChannel sch = SocketChannel.open();
             String[] parts = configuration.split(":", 2);
         try {
             SocketChannel sch = SocketChannel.open();
             String[] parts = configuration.split(":", 2);
-            sch.connect(new InetSocketAddress(domain, Integer.parseInt(parts[0])));
+            sch.connect(new InetSocketAddress(domain.getSuffix(), Integer.parseInt(parts[0])));
             if (parts.length == 2) {
                 switch (parts[1]) {
                 case "xmpp":
             if (parts.length == 2) {
                 switch (parts[1]) {
                 case "xmpp":
-                    startXMPP(sch, false, domain);
+                    startXMPP(sch, false, domain.getSuffix());
                     break;
                 case "server-xmpp":
                     break;
                 case "server-xmpp":
-                    startXMPP(sch, true, domain);
+                    startXMPP(sch, true, domain.getSuffix());
                     break;
                 case "smtp":
                     startSMTP(sch);
                     break;
                 case "smtp":
                     startSMTP(sch);
@@ -49,7 +52,7 @@ public class SSLPinger extends DomainPinger {
 
                 }
             }
 
                 }
             }
-            return test(sch, domain);
+            return test(sch, domain.getSuffix());
         } catch (IOException e) {
             return "Connecton failed";
         }
         } catch (IOException e) {
             return "Connecton failed";
         }