From: Felix Dörre Date: Thu, 23 Oct 2014 20:58:05 +0000 (+0200) Subject: ADD: Show and add affiliations to organistations. X-Git-Url: https://code.wpia.club/?p=gigi.git;a=commitdiff_plain;h=d4802b68c651a984f0b98a462ac1e7721aa50388 ADD: Show and add affiliations to organistations. --- diff --git a/doc/tableStructure.sql b/doc/tableStructure.sql index 82c0e82f..6eb7ae3c 100644 --- a/doc/tableStructure.sql +++ b/doc/tableStructure.sql @@ -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; diff --git a/src/org/cacert/gigi/dbObjects/CertificateOwner.java b/src/org/cacert/gigi/dbObjects/CertificateOwner.java index 1decebb4..3091de6c 100644 --- a/src/org/cacert/gigi/dbObjects/CertificateOwner.java +++ b/src/org/cacert/gigi/dbObjects/CertificateOwner.java @@ -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)); diff --git a/src/org/cacert/gigi/dbObjects/Organisation.java b/src/org/cacert/gigi/dbObjects/Organisation.java index fcd9b2a3..633412c4 100644 --- a/src/org/cacert/gigi/dbObjects/Organisation.java +++ b/src/org/cacert/gigi/dbObjects/Organisation.java @@ -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) { diff --git a/src/org/cacert/gigi/dbObjects/User.java b/src/org/cacert/gigi/dbObjects/User.java index 398af91a..57a9ee2c 100644 --- a/src/org/cacert/gigi/dbObjects/User.java +++ b/src/org/cacert/gigi/dbObjects/User.java @@ -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 index 00000000..e9ab64b4 --- /dev/null +++ b/src/org/cacert/gigi/pages/orga/AffiliationForm.java @@ -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 vars) { + final List admins = o.getAllAdmins(); + vars.put("admins", new IterableDataset() { + + Iterator iter = admins.iterator(); + + @Override + public boolean next(Language l, Map 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 index 00000000..e3d2410c --- /dev/null +++ b/src/org/cacert/gigi/pages/orga/AffiliationForm.templ @@ -0,0 +1,17 @@ + + + + + + + + + + + +
+: + +? + + diff --git a/src/org/cacert/gigi/pages/orga/EditOrg.templ b/src/org/cacert/gigi/pages/orga/EditOrg.templ new file mode 100644 index 00000000..fa3fbb64 --- /dev/null +++ b/src/org/cacert/gigi/pages/orga/EditOrg.templ @@ -0,0 +1,3 @@ + + + diff --git a/src/org/cacert/gigi/pages/orga/ViewOrgPage.java b/src/org/cacert/gigi/pages/orga/ViewOrgPage.java index 06ed58fd..a26b7131 100644 --- a/src/org/cacert/gigi/pages/orga/ViewOrgPage.java +++ b/src/org/cacert/gigi/pages/orga/ViewOrgPage.java @@ -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()); - out.println(lang.getTranslation("WARNING: updating the data will revoke all issued certificates.")); + HashMap vars = new HashMap<>(); + vars.put("editForm", new CreateOrgForm(req, o)); + vars.put("affForm", new AffiliationForm(req, o)); + mainTempl.output(out, lang, vars); } } diff --git a/tests/org/cacert/gigi/TestOrga.java b/tests/org/cacert/gigi/TestOrga.java index e93070d6..72e41efd 100644 --- a/tests/org/cacert/gigi/TestOrga.java +++ b/tests/org/cacert/gigi/TestOrga.java @@ -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()); } + } diff --git a/tests/org/cacert/gigi/TestUser.java b/tests/org/cacert/gigi/TestUser.java index 2c039875..4a51af94 100644 --- a/tests/org/cacert/gigi/TestUser.java +++ b/tests/org/cacert/gigi/TestUser.java @@ -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); + } + }