]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/account/Certificates.java
Convert Pinglog into form.
[gigi.git] / src / org / cacert / gigi / pages / account / Certificates.java
1 package org.cacert.gigi.pages.account;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.net.URLEncoder;
6 import java.security.GeneralSecurityException;
7 import java.security.cert.X509Certificate;
8 import java.sql.SQLException;
9 import java.util.HashMap;
10
11 import javax.servlet.ServletOutputStream;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14
15 import org.cacert.gigi.dbObjects.Certificate;
16 import org.cacert.gigi.dbObjects.User;
17 import org.cacert.gigi.output.CertificateIterable;
18 import org.cacert.gigi.output.template.Template;
19 import org.cacert.gigi.pages.LoginPage;
20 import org.cacert.gigi.pages.Page;
21 import org.cacert.gigi.util.PEM;
22
23 public class Certificates extends Page {
24
25     private Template certDisplay = new Template(Certificates.class.getResource("CertificateDisplay.templ"));
26
27     public static final String PATH = "/account/certs";
28
29     public Certificates() {
30         super("Certificates");
31     }
32
33     @Override
34     public boolean beforeTemplate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
35
36         String pi = req.getPathInfo().substring(PATH.length());
37         if (pi.length() == 0) {
38             return false;
39         }
40         pi = pi.substring(1);
41         boolean crt = false;
42         boolean cer = false;
43         resp.setContentType("application/pkix-cert");
44         if (pi.endsWith(".crt")) {
45             crt = true;
46             pi = pi.substring(0, pi.length() - 4);
47         } else if (pi.endsWith(".cer")) {
48             if (req.getParameter("install") != null) {
49                 resp.setContentType("application/x-x509-user-cert");
50             }
51             cer = true;
52             pi = pi.substring(0, pi.length() - 4);
53         } else if (pi.endsWith(".cer")) {
54             cer = true;
55             pi = pi.substring(0, pi.length() - 4);
56         }
57         String serial = pi;
58         try {
59             Certificate c = Certificate.getBySerial(serial);
60             if (c == null || getUser(req).getId() != c.getOwnerId()) {
61                 resp.sendError(404);
62                 return true;
63             }
64             X509Certificate cert = c.cert();
65             if ( !crt && !cer) {
66                 return false;
67             }
68             ServletOutputStream out = resp.getOutputStream();
69             if (crt) {
70                 out.println(PEM.encode("CERTIFICATE", cert.getEncoded()));
71             } else if (cer) {
72                 out.write(cert.getEncoded());
73             }
74         } catch (IllegalArgumentException e) {
75             resp.sendError(404);
76             return true;
77         } catch (GeneralSecurityException e) {
78             resp.sendError(404);
79             return true;
80         } catch (SQLException e) {
81             resp.sendError(404);
82             return true;
83         }
84
85         return true;
86     }
87
88     private Template certTable = new Template(CertificateIterable.class.getResource("CertificateTable.templ"));
89
90     @Override
91     public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
92         PrintWriter out = resp.getWriter();
93         String pi = req.getPathInfo().substring(PATH.length());
94         if (pi.length() != 0) {
95             pi = pi.substring(1);
96
97             String serial = pi;
98             Certificate c = Certificate.getBySerial(serial);
99             if (c == null || LoginPage.getUser(req).getId() != c.getOwnerId()) {
100                 resp.sendError(404);
101                 return;
102             }
103             HashMap<String, Object> vars = new HashMap<>();
104             vars.put("serial", URLEncoder.encode(serial, "UTF-8"));
105             try {
106                 vars.put("cert", c.cert());
107             } catch (GeneralSecurityException e) {
108                 e.printStackTrace();
109             } catch (SQLException e) {
110                 e.printStackTrace();
111             }
112             certDisplay.output(out, getLanguage(req), vars);
113
114             return;
115         }
116
117         HashMap<String, Object> vars = new HashMap<String, Object>();
118         User us = LoginPage.getUser(req);
119         vars.put("certs", new CertificateIterable(us.getCertificates()));
120         certTable.output(out, getLanguage(req), vars);
121     }
122
123 }