X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Fclub%2Fwpia%2Fgigi%2FdbObjects%2FCertificate.java;h=70ce26a0cd513b079ce288663ffeac0078be7106;hb=7966cd4a5e6c719b9b9790839c743a137b52900b;hp=72cd3c19d57ad77c7adf8efc7f2e3adfc54c033c;hpb=bccd4cc0dba0f89aa045b113bac46eb8cc1dab4e;p=gigi.git diff --git a/src/club/wpia/gigi/dbObjects/Certificate.java b/src/club/wpia/gigi/dbObjects/Certificate.java index 72cd3c19..70ce26a0 100644 --- a/src/club/wpia/gigi/dbObjects/Certificate.java +++ b/src/club/wpia/gigi/dbObjects/Certificate.java @@ -14,6 +14,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map.Entry; import club.wpia.gigi.GigiApiException; @@ -27,6 +28,25 @@ import club.wpia.gigi.util.KeyStorage; public class Certificate implements IdCachable { + public enum RevocationType implements DBEnum { + USER("user"), SUPPORT("support"), PING_TIMEOUT("ping_timeout"), KEY_COMPROMISE("key_compromise"); + + private final String dbName; + + private RevocationType(String dbName) { + this.dbName = dbName; + } + + @Override + public String getDBName() { + return dbName; + } + + public static RevocationType fromString(String s) { + return valueOf(s.toUpperCase(Locale.ENGLISH)); + } + } + public enum SANType implements DBEnum { EMAIL("email"), DNS("DNS"); @@ -282,7 +302,7 @@ public class Certificate implements IdCachable { } public synchronized CertificateStatus getStatus() { - try (GigiPreparedStatement searcher = new GigiPreparedStatement("SELECT crt_name, created, revoked, serial, caid FROM certs WHERE id=?")) { + try (GigiPreparedStatement searcher = new GigiPreparedStatement("SELECT crt_name, created, `revoked`, serial, caid FROM certs LEFT JOIN `certsRevoked` ON `certs`.`id` = `certsRevoked`.`id` WHERE `certs`.id=?")) { searcher.setInt(1, id); GigiResultSet rs = searcher.executeQuery(); if ( !rs.next()) { @@ -325,12 +345,18 @@ public class Certificate implements IdCachable { } - public Job revoke() { + public Job revoke(RevocationType type) { if (getStatus() != CertificateStatus.ISSUED) { throw new IllegalStateException(); } - return Job.revoke(this); + return Job.revoke(this, type); + } + public Job revoke(String challenge, String signature, String message) { + if (getStatus() != CertificateStatus.ISSUED) { + throw new IllegalStateException(); + } + return Job.revoke(this, challenge, signature, message); } public CACertificate getParent() { @@ -394,12 +420,13 @@ public class Certificate implements IdCachable { return profile; } + private static final String CONCAT = "string_agg(concat('/', `name`, '=', REPLACE(REPLACE(value, '\\\\', '\\\\\\\\'), '/', '\\\\/')), '')"; + public synchronized static Certificate getBySerial(String serial) { if (serial == null || "".equals(serial)) { return null; } - String concat = "string_agg(concat('/', `name`, '=', REPLACE(REPLACE(value, '\\\\', '\\\\\\\\'), '/', '\\\\/')), '')"; - try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT certs.id, " + concat + " as `subject`, `md`, `csr_name`, `crt_name`,`memid`, `profile`, `certs`.`serial` FROM `certs` LEFT JOIN `certAvas` ON `certAvas`.`certId`=`certs`.`id` WHERE `serial`=? GROUP BY `certs`.`id`")) { + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT certs.id, " + CONCAT + " as `subject`, `md`, `csr_name`, `crt_name`,`memid`, `profile`, `certs`.`serial` FROM `certs` LEFT JOIN `certAvas` ON `certAvas`.`certId`=`certs`.`id` WHERE `serial`=? GROUP BY `certs`.`id`")) { ps.setString(1, serial); GigiResultSet rs = ps.executeQuery(); if ( !rs.next()) { @@ -425,8 +452,7 @@ public class Certificate implements IdCachable { } try { - String concat = "string_agg(concat('/', `name`, '=', REPLACE(REPLACE(value, '\\\\', '\\\\\\\\'), '/', '\\\\/')), '')"; - try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT certs.id, " + concat + " as subject, md, csr_name, crt_name,memid, profile, certs.serial FROM `certs` LEFT JOIN `certAvas` ON `certAvas`.`certId`=certs.id WHERE certs.id=? GROUP BY certs.id")) { + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT certs.id, " + CONCAT + " as subject, md, csr_name, crt_name,memid, profile, certs.serial FROM `certs` LEFT JOIN `certAvas` ON `certAvas`.`certId`=certs.id WHERE certs.id=? GROUP BY certs.id")) { ps.setInt(1, id); GigiResultSet rs = ps.executeQuery(); if ( !rs.next()) { @@ -467,7 +493,7 @@ public class Certificate implements IdCachable { public java.util.Date getRevocationDate() { if (getStatus() == CertificateStatus.REVOKED) { - try (GigiPreparedStatement prep = new GigiPreparedStatement("SELECT revoked FROM certs WHERE id=?")) { + try (GigiPreparedStatement prep = new GigiPreparedStatement("SELECT revoked FROM `certsRevoked` WHERE id=?")) { prep.setInt(1, getId()); GigiResultSet res = prep.executeQuery(); if (res.next()) {