]> WPIA git - gigi.git/blob - src/org/cacert/gigi/pages/account/certs/CertificateIssueForm.java
5ac13fda21fb00188b36e3dbe823fc1455aaa97f
[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.Iterator;
8 import java.util.List;
9 import java.util.Map;
10
11 import javax.servlet.http.HttpServletRequest;
12
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;
27
28 /**
29  * This class represents a form that is used for issuing certificates. This
30  * class uses "sun.security" and therefore needs "-XDignore.symbol.file"
31  */
32 public class CertificateIssueForm extends Form {
33
34     private final static Template t = new Template(CertificateIssueForm.class.getResource("CertificateIssueForm.templ"));
35
36     private final static Template tIni = new Template(CertificateAdd.class.getResource("RequestCertificate.templ"));
37
38     private User u;
39
40     private String spkacChallenge;
41
42     private boolean login;
43
44     public CertificateIssueForm(HttpServletRequest hsr) {
45         super(hsr);
46         u = Page.getUser(hsr);
47         spkacChallenge = RandomToken.generateToken(16);
48     }
49
50     private Certificate result;
51
52     public Certificate getResult() {
53         return result;
54     }
55
56     private CertificateRequest cr;
57
58     CertificateValiditySelector issueDate = new CertificateValiditySelector();
59
60     @Override
61     public boolean submit(PrintWriter out, HttpServletRequest req) {
62         String csr = req.getParameter("CSR");
63         String spkac = req.getParameter("SPKAC");
64         try {
65             try {
66                 if (csr != null) {
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();
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"), out, req);
80                     } catch (GigiApiException e) {
81                         error.mergeInto(e);
82                     }
83                     if (req.getParameter("CCA") == null) {
84                         error.mergeInto(new GigiApiException("You need to accept the CCA."));
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                         error.format(out, Page.getLanguage(req));
94                         return false;
95                     }
96                     result.issue(issueDate.getFrom(), issueDate.getTo()).waitFor(60000);
97                     this.result = result;
98                     return true;
99                 } else {
100                     throw new GigiApiException("Error no action.");
101                 }
102             } catch (IOException e) {
103                 e.printStackTrace();
104             } catch (IllegalArgumentException e) {
105                 e.printStackTrace();
106                 throw new GigiApiException("Certificate Request format is invalid.");
107             } catch (GeneralSecurityException e) {
108                 e.printStackTrace();
109                 throw new GigiApiException("Certificate Request format is invalid.");
110             } catch (InterruptedException e) {
111                 e.printStackTrace();
112             }
113         } catch (GigiApiException e) {
114             e.format(out, Page.getLanguage(req));
115         }
116         return false;
117     }
118
119     @Override
120     public void output(PrintWriter out, Language l, Map<String, Object> vars) {
121         if (cr == null) {
122             HashMap<String, Object> vars2 = new HashMap<String, Object>(vars);
123             vars2.put("csrf", getCSRFToken());
124             vars2.put("csrf_name", getCsrfFieldName());
125             vars2.put("spkacChallenge", spkacChallenge);
126             tIni.output(out, l, vars2);
127             return;
128         } else {
129             super.output(out, l, vars);
130         }
131     }
132
133     @Override
134     protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
135         HashMap<String, Object> vars2 = new HashMap<String, Object>(vars);
136         vars2.put("CCA", "<a href='/policy/CAcertCommunityAgreement.html'>CCA</a>");
137
138         StringBuffer content = new StringBuffer();
139         for (SubjectAlternateName SAN : cr.getSANs()) {
140             content.append(SAN.getType().toString().toLowerCase());
141             content.append(':');
142             content.append(SAN.getName());
143             content.append('\n');
144         }
145
146         vars2.put("CN", cr.getName());
147         vars2.put("department", cr.getOu());
148         vars2.put("validity", issueDate);
149         vars2.put("emails", content.toString());
150         vars2.put("hashs", new HashAlgorithms(cr.getSelectedDigest()));
151         vars2.put("profiles", new IterableDataset() {
152
153             int i = 1;
154
155             @Override
156             public boolean next(Language l, Map<String, Object> vars) {
157                 CertificateProfile cp;
158                 do {
159                     cp = CertificateProfile.getById(i++);
160                     if (cp == null) {
161                         return false;
162                     }
163                 } while ( !cp.canBeIssuedBy(u));
164
165                 if (cp.getId() == cr.getProfile().getId()) {
166                     vars.put("selected", " selected");
167                 } else {
168                     vars.put("selected", "");
169                 }
170                 vars.put("key", cp.getKeyName());
171                 vars.put("name", cp.getVisibleName());
172                 return true;
173             }
174         });
175         final List<Organisation> orgs = u.getOrganisations();
176         vars2.put("orga", orgs.size() == 0 ? null : new IterableDataset() {
177
178             Iterator<Organisation> iter = orgs.iterator();
179
180             @Override
181             public boolean next(Language l, Map<String, Object> vars) {
182                 if ( !iter.hasNext()) {
183                     return false;
184                 }
185                 Organisation orga = iter.next();
186                 vars.put("key", orga.getId());
187                 vars.put("name", orga.getName());
188                 if (orga == cr.getOrg()) {
189                     vars.put("selected", " selected");
190                 } else {
191                     vars.put("selected", "");
192                 }
193                 return true;
194             }
195         });
196
197         t.output(out, l, vars2);
198     }
199 }