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