]> WPIA git - gigi.git/blobdiff - src/club/wpia/gigi/pages/RootCertPage.java
add: show more certificates on the "roots" page
[gigi.git] / src / club / wpia / gigi / pages / RootCertPage.java
index c821e7c426aa6c13e757b824a229c232980282a9..9d1d9c90eff4ec01f5f7ba1fc22adac68048a25e 100644 (file)
@@ -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<OutputableCertificate> children = new LinkedList<>();
+            for (CACertificate c0 : cs) {
+                if (c0.getParent() == c && c0 != c) {
+                    children.add(new OutputableCertificate(c0));
+                }
+            }
+
+            Collections.sort(children, new Comparator<OutputableCertificate>() {
+
+                @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<String, Object> vars) {
+            out.println("<a href='" + HTMLEncoder.encodeHTML(target.getLink()) + "'>");
+            out.println(HTMLEncoder.encodeHTML(target.getKeyname()));
+            out.println("</a>");
+            out.println(HTMLEncoder.encodeHTML(target.getCertificate().getSubjectX500Principal().toString()));
+            out.println("<ul>");
+            for (OutputableCertificate c : children) {
+                out.print("<li>");
+                c.output(out, l, vars);
+                out.print("</li>");
+            }
+            out.println("</ul>");
+        }
+
+    }
 
     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<String, Object>());
+        HashMap<String, Object> map = new HashMap<String, Object>();
+        map.put("root", rootP);
+        getDefaultTemplate().output(resp.getWriter(), getLanguage(req), map);
 
     }