]> WPIA git - gigi.git/blob - src/org/cacert/gigi/api/GigiAPI.java
upd: split certificate issuance as organisation into seperate
[gigi.git] / src / org / cacert / gigi / api / GigiAPI.java
1 package org.cacert.gigi.api;
2
3 import java.io.IOException;
4 import java.io.InputStreamReader;
5 import java.security.GeneralSecurityException;
6 import java.security.cert.X509Certificate;
7
8 import javax.servlet.ServletException;
9 import javax.servlet.ServletInputStream;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import org.cacert.gigi.GigiApiException;
15 import org.cacert.gigi.dbObjects.Certificate;
16 import org.cacert.gigi.dbObjects.Certificate.CertificateStatus;
17 import org.cacert.gigi.dbObjects.Job;
18 import org.cacert.gigi.dbObjects.User;
19 import org.cacert.gigi.pages.LoginPage;
20 import org.cacert.gigi.pages.account.certs.CertificateRequest;
21 import org.cacert.gigi.util.AuthorizationContext;
22 import org.cacert.gigi.util.PEM;
23
24 public class GigiAPI extends HttpServlet {
25
26     private static final long serialVersionUID = 659963677032635817L;
27
28     @Override
29     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
30         String pi = req.getPathInfo();
31         if (pi == null) {
32             return;
33         }
34         if (pi.equals("/security/csp/report")) {
35             ServletInputStream sis = req.getInputStream();
36             InputStreamReader isr = new InputStreamReader(sis, "UTF-8");
37             StringBuffer strB = new StringBuffer();
38             char[] buffer = new char[4 * 1024];
39             int len;
40             while ((len = isr.read(buffer)) > 0) {
41                 strB.append(buffer, 0, len);
42             }
43             System.out.println(strB);
44             return;
45         }
46         X509Certificate cert = LoginPage.getCertificateFromRequest(req);
47         if (cert == null) {
48             resp.sendError(403, "Error, cert authing required.");
49             return;
50         }
51         String serial = LoginPage.extractSerialFormCert(cert);
52         User u = LoginPage.fetchUserBySerial(serial);
53
54         if (pi.equals("/account/certs/new")) {
55
56             if ( !req.getMethod().equals("POST")) {
57                 resp.sendError(500, "Error, POST required.");
58                 return;
59             }
60             if (req.getQueryString() != null) {
61                 resp.sendError(500, "Error, no query String allowed.");
62                 return;
63             }
64             String csr = req.getParameter("csr");
65             if (csr == null) {
66                 resp.sendError(500, "Error, no CSR found");
67                 return;
68             }
69             try {
70                 CertificateRequest cr = new CertificateRequest(new AuthorizationContext(u, u), csr);
71                 Certificate result = cr.draft();
72                 Job job = result.issue(null, "2y", u);
73                 job.waitFor(60000);
74                 if (result.getStatus() != CertificateStatus.ISSUED) {
75                     resp.sendError(510, "Error, issuing timed out");
76                     return;
77                 }
78                 resp.getWriter().println(PEM.encode("CERTIFICATE", result.cert().getEncoded()));
79             } catch (GeneralSecurityException e) {
80                 e.printStackTrace();
81             } catch (GigiApiException e) {
82                 e.printStackTrace();
83             } catch (InterruptedException e) {
84                 e.printStackTrace();
85             }
86         }
87     }
88 }