1 package club.wpia.gigi.pages;
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.security.KeyStore;
6 import java.security.KeyStoreException;
7 import java.security.cert.Certificate;
8 import java.security.cert.CertificateEncodingException;
9 import java.util.Collections;
10 import java.util.Comparator;
11 import java.util.HashMap;
12 import java.util.LinkedList;
15 import javax.servlet.ServletOutputStream;
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
19 import club.wpia.gigi.dbObjects.CACertificate;
20 import club.wpia.gigi.localisation.Language;
21 import club.wpia.gigi.output.template.Outputable;
22 import club.wpia.gigi.util.HTMLEncoder;
23 import club.wpia.gigi.util.PEM;
25 public class RootCertPage extends Page {
27 private final Certificate root;
29 private final CACertificate[] cs;
31 private final OutputableCertificate rootP;
33 private class OutputableCertificate implements Outputable {
35 private final CACertificate target;
37 private final OutputableCertificate[] children;
39 public OutputableCertificate(CACertificate c) {
41 LinkedList<OutputableCertificate> children = new LinkedList<>();
42 for (CACertificate c0 : cs) {
43 if (c0.getParent() == c && c0 != c) {
44 children.add(new OutputableCertificate(c0));
48 Collections.sort(children, new Comparator<OutputableCertificate>() {
51 public int compare(OutputableCertificate o1, OutputableCertificate o2) {
52 return o1.target.getKeyname().compareTo(o2.target.getKeyname());
55 this.children = children.toArray(new OutputableCertificate[children.size()]);
59 public void output(PrintWriter out, Language l, Map<String, Object> vars) {
60 out.println("<a href='" + HTMLEncoder.encodeHTML(target.getLink()) + "'>");
61 out.println(HTMLEncoder.encodeHTML(target.getKeyname()));
63 out.println(HTMLEncoder.encodeHTML(target.getCertificate().getSubjectX500Principal().toString()));
65 for (OutputableCertificate c : children) {
67 c.output(out, l, vars);
75 public RootCertPage(KeyStore ks) {
76 super("Root Certificates");
78 root = ks.getCertificate("root");
79 } catch (KeyStoreException e) {
82 cs = CACertificate.getAll();
83 CACertificate rootC = null;
84 for (CACertificate c : cs) {
85 if (c.isSelfsigned()) {
93 rootP = new OutputableCertificate(rootC);
97 public boolean beforeTemplate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
98 if (req.getParameter("pem") != null && root != null) {
99 resp.setContentType("application/x-x509-ca-cert");
100 ServletOutputStream out = resp.getOutputStream();
102 out.println(PEM.encode("CERTIFICATE", root.getEncoded()));
103 } catch (CertificateEncodingException e) {
107 } else if (req.getParameter("cer") != null && root != null) {
108 resp.setContentType("application/x-x509-ca-cert");
109 ServletOutputStream out = resp.getOutputStream();
111 out.write(root.getEncoded());
112 } catch (CertificateEncodingException e) {
121 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
122 HashMap<String, Object> map = new HashMap<String, Object>();
123 map.put("root", rootP);
124 getDefaultTemplate().output(resp.getWriter(), getLanguage(req), map);
129 public boolean needsLogin() {