1 package org.cacert.gigi.ping;
3 import java.security.KeyStore;
4 import java.util.HashMap;
6 import org.cacert.gigi.database.DatabaseConnection;
7 import org.cacert.gigi.database.GigiPreparedStatement;
8 import org.cacert.gigi.database.GigiResultSet;
9 import org.cacert.gigi.dbObjects.Domain;
10 import org.cacert.gigi.dbObjects.User;
11 import org.cacert.gigi.util.RandomToken;
13 public class PingerDaemon extends Thread {
15 HashMap<String, DomainPinger> pingers = new HashMap<>();
17 private GigiPreparedStatement searchNeededPings;
19 private GigiPreparedStatement enterPingResult;
21 private GigiPreparedStatement updatePingStatus;
23 private KeyStore truststore;
25 public PingerDaemon(KeyStore truststore) {
26 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 ( pingconfig.reping='y' OR domainPinglog.configId IS NULL) AND domains.deleted IS NULL GROUP BY pingconfig.id");
32 enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
33 updatePingStatus = DatabaseConnection.getInstance().prepare("UPDATE pingconfig SET reping='n' WHERE id=?");
34 pingers.put("email", new EmailPinger());
35 pingers.put("ssl", new SSLPinger(truststore));
36 pingers.put("http", new HTTPFetch());
37 pingers.put("dns", new DNSPinger());
43 } catch (InterruptedException e) {
48 private void execute() {
50 GigiResultSet rs = searchNeededPings.executeQuery();
52 String type = rs.getString("type");
53 String config = rs.getString("info");
54 DomainPinger dp = pingers.get(type);
57 if (dp instanceof EmailPinger) {
58 token = RandomToken.generateToken(16);
59 config = config + ":" + token;
61 updatePingStatus.setInt(1, rs.getInt("id"));
62 updatePingStatus.execute();
63 enterPingResult.setInt(1, rs.getInt("id"));
64 String resp = dp.ping(Domain.getById(rs.getInt("domainid")), config, User.getById(rs.getInt("memid")));
65 enterPingResult.setString(2, DomainPinger.PING_STILL_PENDING == resp ? "open" : DomainPinger.PING_SUCCEDED.equals(resp) ? "success" : "failed");
66 enterPingResult.setString(3, resp);
67 enterPingResult.setString(4, token);
68 enterPingResult.execute();