]> WPIA git - gigi.git/blob - src/org/cacert/gigi/dbObjects/CertificateOwner.java
Empty: Whitespace, serialVersionUID, final classes
[gigi.git] / src / org / cacert / gigi / dbObjects / CertificateOwner.java
1 package org.cacert.gigi.dbObjects;
2
3 import org.cacert.gigi.database.DatabaseConnection;
4 import org.cacert.gigi.database.GigiPreparedStatement;
5 import org.cacert.gigi.database.GigiResultSet;
6
7 public abstract class CertificateOwner implements IdCachable {
8
9     private static ObjectCache<CertificateOwner> myCache = new ObjectCache<>();
10
11     private int id;
12
13     public CertificateOwner(int id) {
14         this.id = id;
15     }
16
17     public CertificateOwner() {}
18
19     public int getId() {
20         return id;
21     }
22
23     public static synchronized CertificateOwner getById(int id) {
24         CertificateOwner u = myCache.get(id);
25         if (u == null) {
26             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");
27             ps.setInt(1, id);
28             GigiResultSet rs = ps.executeQuery();
29             if ( !rs.next()) {
30                 return null;
31             }
32             if (rs.getString("uid") != null) {
33                 myCache.put(u = new User(rs));
34             } else if (rs.getString("oid") != null) {
35                 myCache.put(u = new Organisation(rs));
36             } else {
37                 System.err.print("Malformed cert owner: " + id);
38             }
39         }
40         return u;
41     }
42
43     protected int insert() {
44         synchronized (User.class) {
45             if (id != 0) {
46                 throw new Error("refusing to insert");
47             }
48             GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO certOwners() VALUES()");
49             ps.execute();
50             id = ps.lastInsertId();
51             myCache.put(this);
52         }
53         return id;
54     }
55
56     public EmailAddress[] getEmails() {
57         GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT id FROM emails WHERE memid=? AND deleted is NULL");
58         ps.setInt(1, getId());
59         GigiResultSet rs = ps.executeQuery();
60         rs.last();
61         int count = rs.getRow();
62         EmailAddress[] data = new EmailAddress[count];
63         rs.beforeFirst();
64         for (int i = 0; i < data.length; i++) {
65             if ( !rs.next()) {
66                 throw new Error("Internal sql api violation.");
67             }
68             data[i] = EmailAddress.getById(rs.getInt(1));
69         }
70         rs.close();
71         return data;
72
73     }
74
75     public Domain[] getDomains() {
76         GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT id FROM domains WHERE memid=? AND deleted IS NULL");
77         ps.setInt(1, getId());
78         GigiResultSet rs = ps.executeQuery();
79         rs.last();
80         int count = rs.getRow();
81         Domain[] data = new Domain[count];
82         rs.beforeFirst();
83         for (int i = 0; i < data.length; i++) {
84             if ( !rs.next()) {
85                 throw new Error("Internal sql api violation.");
86             }
87             data[i] = Domain.getById(rs.getInt(1));
88         }
89         rs.close();
90         return data;
91
92     }
93
94     public Certificate[] getCertificates(boolean includeRevoked) {
95         GigiPreparedStatement ps;
96         if (includeRevoked) {
97             ps = DatabaseConnection.getInstance().prepare("SELECT serial FROM certs WHERE memid=?");
98         } else {
99             ps = DatabaseConnection.getInstance().prepare("SELECT serial FROM certs WHERE memid=? AND revoked IS NULL");
100         }
101         ps.setInt(1, getId());
102         GigiResultSet rs = ps.executeQuery();
103         rs.last();
104         int count = rs.getRow();
105         Certificate[] data = new Certificate[count];
106         rs.beforeFirst();
107         for (int i = 0; i < data.length; i++) {
108             if ( !rs.next()) {
109                 throw new Error("Internal sql api violation.");
110             }
111             data[i] = Certificate.getBySerial(rs.getString(1));
112         }
113         rs.close();
114         return data;
115
116     }
117
118     public boolean isValidDomain(String domainname) {
119         for (Domain d : getDomains()) {
120             String sfx = d.getSuffix();
121             if (domainname.equals(sfx) || domainname.endsWith("." + sfx)) {
122                 return true;
123             }
124         }
125
126         return false;
127     }
128
129     public boolean isValidEmail(String email) {
130         for (EmailAddress em : getEmails()) {
131             if (em.getAddress().equals(email)) {
132                 return true;
133             }
134         }
135
136         return false;
137     }
138
139     public void delete() {
140         GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE certOwners set deleted=NOW() WHERE id=?");
141         ps.setInt(1, getId());
142         ps.execute();
143         myCache.remove(this);
144     }
145
146 }