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