import org.cacert.gigi.output.template.Form.CSRFException;
import org.cacert.gigi.output.template.Outputable;
import org.cacert.gigi.output.template.Template;
+import org.cacert.gigi.pages.HandlesMixedRequest;
import org.cacert.gigi.pages.LoginPage;
import org.cacert.gigi.pages.LogoutPage;
import org.cacert.gigi.pages.MainPage;
public void output(PrintWriter out, Language l, Map<String, Object> vars) {
try {
if (req.getMethod().equals("POST")) {
- if (req.getQueryString() != null) {
+ if (req.getQueryString() != null && !(p instanceof HandlesMixedRequest)) {
return;
}
p.doPost(req, resp);
import org.cacert.gigi.database.GigiPreparedStatement;
import org.cacert.gigi.database.GigiResultSet;
-public class CertificateProfile {
+public class CertificateProfile implements IdCachable {
private final int id;
vars.put("profile", c.getProfile().getVisibleName());
try {
CertificateStatus st = c.getStatus();
+ vars.put("isNotRevoked", st != CertificateStatus.REVOKED);
if (st == CertificateStatus.ISSUED || st == CertificateStatus.REVOKED) {
X509Certificate cert = c.cert();
vars.put("issued", DateSelector.getDateFormat().format(cert.getNotBefore()));
-<form method="post">
<table class="wrapper dataTable">
<thead><tr>
<th><?=_Renew/Revoke/Delete?></th>
<tbody>
<? foreach($certs) {?>
<tr>
- <td><input type='checkbox' name='certs[]' value='<?=$serial?>'></td>
+ <td>
+ <? if($isNotRevoked) { ?><input type='checkbox' name='certs[]' value='<?=$serial?>'><? } ?>
+ </td>
<td><?=$state?></td>
<td><?=$CN?></td>
<td><a href='/account/certs/<?=$serial?>'><?=$serial?></a></td>
<? } ?>
</tbody>
</table>
-</form>
private File source;
- private static final Pattern CONTROL_PATTERN = Pattern.compile(" ?([a-z]+)\\(\\$([^)]+)\\) ?\\{ ?");
+ private static final Pattern CONTROL_PATTERN = Pattern.compile(" ?([a-zA-Z]+)\\(\\$([^)]+)\\) ?\\{ ?");
private static final Pattern ELSE_PATTERN = Pattern.compile(" ?\\} ?else ?\\{ ?");
--- /dev/null
+package org.cacert.gigi.pages;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Marks a {@link Page} as beeing able to handle
+ * {@link HttpServletRequest#getQueryString()} in
+ * {@link HttpServletRequest#getMethod()}<code>== "POST"</code>
+ */
+public interface HandlesMixedRequest {
+
+}
--- /dev/null
+package org.cacert.gigi.pages.account.certs;
+
+import java.io.PrintWriter;
+import java.util.LinkedList;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.cacert.gigi.dbObjects.Certificate;
+import org.cacert.gigi.dbObjects.User;
+import org.cacert.gigi.localisation.Language;
+import org.cacert.gigi.output.CertificateIterable;
+import org.cacert.gigi.output.template.Form;
+import org.cacert.gigi.output.template.Template;
+import org.cacert.gigi.pages.LoginPage;
+import org.cacert.gigi.util.Job;
+
+public class CertificateModificationForm extends Form {
+
+ User target;
+
+ final boolean withRevoked;
+
+ public CertificateModificationForm(HttpServletRequest hsr, boolean withRevoked) {
+ super(hsr);
+ this.withRevoked = withRevoked;
+ target = LoginPage.getUser(hsr);
+ }
+
+ private static final Template certTable = new Template(CertificateIterable.class.getResource("CertificateTable.templ"));
+
+ private static final Template myTemplate = new Template(CertificateModificationForm.class.getResource("CertificateModificationForm.templ"));
+
+ @Override
+ public boolean submit(PrintWriter out, HttpServletRequest req) {
+ String[] certs = req.getParameterValues("certs[]");
+ if (certs == null) {
+ // nothing to do
+ return false;
+ }
+ LinkedList<Job> revokes = new LinkedList<Job>();
+ for (String serial : certs) {
+ Certificate c = Certificate.getBySerial(serial);
+ if (c == null || c.getOwner() != target) {
+ continue;
+ }
+ revokes.add(c.revoke());
+ }
+ long start = System.currentTimeMillis();
+ for (Job job : revokes) {
+ try {
+ int toWait = (int) (60000 + start - System.currentTimeMillis());
+ if (toWait > 0) {
+ job.waitFor(toWait);
+ } else {
+ break; // canceled... waited too log
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
+ vars.put("certs", new CertificateIterable(target.getCertificates(withRevoked)));
+ vars.put("certTable", certTable);
+ myTemplate.output(out, l, vars);
+ }
+
+}
--- /dev/null
+<?=$certTable?>
+<input type="submit" value="<?=_Revoke Certificates?>"/>
\ No newline at end of file
import org.cacert.gigi.dbObjects.CACertificate;
import org.cacert.gigi.dbObjects.Certificate;
-import org.cacert.gigi.dbObjects.User;
import org.cacert.gigi.localisation.Language;
-import org.cacert.gigi.output.CertificateIterable;
+import org.cacert.gigi.output.template.Form;
import org.cacert.gigi.output.template.IterableDataset;
import org.cacert.gigi.output.template.Template;
+import org.cacert.gigi.pages.HandlesMixedRequest;
import org.cacert.gigi.pages.LoginPage;
import org.cacert.gigi.pages.Page;
import org.cacert.gigi.util.PEM;
-public class Certificates extends Page {
+public class Certificates extends Page implements HandlesMixedRequest {
private Template certDisplay = new Template(Certificates.class.getResource("CertificateDisplay.templ"));
return true;
}
- private Template certTable = new Template(CertificateIterable.class.getResource("CertificateTable.templ"));
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ if (req.getQueryString() != null && !req.getQueryString().equals("") && !req.getQueryString().equals("withRevoked")) {
+ return;// Block actions by get parameters.
+ }
+ if ( !req.getPathInfo().equals(PATH)) {
+ resp.sendError(500);
+ return;
+ }
+ Form.getForm(req, CertificateModificationForm.class).submit(resp.getWriter(), req);
+ doGet(req, resp);
+ }
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
}
HashMap<String, Object> vars = new HashMap<String, Object>();
- User us = LoginPage.getUser(req);
- vars.put("certs", new CertificateIterable(us.getCertificates(false)));
- certTable.output(out, getLanguage(req), vars);
+ new CertificateModificationForm(req, req.getParameter("withRevoked") != null).output(out, getLanguage(req), vars);
}
}