]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/account/MailCertificates.java
SPKAC: add intstall link for signed certificates.
[gigi.git] / src / org / cacert / gigi / pages / account / MailCertificates.java
1 package org.cacert.gigi.pages.account;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.security.GeneralSecurityException;
6 import java.security.cert.X509Certificate;
7 import java.sql.PreparedStatement;
8 import java.sql.ResultSet;
9 import java.sql.SQLException;
10 import java.util.Base64;
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.pages.LoginPage;
22 import org.cacert.gigi.pages.Page;
23
24 public class MailCertificates extends Page {
25         CertificateTable myTable = new CertificateTable("mailcerts");
26         public static final String PATH = "/account/certs/email";
27
28         public MailCertificates() {
29                 super("Email Certificates");
30         }
31
32         @Override
33         public boolean beforeTemplate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
34
35                 String pi = req.getPathInfo().substring(PATH.length());
36                 if (pi.length() == 0) {
37                         return false;
38                 }
39                 pi = pi.substring(1);
40                 boolean crt = false;
41                 boolean cer = false;
42                 resp.setContentType("application/pkix-cert");
43                 if (pi.endsWith(".crt")) {
44                         crt = true;
45                         pi = pi.substring(0, pi.length() - 4);
46                 } else if (pi.endsWith(".cer")) {
47                         if (req.getParameter("install") != null) {
48                                 resp.setContentType("application/x-x509-user-cert");
49                         }
50                         cer = true;
51                         pi = pi.substring(0, pi.length() - 4);
52                 } else if (pi.endsWith(".cer")) {
53                         cer = true;
54                         pi = pi.substring(0, pi.length() - 4);
55                 }
56                 String serial = pi;
57                 try {
58                         Certificate c = Certificate.getBySerial(serial);
59                         if (c == null || LoginPage.getUser(req).getId() != c.getOwnerId()) {
60                                 resp.sendError(404);
61                                 return true;
62                         }
63                         X509Certificate cert = c.cert();
64                         if (!crt && !cer) {
65                                 return false;
66                         }
67                         ServletOutputStream out = resp.getOutputStream();
68                         if (crt) {
69                                 out.println("-----BEGIN CERTIFICATE-----");
70                                 String block = Base64.getEncoder().encodeToString(cert.getEncoded()).replaceAll("(.{64})(?=.)", "$1\n");
71                                 out.println(block);
72                                 out.println("-----END CERTIFICATE-----");
73                         } else if (cer) {
74                                 out.write(cert.getEncoded());
75                         }
76                 } catch (IllegalArgumentException e) {
77                         resp.sendError(404);
78                         return true;
79                 } catch (GeneralSecurityException e) {
80                         resp.sendError(404);
81                         return true;
82                 } catch (SQLException e) {
83                         resp.sendError(404);
84                         return true;
85                 }
86
87                 return true;
88         }
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                         out.print("<a href='");
104                         out.print(serial);
105                         out.print(".crt'>");
106                         out.print(translate(req, "PEM encoded Certificate"));
107                         out.println("</a><br/>");
108
109                         out.print("<a href='");
110                         out.print(serial);
111                         out.print(".cer'>");
112                         out.print(translate(req, "DER encoded Certificate"));
113                         out.println("</a><br/>");
114                         out.print("<a href='");
115                         out.print(serial);
116                         out.print(".cer?install'>");
117                         out.print(translate(req, "Install into browser."));
118                         out.println("</a><br/>");
119
120                         out.println("<pre>");
121                         try {
122                                 X509Certificate cert = c.cert();
123                                 out.print(cert);
124                         } catch (GeneralSecurityException e) {
125                                 e.printStackTrace();
126                         } catch (SQLException e) {
127                                 e.printStackTrace();
128                         }
129                         out.println("</pre>");
130                         return;
131                 }
132
133                 HashMap<String, Object> vars = new HashMap<String, Object>();
134                 User us = LoginPage.getUser(req);
135                 try {
136                         PreparedStatement ps = DatabaseConnection.getInstance().prepare(
137                                 "SELECT `id`, `CN`, `serial`, `revoked`, `expire`, `disablelogin` FROM `emailcerts` WHERE `memid`=?");
138                         ps.setInt(1, us.getId());
139                         ResultSet rs = ps.executeQuery();
140                         vars.put("mailcerts", rs);
141                         myTable.output(out, getLanguage(req), vars);
142                         rs.close();
143                 } catch (SQLException e) {
144                         e.printStackTrace();
145                 }
146         }
147
148 }