]> WPIA git - gigi.git/blob - src/org/cacert/gigi/dbObjects/CertificateOwner.java
7c111beea4b1ecfb26b50acebe4e3b6f3cb2cf7c
[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 int id;
10
11     public CertificateOwner(int id) {
12         this.id = id;
13     }
14
15     public CertificateOwner() {}
16
17     public int getId() {
18         return id;
19     }
20
21     private static ObjectCache<CertificateOwner> myCache = new ObjectCache<>();
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         if (id != 0) {
45             throw new Error("refusing to insert");
46         }
47         synchronized (User.class) {
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() {
95         GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT serial FROM certs WHERE memid=? AND revoked IS NULL");
96         ps.setInt(1, getId());
97         GigiResultSet rs = ps.executeQuery();
98         rs.last();
99         int count = rs.getRow();
100         Certificate[] data = new Certificate[count];
101         rs.beforeFirst();
102         for (int i = 0; i < data.length; i++) {
103             if ( !rs.next()) {
104                 throw new Error("Internal sql api violation.");
105             }
106             data[i] = Certificate.getBySerial(rs.getString(1));
107         }
108         rs.close();
109         return data;
110
111     }
112
113     public boolean isValidDomain(String domainname) {
114         for (Domain d : getDomains()) {
115             String sfx = d.getSuffix();
116             if (domainname.equals(sfx) || domainname.endsWith("." + sfx)) {
117                 return true;
118             }
119         }
120         return false;
121     }
122
123     public boolean isValidEmail(String email) {
124         for (EmailAddress em : getEmails()) {
125             if (em.getAddress().equals(email)) {
126                 return true;
127             }
128         }
129         return false;
130     }
131
132     public void delete() {
133         GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE certowners set deleted=NOW() WHERE id=?");
134         ps.setInt(1, getId());
135         ps.execute();
136         myCache.remove(this);
137     }
138 }