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.Calendar;
8 import java.util.GregorianCalendar;
9 import java.util.HashMap;
10 import java.util.Iterator;
11 import java.util.LinkedList;
12 import java.util.Locale;
14 import java.util.Properties;
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
19 import org.cacert.gigi.GigiApiException;
20 import org.cacert.gigi.database.DatabaseConnection;
21 import org.cacert.gigi.database.GigiPreparedStatement;
22 import org.cacert.gigi.dbObjects.EmailAddress;
23 import org.cacert.gigi.dbObjects.Group;
24 import org.cacert.gigi.dbObjects.Name;
25 import org.cacert.gigi.dbObjects.User;
26 import org.cacert.gigi.email.EmailProvider;
27 import org.cacert.gigi.localisation.Language;
28 import org.cacert.gigi.output.template.Form;
29 import org.cacert.gigi.output.template.IterableDataset;
30 import org.cacert.gigi.output.template.Template;
31 import org.cacert.gigi.util.Notary;
33 public class Manager extends Page {
35 public static final String PATH = "/manager";
40 super("Test Manager");
42 f = EmailAddress.class.getDeclaredField("hash");
43 f.setAccessible(true);
44 } catch (ReflectiveOperationException e) {
49 public User[] getAssurers() {
50 if (assurers != null) {
53 assurers = new User[10];
55 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?");
56 for (int i = 0; i < assurers.length; i++) {
57 String mail = "test-assurer" + i + "@example.com";
58 User u = User.getByEmail(mail);
61 u = User.getByEmail(mail);
63 ps.setInt(1, u.getId());
64 ps.setInt(2, u.getId());
66 ps.setString(4, "Manager init code");
67 ps.setString(5, "1990-01-01");
73 } catch (ReflectiveOperationException | GigiApiException e) {
79 private void passCATS(User u) {
80 GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO cats_passed SET user_id=?, variant_id=3");
81 ps.setInt(1, u.getId());
85 private static Manager instance;
87 Template t = new Template(Manager.class.getResource("ManagerMails.templ"));
89 HashMap<String, LinkedList<String>> emails = new HashMap<>();
91 public static Manager getInstance() {
92 if (instance == null) {
93 instance = new Manager();
98 public static class MailFetcher extends EmailProvider {
100 public MailFetcher(Properties p) {}
103 public String checkEmailServer(int forUid, String address) throws IOException {
108 public synchronized void sendmail(String to, String subject, String message, String from, String replyto, String toname, String fromname, String errorsto, boolean extra) throws IOException {
109 HashMap<String, LinkedList<String>> mails = Manager.getInstance().emails;
110 LinkedList<String> hismails = mails.get(to);
111 if (hismails == null) {
112 mails.put(to, hismails = new LinkedList<>());
114 hismails.addFirst(subject + "\n" + message);
119 public class ManagementForm extends Form {
121 public ManagementForm(HttpServletRequest hsr) {
126 public boolean submit(PrintWriter out, HttpServletRequest req) throws GigiApiException {
131 protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
132 getDefaultTemplate().output(out, l, vars);
137 public void batchCreateUsers(String mailPrefix, String domain, int amount, PrintWriter out) {
141 out.print("100 at most, please.");
144 for (int i = 0; i < amount; i++) {
145 String email = mailPrefix + i + "@" + domain;
148 } catch (ReflectiveOperationException e) {
149 out.println("failed");
151 } catch (GigiApiException e) {
152 out.println("failed: " + e.getMessage());
157 private void createUser(String email) throws GigiApiException, IllegalAccessException {
159 u.setName(new Name("Först", "Läst", "Müddle", "Süffix"));
161 Calendar gc = GregorianCalendar.getInstance();
163 u.setDoB(new Date(gc.getTime().getTime()));
164 u.setPreferredLocale(Locale.ENGLISH);
165 u.insert("xvXV12°§");
166 EmailAddress ea = new EmailAddress(u, email);
167 ea.insert(Language.getInstance(Locale.ENGLISH));
168 String hash = (String) f.get(ea);
176 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
177 if (req.getParameter("create") != null) {
178 batchCreateUsers(req.getParameter("prefix"), req.getParameter("suffix"), Integer.parseInt(req.getParameter("amount")), resp.getWriter());
179 resp.getWriter().println("User batch created.");
180 } else if (req.getParameter("addpriv") != null || req.getParameter("delpriv") != null) {
181 User u = User.getByEmail(req.getParameter("email"));
183 resp.getWriter().println("User not found.");
186 if (req.getParameter("addpriv") != null) {
187 u.grantGroup(u, Group.getByString(req.getParameter("priv")));
188 resp.getWriter().println("Privilege granted");
190 u.revokeGroup(u, Group.getByString(req.getParameter("priv")));
191 resp.getWriter().println("Privilege revoked");
193 } else if (req.getParameter("fetch") != null) {
194 String mail = req.getParameter("femail");
195 fetchMails(req, resp, mail);
196 } else if (req.getParameter("cats") != null) {
197 String mail = req.getParameter("catsEmail");
198 User byEmail = User.getByEmail(mail);
199 if (byEmail == null) {
200 resp.getWriter().println("User not found.");
204 resp.getWriter().println("User has been passed CATS");
205 } else if (req.getParameter("assure") != null) {
206 String mail = req.getParameter("assureEmail");
207 User byEmail = User.getByEmail(mail);
208 if (byEmail == null) {
209 resp.getWriter().println("User not found.");
213 for (int i = 0; i < getAssurers().length; i++) {
214 Notary.assure(getAssurers()[i], byEmail, byEmail.getName(), byEmail.getDoB(), 10, "Testmanager Assure up code", "2014-11-06");
216 } catch (GigiApiException e) {
219 resp.getWriter().println("User has been assured.");
223 private void fetchMails(HttpServletRequest req, HttpServletResponse resp, String mail) throws IOException {
224 final LinkedList<String> mails = emails.get(mail);
225 HashMap<String, Object> vars = new HashMap<>();
226 vars.put("mail", mail);
228 vars.put("mails", new IterableDataset() {
230 Iterator<String> s = mails.iterator();
233 public boolean next(Language l, Map<String, Object> vars) {
237 vars.put("body", s.next().replaceAll("(https?://\\S+)", "<a href=\"$1\">$1</a>"));
242 t.output(resp.getWriter(), getLanguage(req), vars);
244 resp.getWriter().println("No mails");
250 public boolean needsLogin() {
255 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
257 String pi = req.getPathInfo().substring(PATH.length());
258 if (pi.length() > 1 && pi.startsWith("/fetch-")) {
259 String mail = pi.substring(pi.indexOf('-', 2) + 1);
260 fetchMails(req, resp, mail);
264 new ManagementForm(req).output(resp.getWriter(), getLanguage(req), new HashMap<String, Object>());