1 package org.cacert.gigi.pages.account.certs;
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.security.GeneralSecurityException;
6 import java.util.HashMap;
7 import java.util.Iterator;
11 import javax.servlet.http.HttpServletRequest;
13 import org.cacert.gigi.GigiApiException;
14 import org.cacert.gigi.dbObjects.Certificate;
15 import org.cacert.gigi.dbObjects.Certificate.SubjectAlternateName;
16 import org.cacert.gigi.dbObjects.CertificateProfile;
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.Page;
26 import org.cacert.gigi.util.RandomToken;
29 * This class represents a form that is used for issuing certificates. This
30 * class uses "sun.security" and therefore needs "-XDignore.symbol.file"
32 public class CertificateIssueForm extends Form {
34 private final static Template t = new Template(CertificateIssueForm.class.getResource("CertificateIssueForm.templ"));
36 private final static Template tIni = new Template(CertificateAdd.class.getResource("RequestCertificate.templ"));
40 private String spkacChallenge;
42 private boolean login;
44 public CertificateIssueForm(HttpServletRequest hsr) {
46 u = Page.getUser(hsr);
47 spkacChallenge = RandomToken.generateToken(16);
50 private Certificate result;
52 public Certificate getResult() {
56 private CertificateRequest cr;
58 CertificateValiditySelector issueDate = new CertificateValiditySelector();
61 public boolean submit(PrintWriter out, HttpServletRequest req) {
62 String csr = req.getParameter("CSR");
63 String spkac = req.getParameter("SPKAC");
67 cr = new CertificateRequest(u, csr);
68 cr.checkKeyStrength(out);
69 } else if (spkac != null) {
70 cr = new CertificateRequest(u, spkac, spkacChallenge);
71 cr.checkKeyStrength(out);
72 } else if (cr != null) {
73 login = "1".equals(req.getParameter("login"));
74 issueDate.update(req);
75 GigiApiException error = new GigiApiException();
78 cr.update(req.getParameter("CN"), req.getParameter("hash_alg"), req.getParameter("profile"), //
79 req.getParameter("org"), req.getParameter("OU"), req.getParameter("SANs"), out, req);
80 } catch (GigiApiException e) {
83 if (req.getParameter("CCA") == null) {
84 error.mergeInto(new GigiApiException("You need to accept the CCA."));
88 } catch (GigiApiException e) {
91 if ( !error.isEmpty()) {
92 error.format(out, Page.getLanguage(req));
95 result.issue(issueDate.getFrom(), issueDate.getTo()).waitFor(60000);
98 throw new GigiApiException("Error no action.");
100 } catch (IOException e) {
102 } catch (IllegalArgumentException e) {
104 throw new GigiApiException("Certificate Request format is invalid.");
105 } catch (GeneralSecurityException e) {
107 throw new GigiApiException("Certificate Request format is invalid.");
108 } catch (InterruptedException e) {
111 } catch (GigiApiException e) {
112 e.format(out, Page.getLanguage(req));
118 public void output(PrintWriter out, Language l, Map<String, Object> vars) {
120 HashMap<String, Object> vars2 = new HashMap<String, Object>(vars);
121 vars2.put("csrf", getCSRFToken());
122 vars2.put("csrf_name", getCsrfFieldName());
123 vars2.put("spkacChallenge", spkacChallenge);
124 tIni.output(out, l, vars2);
127 super.output(out, l, vars);
132 protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
133 HashMap<String, Object> vars2 = new HashMap<String, Object>(vars);
134 vars2.put("CCA", "<a href='/policy/CAcertCommunityAgreement.html'>CCA</a>");
136 StringBuffer content = new StringBuffer();
137 for (SubjectAlternateName SAN : cr.getSANs()) {
138 content.append(SAN.getType().toString().toLowerCase());
140 content.append(SAN.getName());
141 content.append('\n');
144 vars2.put("CN", cr.getCN());
145 vars2.put("department", cr.getOu());
146 vars2.put("validity", issueDate);
147 vars2.put("emails", content.toString());
148 vars2.put("hashs", new HashAlgorithms(cr.getSelectedDigest()));
149 vars2.put("profiles", new IterableDataset() {
154 public boolean next(Language l, Map<String, Object> vars) {
155 CertificateProfile cp;
157 cp = CertificateProfile.getById(i++);
161 } while ( !u.canIssue(cp));
163 if (cp.getId() == cr.getProfile().getId()) {
164 vars.put("selected", " selected");
166 vars.put("selected", "");
168 vars.put("key", cp.getKeyName());
169 vars.put("name", cp.getVisibleName());
173 final List<Organisation> orgs = u.getOrganisations();
174 vars2.put("orga", orgs.size() == 0 ? null : new IterableDataset() {
176 Iterator<Organisation> iter = orgs.iterator();
179 public boolean next(Language l, Map<String, Object> vars) {
180 if ( !iter.hasNext()) {
183 Organisation orga = iter.next();
184 vars.put("key", orga.getId());
185 vars.put("name", orga.getName());
186 if (orga == cr.getOrg()) {
187 vars.put("selected", " selected");
189 vars.put("selected", "");
195 t.output(out, l, vars2);