1 package org.cacert.gigi.dbObjects;
3 import java.util.LinkedList;
6 import org.cacert.gigi.database.DatabaseConnection;
7 import org.cacert.gigi.database.GigiPreparedStatement;
8 import org.cacert.gigi.database.GigiResultSet;
10 public abstract class CertificateOwner implements IdCachable {
12 private static final ObjectCache<CertificateOwner> myCache = new ObjectCache<>();
16 protected CertificateOwner(int id) {
20 protected CertificateOwner() {
21 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO `certOwners` DEFAULT VALUES");
23 id = ps.lastInsertId();
31 public static synchronized CertificateOwner getById(int id) {
32 CertificateOwner u = myCache.get(id);
34 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");
36 try (GigiResultSet rs = ps.executeQuery()) {
40 if (rs.getString("uid") != null) {
41 myCache.put(u = new User(rs));
42 } else if (rs.getString("oid") != null) {
43 myCache.put(u = new Organisation(rs));
45 System.err.print("Malformed cert owner: " + id);
52 public Domain[] getDomains() {
53 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `id` FROM `domains` WHERE `memid`=? AND `deleted` IS NULL");
54 ps.setInt(1, getId());
56 try (GigiResultSet rs = ps.executeQuery()) {
57 LinkedList<Domain> data = new LinkedList<Domain>();
60 data.add(Domain.getById(rs.getInt(1)));
63 return data.toArray(new Domain[0]);
67 public Certificate[] getCertificates(boolean includeRevoked) {
68 GigiPreparedStatement ps;
70 ps = DatabaseConnection.getInstance().prepare("SELECT id FROM certs WHERE memid=?");
72 ps = DatabaseConnection.getInstance().prepare("SELECT id FROM certs WHERE memid=? AND revoked IS NULL");
74 ps.setInt(1, getId());
76 try (GigiResultSet rs = ps.executeQuery()) {
77 LinkedList<Certificate> data = new LinkedList<Certificate>();
80 data.add(Certificate.getById(rs.getInt(1)));
83 return data.toArray(new Certificate[0]);
87 public boolean isValidDomain(String domainname) {
88 for (Domain d : getDomains()) {
89 String sfx = d.getSuffix();
90 if (domainname.equals(sfx) || domainname.endsWith("." + sfx)) {
91 return d.isVerified();
98 public abstract boolean isValidEmail(String email);
100 public void delete() {
101 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE `certOwners` SET `deleted`=NOW() WHERE `id`=?");
102 ps.setInt(1, getId());
104 myCache.remove(this);
107 public String[] getAdminLog() {
108 GigiPreparedStatement prep = DatabaseConnection.getInstance().prepare("SELECT `when`, type, information FROM `adminLog` WHERE uid=? ORDER BY `when` ASC");
109 prep.setInt(1, getId());
110 GigiResultSet res = prep.executeQuery();
111 List<String> entries = new LinkedList<String>();
114 entries.add(res.getString(2) + " (" + res.getString(3) + ")");
117 return entries.toArray(new String[0]);
120 public static CertificateOwner getByEnabledSerial(String serial) {
121 GigiPreparedStatement prep = DatabaseConnection.getInstance().prepare("SELECT `memid` FROM `certs` WHERE serial=? AND `disablelogin`='0' AND `revoked` is NULL");
122 prep.setString(1, serial.toLowerCase());
123 GigiResultSet res = prep.executeQuery();
125 return getById(res.getInt(1));