]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/account/MailCertificates.java
Serials are in fact Strings.
[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                 String pi = req.getPathInfo().substring(PATH.length());
35                 if (pi.length() == 0) {
36                         return false;
37                 }
38                 pi = pi.substring(1);
39                 boolean crt = false;
40                 boolean cer = false;
41                 if (pi.endsWith(".crt")) {
42                         crt = true;
43                         pi = pi.substring(0, pi.length() - 4);
44                 } else if (pi.endsWith(".cer")) {
45                         cer = true;
46                         pi = pi.substring(0, pi.length() - 4);
47                 }
48                 String serial = pi;
49                 try {
50                         Certificate c = Certificate.getBySerial(serial);
51                         if (c == null || LoginPage.getUser(req).getId() != c.getOwnerId()) {
52                                 resp.sendError(404);
53                                 return true;
54                         }
55                         X509Certificate cert = c.cert();
56                         if (!crt && !cer) {
57                                 return false;
58                         }
59                         ServletOutputStream out = resp.getOutputStream();
60                         if (crt) {
61                                 out.println("-----BEGIN CERTIFICATE-----");
62                                 String block = Base64.getEncoder().encodeToString(cert.getEncoded()).replaceAll("(.{64})(?=.)", "$1\n");
63                                 out.println(block);
64                                 out.println("-----END CERTIFICATE-----");
65                         } else if (cer) {
66                                 out.write(cert.getEncoded());
67                         }
68                 } catch (IllegalArgumentException e) {
69                         resp.sendError(404);
70                         return true;
71                 } catch (GeneralSecurityException e) {
72                         resp.sendError(404);
73                         return true;
74                 } catch (SQLException e) {
75                         resp.sendError(404);
76                         return true;
77                 }
78
79                 return true;
80         }
81
82         @Override
83         public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
84                 PrintWriter out = resp.getWriter();
85                 String pi = req.getPathInfo().substring(PATH.length());
86                 if (pi.length() != 0) {
87                         pi = pi.substring(1);
88
89                         String serial = pi;
90                         Certificate c = Certificate.getBySerial(serial);
91                         if (c == null || LoginPage.getUser(req).getId() != c.getOwnerId()) {
92                                 resp.sendError(404);
93                                 return;
94                         }
95                         out.print("<a href='");
96                         out.print(serial);
97                         out.print(".crt'>");
98                         out.print(translate(req, "PEM encoded Certificate"));
99                         out.println("</a><br/>");
100
101                         out.print("<a href='");
102                         out.print(serial);
103                         out.print(".cer'>");
104                         out.print(translate(req, "DER encoded Certificate"));
105                         out.println("</a><br/>");
106
107                         out.println("<pre>");
108                         try {
109                                 X509Certificate cert = c.cert();
110                                 out.print(cert);
111                         } catch (GeneralSecurityException e) {
112                                 e.printStackTrace();
113                         } catch (SQLException e) {
114                                 e.printStackTrace();
115                         }
116                         out.println("</pre>");
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(
124                                 "SELECT `id`, `CN`, `serial`, `revoked`, `expire`, `disablelogin` FROM `emailcerts` WHERE `memid`=?");
125                         ps.setInt(1, us.getId());
126                         ResultSet rs = ps.executeQuery();
127                         vars.put("mailcerts", rs);
128                         myTable.output(out, getLanguage(req), vars);
129                         rs.close();
130                 } catch (SQLException e) {
131                         e.printStackTrace();
132                 }
133         }
134
135 }