]> WPIA git - gigi.git/commitdiff
add: more strict ticket handling. User history page
authorFelix Dörre <felix@dogcraft.de>
Thu, 5 Nov 2015 15:19:39 +0000 (16:19 +0100)
committerFelix Dörre <felix@dogcraft.de>
Thu, 5 Nov 2015 15:20:07 +0000 (16:20 +0100)
17 files changed:
src/org/cacert/gigi/Gigi.java
src/org/cacert/gigi/Gigi.templ
src/org/cacert/gigi/pages/admin/support/FindDomainPage.java
src/org/cacert/gigi/pages/admin/support/FindUserPage.java
src/org/cacert/gigi/pages/admin/support/SupportEnterTicketForm.java
src/org/cacert/gigi/pages/admin/support/SupportEnterTicketForm.templ
src/org/cacert/gigi/pages/admin/support/SupportEnterTicketPage.java [new file with mode: 0644]
src/org/cacert/gigi/pages/admin/support/SupportUserDetailsPage.java
src/org/cacert/gigi/pages/admin/support/SupportUserDetailsPage.templ
src/org/cacert/gigi/pages/admin/support/SupportUserHistory.java [new file with mode: 0644]
src/org/cacert/gigi/util/AuthorizationContext.java
tests/org/cacert/gigi/pages/admin/TestSEAdminPageDetails.java
tests/org/cacert/gigi/pages/admin/TestSEAdminPageUserDomainSearch.java
tests/org/cacert/gigi/pages/admin/TestSEAdminPageUserMailSearch.java
tests/org/cacert/gigi/pages/admin/TestSEAdminTicketSetting.java [new file with mode: 0644]
tests/org/cacert/gigi/testUtils/ClientTest.java
tests/org/cacert/gigi/testUtils/ManagedTest.java

index c70c913b5dc19f785218aac7f17001caad45fb6d..b347a63f5f9a56f92a28a67e0a85703007803281 100644 (file)
@@ -22,11 +22,8 @@ import javax.servlet.http.HttpSession;
 
 import org.cacert.gigi.database.DatabaseConnection;
 import org.cacert.gigi.dbObjects.CACertificate;
-import org.cacert.gigi.dbObjects.CertificateOwner;
 import org.cacert.gigi.dbObjects.CertificateProfile;
 import org.cacert.gigi.dbObjects.DomainPingConfiguration;
-import org.cacert.gigi.dbObjects.Organisation;
-import org.cacert.gigi.dbObjects.User;
 import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.output.Menu;
 import org.cacert.gigi.output.PageMenuItem;
@@ -53,7 +50,9 @@ import org.cacert.gigi.pages.account.mail.MailOverview;
 import org.cacert.gigi.pages.admin.TTPAdminPage;
 import org.cacert.gigi.pages.admin.support.FindDomainPage;
 import org.cacert.gigi.pages.admin.support.FindUserPage;
+import org.cacert.gigi.pages.admin.support.SupportEnterTicketPage;
 import org.cacert.gigi.pages.admin.support.SupportUserDetailsPage;
+import org.cacert.gigi.pages.admin.support.SupportUserHistory;
 import org.cacert.gigi.pages.error.AccessDenied;
 import org.cacert.gigi.pages.error.PageNotFound;
 import org.cacert.gigi.pages.main.RegisterPage;
@@ -141,7 +140,9 @@ public class Gigi extends HttpServlet {
             putPage(ViewOrgPage.DEFAULT_PATH + "/*", new ViewOrgPage(), "Organisation Admin");
             putPage(FindUserPage.PATH, new FindUserPage("Find User"), "System Admin");
             putPage(FindDomainPage.PATH, new FindDomainPage("Find Domain"), "System Admin");
+            putPage(SupportEnterTicketPage.PATH, new SupportEnterTicketPage(), "System Admin");
             putPage(SupportUserDetailsPage.PATH + "*", new SupportUserDetailsPage("Support: User Details"), null);
+            putPage(SupportUserHistory.PATH, new SupportUserHistory(), null);
             if (testing) {
                 try {
                     Class<?> manager = Class.forName("org.cacert.gigi.pages.Manager");
@@ -264,17 +265,20 @@ public class Gigi extends HttpServlet {
             return page;
         }
         int idx = pathInfo.lastIndexOf('/');
+        if (idx == -1 || idx == 0) {
+            return null;
+        }
 
         page = pages.get(pathInfo.substring(0, idx) + "/*");
         if (page != null) {
             return page;
         }
-
-        int lIdx = pathInfo.lastIndexOf('/', idx);
+        int lIdx = pathInfo.lastIndexOf('/', idx - 1);
         if (lIdx == -1) {
             return null;
         }
-        page = pages.get(pathInfo.substring(0, lIdx) + "/" + pathInfo.substring(idx));
+        String lastResort = pathInfo.substring(0, lIdx) + "/*" + pathInfo.substring(idx);
+        page = pages.get(lastResort);
         return page;
 
     }
@@ -382,14 +386,10 @@ public class Gigi extends HttpServlet {
             vars.put("year", Calendar.getInstance().get(Calendar.YEAR));
             vars.put("content", content);
             if (currentAuthContext != null) {
-                CertificateOwner target = currentAuthContext.getTarget();
-                User currentPageUser = LoginPage.getUser(req);
-                if (target != currentPageUser) {
-                    vars.put("loggedInAs", ((Organisation) target).getName() + " (" + currentPageUser.getName().toString() + ")");
-                } else {
-                    vars.put("loggedInAs", currentPageUser.getName().toString());
-                }
+                // TODO maybe move this information into the AuthContext object
                 vars.put("loginMethod", lang.getTranslation((String) req.getSession().getAttribute(LOGIN_METHOD)));
+                vars.put("authContext", currentAuthContext);
+
             }
             resp.setContentType("text/html; charset=utf-8");
             baseTemplate.output(resp.getWriter(), lang, vars);
index 478c9e9bbca1a89cf1920bcf37b27ce05804cab3..5be91d309dc1fef42509c89aff5585733b45e34c 100644 (file)
@@ -20,7 +20,7 @@
                        </div>
                </div>
                <div id="pageNav">
-                       <? if($loggedInAs) { ?><div><?=_Logged in as?>: <?=$loggedInAs?> <?=_with?> <?=$loginMethod?></div><? } ?>
+                       <? if($authContext) { ?><div><?=$authContext?></div><? } ?>
                        <?=$menu?>
                        <div>
                                <h3 class="pointer"><?=_Advertising?></h3>
index acff64631cac15042af139f4287cd646c1e88505..8f0830bb09eac8c9694b4323a8308faad5588092 100644 (file)
@@ -1,6 +1,5 @@
 package org.cacert.gigi.pages.admin.support;
 
-import org.cacert.gigi.dbObjects.Group;
 import org.cacert.gigi.output.template.Form;
 import org.cacert.gigi.pages.OneFormPage;
 import org.cacert.gigi.util.AuthorizationContext;
@@ -20,6 +19,6 @@ public class FindDomainPage extends OneFormPage {
 
     @Override
     public boolean isPermitted(AuthorizationContext ac) {
-        return ac != null && ac.isInGroup(Group.SUPPORTER);
+        return ac != null && ac.canSupport();
     }
 }
index ad112919eb2a7c34d23159073c47bfba4c00decb..562f0e89460f028f0518990d33b6849db1aa0a89 100644 (file)
@@ -8,7 +8,6 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.cacert.gigi.GigiApiException;
-import org.cacert.gigi.dbObjects.Group;
 import org.cacert.gigi.dbObjects.User;
 import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.output.template.Form;
@@ -67,7 +66,7 @@ public class FindUserPage extends Page {
 
     @Override
     public boolean isPermitted(AuthorizationContext ac) {
-        return ac != null && ac.isInGroup(Group.SUPPORTER);
+        return ac != null && ac.canSupport();
     }
 
 }
index 5db93f30960df3c03c1bdbe4b349b2b7f30871ee..f7ddea07d3e9a1af09fb132efc129c372a78fb64 100644 (file)
@@ -6,31 +6,38 @@ import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 
 import org.cacert.gigi.GigiApiException;
-import org.cacert.gigi.dbObjects.User;
 import org.cacert.gigi.localisation.Language;
 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.AuthorizationContext;
 
 public class SupportEnterTicketForm extends Form {
 
     private static Template t;
 
-    private User target;
     static {
         t = new Template(SupportEnterTicketForm.class.getResource("SupportEnterTicketForm.templ"));
     }
 
-    public SupportEnterTicketForm(HttpServletRequest hsr, User target) {
+    public SupportEnterTicketForm(HttpServletRequest hsr) {
         super(hsr);
-        this.target = target;
     }
 
     @Override
     public boolean submit(PrintWriter out, HttpServletRequest req) throws GigiApiException {
-        // [asdmASDM]\d{8}\.\d+
-        String ticket = req.getParameter("ticketno");
-        if (ticket.matches("[asdmASDM]\\d{8}\\.\\d+")) {
-            req.getSession().setAttribute("ticketNo" + target.getId(), ticket);
+        if (req.getParameter("setTicket") != null) {
+            // [asdmASDM]\d{8}\.\d+
+            String ticket = req.getParameter("ticketno");
+            if (ticket.matches("[asdmASDM]\\d{8}\\.\\d+")) {
+                AuthorizationContext ac = LoginPage.getAuthorizationContext(req);
+                ac.setSupporterTicketId(ticket);
+                return true;
+            }
+            return false;
+        } else if (req.getParameter("deleteTicket") != null) {
+            AuthorizationContext ac = LoginPage.getAuthorizationContext(req);
+            ac.setSupporterTicketId(null);
             return true;
         }
         return false;
index fe9c34fb2eba72b7113d240da04412f8f3d9e942..3f7c82c4334cc84e5b25bf0403f641569c34eea0 100644 (file)
@@ -9,4 +9,9 @@
         <tr>
             <td colspan="2"><input type="submit" name="setTicket" value="<?=_Set ticket number?>"></td>
         </tr>
+<? if($ticketNo) {?>
+        <tr>
+            <td colspan="2"><input type="submit" name="deleteTicket" value="<?=_End working on ticket?>"></td>
+        </tr>
+<? } ?>
 </table>
\ No newline at end of file
diff --git a/src/org/cacert/gigi/pages/admin/support/SupportEnterTicketPage.java b/src/org/cacert/gigi/pages/admin/support/SupportEnterTicketPage.java
new file mode 100644 (file)
index 0000000..10b65f6
--- /dev/null
@@ -0,0 +1,51 @@
+package org.cacert.gigi.pages.admin.support;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.cacert.gigi.GigiApiException;
+import org.cacert.gigi.output.template.Form;
+import org.cacert.gigi.pages.LoginPage;
+import org.cacert.gigi.pages.Page;
+
+public class SupportEnterTicketPage extends Page {
+
+    public static final String PATH = "/support/ticket";
+
+    public SupportEnterTicketPage() {
+        super("Set Ticket");
+    }
+
+    @Override
+    public boolean beforeTemplate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        if (req.getParameter("setTicket") == null && req.getParameter("deleteTicket") == null) {
+            return false;
+        }
+        SupportEnterTicketForm f = Form.getForm(req, SupportEnterTicketForm.class);
+        try {
+            if (f.submit(resp.getWriter(), req)) {
+                if (req.getParameter("setTicket") != null) {
+                    resp.sendRedirect(FindUserPage.PATH);
+                } else {
+                    resp.sendRedirect(PATH);
+                }
+                return true;
+            }
+        } catch (GigiApiException e) {
+            e.format(resp.getWriter(), getLanguage(req));
+        }
+        return false;
+
+    }
+
+    @Override
+    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        HashMap<String, Object> vars = new HashMap<String, Object>();
+        vars.put("ticketNo", LoginPage.getAuthorizationContext(req).getSupporterTicketId());
+        new SupportEnterTicketForm(req).output(resp.getWriter(), getLanguage(req), vars);
+    }
+
+}
index b1ec3abf7bf041af50bad7260444130903075850..b0ddb8fee7cdce3cd9ef81590988e1a0ccae555c 100644 (file)
@@ -9,12 +9,12 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.cacert.gigi.GigiApiException;
 import org.cacert.gigi.dbObjects.EmailAddress;
-import org.cacert.gigi.dbObjects.Group;
 import org.cacert.gigi.dbObjects.SupportedUser;
 import org.cacert.gigi.dbObjects.User;
 import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.output.template.Form;
 import org.cacert.gigi.output.template.IterableDataset;
+import org.cacert.gigi.pages.LoginPage;
 import org.cacert.gigi.pages.Page;
 import org.cacert.gigi.util.AuthorizationContext;
 
@@ -36,11 +36,10 @@ public class SupportUserDetailsPage extends Page {
             resp.sendError(404);
         }
         final User user = User.getById(id);
-        String ticket = (String) req.getSession().getAttribute("ticketNo" + user.getId());
-        SupportUserDetailsForm f = new SupportUserDetailsForm(req, new SupportedUser(user, getUser(req), ticket));
+        SupportedUser targetUser = new SupportedUser(user, getUser(req), LoginPage.getAuthorizationContext(req).getSupporterTicketId());
+        SupportUserDetailsForm f = new SupportUserDetailsForm(req, targetUser);
         HashMap<String, Object> vars = new HashMap<String, Object>();
         vars.put("details", f);
-        vars.put("ticketNo", ticket);
         final EmailAddress[] addrs = user.getEmails();
         vars.put("emails", new IterableDataset() {
 
@@ -59,20 +58,14 @@ public class SupportUserDetailsPage extends Page {
                 return true;
             }
         });
-        vars.put("certifrevoke", new SupportRevokeCertificatesForm(req, new SupportedUser(user, getUser(req), ticket)));
-        vars.put("tickethandling", new SupportEnterTicketForm(req, user));
+        vars.put("certifrevoke", new SupportRevokeCertificatesForm(req, targetUser));
         getDefaultTemplate().output(resp.getWriter(), getLanguage(req), vars);
     }
 
     @Override
     public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
         try {
-            if (req.getParameter("setTicket") != null) {
-
-                if ( !Form.getForm(req, SupportEnterTicketForm.class).submit(resp.getWriter(), req)) {
-                    throw new GigiApiException("Invalid ticket number!");
-                }
-            } else if (req.getParameter("revokeall") != null) {
+            if (req.getParameter("revokeall") != null) {
                 if ( !Form.getForm(req, SupportRevokeCertificatesForm.class).submit(resp.getWriter(), req)) {
                     throw new GigiApiException("No ticket number set.");
                 }
@@ -90,6 +83,6 @@ public class SupportUserDetailsPage extends Page {
 
     @Override
     public boolean isPermitted(AuthorizationContext ac) {
-        return ac != null && ac.isInGroup(Group.SUPPORTER);
+        return ac != null && ac.canSupport();
     }
 }
index 04195c4a17ecf7cd02523791c8608f2dc9ecec05..abd4167b510cb0d9503bc21d0366212e46b0faa7 100644 (file)
@@ -1,4 +1,3 @@
-<?=$tickethandling?>
 <br/>
 <?=$details?>
 <table class="wrapper dataTable centertext">
diff --git a/src/org/cacert/gigi/pages/admin/support/SupportUserHistory.java b/src/org/cacert/gigi/pages/admin/support/SupportUserHistory.java
new file mode 100644 (file)
index 0000000..02ad8b0
--- /dev/null
@@ -0,0 +1,39 @@
+package org.cacert.gigi.pages.admin.support;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.cacert.gigi.dbObjects.Group;
+import org.cacert.gigi.dbObjects.User;
+import org.cacert.gigi.pages.Page;
+import org.cacert.gigi.util.AuthorizationContext;
+
+public class SupportUserHistory extends Page {
+
+    public static final String PATH = "/support/user/*/history";
+
+    private static final int intStart = PATH.indexOf('*');
+
+    public SupportUserHistory() {
+        super("Support user history");
+    }
+
+    @Override
+    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+        String info = req.getPathInfo();
+        int id = Integer.parseInt(info.substring(intStart, info.length() - PATH.length() + intStart + 1));
+        User u = User.getById(id);
+        if (u == null) {
+            resp.sendError(404);
+            return;
+        }
+        // TODO get Admin log
+    }
+
+    @Override
+    public boolean isPermitted(AuthorizationContext ac) {
+        return ac != null && ac.isInGroup(Group.SUPPORTER);
+    }
+}
index 9d190f72d89f785e2bcd4e40044f9c65089b7eb5..16f458cafd09d934d29686acfab91ce4caac0a80 100644 (file)
@@ -1,15 +1,24 @@
 package org.cacert.gigi.util;
 
+import java.io.PrintWriter;
+import java.util.Map;
+
+import org.cacert.gigi.GigiApiException;
 import org.cacert.gigi.dbObjects.CertificateOwner;
 import org.cacert.gigi.dbObjects.Group;
+import org.cacert.gigi.dbObjects.Organisation;
 import org.cacert.gigi.dbObjects.User;
+import org.cacert.gigi.localisation.Language;
+import org.cacert.gigi.output.template.Outputable;
 
-public class AuthorizationContext {
+public class AuthorizationContext implements Outputable {
 
     CertificateOwner target;
 
     User actor;
 
+    String supporterTicketId;
+
     public AuthorizationContext(CertificateOwner target, User actor) {
         this.target = target;
         this.actor = actor;
@@ -33,4 +42,42 @@ public class AuthorizationContext {
         }
         return ac.getActor();
     }
+
+    public void setSupporterTicketId(String supporterTicketId) throws GigiApiException {
+        if ( !isInGroup(Group.SUPPORTER)) {
+            throw new GigiApiException("requires a supporter");
+        }
+        this.supporterTicketId = supporterTicketId;
+    }
+
+    public String getSupporterTicketId() {
+        return supporterTicketId;
+    }
+
+    public boolean canSupport() {
+        return getSupporterTicketId() != null && isInGroup(Group.SUPPORTER);
+    }
+
+    @Override
+    public void output(PrintWriter out, Language l, Map<String, Object> vars) {
+        out.println("<div>");
+        out.println(l.getTranslation("Logged in as"));
+        out.println(": ");
+
+        if (target != actor) {
+            out.println(((Organisation) target).getName() + " (" + actor.getName().toString() + ")");
+        } else {
+            out.println(actor.getName().toString());
+        }
+
+        out.println(l.getTranslation("with"));
+        out.println(vars.get("loginMethod"));
+        out.println("</div>");
+        if (supporterTicketId != null) {
+            out.println("<div>");
+            out.println(l.getTranslation("SupportTicket: "));
+            out.println(supporterTicketId);
+            out.println("</div>");
+        }
+    }
 }
index 39d1ac40d9f99f34562a18ec4a4480815cc95755..ef71210b8948e694bcb063045744491e435a65aa 100644 (file)
@@ -1,5 +1,6 @@
 package org.cacert.gigi.pages.admin;
 
+import static org.cacert.gigi.testUtils.ManagedTest.*;
 import static org.hamcrest.CoreMatchers.*;
 import static org.junit.Assert.*;
 
@@ -9,6 +10,7 @@ import java.net.URL;
 import java.net.URLConnection;
 
 import org.cacert.gigi.dbObjects.Group;
+import org.cacert.gigi.pages.admin.support.SupportEnterTicketPage;
 import org.cacert.gigi.pages.admin.support.SupportUserDetailsPage;
 import org.cacert.gigi.testUtils.ClientTest;
 import org.cacert.gigi.testUtils.IOUtils;
@@ -18,6 +20,7 @@ public class TestSEAdminPageDetails extends ClientTest {
 
     public TestSEAdminPageDetails() throws IOException {
         grant(email, Group.SUPPORTER);
+        assertEquals(302, post(cookie, SupportEnterTicketPage.PATH, "ticketno=a20140808.8&setTicket=action", 0).getResponseCode());
     }
 
     @Test
index 3229908f3be4754bdea315bd228967fd8022618c..81d727bcd882d5e52126a3d1033dd7196db9cd6a 100644 (file)
@@ -16,6 +16,7 @@ import org.cacert.gigi.dbObjects.Domain;
 import org.cacert.gigi.dbObjects.Group;
 import org.cacert.gigi.dbObjects.User;
 import org.cacert.gigi.pages.admin.support.FindDomainPage;
+import org.cacert.gigi.pages.admin.support.SupportEnterTicketPage;
 import org.cacert.gigi.pages.admin.support.SupportUserDetailsPage;
 import org.cacert.gigi.testUtils.ClientTest;
 import org.cacert.gigi.testUtils.IOUtils;
@@ -26,6 +27,7 @@ public class TestSEAdminPageUserDomainSearch extends ClientTest {
 
     public TestSEAdminPageUserDomainSearch() throws IOException {
         grant(email, Group.SUPPORTER);
+        assertEquals(302, post(cookie, SupportEnterTicketPage.PATH, "ticketno=a20140808.8&setTicket=action", 0).getResponseCode());
     }
 
     @Test
index 23b551e7c134c544b324c407dc4fe187716e044a..95b9ec7468f616eb5c9ccabd7ca3bedc8da0b535 100644 (file)
@@ -13,6 +13,7 @@ import java.net.URLEncoder;
 
 import org.cacert.gigi.dbObjects.Group;
 import org.cacert.gigi.pages.admin.support.FindUserPage;
+import org.cacert.gigi.pages.admin.support.SupportEnterTicketPage;
 import org.cacert.gigi.pages.admin.support.SupportUserDetailsPage;
 import org.cacert.gigi.testUtils.ClientTest;
 import org.cacert.gigi.testUtils.IOUtils;
@@ -23,23 +24,15 @@ public class TestSEAdminPageUserMailSearch extends ClientTest {
 
     public TestSEAdminPageUserMailSearch() throws IOException {
         grant(email, Group.SUPPORTER);
+        assertEquals(302, post(cookie, SupportEnterTicketPage.PATH, "ticketno=a20140808.8&setTicket=action", 0).getResponseCode());
     }
 
     @Test
     public void testFulltextMailSearch() throws MalformedURLException, UnsupportedEncodingException, IOException {
         String mail = createUniqueName() + "@example.com";
         int id = createVerifiedUser("Först", "Secönd", mail, TEST_PASSWORD);
-        URLConnection uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        String csrf = getCSRF(uc, 0);
 
-        uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        uc.setDoOutput(true);
-        OutputStream os = uc.getOutputStream();
-        os.write(("csrf=" + URLEncoder.encode(csrf, "UTF-8") + "&" //
-                + "process&email=" + URLEncoder.encode(mail, "UTF-8")).getBytes("UTF-8"));
-        os.flush();
+        URLConnection uc = post(cookie, FindUserPage.PATH, "process&email=" + URLEncoder.encode(mail, "UTF-8"), 0);
         assertEquals("https://" + ServerConstants.getWwwHostNamePortSecure() + SupportUserDetailsPage.PATH + id, uc.getHeaderField("Location"));
     }
 
@@ -47,17 +40,8 @@ public class TestSEAdminPageUserMailSearch extends ClientTest {
     public void testWildcardMailSearchSingle() throws MalformedURLException, UnsupportedEncodingException, IOException {
         String mail = createUniqueName() + "@example.tld";
         int id = createVerifiedUser("Först", "Secönd", mail, TEST_PASSWORD);
-        URLConnection uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        String csrf = getCSRF(uc, 0);
 
-        uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        uc.setDoOutput(true);
-        OutputStream os = uc.getOutputStream();
-        os.write(("csrf=" + URLEncoder.encode(csrf, "UTF-8") + "&" //
-                + "process&email=" + URLEncoder.encode("%@example.tld", "UTF-8")).getBytes("UTF-8"));
-        os.flush();
+        URLConnection uc = post(cookie, FindUserPage.PATH, "process&email=" + URLEncoder.encode("%@example.tld", "UTF-8"), 0);
         assertEquals("https://" + ServerConstants.getWwwHostNamePortSecure() + SupportUserDetailsPage.PATH + id, uc.getHeaderField("Location"));
     }
 
@@ -67,17 +51,8 @@ public class TestSEAdminPageUserMailSearch extends ClientTest {
         int id = createVerifiedUser("Först", "Secönd", mail, TEST_PASSWORD);
         String mail2 = createUniqueName() + "@example.org";
         int id2 = createVerifiedUser("Först", "Secönd", mail2, TEST_PASSWORD);
-        URLConnection uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        String csrf = getCSRF(uc, 0);
+        URLConnection uc = post(cookie, FindUserPage.PATH, "process&email=" + URLEncoder.encode("%@example.org", "UTF-8"), 0);
 
-        uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        uc.setDoOutput(true);
-        OutputStream os = uc.getOutputStream();
-        os.write(("csrf=" + URLEncoder.encode(csrf, "UTF-8") + "&" //
-                + "process&email=" + URLEncoder.encode("%@example.org", "UTF-8")).getBytes("UTF-8"));
-        os.flush();
         String res = IOUtils.readURL(uc);
         assertThat(res, containsString(SupportUserDetailsPage.PATH + id));
         assertThat(res, containsString(SupportUserDetailsPage.PATH + id2));
@@ -87,19 +62,11 @@ public class TestSEAdminPageUserMailSearch extends ClientTest {
     public void testWildcardMailSearchSingleChar() throws MalformedURLException, UnsupportedEncodingException, IOException {
         String mail = createUniqueName() + "@example.org";
         int id = createVerifiedUser("Först", "Secönd", mail, TEST_PASSWORD);
-        String mail2 = createUniqueName() + "@example.org";
+        String mail2 = createUniqueName() + "@fxample.org";
         int id2 = createVerifiedUser("Först", "Secönd", mail2, TEST_PASSWORD);
-        URLConnection uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        String csrf = getCSRF(uc, 0);
 
-        uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        uc.setDoOutput(true);
-        OutputStream os = uc.getOutputStream();
-        os.write(("csrf=" + URLEncoder.encode(csrf, "UTF-8") + "&" //
-                + "process&email=" + URLEncoder.encode("%@_xample.org", "UTF-8")).getBytes("UTF-8"));
-        os.flush();
+        URLConnection uc = post(cookie, FindUserPage.PATH, "process&email=" + URLEncoder.encode("%@_xample.org", "UTF-8"), 0);
+
         String res = IOUtils.readURL(uc);
         assertThat(res, containsString(SupportUserDetailsPage.PATH + id));
         assertThat(res, containsString(SupportUserDetailsPage.PATH + id2));
@@ -123,17 +90,8 @@ public class TestSEAdminPageUserMailSearch extends ClientTest {
 
     @Test
     public void testFulltextMailSearchNoRes() throws MalformedURLException, UnsupportedEncodingException, IOException {
-        URLConnection uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        String csrf = getCSRF(uc, 0);
+        URLConnection uc = post(cookie, FindUserPage.PATH, "process&email=" + URLEncoder.encode(createUniqueName() + "@example.org", "UTF-8"), 0);
 
-        uc = new URL("https://" + getServerName() + FindUserPage.PATH).openConnection();
-        uc.addRequestProperty("Cookie", cookie);
-        uc.setDoOutput(true);
-        OutputStream os = uc.getOutputStream();
-        os.write(("csrf=" + URLEncoder.encode(csrf, "UTF-8") + "&" //
-                + "process&email=" + URLEncoder.encode(createUniqueName() + "@example.org", "UTF-8")).getBytes("UTF-8"));
-        os.flush();
         assertNotNull(fetchStartErrorMessage(IOUtils.readURL(uc)));
     }
 }
diff --git a/tests/org/cacert/gigi/pages/admin/TestSEAdminTicketSetting.java b/tests/org/cacert/gigi/pages/admin/TestSEAdminTicketSetting.java
new file mode 100644 (file)
index 0000000..c4c1a30
--- /dev/null
@@ -0,0 +1,32 @@
+package org.cacert.gigi.pages.admin;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+
+import org.cacert.gigi.dbObjects.Group;
+import org.cacert.gigi.pages.admin.support.FindDomainPage;
+import org.cacert.gigi.pages.admin.support.FindUserPage;
+import org.cacert.gigi.pages.admin.support.SupportEnterTicketPage;
+import org.cacert.gigi.testUtils.ClientTest;
+import org.junit.Test;
+
+public class TestSEAdminTicketSetting extends ClientTest {
+
+    public TestSEAdminTicketSetting() throws IOException {
+        grant(email, Group.SUPPORTER);
+    }
+
+    @Test
+    public void testFulltextMailSearch() throws MalformedURLException, UnsupportedEncodingException, IOException {
+        assertEquals(403, get(FindUserPage.PATH).getResponseCode());
+        assertEquals(302, post(cookie, SupportEnterTicketPage.PATH, "ticketno=a20140808.8&setTicket=action", 0).getResponseCode());
+        assertEquals(200, get(FindUserPage.PATH).getResponseCode());
+        assertEquals(200, get(FindDomainPage.PATH).getResponseCode());
+        assertEquals(302, post(cookie, SupportEnterTicketPage.PATH, "ticketno=a20140808.8&deleteTicket=action", 0).getResponseCode());
+        assertEquals(403, get(FindUserPage.PATH).getResponseCode());
+    }
+
+}
index fc22e6d086bc58399c3463e30aa237f8db32a94d..846a5abeac6a9e851d96a7c069cd7f20a0c6a42b 100644 (file)
@@ -1,6 +1,9 @@
 package org.cacert.gigi.testUtils;
 
 import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
 
 import org.cacert.gigi.dbObjects.User;
 
@@ -37,4 +40,23 @@ public abstract class ClientTest extends ManagedTest {
             throw new Error(e);
         }
     }
+
+    public HttpURLConnection post(String path, String query) throws IOException {
+        return post(path, query, 0);
+    }
+
+    public HttpURLConnection post(String path, String query, int formIndex) throws IOException {
+        return post(cookie, path, query, formIndex);
+    }
+
+    public HttpURLConnection get(String path) throws IOException {
+        return get(path, 0);
+    }
+
+    public HttpURLConnection get(String path, int formIndex) throws IOException {
+        URLConnection uc = new URL("https://" + getServerName() + path).openConnection();
+        uc.addRequestProperty("Cookie", cookie);
+        return (HttpURLConnection) uc;
+    }
+
 }
index 279f08c7a89640cae2caeae60aa0de7dc56e8223..3bc32ca728e26bbdd69b6b171a3d641cc8cb69fc 100644 (file)
@@ -452,6 +452,12 @@ public class ManagedTest extends ConfiguredTest {
     }
 
     public static String executeBasicWebInteraction(String cookie, String path, String query, int formIndex) throws IOException, MalformedURLException, UnsupportedEncodingException {
+        URLConnection uc = post(cookie, path, query, formIndex);
+        String error = fetchStartErrorMessage(IOUtils.readURL(uc));
+        return error;
+    }
+
+    public static HttpURLConnection post(String cookie, String path, String query, int formIndex) throws IOException, MalformedURLException, UnsupportedEncodingException {
         URLConnection uc = new URL("https://" + getServerName() + path).openConnection();
         uc.addRequestProperty("Cookie", cookie);
         String csrf = getCSRF(uc, formIndex);
@@ -464,8 +470,7 @@ public class ManagedTest extends ConfiguredTest {
         + query//
         ).getBytes("UTF-8"));
         os.flush();
-        String error = fetchStartErrorMessage(IOUtils.readURL(uc));
-        return error;
+        return (HttpURLConnection) uc;
     }
 
     public static EmailAddress createVerifiedEmail(User u) throws InterruptedException, GigiApiException {