]> WPIA git - gigi.git/blob - src/club/wpia/gigi/pages/RootCertPage.java
chg: add appName to filename for root certificate download
[gigi.git] / src / club / wpia / gigi / pages / RootCertPage.java
1 package club.wpia.gigi.pages;
2
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;
13 import java.util.Map;
14
15 import javax.servlet.ServletOutputStream;
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
18
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;
25
26 public class RootCertPage extends Page {
27
28     private final Certificate root;
29
30     private final CACertificate[] cs;
31
32     private final OutputableCertificate rootP;
33
34     private final String appName = ServerConstants.getAppName().toLowerCase();
35
36     private class OutputableCertificate implements Outputable {
37
38         private final CACertificate target;
39
40         private final OutputableCertificate[] children;
41
42         public OutputableCertificate(CACertificate c) {
43             target = 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));
48                 }
49             }
50
51             Collections.sort(children, new Comparator<OutputableCertificate>() {
52
53                 @Override
54                 public int compare(OutputableCertificate o1, OutputableCertificate o2) {
55                     return o1.target.getKeyname().compareTo(o2.target.getKeyname());
56                 }
57             });
58             this.children = children.toArray(new OutputableCertificate[children.size()]);
59         }
60
61         @Override
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()));
65             out.println("</a>");
66             out.println(HTMLEncoder.encodeHTML(target.getCertificate().getSubjectX500Principal().toString()));
67             out.println("<ul>");
68             for (OutputableCertificate c : children) {
69                 out.print("<li>");
70                 c.output(out, l, vars);
71                 out.print("</li>");
72             }
73             out.println("</ul>");
74         }
75
76     }
77
78     public RootCertPage(KeyStore ks) {
79         super("Root Certificates");
80         try {
81             root = ks.getCertificate("root");
82         } catch (KeyStoreException e) {
83             throw new Error(e);
84         }
85         cs = CACertificate.getAll();
86         CACertificate rootC = null;
87         for (CACertificate c : cs) {
88             if (c.isSelfsigned()) {
89                 rootC = c;
90                 break;
91             }
92         }
93         if (rootC == null) {
94             throw new Error();
95         }
96         rootP = new OutputableCertificate(rootC);
97     }
98
99     @Override
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();
105             try {
106                 out.println(PEM.encode("CERTIFICATE", root.getEncoded()));
107             } catch (CertificateEncodingException e) {
108                 e.printStackTrace();
109             }
110             return true;
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();
115             try {
116                 out.write(root.getEncoded());
117             } catch (CertificateEncodingException e) {
118                 e.printStackTrace();
119             }
120             return true;
121         }
122         return false;
123     }
124
125     @Override
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);
130
131     }
132
133     @Override
134     public boolean needsLogin() {
135         return false;
136     }
137
138 }