]> WPIA git - gigi.git/blob - src/org/cacert/gigi/dbObjects/CertificateOwner.java
add: split API and add CATS import API
[gigi.git] / src / org / cacert / gigi / dbObjects / CertificateOwner.java
1 package org.cacert.gigi.dbObjects;
2
3 import java.util.LinkedList;
4 import java.util.List;
5
6 import org.cacert.gigi.database.DatabaseConnection;
7 import org.cacert.gigi.database.GigiPreparedStatement;
8 import org.cacert.gigi.database.GigiResultSet;
9
10 public abstract class CertificateOwner implements IdCachable {
11
12     private static final ObjectCache<CertificateOwner> myCache = new ObjectCache<>();
13
14     private int id;
15
16     protected CertificateOwner(int id) {
17         this.id = id;
18     }
19
20     protected CertificateOwner() {
21         GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO `certOwners` DEFAULT VALUES");
22         ps.execute();
23         id = ps.lastInsertId();
24         myCache.put(this);
25     }
26
27     public int getId() {
28         return id;
29     }
30
31     public static synchronized CertificateOwner getById(int id) {
32         CertificateOwner u = myCache.get(id);
33         if (u == null) {
34             GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT *, `users`.`id` AS uid, `organisations`.`id` AS oid FROM `certOwners` LEFT JOIN `users` ON `users`.`id`=`certOwners`.`id` LEFT JOIN `organisations` ON `organisations`.`id` = `certOwners`.`id` WHERE `certOwners`.`id`=? AND `deleted` is null");
35             ps.setInt(1, id);
36             try (GigiResultSet rs = ps.executeQuery()) {
37                 if ( !rs.next()) {
38                     return null;
39                 }
40                 if (rs.getString("uid") != null) {
41                     myCache.put(u = new User(rs));
42                 } else if (rs.getString("oid") != null) {
43                     myCache.put(u = new Organisation(rs));
44                 } else {
45                     System.err.print("Malformed cert owner: " + id);
46                 }
47             }
48         }
49         return u;
50     }
51
52     public Domain[] getDomains() {
53         GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `id` FROM `domains` WHERE `memid`=? AND `deleted` IS NULL");
54         ps.setInt(1, getId());
55
56         try (GigiResultSet rs = ps.executeQuery()) {
57             LinkedList<Domain> data = new LinkedList<Domain>();
58
59             while (rs.next()) {
60                 data.add(Domain.getById(rs.getInt(1)));
61             }
62
63             return data.toArray(new Domain[0]);
64         }
65     }
66
67     public Certificate[] getCertificates(boolean includeRevoked) {
68         GigiPreparedStatement ps;
69         if (includeRevoked) {
70             ps = DatabaseConnection.getInstance().prepare("SELECT id FROM certs WHERE memid=?");
71         } else {
72             ps = DatabaseConnection.getInstance().prepare("SELECT id FROM certs WHERE memid=? AND revoked IS NULL");
73         }
74         ps.setInt(1, getId());
75
76         try (GigiResultSet rs = ps.executeQuery()) {
77             LinkedList<Certificate> data = new LinkedList<Certificate>();
78
79             while (rs.next()) {
80                 data.add(Certificate.getById(rs.getInt(1)));
81             }
82
83             return data.toArray(new Certificate[0]);
84         }
85     }
86
87     public boolean isValidDomain(String domainname) {
88         for (Domain d : getDomains()) {
89             String sfx = d.getSuffix();
90             if (domainname.equals(sfx) || domainname.endsWith("." + sfx)) {
91                 return d.isVerified();
92             }
93         }
94
95         return false;
96     }
97
98     public abstract boolean isValidEmail(String email);
99
100     public void delete() {
101         GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE `certOwners` SET `deleted`=NOW() WHERE `id`=?");
102         ps.setInt(1, getId());
103         ps.execute();
104         myCache.remove(this);
105     }
106
107     public String[] getAdminLog() {
108         GigiPreparedStatement prep = DatabaseConnection.getInstance().prepare("SELECT `when`, type, information FROM `adminLog` WHERE uid=? ORDER BY `when` ASC");
109         prep.setInt(1, getId());
110         GigiResultSet res = prep.executeQuery();
111         List<String> entries = new LinkedList<String>();
112
113         while (res.next()) {
114             entries.add(res.getString(2) + " (" + res.getString(3) + ")");
115         }
116
117         return entries.toArray(new String[0]);
118     }
119
120     public static CertificateOwner getByEnabledSerial(String serial) {
121         GigiPreparedStatement prep = DatabaseConnection.getInstance().prepare("SELECT `memid` FROM `certs` WHERE serial=? AND `disablelogin`='0' AND `revoked` is NULL");
122         prep.setString(1, serial.toLowerCase());
123         GigiResultSet res = prep.executeQuery();
124         if (res.next()) {
125             return getById(res.getInt(1));
126         }
127         return null;
128     }
129 }