]> WPIA git - gigi.git/blob - src/org/cacert/gigi/ping/PingerDaemon.java
[test-config] FIX: the ssl-pinger+ add various tests for that.
[gigi.git] / src / org / cacert / gigi / ping / PingerDaemon.java
1 package org.cacert.gigi.ping;
2
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;
12
13 public class PingerDaemon extends Thread {
14
15     HashMap<String, DomainPinger> pingers = new HashMap<>();
16
17     private PreparedStatement searchNeededPings;
18
19     private PreparedStatement enterPingResult;
20
21     private KeyStore truststore;
22
23     public PingerDaemon(KeyStore truststore) {
24         this.truststore = truststore;
25     }
26
27     @Override
28     public void run() {
29         try {
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) {
37             e.printStackTrace();
38         }
39         while (true) {
40             try {
41                 execute();
42             } catch (SQLException e) {
43                 e.printStackTrace();
44             }
45             try {
46                 Thread.sleep(5000);
47             } catch (InterruptedException e) {
48                 e.printStackTrace();
49             }
50         }
51     }
52
53     private void execute() throws SQLException {
54
55         ResultSet rs = searchNeededPings.executeQuery();
56         while (rs.next()) {
57             String type = rs.getString("type");
58             String config = rs.getString("info");
59             DomainPinger dp = pingers.get(type);
60             if (dp != null) {
61                 String token = null;
62                 if (dp instanceof EmailPinger) {
63                     token = RandomToken.generateToken(16);
64                     config = config + ":" + token;
65                 }
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();
72             }
73         }
74     }
75 }