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