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;
8 import org.cacert.gigi.database.DatabaseConnection;
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 PreparedStatement searchNeededPings;
19 private PreparedStatement enterPingResult;
21 private PreparedStatement updatePingStatus;
23 private KeyStore truststore;
25 public PingerDaemon(KeyStore truststore) {
26 this.truststore = truststore;
32 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");
33 enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
34 updatePingStatus = DatabaseConnection.getInstance().prepare("UPDATE pingconfig SET reping='n' WHERE id=?");
35 pingers.put("email", new EmailPinger());
36 pingers.put("ssl", new SSLPinger(truststore));
37 pingers.put("http", new HTTPFetch());
38 pingers.put("dns", new DNSPinger());
39 } catch (SQLException e) {
45 } catch (SQLException e) {
50 } catch (InterruptedException e) {
55 private void execute() throws SQLException {
57 ResultSet rs = searchNeededPings.executeQuery();
59 String type = rs.getString("type");
60 String config = rs.getString("info");
61 DomainPinger dp = pingers.get(type);
64 if (dp instanceof EmailPinger) {
65 token = RandomToken.generateToken(16);
66 config = config + ":" + token;
68 updatePingStatus.setInt(1, rs.getInt("id"));
69 updatePingStatus.execute();
70 enterPingResult.setInt(1, rs.getInt("id"));
71 String resp = dp.ping(Domain.getById(rs.getInt("domainid")), config, User.getById(rs.getInt("memid")));
72 enterPingResult.setString(2, DomainPinger.PING_STILL_PENDING == resp ? "open" : DomainPinger.PING_SUCCEDED.equals(resp) ? "success" : "failed");
73 enterPingResult.setString(3, resp);
74 enterPingResult.setString(4, token);
75 enterPingResult.execute();