]> WPIA git - gigi.git/blob - src/org/cacert/gigi/output/Form.java
11209ca51146769f15ec27654556db9343a80260
[gigi.git] / src / org / cacert / gigi / output / Form.java
1 package org.cacert.gigi.output;
2
3 import java.io.PrintWriter;
4 import java.util.Map;
5
6 import javax.servlet.ServletRequest;
7 import javax.servlet.http.HttpServletRequest;
8 import javax.servlet.http.HttpSession;
9
10 import org.cacert.gigi.Language;
11 import org.cacert.gigi.pages.Page;
12 import org.cacert.gigi.util.RandomToken;
13
14 public abstract class Form implements Outputable {
15         String csrf;
16
17         public Form(HttpServletRequest hsr) {
18                 csrf = RandomToken.generateToken(32);
19                 HttpSession hs = hsr.getSession();
20                 hs.setAttribute("form/" + getClass().getName() + "/" + csrf, this);
21
22         }
23
24         public abstract boolean submit(PrintWriter out, HttpServletRequest req);
25
26         @Override
27         public final void output(PrintWriter out, Language l, Map<String, Object> vars) {
28                 out.println("<form method='POST' autocomplete='off'>");
29                 outputContent(out, l, vars);
30                 out.print("<input type='hidden' name='csrf' value='");
31                 out.print(getCSRFToken());
32                 out.println("'></form>");
33         }
34
35         protected abstract void outputContent(PrintWriter out, Language l, Map<String, Object> vars);
36
37         protected void outputError(PrintWriter out, ServletRequest req, String text) {
38                 out.print("<div>");
39                 out.print(Page.translate(req, text));
40                 out.println("</div>");
41         }
42
43         protected String getCSRFToken() {
44                 return csrf;
45         }
46
47         protected void checkCSRF(HttpServletRequest req) {
48                 if (!csrf.equals(req.getParameter("csrf"))) {
49                         throw new CSRFError();
50                 }
51         }
52
53         public static <T extends Form> T getForm(HttpServletRequest req, Class<T> target) {
54                 String csrf = req.getParameter("csrf");
55                 if (csrf == null) {
56                         throw new CSRFError();
57                 }
58                 HttpSession hs = req.getSession();
59                 if (hs == null) {
60                         throw new CSRFError();
61                 }
62                 Form f = (Form) hs.getAttribute("form/" + target.getName() + "/" + csrf);
63                 if (f == null) {
64                         throw new CSRFError();
65                 }
66                 return (T) f;
67         }
68
69         public static class CSRFError extends Error {
70
71         }
72 }