1 package org.cacert.gigi.dbObjects;
3 import java.util.LinkedList;
5 import org.cacert.gigi.database.DatabaseConnection;
6 import org.cacert.gigi.database.GigiPreparedStatement;
7 import org.cacert.gigi.database.GigiResultSet;
9 public abstract class CertificateOwner implements IdCachable {
11 private static final ObjectCache<CertificateOwner> myCache = new ObjectCache<>();
15 public CertificateOwner(int id) {
19 public CertificateOwner() {}
25 public static synchronized CertificateOwner getById(int id) {
26 CertificateOwner u = myCache.get(id);
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");
30 try (GigiResultSet rs = ps.executeQuery()) {
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));
39 System.err.print("Malformed cert owner: " + id);
46 protected int insert() {
47 synchronized (User.class) {
49 throw new Error("refusing to insert");
51 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO certOwners() VALUES()");
53 id = ps.lastInsertId();
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());
64 try (GigiResultSet rs = ps.executeQuery()) {
65 LinkedList<Domain> data = new LinkedList<Domain>();
68 data.add(Domain.getById(rs.getInt(1)));
71 return data.toArray(new Domain[0]);
75 public Certificate[] getCertificates(boolean includeRevoked) {
76 GigiPreparedStatement ps;
78 ps = DatabaseConnection.getInstance().prepare("SELECT id FROM certs WHERE memid=?");
80 ps = DatabaseConnection.getInstance().prepare("SELECT id FROM certs WHERE memid=? AND revoked IS NULL");
82 ps.setInt(1, getId());
84 try (GigiResultSet rs = ps.executeQuery()) {
85 LinkedList<Certificate> data = new LinkedList<Certificate>();
88 data.add(Certificate.getById(rs.getInt(1)));
91 return data.toArray(new Certificate[0]);
95 public boolean isValidDomain(String domainname) {
96 for (Domain d : getDomains()) {
97 String sfx = d.getSuffix();
98 if (domainname.equals(sfx) || domainname.endsWith("." + sfx)) {
106 public abstract boolean isValidEmail(String email);
108 public void delete() {
109 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE certOwners SET deleted=NOW() WHERE id=?");
110 ps.setInt(1, getId());
112 myCache.remove(this);