X-Git-Url: https://code.wpia.club/?p=gigi.git;a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2FdbObjects%2FDomain.java;h=1d31db61c2dee3dcf95dc122d74f4e5694344271;hp=7e35225f4d99d409cee53e9aec64544c8563df9a;hb=a0232b6e40e7e09767f0444d24e18bf12dafc362;hpb=a7aea81ff9eebb35aef0f91dfa8b5e3c797568f8 diff --git a/src/org/cacert/gigi/dbObjects/Domain.java b/src/org/cacert/gigi/dbObjects/Domain.java index 7e35225f..1d31db61 100644 --- a/src/org/cacert/gigi/dbObjects/Domain.java +++ b/src/org/cacert/gigi/dbObjects/Domain.java @@ -12,57 +12,13 @@ import java.util.Properties; import java.util.Set; import org.cacert.gigi.GigiApiException; -import org.cacert.gigi.database.DatabaseConnection; import org.cacert.gigi.database.GigiPreparedStatement; import org.cacert.gigi.database.GigiResultSet; -import org.cacert.gigi.dbObjects.DomainPingConfiguration.PingType; import org.cacert.gigi.util.PublicSuffixes; public class Domain implements IdCachable, Verifyable { - public class DomainPingExecution { - - private String state; - - private String type; - - private String info; - - private String result; - - private DomainPingConfiguration config; - - public DomainPingExecution(GigiResultSet rs) { - state = rs.getString(1); - type = rs.getString(2); - info = rs.getString(3); - result = rs.getString(4); - config = DomainPingConfiguration.getById(rs.getInt(5)); - } - - public String getState() { - return state; - } - - public String getType() { - return type; - } - - public String getInfo() { - return info; - } - - public String getResult() { - return result; - } - - public DomainPingConfiguration getConfig() { - return config; - } - - } - - private User owner; + private CertificateOwner owner; private String suffix; @@ -81,24 +37,26 @@ public class Domain implements IdCachable, Verifyable { } private Domain(int id) { - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT memid, domain FROM `domains` WHERE id=? AND deleted IS NULL"); - ps.setInt(1, id); + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT `memid`, `domain` FROM `domains` WHERE `id`=? AND `deleted` IS NULL")) { + ps.setInt(1, id); - GigiResultSet rs = ps.executeQuery(); - if ( !rs.next()) { - throw new IllegalArgumentException("Invalid domain id " + id); + GigiResultSet rs = ps.executeQuery(); + if ( !rs.next()) { + throw new IllegalArgumentException("Invalid domain id " + id); + } + this.id = id; + owner = CertificateOwner.getById(rs.getInt(1)); + suffix = rs.getString(2); } - this.id = id; - owner = User.getById(rs.getInt(1)); - suffix = rs.getString(2); - rs.close(); } - public Domain(User owner, String suffix) throws GigiApiException { - checkCertifyableDomain(suffix, owner.isInGroup(Group.CODESIGNING)); - this.owner = owner; - this.suffix = suffix; - + public Domain(User actor, CertificateOwner owner, String suffix) throws GigiApiException { + synchronized (Domain.class) { + checkCertifyableDomain(suffix, actor.isInGroup(Group.CODESIGNING)); + this.owner = owner; + this.suffix = suffix; + insert(); + } } public static void checkCertifyableDomain(String s, boolean hasPunycodeRight) throws GigiApiException { @@ -156,44 +114,45 @@ public class Domain implements IdCachable, Verifyable { } private static void checkInsert(String suffix) throws GigiApiException { - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT 1 FROM `domains` WHERE (domain=? OR (CONCAT('.', domain)=RIGHT(?,LENGTH(domain)+1) OR RIGHT(domain,LENGTH(?)+1)=CONCAT('.',?))) AND deleted IS NULL"); - ps.setString(1, suffix); - ps.setString(2, suffix); - ps.setString(3, suffix); - ps.setString(4, suffix); - GigiResultSet rs = ps.executeQuery(); - boolean existed = rs.next(); - rs.close(); - if (existed) { - throw new GigiApiException("Domain could not be inserted. Domain is already valid."); + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT 1 FROM `domains` WHERE (`domain`=? OR (CONCAT('.', `domain`)=RIGHT(?,LENGTH(`domain`)+1) OR RIGHT(`domain`,LENGTH(?)+1)=CONCAT('.',?))) AND `deleted` IS NULL")) { + ps.setString(1, suffix); + ps.setString(2, suffix); + ps.setString(3, suffix); + ps.setString(4, suffix); + GigiResultSet rs = ps.executeQuery(); + boolean existed = rs.next(); + rs.close(); + if (existed) { + throw new GigiApiException("Domain could not be inserted. Domain is already valid."); + } } } - public void insert() throws GigiApiException { - synchronized (Domain.class) { - if (id != 0) { - throw new GigiApiException("already inserted."); - } - checkInsert(suffix); - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO `domains` SET memid=?, domain=?"); + private void insert() throws GigiApiException { + if (id != 0) { + throw new GigiApiException("already inserted."); + } + checkInsert(suffix); + try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `domains` SET memid=?, domain=?")) { ps.setInt(1, owner.getId()); ps.setString(2, suffix); ps.execute(); id = ps.lastInsertId(); - myCache.put(this); } + myCache.put(this); } public void delete() throws GigiApiException { if (id == 0) { throw new GigiApiException("not inserted."); } - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE `domains` SET deleted=CURRENT_TIMESTAMP WHERE id=?"); - ps.setInt(1, id); - ps.execute(); + try (GigiPreparedStatement ps = new GigiPreparedStatement("UPDATE `domains` SET `deleted`=CURRENT_TIMESTAMP WHERE `id`=?")) { + ps.setInt(1, id); + ps.execute(); + } } - public User getOwner() { + public CertificateOwner getOwner() { return owner; } @@ -212,53 +171,57 @@ public class Domain implements IdCachable, Verifyable { LinkedList configs = this.configs; if (configs == null) { configs = new LinkedList<>(); - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT id FROM pingconfig WHERE domainid=?"); - ps.setInt(1, id); - GigiResultSet rs = ps.executeQuery(); - while (rs.next()) { - configs.add(DomainPingConfiguration.getById(rs.getInt(1))); + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT id FROM pingconfig WHERE domainid=?")) { + ps.setInt(1, id); + GigiResultSet rs = ps.executeQuery(); + while (rs.next()) { + configs.add(DomainPingConfiguration.getById(rs.getInt(1))); + } } - rs.close(); this.configs = configs; } return Collections.unmodifiableList(configs); } - public void addPing(PingType type, String config) throws GigiApiException { - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO pingconfig SET domainid=?, type=?, info=?"); - ps.setInt(1, id); - ps.setString(2, type.toString().toLowerCase()); - ps.setString(3, config); - ps.execute(); + public void addPing(DomainPingType type, String config) throws GigiApiException { + try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `pingconfig` SET `domainid`=?, `type`=?::`pingType`, `info`=?")) { + ps.setInt(1, id); + ps.setString(2, type.toString().toLowerCase()); + ps.setString(3, config); + ps.execute(); + } configs = null; } public synchronized void verify(String hash) throws GigiApiException { - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE domainPinglog SET state='success' WHERE challenge=? AND configId IN (SELECT id FROM pingconfig WHERE domainId=?)"); - ps.setString(1, hash); - ps.setInt(2, id); - ps.executeUpdate(); + try (GigiPreparedStatement ps = new GigiPreparedStatement("UPDATE `domainPinglog` SET `state`='success' WHERE `challenge`=? AND `state`='open' AND `configId` IN (SELECT `id` FROM `pingconfig` WHERE `domainid`=? AND `type`='email')")) { + ps.setString(1, hash); + ps.setInt(2, id); + ps.executeUpdate(); + } } public boolean isVerified() { - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT 1 FROM domainPinglog INNER JOIN pingconfig ON pingconfig.id=domainPinglog.configId WHERE domainid=? AND state='success'"); - ps.setInt(1, id); - GigiResultSet rs = ps.executeQuery(); - return rs.next(); + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT 1 FROM `domainPinglog` INNER JOIN `pingconfig` ON `pingconfig`.`id`=`domainPinglog`.`configId` WHERE `domainid`=? AND `state`='success'")) { + ps.setInt(1, id); + GigiResultSet rs = ps.executeQuery(); + return rs.next(); + } } public DomainPingExecution[] getPings() throws GigiApiException { - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT state, type, info, result, configId FROM domainPinglog INNER JOIN pingconfig ON pingconfig.id=domainPinglog.configid WHERE pingconfig.domainid=? ORDER BY `when` DESC;"); - ps.setInt(1, id); - GigiResultSet rs = ps.executeQuery(); - rs.last(); - DomainPingExecution[] contents = new DomainPingExecution[rs.getRow()]; - rs.beforeFirst(); - for (int i = 0; i < contents.length && rs.next(); i++) { - contents[i] = new DomainPingExecution(rs); + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT `state`, `type`, `info`, `result`, `configId`, `when` FROM `domainPinglog` INNER JOIN `pingconfig` ON `pingconfig`.`id`=`domainPinglog`.`configId` WHERE `pingconfig`.`domainid`=? ORDER BY `when` DESC;", true)) { + ps.setInt(1, id); + GigiResultSet rs = ps.executeQuery(); + rs.last(); + DomainPingExecution[] contents = new DomainPingExecution[rs.getRow()]; + rs.beforeFirst(); + for (int i = 0; i < contents.length && rs.next(); i++) { + contents[i] = new DomainPingExecution(rs); + } + return contents; } - return contents; } @@ -273,14 +236,14 @@ public class Domain implements IdCachable, Verifyable { } public static int searchUserIdByDomain(String domain) { - GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT memid FROM domains WHERE domain = ?"); - ps.setString(1, domain); - GigiResultSet res = ps.executeQuery(); - res.beforeFirst(); - if (res.next()) { - return res.getInt(1); - } else { - return -1; + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT `memid` FROM `domains` WHERE `domain` = ?")) { + ps.setString(1, domain); + GigiResultSet res = ps.executeQuery(); + if (res.next()) { + return res.getInt(1); + } else { + return -1; + } } }