1 package org.cacert.gigi.pages;
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.lang.reflect.Field;
7 import java.util.HashMap;
8 import java.util.Iterator;
9 import java.util.LinkedList;
10 import java.util.Locale;
12 import java.util.Properties;
14 import javax.servlet.http.HttpServletRequest;
15 import javax.servlet.http.HttpServletResponse;
17 import org.cacert.gigi.GigiApiException;
18 import org.cacert.gigi.dbObjects.EmailAddress;
19 import org.cacert.gigi.dbObjects.Group;
20 import org.cacert.gigi.dbObjects.User;
21 import org.cacert.gigi.email.EmailProvider;
22 import org.cacert.gigi.localisation.Language;
23 import org.cacert.gigi.output.Form;
24 import org.cacert.gigi.output.template.IterableDataset;
25 import org.cacert.gigi.output.template.Template;
27 public class Manager extends Page {
29 public static final String PATH = "/manager";
32 super("Test Manager");
35 private static Manager instance;
37 Template t = new Template(Manager.class.getResource("ManagerMails.templ"));
39 HashMap<String, LinkedList<String>> emails = new HashMap<>();
41 public static Manager getInstance() {
42 if (instance == null) {
43 instance = new Manager();
48 public static class MailFetcher extends EmailProvider {
50 public MailFetcher(Properties p) {}
53 public String checkEmailServer(int forUid, String address) throws IOException {
58 public synchronized void sendmail(String to, String subject, String message, String from, String replyto, String toname, String fromname, String errorsto, boolean extra) throws IOException {
59 HashMap<String, LinkedList<String>> mails = Manager.getInstance().emails;
60 LinkedList<String> hismails = mails.get(to);
61 if (hismails == null) {
62 mails.put(to, hismails = new LinkedList<>());
64 hismails.addFirst(subject + "\n" + message);
69 public class ManagementForm extends Form {
71 public ManagementForm(HttpServletRequest hsr) {
76 public boolean submit(PrintWriter out, HttpServletRequest req) throws GigiApiException {
81 protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
82 getDefaultTemplate().output(out, l, vars);
87 public void batchCreateUsers(String mailPrefix, String domain, int amount, PrintWriter out) {
91 out.print("100 at most, please.");
94 Field f = EmailAddress.class.getDeclaredField("hash");
95 f.setAccessible(true);
96 for (int i = 0; i < amount; i++) {
97 String email = mailPrefix + i + "@" + domain;
100 u.setMname("Müddle");
102 u.setSuffix("Süffix");
104 u.setDob(new Date(System.currentTimeMillis() - 366 * 18));
105 u.setPreferredLocale(Locale.ENGLISH);
106 u.insert("xvXV12°§");
107 EmailAddress ea = new EmailAddress(u, email);
108 ea.insert(Language.getInstance(Locale.ENGLISH));
109 String hash = (String) f.get(ea);
114 f.setAccessible(false);
115 } catch (ReflectiveOperationException e) {
116 out.println("failed");
118 } catch (GigiApiException e) {
119 out.println("failed: " + e.getMessage());
125 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
126 if (req.getParameter("create") != null) {
127 batchCreateUsers(req.getParameter("prefix"), req.getParameter("suffix"), Integer.parseInt(req.getParameter("amount")), resp.getWriter());
128 } else if (req.getParameter("addpriv") != null || req.getParameter("delpriv") != null) {
129 User u = User.getByEmail(req.getParameter("email"));
131 resp.getWriter().println("User not found.");
134 if (req.getParameter("addpriv") != null) {
135 u.grantGroup(u, Group.getByString(req.getParameter("priv")));
137 u.revokeGroup(u, Group.getByString(req.getParameter("priv")));
140 } else if (req.getParameter("fetch") != null) {
141 String mail = req.getParameter("femail");
142 fetchMails(req, resp, mail);
146 private void fetchMails(HttpServletRequest req, HttpServletResponse resp, String mail) throws IOException {
147 final LinkedList<String> mails = emails.get(mail);
148 HashMap<String, Object> vars = new HashMap<>();
149 vars.put("mail", mail);
151 vars.put("mails", new IterableDataset() {
153 Iterator<String> s = mails.iterator();
156 public boolean next(Language l, Map<String, Object> vars) {
159 vars.put("body", s.next().replaceAll("(https?://\\S+)", "<a href=\"$1\">$1</a>"));
164 t.output(resp.getWriter(), getLanguage(req), vars);
166 resp.getWriter().println("No mails");
172 public boolean needsLogin() {
177 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
178 String pi = req.getPathInfo().substring(PATH.length());
179 if (pi.length() > 1 && pi.startsWith("/fetch-")) {
180 String mail = pi.substring(pi.indexOf('-', 2) + 1);
181 fetchMails(req, resp, mail);
185 new ManagementForm(req).output(resp.getWriter(), getLanguage(req), new HashMap<String, Object>());