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 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 EmailAddress[] getEmails() {
61 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT id FROM emails WHERE memid=? AND deleted is NULL");
62 ps.setInt(1, getId());
64 try (GigiResultSet rs = ps.executeQuery()) {
65 LinkedList<EmailAddress> data = new LinkedList<EmailAddress>();
68 data.add(EmailAddress.getById(rs.getInt(1)));
71 return data.toArray(new EmailAddress[0]);
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());
79 try (GigiResultSet rs = ps.executeQuery()) {
80 LinkedList<Domain> data = new LinkedList<Domain>();
83 data.add(Domain.getById(rs.getInt(1)));
86 return data.toArray(new Domain[0]);
90 public Certificate[] getCertificates(boolean includeRevoked) {
91 GigiPreparedStatement ps;
93 ps = DatabaseConnection.getInstance().prepare("SELECT serial FROM certs WHERE memid=?");
95 ps = DatabaseConnection.getInstance().prepare("SELECT serial FROM certs WHERE memid=? AND revoked IS NULL");
97 ps.setInt(1, getId());
99 try (GigiResultSet rs = ps.executeQuery()) {
100 LinkedList<Certificate> data = new LinkedList<Certificate>();
103 data.add(Certificate.getBySerial(rs.getString(1)));
106 return data.toArray(new Certificate[0]);
110 public boolean isValidDomain(String domainname) {
111 for (Domain d : getDomains()) {
112 String sfx = d.getSuffix();
113 if (domainname.equals(sfx) || domainname.endsWith("." + sfx)) {
121 public boolean isValidEmail(String email) {
122 for (EmailAddress em : getEmails()) {
123 if (em.getAddress().equals(email)) {
131 public void delete() {
132 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE certOwners SET deleted=NOW() WHERE id=?");
133 ps.setInt(1, getId());
135 myCache.remove(this);