import java.util.Map.Entry;
import org.cacert.gigi.GigiApiException;
+import org.cacert.gigi.database.DBEnum;
import org.cacert.gigi.database.GigiPreparedStatement;
import org.cacert.gigi.database.GigiResultSet;
import org.cacert.gigi.output.template.Outputable;
import org.cacert.gigi.output.template.TranslateCommand;
+import org.cacert.gigi.pages.account.certs.CertificateRequest;
import org.cacert.gigi.util.KeyStorage;
-import org.cacert.gigi.util.Notary;
public class Certificate implements IdCachable {
- public enum SANType {
+ public enum SANType implements DBEnum {
EMAIL("email"), DNS("DNS");
private final String opensslName;
public String getOpensslName() {
return opensslName;
}
+
+ @Override
+ public String getDBName() {
+ return opensslName;
+ }
}
public static class SubjectAlternateName implements Comparable<SubjectAlternateName> {
private CACertificate ca;
+ /**
+ * Creates a new Certificate. WARNING: this is an internal API. Creating
+ * certificates for users must be done using the {@link CertificateRequest}
+ * -API.
+ *
+ * @param owner
+ * the owner for whom the certificate should be created.
+ * @param actor
+ * the acting user that creates the certificate
+ * @param dn
+ * the distinguished name of the subject of this certificate (as
+ * Map using OpenSSL-Style keys)
+ * @param md
+ * the {@link Digest} to sign the certificate with
+ * @param csr
+ * the CSR/SPKAC-Request containing the public key in question
+ * @param csrType
+ * the type of the csr parameter
+ * @param profile
+ * the profile under which this certificate is to be issued
+ * @param sans
+ * additional subject alternative names
+ * @throws GigiApiException
+ * in case the request is malformed or internal errors occur
+ * @throws IOException
+ * when the request cannot be written.
+ */
public Certificate(CertificateOwner owner, User actor, HashMap<String, String> dn, Digest md, String csr, CSRType csrType, CertificateProfile profile, SubjectAlternateName... sans) throws GigiApiException, IOException {
if ( !profile.canBeIssuedBy(owner, actor)) {
throw new GigiApiException("You are not allowed to issue these certificates.");
try (GigiPreparedStatement inserter = new GigiPreparedStatement("INSERT INTO certs SET md=?::`mdType`, csr_type=?::`csrType`, crt_name='', memid=?, profile=?")) {
inserter.setString(1, md.toString().toLowerCase());
- inserter.setString(2, csrType.toString());
+ inserter.setString(2, this.csrType.toString());
inserter.setInt(3, owner.getId());
inserter.setInt(4, profile.getId());
inserter.execute();
try (GigiPreparedStatement insertAVA = new GigiPreparedStatement("INSERT INTO `certAvas` SET `certId`=?, name=?, value=?")) {
insertAVA.setInt(1, id);
- for (Entry<String, String> e : dn.entrySet()) {
+ for (Entry<String, String> e : this.dn.entrySet()) {
insertAVA.setString(2, e.getKey());
insertAVA.setString(3, e.getValue());
insertAVA.execute();
File csrFile = KeyStorage.locateCsr(id);
csrName = csrFile.getPath();
try (FileOutputStream fos = new FileOutputStream(csrFile)) {
- fos.write(csr.getBytes("UTF-8"));
+ fos.write(this.csr.getBytes("UTF-8"));
}
try (GigiPreparedStatement updater = new GigiPreparedStatement("UPDATE `certs` SET `csr_name`=? WHERE id=?")) {
updater.setString(1, csrName);
if (getStatus() != CertificateStatus.DRAFT) {
throw new IllegalStateException();
}
- Notary.writeUserAgreement(actor, "CCA", "issue certificate", "", true, 0);
return Job.sign(this, start, period);
}
return null;
}
+
+ public void setLoginEnabled(boolean activate) {
+ if (activate) {
+ if ( !isLoginEnabled()) {
+ try (GigiPreparedStatement prep = new GigiPreparedStatement("INSERT INTO `logincerts` SET `id`=?")) {
+ prep.setInt(1, id);
+ prep.execute();
+ }
+ }
+ } else {
+ try (GigiPreparedStatement prep = new GigiPreparedStatement("DELETE FROM `logincerts` WHERE `id`=?")) {
+ prep.setInt(1, id);
+ prep.execute();
+ }
+ }
+ }
+
+ public boolean isLoginEnabled() {
+ try (GigiPreparedStatement prep = new GigiPreparedStatement("SELECT 1 FROM `logincerts` WHERE `id`=?")) {
+ prep.setInt(1, id);
+ GigiResultSet res = prep.executeQuery();
+ return res.next();
+ }
+ }
+
+ public static Certificate[] findBySerialPattern(String serial) {
+ try (GigiPreparedStatement prep = new GigiPreparedStatement("SELECT `id` FROM `certs` WHERE `serial` LIKE ? GROUP BY `id` LIMIT 100", true)) {
+ prep.setString(1, serial);
+ return fetchCertsToArray(prep);
+ }
+ }
+
+ public static Certificate[] findBySANPattern(String request, SANType type) {
+ try (GigiPreparedStatement prep = new GigiPreparedStatement("SELECT `certId` FROM `subjectAlternativeNames` WHERE `contents` LIKE ? and `type`=?::`SANType` GROUP BY `certId` LIMIT 100", true)) {
+ prep.setString(1, request);
+ prep.setEnum(2, type);
+ return fetchCertsToArray(prep);
+ }
+ }
+
+ private static Certificate[] fetchCertsToArray(GigiPreparedStatement prep) {
+ GigiResultSet res = prep.executeQuery();
+ res.last();
+ Certificate[] certs = new Certificate[res.getRow()];
+ res.beforeFirst();
+ for (int i = 0; res.next(); i++) {
+ certs[i] = Certificate.getById(res.getInt(1));
+ }
+ return certs;
+ }
}