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.Domain;
9 import org.cacert.gigi.User;
10 import org.cacert.gigi.database.DatabaseConnection;
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 KeyStore truststore;
23 public PingerDaemon(KeyStore truststore) {
24 this.truststore = truststore;
30 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 ");
31 enterPingResult = DatabaseConnection.getInstance().prepare("INSERT INTO domainPinglog SET configId=?, state=?, result=?, challenge=?");
32 pingers.put("email", new EmailPinger());
33 pingers.put("ssl", new SSLPinger(truststore));
34 pingers.put("http", new HTTPFetch());
35 pingers.put("dns", new DNSPinger());
36 } catch (SQLException e) {
42 } catch (SQLException e) {
47 } catch (InterruptedException e) {
52 private void execute() throws SQLException {
54 ResultSet rs = searchNeededPings.executeQuery();
56 String type = rs.getString("type");
57 String config = rs.getString("info");
58 DomainPinger dp = pingers.get(type);
61 if (dp instanceof EmailPinger) {
62 token = RandomToken.generateToken(16);
63 config = config + ":" + token;
65 enterPingResult.setInt(1, rs.getInt("id"));
66 String resp = dp.ping(Domain.getById(rs.getInt("domainid")), config, User.getById(rs.getInt("memid")));
67 enterPingResult.setString(2, DomainPinger.PING_STILL_PENDING == resp ? "open" : DomainPinger.PING_SUCCEDED.equals(resp) ? "success" : "failed");
68 enterPingResult.setString(3, resp);
69 enterPingResult.setString(4, token);
70 enterPingResult.execute();