]> WPIA git - gigi.git/commitdiff
Better display of encoded certificates.
authorFelix Dörre <felix@dogcraft.de>
Thu, 10 Jul 2014 20:19:12 +0000 (22:19 +0200)
committerFelix Dörre <felix@dogcraft.de>
Thu, 10 Jul 2014 22:35:17 +0000 (00:35 +0200)
src/org/cacert/gigi/pages/account/MailCertificates.java

index f073d33a77b2b5ac8f2410a99552f4407c9021eb..e0dd947a06d3dfe37c47683f4c3ec9b8ee3e3b5a 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.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.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Base64;
 import java.util.HashMap;
 
 import java.util.HashMap;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -26,21 +29,98 @@ public class MailCertificates extends Page {
                super("Email Certificates");
        }
 
                super("Email Certificates");
        }
 
+       @Override
+       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;
+               if (pi.endsWith(".crt")) {
+                       crt = true;
+                       pi = pi.substring(0, pi.length() - 4);
+               } else if (pi.endsWith(".cer")) {
+                       cer = true;
+                       pi = pi.substring(0, pi.length() - 4);
+               }
+               int serial = 0;
+               try {
+                       serial = Integer.parseInt(pi);
+               } catch (NumberFormatException nfe) {
+                       resp.sendError(404);
+                       return true;
+               }
+               try {
+                       Certificate c = new Certificate(serial);
+                       if (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);
        @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 serial = Integer.parseInt(pi);
-                       Certificate c = new Certificate(serial);
-                       if (LoginPage.getUser(req).getId() != c.getOwnerId()) {
-                               out.println(translate(req, "You do not own this certificate."));
+
+                       int serial = 0;
+                       try {
+                               serial = Integer.parseInt(pi);
+                       } catch (NumberFormatException nfe) {
+                       }
+                       Certificate c = null;
+                       if (serial != 0) {
+                               c = new Certificate(serial);
+                       }
+                       if (c == null || LoginPage.getUser(req).getId() != c.getOwnerId()) {
+                               resp.sendError(404);
                                return;
                        }
                                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.println("<pre>");
                        try {
                        out.println("<pre>");
                        try {
-                               out.print(c.cert());
+                               X509Certificate cert = c.cert();
+                               out.print(cert);
                        } catch (GeneralSecurityException e) {
                                e.printStackTrace();
                        } catch (SQLException e) {
                        } catch (GeneralSecurityException e) {
                                e.printStackTrace();
                        } catch (SQLException e) {