From f3854f902e8c2c14bcc3c16baf82134ca5147494 Mon Sep 17 00:00:00 2001 From: INOPIAE Date: Thu, 7 Jul 2016 09:33:16 +0200 Subject: [PATCH] add: new test types for CATS and handling in gigi test manager Change-Id: Ia0a5aa22c9f38122d22917436d1f99ddf0e57357 --- src/org/cacert/gigi/Gigi.java | 4 +- .../gigi/database/DatabaseConnection.java | 2 +- .../cacert/gigi/database/tableStructure.sql | 11 ++++- .../cacert/gigi/database/upgrade/from_16.sql | 8 ++++ src/org/cacert/gigi/dbObjects/CATS.java | 47 +++++++++++++++++-- src/org/cacert/gigi/dbObjects/User.java | 3 +- .../org/cacert/gigi/api/ImportCATSResult.java | 4 +- .../gigi/pages/account/TestTrainings.java | 5 +- .../cacert/gigi/testUtils/ManagedTest.java | 4 +- .../org/cacert/gigi/pages/Manager.java | 41 ++++++++++++---- .../org/cacert/gigi/pages/Manager.templ | 5 ++ 11 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 src/org/cacert/gigi/database/upgrade/from_16.sql diff --git a/src/org/cacert/gigi/Gigi.java b/src/org/cacert/gigi/Gigi.java index 58e7b11d..cb8c389e 100644 --- a/src/org/cacert/gigi/Gigi.java +++ b/src/org/cacert/gigi/Gigi.java @@ -23,7 +23,7 @@ import javax.servlet.http.HttpSession; import org.cacert.gigi.database.DatabaseConnection; import org.cacert.gigi.database.DatabaseConnection.Link; import org.cacert.gigi.dbObjects.CACertificate; -import org.cacert.gigi.dbObjects.CATS; +import org.cacert.gigi.dbObjects.CATS.CATSType; import org.cacert.gigi.dbObjects.CertificateProfile; import org.cacert.gigi.dbObjects.DomainPingConfiguration; import org.cacert.gigi.localisation.Language; @@ -254,7 +254,7 @@ public final class Gigi extends HttpServlet { try (Link l = DatabaseConnection.newLink(false)) { CACertificate.getById(1); CertificateProfile.getById(1); - CATS.getID(CATS.ASSURER_CHALLENGE_NAME); + CATSType.ASSURER_CHALLENGE.getDisplayName(); } catch (InterruptedException e) { throw new Error(e); } diff --git a/src/org/cacert/gigi/database/DatabaseConnection.java b/src/org/cacert/gigi/database/DatabaseConnection.java index abd4c93d..f2c5d5fa 100644 --- a/src/org/cacert/gigi/database/DatabaseConnection.java +++ b/src/org/cacert/gigi/database/DatabaseConnection.java @@ -122,7 +122,7 @@ public class DatabaseConnection { } - public static final int CURRENT_SCHEMA_VERSION = 16; + public static final int CURRENT_SCHEMA_VERSION = 17; public static final int CONNECTION_TIMEOUT = 24 * 60 * 60; diff --git a/src/org/cacert/gigi/database/tableStructure.sql b/src/org/cacert/gigi/database/tableStructure.sql index eddd1a6b..cc2aebd0 100644 --- a/src/org/cacert/gigi/database/tableStructure.sql +++ b/src/org/cacert/gigi/database/tableStructure.sql @@ -319,6 +319,15 @@ CREATE TABLE "cats_type" ( UNIQUE ("type_text") ); +# Add values to table "cats_type" +INSERT INTO `cats_type` (`type_text`) VALUES ('Agent Qualifying Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('Organisation Agent Qualifying Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('TTP Agent Qualifying Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('TTP TOPUP Agent Qualifying Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('Code Signing Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('Organisation Administrator Data Protection Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('Support Data Protection Challenge'); + DROP TABLE IF EXISTS "arbitrations"; CREATE TABLE IF NOT EXISTS "arbitrations" ( "user" int NOT NULL, @@ -376,7 +385,7 @@ CREATE TABLE "schemeVersion" ( "version" smallint NOT NULL, PRIMARY KEY ("version") ); -INSERT INTO "schemeVersion" (version) VALUES(16); +INSERT INTO "schemeVersion" (version) VALUES(17); DROP TABLE IF EXISTS `passwordResetTickets`; CREATE TABLE `passwordResetTickets` ( diff --git a/src/org/cacert/gigi/database/upgrade/from_16.sql b/src/org/cacert/gigi/database/upgrade/from_16.sql new file mode 100644 index 00000000..021e6309 --- /dev/null +++ b/src/org/cacert/gigi/database/upgrade/from_16.sql @@ -0,0 +1,8 @@ +UPDATE `cats_type` SET `type_text` = 'Agent Qualifying Challenge' WHERE `type_text` = 'Assurer''s Challenge'; + +INSERT INTO `cats_type` (`type_text`) VALUES ('Organisation Agent Qualifying Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('TTP Agent Qualifying Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('TTP TOPUP Agent Qualifying Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('Code Signing Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('Organisation Administrator Data Protection Challenge'); +INSERT INTO `cats_type` (`type_text`) VALUES ('Support Data Protection Challenge'); diff --git a/src/org/cacert/gigi/dbObjects/CATS.java b/src/org/cacert/gigi/dbObjects/CATS.java index 700d76ee..cac16694 100644 --- a/src/org/cacert/gigi/dbObjects/CATS.java +++ b/src/org/cacert/gigi/dbObjects/CATS.java @@ -9,11 +9,40 @@ import org.cacert.gigi.database.GigiResultSet; public class CATS { - private static HashMap names = new HashMap<>(); + public enum CATSType { + ASSURER_CHALLENGE("Agent Qualifying Challenge"), + + ORG_AGENT_CHALLENGE("Organisation Agent Qualifying Challenge"), + + TTP_AGENT_CHALLENGE("TTP Agent Qualifying Challenge"), + + TTP_TOPUP_AGENT_CHALLENGE_NAME("TTP TOPUP Agent Qualifying Challenge"), + + CODE_SIGNING_CHALLENGE_NAME("Code Signing Challenge"), + + ORG_ADMIN_DP_CHALLENGE_NAME("Organisation Administrator Data Protection Challenge"), - public static final String ASSURER_CHALLENGE_NAME = "Assurer's Challenge"; + SUPPORT_DP_CHALLENGE_NAME("Support Data Protection Challenge"); - public static final int ASSURER_CHALLENGE_ID; + private final String displayName; + + private final int id; + + private CATSType(String displayName) { + this.displayName = displayName; + id = getID(displayName); + } + + public String getDisplayName() { + return displayName; + } + + public int getId() { + return id; + } + } + + private static HashMap names = new HashMap<>(); private CATS() { @@ -26,7 +55,6 @@ public class CATS { names.put(res.getString(2), res.getInt(1)); } } - ASSURER_CHALLENGE_ID = getID(ASSURER_CHALLENGE_NAME); } public static synchronized int getID(String name) { @@ -42,10 +70,19 @@ public class CATS { return i; } + public static void enterResult(User user, CATSType testType, Date passDate, String language, String version) { + enterResult(user, testType.id, passDate, language, version); + } + public static void enterResult(User user, String testType, Date passDate, String language, String version) { + enterResult(user, getID(testType), passDate, language, version); + } + + private static void enterResult(User user, int testTypeId, Date passDate, String language, String version) { + try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `cats_passed` SET `user_id`=?, `variant_id`=?, `pass_date`=?, `language`=?, `version`=?")) { ps.setInt(1, user.getId()); - ps.setInt(2, getID(testType)); + ps.setInt(2, testTypeId); ps.setTimestamp(3, new Timestamp(passDate.getTime())); ps.setString(4, language); ps.setString(5, version); diff --git a/src/org/cacert/gigi/dbObjects/User.java b/src/org/cacert/gigi/dbObjects/User.java index 370790c9..7c45661e 100644 --- a/src/org/cacert/gigi/dbObjects/User.java +++ b/src/org/cacert/gigi/dbObjects/User.java @@ -11,6 +11,7 @@ import java.util.Set; import org.cacert.gigi.GigiApiException; import org.cacert.gigi.database.GigiPreparedStatement; import org.cacert.gigi.database.GigiResultSet; +import org.cacert.gigi.dbObjects.CATS.CATSType; import org.cacert.gigi.localisation.Language; import org.cacert.gigi.output.DateSelector; import org.cacert.gigi.pages.PasswordResetPage; @@ -161,7 +162,7 @@ public class User extends CertificateOwner { public boolean hasPassedCATS() { try (GigiPreparedStatement query = new GigiPreparedStatement("SELECT 1 FROM `cats_passed` where `user_id`=? AND `variant_id`=?")) { query.setInt(1, getId()); - query.setInt(2, CATS.ASSURER_CHALLENGE_ID); + query.setInt(2, CATSType.ASSURER_CHALLENGE.getId()); try (GigiResultSet rs = query.executeQuery()) { if (rs.next()) { return true; diff --git a/tests/org/cacert/gigi/api/ImportCATSResult.java b/tests/org/cacert/gigi/api/ImportCATSResult.java index 30d3ffff..3fe6a63c 100644 --- a/tests/org/cacert/gigi/api/ImportCATSResult.java +++ b/tests/org/cacert/gigi/api/ImportCATSResult.java @@ -17,7 +17,7 @@ import java.security.PrivateKey; import java.security.cert.X509Certificate; import org.cacert.gigi.GigiApiException; -import org.cacert.gigi.dbObjects.CATS; +import org.cacert.gigi.dbObjects.CATS.CATSType; import org.cacert.gigi.dbObjects.Certificate; import org.cacert.gigi.dbObjects.Certificate.CSRType; import org.cacert.gigi.dbObjects.Certificate.SANType; @@ -73,7 +73,7 @@ public class ImportCATSResult extends ClientTest { apiImport(u2, "Test Training"); assertEquals(1, u2.getTrainings().length); assertFalse(u2.hasPassedCATS()); - apiImport(u2, CATS.ASSURER_CHALLENGE_NAME); + apiImport(u2, CATSType.ASSURER_CHALLENGE.getDisplayName()); assertEquals(2, u2.getTrainings().length); assertTrue(u2.hasPassedCATS()); diff --git a/tests/org/cacert/gigi/pages/account/TestTrainings.java b/tests/org/cacert/gigi/pages/account/TestTrainings.java index 22bd4a17..7a30a3dc 100644 --- a/tests/org/cacert/gigi/pages/account/TestTrainings.java +++ b/tests/org/cacert/gigi/pages/account/TestTrainings.java @@ -8,6 +8,7 @@ import java.security.GeneralSecurityException; import java.sql.Date; import org.cacert.gigi.dbObjects.CATS; +import org.cacert.gigi.dbObjects.CATS.CATSType; import org.cacert.gigi.testUtils.ClientTest; import org.cacert.gigi.testUtils.IOUtils; import org.cacert.gigi.util.HTMLEncoder; @@ -19,11 +20,11 @@ public class TestTrainings extends ClientTest { @Test public void testShow() throws IOException, GeneralSecurityException { - CATS.enterResult(u, CATS.ASSURER_CHALLENGE_NAME, new Date(System.currentTimeMillis()), "en_US", "1"); + CATS.enterResult(u, CATSType.ASSURER_CHALLENGE, new Date(System.currentTimeMillis()), "en_US", "1"); CATS.enterResult(u, "Special Case Test", new Date(System.currentTimeMillis()), "spLan", "v23"); String res = IOUtils.readURL(get(UserTrainings.PATH)); assertThat(res, containsString("Special Case Test")); - assertThat(res, containsString(HTMLEncoder.encodeHTML(CATS.ASSURER_CHALLENGE_NAME))); + assertThat(res, containsString(HTMLEncoder.encodeHTML(CATSType.ASSURER_CHALLENGE.getDisplayName()))); assertThat(res, containsString("en_US, 1")); assertThat(res, containsString("v23")); assertThat(res, containsString("spLan")); diff --git a/tests/org/cacert/gigi/testUtils/ManagedTest.java b/tests/org/cacert/gigi/testUtils/ManagedTest.java index 6fa11a91..61689b55 100644 --- a/tests/org/cacert/gigi/testUtils/ManagedTest.java +++ b/tests/org/cacert/gigi/testUtils/ManagedTest.java @@ -38,7 +38,7 @@ import org.cacert.gigi.GigiApiException; import org.cacert.gigi.database.GigiPreparedStatement; import org.cacert.gigi.database.GigiResultSet; import org.cacert.gigi.database.SQLFileManager.ImportType; -import org.cacert.gigi.dbObjects.CATS; +import org.cacert.gigi.dbObjects.CATS.CATSType; import org.cacert.gigi.dbObjects.Domain; import org.cacert.gigi.dbObjects.DomainPingType; import org.cacert.gigi.dbObjects.EmailAddress; @@ -344,7 +344,7 @@ public class ManagedTest extends ConfiguredTest { public static void makeAssurer(int uid) { try (GigiPreparedStatement ps1 = new GigiPreparedStatement("INSERT INTO cats_passed SET user_id=?, variant_id=?, language='en_EN', version=1")) { ps1.setInt(1, uid); - ps1.setInt(2, CATS.ASSURER_CHALLENGE_ID); + ps1.setInt(2, CATSType.ASSURER_CHALLENGE.getId()); ps1.execute(); } diff --git a/util-testing/org/cacert/gigi/pages/Manager.java b/util-testing/org/cacert/gigi/pages/Manager.java index ceadd038..6c45d346 100644 --- a/util-testing/org/cacert/gigi/pages/Manager.java +++ b/util-testing/org/cacert/gigi/pages/Manager.java @@ -9,6 +9,7 @@ import java.security.KeyPairGenerator; import java.security.Signature; import java.util.Base64; import java.util.Calendar; +import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; @@ -28,6 +29,8 @@ import org.cacert.gigi.GigiApiException; import org.cacert.gigi.crypto.SPKAC; import org.cacert.gigi.database.GigiPreparedStatement; import org.cacert.gigi.dbObjects.Assurance.AssuranceType; +import org.cacert.gigi.dbObjects.CATS; +import org.cacert.gigi.dbObjects.CATS.CATSType; import org.cacert.gigi.dbObjects.Certificate; import org.cacert.gigi.dbObjects.Certificate.CertificateStatus; import org.cacert.gigi.dbObjects.CertificateOwner; @@ -104,7 +107,7 @@ public class Manager extends Page { System.out.println("Creating assurer"); createUser(mail); u = User.getByEmail(mail); - passCATS(u); + passCATS(u, CATSType.ASSURER_CHALLENGE); ps.setInt(1, u.getId()); ps.setInt(2, u.getId()); ps.setInt(3, 100); @@ -116,11 +119,8 @@ public class Manager extends Page { } } - private void passCATS(User u) { - try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO cats_passed SET user_id=?, variant_id=1, language='en_EN', version=1")) { - ps.setInt(1, u.getId()); - ps.execute(); - } + private void passCATS(User u, CATSType t) { + CATS.enterResult(u, t, new Date(System.currentTimeMillis()), "en_EN", "1"); } private static Manager instance; @@ -246,13 +246,19 @@ public class Manager extends Page { fetchMails(req, resp, mail); } else if (req.getParameter("cats") != null) { String mail = req.getParameter("catsEmail"); + String testId = req.getParameter("catsType"); User byEmail = User.getByEmail(mail); if (byEmail == null) { resp.getWriter().println("User not found."); return; } - passCATS(byEmail); - resp.getWriter().println("User has been passed CATS"); + if (testId == null) { + resp.getWriter().println("No test given."); + return; + } + CATSType test = CATSType.values()[Integer.parseInt(testId)]; + passCATS(byEmail, test); + resp.getWriter().println("Test '" + test.getDisplayName() + "' was added to user account."); } else if (req.getParameter("assure") != null) { String mail = req.getParameter("assureEmail"); User byEmail = User.getByEmail(mail); @@ -375,7 +381,24 @@ public class Manager extends Page { fetchMails(req, resp, mail); return; } + HashMap vars = new HashMap<>(); + vars.put("cats_types", new IterableDataset() { - form.output(resp.getWriter(), getLanguage(req), new HashMap()); + CATSType[] type = CATSType.values(); + + int i = 0; + + @Override + public boolean next(Language l, Map vars) { + if (i >= type.length) { + return false; + } + CATSType t = type[i++]; + vars.put("id", i - 1); + vars.put("name", t.getDisplayName()); + return true; + } + }); + form.output(resp.getWriter(), getLanguage(req), vars); } } diff --git a/util-testing/org/cacert/gigi/pages/Manager.templ b/util-testing/org/cacert/gigi/pages/Manager.templ index 8c32a8c9..d1cb1f62 100644 --- a/util-testing/org/cacert/gigi/pages/Manager.templ +++ b/util-testing/org/cacert/gigi/pages/Manager.templ @@ -45,6 +45,11 @@ Add CATs entry: Email: + -- 2.39.2