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;
24 import club.wpia.gigi.util.ServerConstants;
26 public class RootCertPage extends Page {
28 private final Certificate root;
30 private final CACertificate[] cs;
32 private final OutputableCertificate rootP;
34 private final String appName = ServerConstants.getAppName().toLowerCase();
36 private class OutputableCertificate implements Outputable {
38 private final CACertificate target;
40 private final OutputableCertificate[] children;
42 public OutputableCertificate(CACertificate c) {
44 LinkedList<OutputableCertificate> children = new LinkedList<>();
45 for (CACertificate c0 : cs) {
46 if (c0.getParent() == c && c0 != c) {
47 children.add(new OutputableCertificate(c0));
51 Collections.sort(children, new Comparator<OutputableCertificate>() {
54 public int compare(OutputableCertificate o1, OutputableCertificate o2) {
55 return o1.target.getKeyname().compareTo(o2.target.getKeyname());
58 this.children = children.toArray(new OutputableCertificate[children.size()]);
62 public void output(PrintWriter out, Language l, Map<String, Object> vars) {
63 out.println("<a href='" + HTMLEncoder.encodeHTML(target.getLink()) + "'>");
64 out.println(HTMLEncoder.encodeHTML(target.getKeyname()));
66 out.println(HTMLEncoder.encodeHTML(target.getCertificate().getSubjectX500Principal().toString()));
68 for (OutputableCertificate c : children) {
70 c.output(out, l, vars);
78 public RootCertPage(KeyStore ks) {
79 super("Root Certificates");
81 root = ks.getCertificate("root");
82 } catch (KeyStoreException e) {
85 cs = CACertificate.getAll();
86 CACertificate rootC = null;
87 for (CACertificate c : cs) {
88 if (c.isSelfsigned()) {
96 rootP = new OutputableCertificate(rootC);
100 public boolean beforeTemplate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
101 if (req.getParameter("pem") != null && root != null) {
102 resp.setContentType("application/x-x509-ca-cert");
103 resp.setHeader("Content-Disposition", "attachment; filename=\"" + appName + "_roots.crt\"");
104 ServletOutputStream out = resp.getOutputStream();
106 out.println(PEM.encode("CERTIFICATE", root.getEncoded()));
107 } catch (CertificateEncodingException e) {
111 } else if (req.getParameter("cer") != null && root != null) {
112 resp.setContentType("application/x-x509-ca-cert");
113 resp.setHeader("Content-Disposition", "attachment; filename=\"" + appName + "_roots.cer\"");
114 ServletOutputStream out = resp.getOutputStream();
116 out.write(root.getEncoded());
117 } catch (CertificateEncodingException e) {
126 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
127 HashMap<String, Object> map = new HashMap<String, Object>();
128 map.put("root", rootP);
129 getDefaultTemplate().output(resp.getWriter(), getLanguage(req), map);
134 public boolean needsLogin() {