1 package org.cacert.gigi.ping;
3 import java.security.KeyStore;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.util.HashMap;
9 import org.cacert.gigi.database.DatabaseConnection;
10 import org.cacert.gigi.dbObjects.Domain;
11 import org.cacert.gigi.dbObjects.User;
12 import org.cacert.gigi.util.RandomToken;
14 public class PingerDaemon extends Thread {
16 HashMap<String, DomainPinger> pingers = new HashMap<>();
18 private PreparedStatement searchNeededPings;
20 private PreparedStatement enterPingResult;
22 private KeyStore truststore;
24 public PingerDaemon(KeyStore truststore) {
25 this.truststore = truststore;
31 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 ");
32 enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
33 pingers.put("email", new EmailPinger());
34 pingers.put("ssl", new SSLPinger(truststore));
35 pingers.put("http", new HTTPFetch());
36 pingers.put("dns", new DNSPinger());
37 } catch (SQLException e) {
43 } catch (SQLException e) {
48 } catch (InterruptedException e) {
53 private void execute() throws SQLException {
55 ResultSet rs = searchNeededPings.executeQuery();
57 String type = rs.getString("type");
58 String config = rs.getString("info");
59 DomainPinger dp = pingers.get(type);
62 if (dp instanceof EmailPinger) {
63 token = RandomToken.generateToken(16);
64 config = config + ":" + token;
66 enterPingResult.setInt(1, rs.getInt("id"));
67 String resp = dp.ping(Domain.getById(rs.getInt("domainid")), config, User.getById(rs.getInt("memid")));
68 enterPingResult.setString(2, DomainPinger.PING_STILL_PENDING == resp ? "open" : DomainPinger.PING_SUCCEDED.equals(resp) ? "success" : "failed");
69 enterPingResult.setString(3, resp);
70 enterPingResult.setString(4, token);
71 enterPingResult.execute();