]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/account/certs/Certificates.java
Merge branch 'libs/jetty/local'
[gigi.git] / src / org / cacert / gigi / pages / account / certs / Certificates.java
1 package org.cacert.gigi.pages.account.certs;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.net.URLEncoder;
6 import java.security.GeneralSecurityException;
7 import java.util.HashMap;
8 import java.util.Map;
9
10 import javax.servlet.ServletOutputStream;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import org.cacert.gigi.dbObjects.CACertificate;
15 import org.cacert.gigi.dbObjects.Certificate;
16 import org.cacert.gigi.localisation.Language;
17 import org.cacert.gigi.output.template.Form;
18 import org.cacert.gigi.output.template.IterableDataset;
19 import org.cacert.gigi.output.template.Template;
20 import org.cacert.gigi.pages.HandlesMixedRequest;
21 import org.cacert.gigi.pages.LoginPage;
22 import org.cacert.gigi.pages.Page;
23 import org.cacert.gigi.util.CertExporter;
24 import org.cacert.gigi.util.PEM;
25
26 public class Certificates extends Page implements HandlesMixedRequest {
27
28     private Template certDisplay = new Template(Certificates.class.getResource("CertificateDisplay.templ"));
29
30     public static final String PATH = "/account/certs";
31
32     static class TrustchainIterable implements IterableDataset {
33
34         CACertificate cert;
35
36         public TrustchainIterable(CACertificate cert) {
37             this.cert = cert;
38         }
39
40         @Override
41         public boolean next(Language l, Map<String, Object> vars) {
42             if (cert == null) {
43                 return false;
44             }
45             vars.put("name", cert.getKeyname());
46             vars.put("link", cert.getLink());
47             if (cert.isSelfsigned()) {
48                 cert = null;
49                 return true;
50             }
51             cert = cert.getParent();
52             return true;
53         }
54
55     }
56
57     public Certificates() {
58         super("Certificates");
59     }
60
61     @Override
62     public boolean beforeTemplate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
63
64         String pi = req.getPathInfo().substring(PATH.length());
65         if (pi.length() == 0) {
66             return false;
67         }
68         pi = pi.substring(1);
69         boolean crt = false;
70         boolean cer = false;
71         resp.setContentType("application/pkix-cert");
72         if (req.getParameter("install") != null) {
73             resp.setContentType("application/x-x509-user-cert");
74         }
75         if (pi.endsWith(".crt")) {
76             crt = true;
77             pi = pi.substring(0, pi.length() - 4);
78         } else if (pi.endsWith(".cer")) {
79             cer = true;
80             pi = pi.substring(0, pi.length() - 4);
81         }
82         String serial = pi;
83         try {
84             Certificate c = Certificate.getBySerial(serial);
85             if (c == null || LoginPage.getAuthorizationContext(req).getTarget().getId() != c.getOwner().getId()) {
86                 resp.sendError(404);
87                 return true;
88             }
89             if ( !crt && !cer) {
90                 return false;
91             }
92             ServletOutputStream out = resp.getOutputStream();
93             boolean doChain = req.getParameter("chain") != null;
94             boolean includeAnchor = req.getParameter("noAnchor") == null;
95             if (crt) {
96                 CertExporter.writeCertCrt(c, out, doChain, includeAnchor);
97             } else if (cer) {
98                 CertExporter.writeCertCer(c, out, doChain, includeAnchor);
99             }
100         } catch (IllegalArgumentException e) {
101             resp.sendError(404);
102             return true;
103         } catch (GeneralSecurityException e) {
104             resp.sendError(404);
105             return true;
106         }
107
108         return true;
109     }
110
111     @Override
112     public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
113         if (req.getQueryString() != null && !req.getQueryString().equals("") && !req.getQueryString().equals("withRevoked")) {
114             return;// Block actions by get parameters.
115         }
116         if ( !req.getPathInfo().equals(PATH)) {
117             resp.sendError(500);
118             return;
119         }
120         Form.getForm(req, CertificateModificationForm.class).submit(resp.getWriter(), req);
121         doGet(req, resp);
122     }
123
124     @Override
125     public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
126         PrintWriter out = resp.getWriter();
127         String pi = req.getPathInfo().substring(PATH.length());
128         if (pi.length() != 0) {
129             pi = pi.substring(1);
130
131             String serial = pi;
132             Certificate c = Certificate.getBySerial(serial);
133             if (c == null || LoginPage.getAuthorizationContext(req).getTarget().getId() != c.getOwner().getId()) {
134                 resp.sendError(404);
135                 return;
136             }
137             HashMap<String, Object> vars = new HashMap<>();
138             vars.put("serial", URLEncoder.encode(serial, "UTF-8"));
139             vars.put("trustchain", new TrustchainIterable(c.getParent()));
140             try {
141                 vars.put("cert", PEM.encode("CERTIFICATE", c.cert().getEncoded()));
142             } catch (GeneralSecurityException e) {
143                 e.printStackTrace();
144             }
145             certDisplay.output(out, getLanguage(req), vars);
146
147             return;
148         }
149
150         HashMap<String, Object> vars = new HashMap<String, Object>();
151         new CertificateModificationForm(req, req.getParameter("withRevoked") != null).output(out, getLanguage(req), vars);
152     }
153
154 }