]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/account/certs/CertificateIssueForm.java
8b9272cc887610ec4bb60d786481010bc28484cc
[gigi.git] / src / org / cacert / gigi / pages / account / certs / CertificateIssueForm.java
1 package org.cacert.gigi.pages.account.certs;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.security.GeneralSecurityException;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 import javax.servlet.http.HttpServletRequest;
10
11 import org.cacert.gigi.GigiApiException;
12 import org.cacert.gigi.dbObjects.Certificate;
13 import org.cacert.gigi.dbObjects.Certificate.CertificateStatus;
14 import org.cacert.gigi.dbObjects.Certificate.SubjectAlternateName;
15 import org.cacert.gigi.dbObjects.CertificateProfile;
16 import org.cacert.gigi.dbObjects.Domain;
17 import org.cacert.gigi.dbObjects.Organisation;
18 import org.cacert.gigi.dbObjects.User;
19 import org.cacert.gigi.localisation.Language;
20 import org.cacert.gigi.output.CertificateValiditySelector;
21 import org.cacert.gigi.output.HashAlgorithms;
22 import org.cacert.gigi.output.template.Form;
23 import org.cacert.gigi.output.template.IterableDataset;
24 import org.cacert.gigi.output.template.Template;
25 import org.cacert.gigi.pages.LoginPage;
26 import org.cacert.gigi.util.AuthorizationContext;
27 import org.cacert.gigi.util.RandomToken;
28
29 /**
30  * This class represents a form that is used for issuing certificates. This
31  * class uses "sun.security" and therefore needs "-XDignore.symbol.file"
32  */
33 public class CertificateIssueForm extends Form {
34
35     private final static Template t = new Template(CertificateIssueForm.class.getResource("CertificateIssueForm.templ"));
36
37     private final static Template tIni = new Template(CertificateAdd.class.getResource("RequestCertificate.templ"));
38
39     private AuthorizationContext c;
40
41     private String spkacChallenge;
42
43     private boolean login;
44
45     public CertificateIssueForm(HttpServletRequest hsr) {
46         super(hsr);
47         c = LoginPage.getAuthorizationContext(hsr);
48         spkacChallenge = RandomToken.generateToken(16);
49     }
50
51     private Certificate result;
52
53     public Certificate getResult() {
54         return result;
55     }
56
57     private CertificateRequest cr;
58
59     CertificateValiditySelector issueDate = new CertificateValiditySelector();
60
61     @Override
62     public SubmissionResult submit(HttpServletRequest req) throws GigiApiException {
63         String csr = req.getParameter("CSR");
64         String spkac = req.getParameter("SPKAC");
65         try {
66             if (csr != null) {
67                 cr = new CertificateRequest(c, csr);
68                 // TODO cr.checkKeyStrength(out);
69                 return new FormContinue();
70             } else if (spkac != null) {
71                 cr = new CertificateRequest(c, spkac, spkacChallenge);
72                 // TODO cr.checkKeyStrength(out);
73                 return new FormContinue();
74             } else if (cr != null) {
75                 login = "1".equals(req.getParameter("login"));
76                 issueDate.update(req);
77                 GigiApiException error = new GigiApiException();
78
79                 try {
80                     cr.update(req.getParameter("CN"), req.getParameter("hash_alg"), req.getParameter("profile"), //
81                             req.getParameter("org"), req.getParameter("OU"), req.getParameter("SANs"));
82                 } catch (GigiApiException e) {
83                     error.mergeInto(e);
84                 }
85
86                 Certificate result = null;
87                 try {
88                     result = cr.draft();
89                 } catch (GigiApiException e) {
90                     error.mergeInto(e);
91                 }
92                 if ( !error.isEmpty() || result == null) {
93                     throw error;
94                 }
95                 if (login) {
96                     result.setLoginEnabled(true);
97                 }
98                 result.issue(issueDate.getFrom(), issueDate.getTo(), c.getActor()).waitFor(60000);
99                 this.result = result;
100                 Certificate c = result;
101                 if (c.getStatus() != CertificateStatus.ISSUED) {
102                     throw new PermamentFormException(new GigiApiException("Timeout while waiting for certificate."));
103                 }
104                 String ser = c.getSerial();
105                 if (ser.isEmpty()) {
106                     throw new PermamentFormException(new GigiApiException("Timeout while waiting for certificate."));
107                 }
108                 return new RedirectResult(Certificates.PATH + "/" + ser);
109             } else {
110                 throw new GigiApiException("Error no action.");
111             }
112         } catch (IOException e) {
113             e.printStackTrace();
114             throw new GigiApiException("Certificate Request format is invalid.");
115         } catch (IllegalArgumentException e) {
116             e.printStackTrace();
117             throw new GigiApiException("Certificate Request format is invalid.");
118         } catch (GeneralSecurityException e) {
119             e.printStackTrace();
120             throw new GigiApiException("Certificate Request format is invalid.");
121         }
122     }
123
124     @Override
125     public void output(PrintWriter out, Language l, Map<String, Object> vars) {
126         if (cr == null) {
127             HashMap<String, Object> vars2 = new HashMap<String, Object>(vars);
128             vars2.put("csrf", getCSRFToken());
129             vars2.put("csrf_name", getCsrfFieldName());
130             vars2.put("spkacChallenge", spkacChallenge);
131             tIni.output(out, l, vars2);
132             return;
133         } else {
134             super.output(out, l, vars);
135         }
136     }
137
138     @Override
139     protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
140         HashMap<String, Object> vars2 = new HashMap<String, Object>(vars);
141
142         StringBuffer content = new StringBuffer();
143         for (SubjectAlternateName SAN : cr.getSANs()) {
144             content.append(SAN.getType().toString().toLowerCase());
145             content.append(':');
146             content.append(SAN.getName());
147             content.append('\n');
148         }
149         vars2.put("placeholderName", CertificateRequest.DEFAULT_CN);
150         if (c.getTarget() instanceof User) {
151             User target = (User) c.getTarget();
152             vars2.put("defaultName", target.getPreferredName().toString());
153             vars2.put("defaultEmail", target.getEmail());
154             Domain[] domains = target.getDomains();
155             if (domains.length > 0) {
156                 vars2.put("defaultDomain", domains[0].getSuffix());
157             }
158         }
159         vars2.put("CN", cr.getName());
160         if (c.getTarget() instanceof Organisation) {
161             vars2.put("orga", "true");
162             vars2.put("department", cr.getOu());
163         }
164         vars2.put("validity", issueDate);
165         vars2.put("emails", content.toString());
166         vars2.put("hashs", new HashAlgorithms(cr.getSelectedDigest()));
167         vars2.put("profiles", new IterableDataset() {
168
169             CertificateProfile[] cps = CertificateProfile.getAll();
170
171             int i = 0;
172
173             @Override
174             public boolean next(Language l, Map<String, Object> vars) {
175                 CertificateProfile cp;
176                 do {
177                     if (i >= cps.length) {
178                         return false;
179                     }
180                     cp = cps[i];
181                     i++;
182                 } while ( !cp.canBeIssuedBy(c.getTarget(), c.getActor()));
183
184                 if (cp.getId() == cr.getProfile().getId()) {
185                     vars.put("selected", " selected");
186                 } else {
187                     vars.put("selected", "");
188                 }
189                 vars.put("key", cp.getKeyName());
190                 vars.put("name", cp.getVisibleName());
191                 return true;
192             }
193         });
194
195         t.output(out, l, vars2);
196     }
197 }