]> WPIA git - gigi.git/blobdiff - src/org/cacert/gigi/pages/account/MailCertificates.java
Factor out email sending from "Signup".
[gigi.git] / src / org / cacert / gigi / pages / account / MailCertificates.java
index 6eae585a2c787cee2ab2691712e58346713feffc..de8c1ca010c1cde5d5fd2b7727896b3823cf6a81 100644 (file)
@@ -3,11 +3,14 @@ package org.cacert.gigi.pages.account;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.security.GeneralSecurityException;
+import java.security.cert.X509Certificate;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Base64;
 import java.util.HashMap;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -27,18 +30,97 @@ public class MailCertificates extends Page {
        }
 
        @Override
-       public void doGet(HttpServletRequest req, HttpServletResponse resp)
-                       throws IOException {
+       public boolean beforeTemplate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+
+               String pi = req.getPathInfo().substring(PATH.length());
+               if (pi.length() == 0) {
+                       return false;
+               }
+               pi = pi.substring(1);
+               boolean crt = false;
+               boolean cer = false;
+               resp.setContentType("application/pkix-cert");
+               if (pi.endsWith(".crt")) {
+                       crt = true;
+                       pi = pi.substring(0, pi.length() - 4);
+               } else if (pi.endsWith(".cer")) {
+                       if (req.getParameter("install") != null) {
+                               resp.setContentType("application/x-x509-user-cert");
+                       }
+                       cer = true;
+                       pi = pi.substring(0, pi.length() - 4);
+               } else if (pi.endsWith(".cer")) {
+                       cer = true;
+                       pi = pi.substring(0, pi.length() - 4);
+               }
+               String serial = pi;
+               try {
+                       Certificate c = Certificate.getBySerial(serial);
+                       if (c == null || LoginPage.getUser(req).getId() != c.getOwnerId()) {
+                               resp.sendError(404);
+                               return true;
+                       }
+                       X509Certificate cert = c.cert();
+                       if (!crt && !cer) {
+                               return false;
+                       }
+                       ServletOutputStream out = resp.getOutputStream();
+                       if (crt) {
+                               out.println("-----BEGIN CERTIFICATE-----");
+                               String block = Base64.getEncoder().encodeToString(cert.getEncoded()).replaceAll("(.{64})(?=.)", "$1\n");
+                               out.println(block);
+                               out.println("-----END CERTIFICATE-----");
+                       } else if (cer) {
+                               out.write(cert.getEncoded());
+                       }
+               } catch (IllegalArgumentException e) {
+                       resp.sendError(404);
+                       return true;
+               } catch (GeneralSecurityException e) {
+                       resp.sendError(404);
+                       return true;
+               } catch (SQLException e) {
+                       resp.sendError(404);
+                       return true;
+               }
+
+               return true;
+       }
+
+       @Override
+       public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
                PrintWriter out = resp.getWriter();
                String pi = req.getPathInfo().substring(PATH.length());
                if (pi.length() != 0) {
                        pi = pi.substring(1);
-                       int id = Integer.parseInt(pi);
-                       Certificate c = new Certificate(id);
-                       // TODO check ownership
+
+                       String serial = pi;
+                       Certificate c = Certificate.getBySerial(serial);
+                       if (c == null || LoginPage.getUser(req).getId() != c.getOwnerId()) {
+                               resp.sendError(404);
+                               return;
+                       }
+                       out.print("<a href='");
+                       out.print(serial);
+                       out.print(".crt'>");
+                       out.print(translate(req, "PEM encoded Certificate"));
+                       out.println("</a><br/>");
+
+                       out.print("<a href='");
+                       out.print(serial);
+                       out.print(".cer'>");
+                       out.print(translate(req, "DER encoded Certificate"));
+                       out.println("</a><br/>");
+                       out.print("<a href='");
+                       out.print(serial);
+                       out.print(".cer?install'>");
+                       out.print(translate(req, "Install into browser."));
+                       out.println("</a><br/>");
+
                        out.println("<pre>");
                        try {
-                               out.print(c.cert());
+                               X509Certificate cert = c.cert();
+                               out.print(cert);
                        } catch (GeneralSecurityException e) {
                                e.printStackTrace();
                        } catch (SQLException e) {
@@ -51,10 +133,8 @@ public class MailCertificates extends Page {
                HashMap<String, Object> vars = new HashMap<String, Object>();
                User us = LoginPage.getUser(req);
                try {
-                       PreparedStatement ps = DatabaseConnection
-                                       .getInstance()
-                                       .prepare(
-                                                       "SELECT `id`, `CN`, `serial`, `revoked`, `expire`, `disablelogin` FROM `emailcerts` WHERE `memid`=?");
+                       PreparedStatement ps = DatabaseConnection.getInstance().prepare(
+                               "SELECT `id`, `CN`, `serial`, `revoked`, `expire`, `disablelogin` FROM `emailcerts` WHERE `memid`=?");
                        ps.setInt(1, us.getId());
                        ResultSet rs = ps.executeQuery();
                        vars.put("mailcerts", rs);