From: Felix Dörre Date: Sun, 8 Oct 2017 15:22:05 +0000 (+0200) Subject: add: show more certificates on the "roots" page X-Git-Url: https://code.wpia.club/?p=gigi.git;a=commitdiff_plain;h=189f4896bdfa004f3b6a8df7794cc9a2cf0ae09e add: show more certificates on the "roots" page Change-Id: I2a2acbba4636bc54b93d4f3022543a66a296ec6c --- diff --git a/src/club/wpia/gigi/dbObjects/CACertificate.java b/src/club/wpia/gigi/dbObjects/CACertificate.java index 5953059f..1240cd89 100644 --- a/src/club/wpia/gigi/dbObjects/CACertificate.java +++ b/src/club/wpia/gigi/dbObjects/CACertificate.java @@ -8,6 +8,7 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.ArrayDeque; +import java.util.Arrays; import java.util.Deque; import java.util.HashMap; @@ -30,6 +31,10 @@ public class CACertificate implements IdCachable { private final String link; + private static final CACertificate[] instances; + + private static ObjectCache myCache = new ObjectCache<>(); + private CACertificate(int id) { this.id = id; int parentRoot; @@ -78,6 +83,17 @@ public class CACertificate implements IdCachable { static { try { update(); + try (GigiPreparedStatement q = new GigiPreparedStatement("SELECT `id` FROM `cacerts`", true)) { + GigiResultSet res = q.executeQuery(); + res.last(); + CACertificate[] certs = new CACertificate[res.getRow()]; + res.beforeFirst(); + int i = 0; + while (res.next()) { + certs[i++] = getById(res.getInt(1)); + } + instances = certs; + } } catch (CertificateException e) { throw new Error(e); } catch (FileNotFoundException e) { @@ -161,8 +177,6 @@ public class CACertificate implements IdCachable { return id; } - private static ObjectCache myCache = new ObjectCache<>(); - public String getKeyname() { return keyname; } @@ -183,4 +197,8 @@ public class CACertificate implements IdCachable { return this == getParent(); } + public static synchronized CACertificate[] getAll() { + return Arrays.copyOf(instances, instances.length); + } + } diff --git a/src/club/wpia/gigi/pages/RootCertPage.java b/src/club/wpia/gigi/pages/RootCertPage.java index c821e7c4..9d1d9c90 100644 --- a/src/club/wpia/gigi/pages/RootCertPage.java +++ b/src/club/wpia/gigi/pages/RootCertPage.java @@ -1,29 +1,96 @@ package club.wpia.gigi.pages; import java.io.IOException; +import java.io.PrintWriter; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.cert.Certificate; import java.security.cert.CertificateEncodingException; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import club.wpia.gigi.dbObjects.CACertificate; +import club.wpia.gigi.localisation.Language; +import club.wpia.gigi.output.template.Outputable; +import club.wpia.gigi.util.HTMLEncoder; import club.wpia.gigi.util.PEM; public class RootCertPage extends Page { - private Certificate root; + private final Certificate root; + + private final CACertificate[] cs; + + private final OutputableCertificate rootP; + + private class OutputableCertificate implements Outputable { + + private final CACertificate target; + + private final OutputableCertificate[] children; + + public OutputableCertificate(CACertificate c) { + target = c; + LinkedList children = new LinkedList<>(); + for (CACertificate c0 : cs) { + if (c0.getParent() == c && c0 != c) { + children.add(new OutputableCertificate(c0)); + } + } + + Collections.sort(children, new Comparator() { + + @Override + public int compare(OutputableCertificate o1, OutputableCertificate o2) { + return o1.target.getKeyname().compareTo(o2.target.getKeyname()); + } + }); + this.children = children.toArray(new OutputableCertificate[children.size()]); + } + + @Override + public void output(PrintWriter out, Language l, Map vars) { + out.println(""); + out.println(HTMLEncoder.encodeHTML(target.getKeyname())); + out.println(""); + out.println(HTMLEncoder.encodeHTML(target.getCertificate().getSubjectX500Principal().toString())); + out.println("
    "); + for (OutputableCertificate c : children) { + out.print("
  • "); + c.output(out, l, vars); + out.print("
  • "); + } + out.println("
"); + } + + } public RootCertPage(KeyStore ks) { super("Root Certificates"); try { root = ks.getCertificate("root"); } catch (KeyStoreException e) { - e.printStackTrace(); + throw new Error(e); + } + cs = CACertificate.getAll(); + CACertificate rootC = null; + for (CACertificate c : cs) { + if (c.isSelfsigned()) { + rootC = c; + break; + } + } + if (rootC == null) { + throw new Error(); } + rootP = new OutputableCertificate(rootC); } @Override @@ -52,7 +119,9 @@ public class RootCertPage extends Page { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { - getDefaultTemplate().output(resp.getWriter(), getLanguage(req), new HashMap()); + HashMap map = new HashMap(); + map.put("root", rootP); + getDefaultTemplate().output(resp.getWriter(), getLanguage(req), map); } diff --git a/src/club/wpia/gigi/pages/RootCertPage.templ b/src/club/wpia/gigi/pages/RootCertPage.templ index cd65445a..060fdfd4 100644 --- a/src/club/wpia/gigi/pages/RootCertPage.templ +++ b/src/club/wpia/gigi/pages/RootCertPage.templ @@ -1,2 +1,8 @@
-PEM CER +PEM DER +

+ +

+
+ +