]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/account/MailCertificates.java
Better display of encoded 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                 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                 int serial = 0;
49                 try {
50                         serial = Integer.parseInt(pi);
51                 } catch (NumberFormatException nfe) {
52                         resp.sendError(404);
53                         return true;
54                 }
55                 try {
56                         Certificate c = new Certificate(serial);
57                         if (LoginPage.getUser(req).getId() != c.getOwnerId()) {
58                                 resp.sendError(404);
59                                 return true;
60                         }
61                         X509Certificate cert = c.cert();
62                         if (!crt && !cer) {
63                                 return false;
64                         }
65                         ServletOutputStream out = resp.getOutputStream();
66                         if (crt) {
67                                 out.println("-----BEGIN CERTIFICATE-----");
68                                 String block = Base64.getEncoder().encodeToString(cert.getEncoded()).replaceAll("(.{64})(?=.)", "$1\n");
69                                 out.println(block);
70                                 out.println("-----END CERTIFICATE-----");
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         @Override
89         public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
90                 PrintWriter out = resp.getWriter();
91                 String pi = req.getPathInfo().substring(PATH.length());
92                 if (pi.length() != 0) {
93                         pi = pi.substring(1);
94
95                         int serial = 0;
96                         try {
97                                 serial = Integer.parseInt(pi);
98                         } catch (NumberFormatException nfe) {
99                         }
100                         Certificate c = null;
101                         if (serial != 0) {
102                                 c = new Certificate(serial);
103                         }
104                         if (c == null || LoginPage.getUser(req).getId() != c.getOwnerId()) {
105                                 resp.sendError(404);
106                                 return;
107                         }
108                         out.print("<a href='");
109                         out.print(serial);
110                         out.print(".crt'>");
111                         out.print(translate(req, "PEM encoded Certificate"));
112                         out.println("</a><br/>");
113
114                         out.print("<a href='");
115                         out.print(serial);
116                         out.print(".cer'>");
117                         out.print(translate(req, "DER encoded Certificate"));
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 }