]> WPIA git - gigi.git/commitdiff
ADD: Show and add affiliations to organistations.
authorFelix Dörre <felix@dogcraft.de>
Thu, 23 Oct 2014 20:58:05 +0000 (22:58 +0200)
committerJanis Streib <janis@dogcraft.de>
Wed, 31 Dec 2014 01:35:48 +0000 (02:35 +0100)
doc/tableStructure.sql
src/org/cacert/gigi/dbObjects/CertificateOwner.java
src/org/cacert/gigi/dbObjects/Organisation.java
src/org/cacert/gigi/dbObjects/User.java
src/org/cacert/gigi/pages/orga/AffiliationForm.java [new file with mode: 0644]
src/org/cacert/gigi/pages/orga/AffiliationForm.templ [new file with mode: 0644]
src/org/cacert/gigi/pages/orga/EditOrg.templ [new file with mode: 0644]
src/org/cacert/gigi/pages/orga/ViewOrgPage.java
tests/org/cacert/gigi/TestOrga.java
tests/org/cacert/gigi/TestUser.java

index 82c0e82fb317eee21f00edf63d1e3f4e5c5d9420..6eb7ae3c90e1d3f70eaced4cb551a785f53699dd 100644 (file)
@@ -311,5 +311,5 @@ CREATE TABLE IF NOT EXISTS `org_admin` (
   `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `deleter` int(11) NULL DEFAULT NULL,
   `deleted` timestamp NULL DEFAULT NULL,
-  PRIMARY KEY (`orgid`, `memid`)
+  KEY (`orgid`, `memid`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
index 1decebb4e02aa47d17313652a8991484112dae71..3091de6c98c806eff28ffc2e5e10c786b16b359d 100644 (file)
@@ -27,7 +27,7 @@ public abstract class CertificateOwner implements IdCachable {
             ps.setInt(1, id);
             GigiResultSet rs = ps.executeQuery();
             if ( !rs.next()) {
-                System.out.println("no " + id);
+                return null;
             }
             if (rs.getString("uid") != null) {
                 myCache.put(u = new User(rs));
index fcd9b2a3b1a6003b24ba7131af8acb3d2c618168..633412c440fff98732c4fdfc11a0e9bfe2505cfa 100644 (file)
@@ -100,13 +100,20 @@ public class Organisation extends CertificateOwner {
         return null;
     }
 
-    public void addAdmin(User admin, User actor, boolean master) {
-        GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO org_admin SET orgid=?, memid=?, creator=?, master=?");
-        ps.setInt(1, getId());
-        ps.setInt(2, admin.getId());
-        ps.setInt(3, actor.getId());
-        ps.setString(4, master ? "y" : "n");
-        ps.execute();
+    public synchronized void addAdmin(User admin, User actor, boolean master) {
+        GigiPreparedStatement ps1 = DatabaseConnection.getInstance().prepare("SELECT 1 FROM org_admin WHERE orgid=? AND memid=? AND deleted is null");
+        ps1.setInt(1, getId());
+        ps1.setInt(2, admin.getId());
+        GigiResultSet result = ps1.executeQuery();
+        if (result.next()) {
+            return;
+        }
+        GigiPreparedStatement ps2 = DatabaseConnection.getInstance().prepare("INSERT INTO org_admin SET orgid=?, memid=?, creator=?, master=?");
+        ps2.setInt(1, getId());
+        ps2.setInt(2, admin.getId());
+        ps2.setInt(3, actor.getId());
+        ps2.setString(4, master ? "y" : "n");
+        ps2.execute();
     }
 
     public void removeAdmin(User admin, User actor) {
index 398af91adf7304fbad0867817d1c14768425b3bc..57a9ee2cefbad0293f047266db95b03f912bb2f4 100644 (file)
@@ -419,6 +419,16 @@ public class User extends CertificateOwner {
         return null;
     }
 
+    public static User getByEmail(String mail) {
+        GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT users.id FROM users inner join certOwners on certOwners.id=users.id WHERE email=? AND deleted is null");
+        ps.setString(1, mail);
+        GigiResultSet rs = ps.executeQuery();
+        if ( !rs.next()) {
+            return null;
+        }
+        return User.getById(rs.getInt(1));
+    }
+
     public boolean canIssue(CertificateProfile p) {
         switch (p.getCAId()) {
         case 0:
diff --git a/src/org/cacert/gigi/pages/orga/AffiliationForm.java b/src/org/cacert/gigi/pages/orga/AffiliationForm.java
new file mode 100644 (file)
index 0000000..e9ab64b
--- /dev/null
@@ -0,0 +1,60 @@
+package org.cacert.gigi.pages.orga;
+
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.cacert.gigi.GigiApiException;
+import org.cacert.gigi.dbObjects.Organisation;
+import org.cacert.gigi.dbObjects.Organisation.Affiliation;
+import org.cacert.gigi.dbObjects.User;
+import org.cacert.gigi.localisation.Language;
+import org.cacert.gigi.output.Form;
+import org.cacert.gigi.output.template.IterableDataset;
+import org.cacert.gigi.output.template.Template;
+import org.cacert.gigi.pages.LoginPage;
+
+public class AffiliationForm extends Form {
+
+    Organisation o;
+
+    private static final Template t = new Template(AffiliationForm.class.getResource("AffiliationForm.templ"));
+
+    public AffiliationForm(HttpServletRequest hsr, Organisation o) {
+        super(hsr);
+        this.o = o;
+    }
+
+    @Override
+    public boolean submit(PrintWriter out, HttpServletRequest req) throws GigiApiException {
+        o.addAdmin(User.getByEmail(req.getParameter("email")), LoginPage.getUser(req), req.getParameter("master") != null);
+        return true;
+    }
+
+    @Override
+    protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
+        final List<Affiliation> admins = o.getAllAdmins();
+        vars.put("admins", new IterableDataset() {
+
+            Iterator<Affiliation> iter = admins.iterator();
+
+            @Override
+            public boolean next(Language l, Map<String, Object> vars) {
+                if ( !iter.hasNext())
+                    return false;
+                Affiliation aff = iter.next();
+                vars.put("name", aff.getTarget().getName());
+                vars.put("master", aff.isMaster() ? l.getTranslation("master") : "");
+                return true;
+            }
+        });
+        t.output(out, l, vars);
+    }
+
+    public Organisation getOrganisation() {
+        return o;
+    }
+}
diff --git a/src/org/cacert/gigi/pages/orga/AffiliationForm.templ b/src/org/cacert/gigi/pages/orga/AffiliationForm.templ
new file mode 100644 (file)
index 0000000..e3d2410
--- /dev/null
@@ -0,0 +1,17 @@
+<table align="center" valign="middle" border="0" cellspacing="0" cellpadding="0" class="wrapper dataTable">
+  <tr>
+    <th><?=_Name?></th>
+    <th><?=_Master?></th>
+  </tr>
+<? foreach($admins) { ?>
+  <tr>
+    <td><?=$name?></td>
+    <td><?=$master?></td>
+  </tr>
+<? } ?>
+</table>
+<?=_Add new admin?>:
+<input type="text" name="email">
+<?=_Master?>?
+<input type="checkbox" name="master" value="y">
+<input type="submit" name="affiliate" value="<?=_Add?>">
diff --git a/src/org/cacert/gigi/pages/orga/EditOrg.templ b/src/org/cacert/gigi/pages/orga/EditOrg.templ
new file mode 100644 (file)
index 0000000..fa3fbb6
--- /dev/null
@@ -0,0 +1,3 @@
+<?=$editForm?>
+<?=_WARNING: updating the data will revoke all issued certificates.?>
+<?=$affForm?>
index 06ed58fd8797b8bfe95fe62f83d842074d2e4028..a26b71314284794483b5546098ad530c85d646e1 100644 (file)
@@ -21,6 +21,8 @@ public class ViewOrgPage extends Page {
 
     private final Template orgas = new Template(ViewOrgPage.class.getResource("ViewOrgs.templ"));
 
+    private final Template mainTempl = new Template(ViewOrgPage.class.getResource("EditOrg.templ"));
+
     public static final String DEFAULT_PATH = "/orga";
 
     public ViewOrgPage() {
@@ -35,7 +37,13 @@ public class ViewOrgPage extends Page {
     @Override
     public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
         try {
-            Form.getForm(req, CreateOrgForm.class).submit(resp.getWriter(), req);
+            if (req.getParameter("affiliate") != null) {
+                AffiliationForm form = Form.getForm(req, AffiliationForm.class);
+                form.submit(resp.getWriter(), req);
+                resp.sendRedirect(DEFAULT_PATH + "/" + form.getOrganisation().getId());
+            } else {
+                Form.getForm(req, CreateOrgForm.class).submit(resp.getWriter(), req);
+            }
         } catch (GigiApiException e) {
             e.format(resp.getWriter(), getLanguage(req));
         }
@@ -58,7 +66,6 @@ public class ViewOrgPage extends Page {
                     if (count >= orgas.length)
                         return false;
                     Organisation org = orgas[count++];
-                    System.out.println(org.getId());
                     vars.put("id", Integer.toString(org.getId()));
                     vars.put("name", org.getName());
                     vars.put("country", org.getState());
@@ -75,7 +82,9 @@ public class ViewOrgPage extends Page {
             resp.sendError(404);
             return;
         }
-        new CreateOrgForm(req, o).output(out, lang, new HashMap<String, Object>());
-        out.println(lang.getTranslation("WARNING: updating the data will revoke all issued certificates."));
+        HashMap<String, Object> vars = new HashMap<>();
+        vars.put("editForm", new CreateOrgForm(req, o));
+        vars.put("affForm", new AffiliationForm(req, o));
+        mainTempl.output(out, lang, vars);
     }
 }
index e93070d6adf3fbc2a1c235857293539e277a7666..72e41efdae68b0da8b162fe9688db4d50c556a98 100644 (file)
@@ -19,14 +19,21 @@ public class TestOrga extends ManagedTest {
         assertEquals(0, o1.getAllAdmins().size());
         o1.addAdmin(u2, u1, false);
         assertEquals(1, o1.getAllAdmins().size());
+        o1.addAdmin(u2, u1, false); // Insert double should be ignored
+        assertEquals(1, o1.getAllAdmins().size());
         o1.addAdmin(u3, u1, false);
         assertEquals(2, o1.getAllAdmins().size());
         o1.addAdmin(u4, u1, false);
         assertEquals(3, o1.getAllAdmins().size());
         o1.removeAdmin(u3, u1);
         assertEquals(2, o1.getAllAdmins().size());
+        o1.addAdmin(u3, u1, false); // add again
+        assertEquals(3, o1.getAllAdmins().size());
+        o1.removeAdmin(u3, u1);
+        assertEquals(2, o1.getAllAdmins().size());
         o1.removeAdmin(u4, u1);
         o1.removeAdmin(u2, u1);
         assertEquals(0, o1.getAllAdmins().size());
     }
+
 }
index 2c039875a66d2d967a1c10d5ca32415fe955a1b5..4a51af94b5decdd2a9b7850a6b1e384cfc99c1b8 100644 (file)
@@ -124,4 +124,13 @@ public class TestUser extends ManagedTest {
         assertSame(ra, ra2);
     }
 
+    @Test
+    public void testGetByMail() {
+        String email = createUniqueName() + "a@email.org";
+        int id = createVerifiedUser("aä", "b", email, TEST_PASSWORD);
+        User emailUser = User.getByEmail(email);
+        User u = User.getById(id);
+        assertSame(u, emailUser);
+    }
+
 }