From: Marcus Mängel Date: Thu, 19 Mar 2020 05:59:59 +0000 (+0000) Subject: Merge "upd: redesign of find cert result page" X-Git-Url: https://code.wpia.club/?p=gigi.git;a=commitdiff_plain;h=2549d4ce76e9ada84a550795554d3376d42c634a;hp=374e616d077431214c8128e3bf5ac3045a088aae Merge "upd: redesign of find cert result page" --- diff --git a/src/club/wpia/gigi/api/CreateCertificate.java b/src/club/wpia/gigi/api/CreateCertificate.java index 1890e4a9..41556d13 100644 --- a/src/club/wpia/gigi/api/CreateCertificate.java +++ b/src/club/wpia/gigi/api/CreateCertificate.java @@ -65,7 +65,7 @@ public class CreateCertificate extends APIPoint { CertificateRequest cr = new CertificateRequest(ctx, csr, cp); Certificate result = cr.draft(); Job job = result.issue(null, "2y", u); - job.waitFor(60000); + job.waitFor(Job.WAIT_MIN); if (result.getStatus() != CertificateStatus.ISSUED) { resp.sendError(510, "Error, issuing timed out"); return; diff --git a/src/club/wpia/gigi/api/RevokeCertificate.java b/src/club/wpia/gigi/api/RevokeCertificate.java index 81e57cfb..e8e8b964 100644 --- a/src/club/wpia/gigi/api/RevokeCertificate.java +++ b/src/club/wpia/gigi/api/RevokeCertificate.java @@ -42,7 +42,7 @@ public class RevokeCertificate extends APIPoint { } Job job = c.revoke(RevocationType.USER); - job.waitFor(60000); + job.waitFor(Job.WAIT_MIN); if (c.getStatus() != CertificateStatus.REVOKED) { resp.sendError(510, "Error, issuing timed out"); return; diff --git a/src/club/wpia/gigi/dbObjects/Domain.java b/src/club/wpia/gigi/dbObjects/Domain.java index 9b356e60..1d3ba17d 100644 --- a/src/club/wpia/gigi/dbObjects/Domain.java +++ b/src/club/wpia/gigi/dbObjects/Domain.java @@ -7,6 +7,7 @@ import java.util.List; import club.wpia.gigi.GigiApiException; import club.wpia.gigi.database.GigiPreparedStatement; import club.wpia.gigi.database.GigiResultSet; +import club.wpia.gigi.dbObjects.Certificate.RevocationType; import club.wpia.gigi.util.DomainAssessment; public class Domain implements IdCachable, Verifyable { @@ -72,6 +73,19 @@ public class Domain implements IdCachable, Verifyable { ps.setInt(1, id); ps.execute(); } + LinkedList revokes = new LinkedList(); + for (Certificate cert : fetchActiveCertificates()) { + revokes.add(cert.revoke(RevocationType.USER)); + } + long start = System.currentTimeMillis(); + for (Job job : revokes) { + int toWait = (int) (60000 + start - System.currentTimeMillis()); + if (toWait > 0) { + job.waitFor(toWait); + } else { + break; // canceled... waited too log + } + } } } diff --git a/src/club/wpia/gigi/dbObjects/Job.java b/src/club/wpia/gigi/dbObjects/Job.java index a505eb41..071b1b2e 100644 --- a/src/club/wpia/gigi/dbObjects/Job.java +++ b/src/club/wpia/gigi/dbObjects/Job.java @@ -11,6 +11,8 @@ import club.wpia.gigi.output.CertificateValiditySelector; public class Job implements IdCachable { + public static int WAIT_MIN = 60000; + private int id; private Job(int id) { diff --git a/src/club/wpia/gigi/dbObjects/Name.java b/src/club/wpia/gigi/dbObjects/Name.java index fbcf10ee..ce8e7e2a 100644 --- a/src/club/wpia/gigi/dbObjects/Name.java +++ b/src/club/wpia/gigi/dbObjects/Name.java @@ -1,6 +1,9 @@ package club.wpia.gigi.dbObjects; import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; import java.util.Map; import club.wpia.gigi.GigiApiException; @@ -11,6 +14,7 @@ import club.wpia.gigi.dbObjects.NamePart.NamePartType; import club.wpia.gigi.localisation.Language; import club.wpia.gigi.output.template.Outputable; import club.wpia.gigi.util.HTMLEncoder; +import club.wpia.gigi.util.TimeConditions; public class Name implements Outputable, IdCachable { @@ -512,4 +516,26 @@ public class Name implements Outputable, IdCachable { } return initals.toString(); } + + public boolean isValidVerification() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(System.currentTimeMillis()); + c.add(Calendar.MONTH, -TimeConditions.getInstance().getVerificationMonths()); + String date = sdf.format(new Date(c.getTimeInMillis())); + try (GigiPreparedStatement query = new GigiPreparedStatement("SELECT COUNT(id) FROM `notary` WHERE `to` = ? AND `deleted` IS NULL AND (`expire` IS NULL OR `expire` > CURRENT_TIMESTAMP) AND `date` > ?")) { + query.setInt(1, getId()); + query.setString(2, date); + GigiResultSet rs = query.executeQuery(); + + if (rs.next()) { + if (rs.getInt(1) > 0) { + return true; + } + } + + return false; + } + } + } diff --git a/src/club/wpia/gigi/dbObjects/SupportedUser.java b/src/club/wpia/gigi/dbObjects/SupportedUser.java index 84c43ab8..1eae478f 100644 --- a/src/club/wpia/gigi/dbObjects/SupportedUser.java +++ b/src/club/wpia/gigi/dbObjects/SupportedUser.java @@ -70,7 +70,7 @@ public class SupportedUser { // TODO Check for open jobs! if (cert.getStatus() == CertificateStatus.ISSUED) { writeSELog("SE Revoke certificate"); - cert.revoke(RevocationType.SUPPORT).waitFor(60000); + cert.revoke(RevocationType.SUPPORT).waitFor(Job.WAIT_MIN); // send notification to support String subject = "Revoke certificate"; Outputable message = SprintfCommand.createSimple("Certificate with serial number {0} for {1} <{2}> has been revoked.", cert.getSerial(), target.getPreferredName().toString(), target.getEmail()); diff --git a/src/club/wpia/gigi/dbObjects/User.java b/src/club/wpia/gigi/dbObjects/User.java index 714bfc3a..834b6f68 100644 --- a/src/club/wpia/gigi/dbObjects/User.java +++ b/src/club/wpia/gigi/dbObjects/User.java @@ -17,6 +17,7 @@ import club.wpia.gigi.GigiApiException; import club.wpia.gigi.database.GigiPreparedStatement; import club.wpia.gigi.database.GigiResultSet; import club.wpia.gigi.dbObjects.CATS.CATSType; +import club.wpia.gigi.dbObjects.Certificate.RevocationType; import club.wpia.gigi.dbObjects.Country.CountryCodeType; import club.wpia.gigi.dbObjects.Verification.VerificationType; import club.wpia.gigi.email.EmailProvider; @@ -338,6 +339,15 @@ public class User extends CertificateOwner { return false; } + public boolean isValidNameVerification(String name) { + for (Name n : getNames()) { + if (n.matches(name) && n.isValidVerification()) { + return true; + } + } + return false; + } + public void updateDefaultEmail(EmailAddress newMail) throws GigiApiException { for (EmailAddress email : getEmails()) { if (email.getAddress().equals(newMail.getAddress())) { @@ -364,16 +374,51 @@ public class User extends CertificateOwner { throw new GigiApiException("Can't delete user's default e-mail."); } + deleteEmailCerts(delMail, RevocationType.USER); + } + + private void deleteEmailCerts(EmailAddress delMail, RevocationType rt) throws GigiApiException { for (EmailAddress email : getEmails()) { if (email.getId() == delMail.getId()) { try (GigiPreparedStatement ps = new GigiPreparedStatement("UPDATE `emails` SET `deleted`=CURRENT_TIMESTAMP WHERE `id`=?")) { ps.setInt(1, delMail.getId()); ps.execute(); } + LinkedList revokes = new LinkedList(); + for (Certificate cert : fetchActiveEmailCertificates(delMail.getAddress())) { + cert.revoke(RevocationType.USER).waitFor(Job.WAIT_MIN); + } + long start = System.currentTimeMillis(); + for (Job job : revokes) { + int toWait = (int) (60000 + start - System.currentTimeMillis()); + if (toWait > 0) { + job.waitFor(toWait); + } else { + break; // canceled... waited too log + } + } return; } + } throw new GigiApiException("Email not one of user's email addresses."); + + } + + public Certificate[] fetchActiveEmailCertificates(String email) { + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT DISTINCT `certs`.`id` FROM `certs` INNER JOIN `subjectAlternativeNames` ON `subjectAlternativeNames`.`certId` = `certs`.`id` WHERE `contents`=? AND `type`='email' AND `revoked` IS NULL AND `expire` > CURRENT_TIMESTAMP AND `memid`=?", true)) { + ps.setString(1, email); + ps.setInt(2, getId()); + GigiResultSet rs = ps.executeQuery(); + rs.last(); + Certificate[] res = new Certificate[rs.getRow()]; + rs.beforeFirst(); + int i = 0; + while (rs.next()) { + res[i++] = Certificate.getById(rs.getInt(1)); + } + return res; + } } public synchronized Verification[] getReceivedVerifications() { diff --git a/src/club/wpia/gigi/pages/account/certs/CertificateIssueForm.java b/src/club/wpia/gigi/pages/account/certs/CertificateIssueForm.java index 31be06f4..68002958 100644 --- a/src/club/wpia/gigi/pages/account/certs/CertificateIssueForm.java +++ b/src/club/wpia/gigi/pages/account/certs/CertificateIssueForm.java @@ -14,6 +14,7 @@ import club.wpia.gigi.dbObjects.Certificate.CertificateStatus; import club.wpia.gigi.dbObjects.Certificate.SubjectAlternateName; import club.wpia.gigi.dbObjects.CertificateProfile; import club.wpia.gigi.dbObjects.Domain; +import club.wpia.gigi.dbObjects.Job; import club.wpia.gigi.dbObjects.Organisation; import club.wpia.gigi.dbObjects.User; import club.wpia.gigi.localisation.Language; @@ -97,7 +98,7 @@ public class CertificateIssueForm extends Form { } result.setDescription(description); } - result.issue(issueDate.getFrom(), issueDate.getTo(), c.getActor()).waitFor(60000); + result.issue(issueDate.getFrom(), issueDate.getTo(), c.getActor()).waitFor(Job.WAIT_MIN); this.result = result; Certificate c = result; if (c.getStatus() != CertificateStatus.ISSUED) { diff --git a/src/club/wpia/gigi/pages/account/certs/CertificateModificationForm.java b/src/club/wpia/gigi/pages/account/certs/CertificateModificationForm.java index 7ca73eb0..dd616113 100644 --- a/src/club/wpia/gigi/pages/account/certs/CertificateModificationForm.java +++ b/src/club/wpia/gigi/pages/account/certs/CertificateModificationForm.java @@ -54,7 +54,7 @@ public class CertificateModificationForm extends Form { } long start = System.currentTimeMillis(); for (Job job : revokes) { - int toWait = (int) (60000 + start - System.currentTimeMillis()); + int toWait = (int) (Job.WAIT_MIN + start - System.currentTimeMillis()); if (toWait > 0) { job.waitFor(toWait); } else { diff --git a/src/club/wpia/gigi/pages/account/certs/CertificateRequest.java b/src/club/wpia/gigi/pages/account/certs/CertificateRequest.java index d9d090ca..28a5b098 100644 --- a/src/club/wpia/gigi/pages/account/certs/CertificateRequest.java +++ b/src/club/wpia/gigi/pages/account/certs/CertificateRequest.java @@ -443,7 +443,7 @@ public class CertificateRequest { subject.put("OU", ou); } } - System.out.println(subject); + if ( !error.isEmpty()) { throw error; } @@ -493,7 +493,11 @@ public class CertificateRequest { User u = (User) ctx.getTarget(); if (name != null && u.isValidName(name)) { if (realIsOK) { - verifiedCN = name; + if (u.isValidNameVerification(name)) { + verifiedCN = name; + } else { + error.mergeInto(new GigiApiException(SprintfCommand.createSimple("The entered name needs a valid verification within the last {0} months.", TimeConditions.getInstance().getVerificationMonths()))); + } } else { error.mergeInto(new GigiApiException("Your real name is not allowed in this certificate.")); if (defaultIsOK) { diff --git a/src/club/wpia/gigi/pages/account/certs/RevokeSingleCertForm.java b/src/club/wpia/gigi/pages/account/certs/RevokeSingleCertForm.java index 30e404c0..12a7daa9 100644 --- a/src/club/wpia/gigi/pages/account/certs/RevokeSingleCertForm.java +++ b/src/club/wpia/gigi/pages/account/certs/RevokeSingleCertForm.java @@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest; import club.wpia.gigi.GigiApiException; import club.wpia.gigi.dbObjects.Certificate; import club.wpia.gigi.dbObjects.Certificate.RevocationType; +import club.wpia.gigi.dbObjects.Job; import club.wpia.gigi.dbObjects.SupportedUser; import club.wpia.gigi.localisation.Language; import club.wpia.gigi.output.template.Form; @@ -32,7 +33,7 @@ public class RevokeSingleCertForm extends Form { if (target != null) { target.revokeCertificate(c); } else { - c.revoke(RevocationType.USER).waitFor(60000); + c.revoke(RevocationType.USER).waitFor(Job.WAIT_MIN); } return new RedirectResult(req.getPathInfo()); } diff --git a/src/club/wpia/gigi/pages/account/domain/DomainManagementForm.templ b/src/club/wpia/gigi/pages/account/domain/DomainManagementForm.templ index d022c271..c4507f2e 100644 --- a/src/club/wpia/gigi/pages/account/domain/DomainManagementForm.templ +++ b/src/club/wpia/gigi/pages/account/domain/DomainManagementForm.templ @@ -10,7 +10,7 @@ - + diff --git a/src/club/wpia/gigi/pages/account/mail/MailManagementForm.templ b/src/club/wpia/gigi/pages/account/mail/MailManagementForm.templ index 2449bca1..c71306f0 100644 --- a/src/club/wpia/gigi/pages/account/mail/MailManagementForm.templ +++ b/src/club/wpia/gigi/pages/account/mail/MailManagementForm.templ @@ -19,7 +19,7 @@ - + diff --git a/src/club/wpia/gigi/pages/main/KeyCompromiseForm.java b/src/club/wpia/gigi/pages/main/KeyCompromiseForm.java index e0690844..ae3e30e0 100644 --- a/src/club/wpia/gigi/pages/main/KeyCompromiseForm.java +++ b/src/club/wpia/gigi/pages/main/KeyCompromiseForm.java @@ -166,7 +166,7 @@ public class KeyCompromiseForm extends Form { throw new GigiApiException("Sending the notification mail failed."); } Job j = c.revoke(challenge, Base64.getEncoder().encodeToString(signature), message); - if ( !j.waitFor(60000)) { + if ( !j.waitFor(Job.WAIT_MIN)) { throw new PermamentFormException(new GigiApiException("Revocation timed out.")); } if (c.getStatus() != CertificateStatus.REVOKED) { diff --git a/tests/club/wpia/gigi/dbObjects/TestDomain.java b/tests/club/wpia/gigi/dbObjects/TestDomain.java new file mode 100644 index 00000000..93afd635 --- /dev/null +++ b/tests/club/wpia/gigi/dbObjects/TestDomain.java @@ -0,0 +1,43 @@ +package club.wpia.gigi.dbObjects; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.security.KeyPair; + +import org.junit.Test; + +import club.wpia.gigi.GigiApiException; +import club.wpia.gigi.dbObjects.Certificate.CSRType; +import club.wpia.gigi.dbObjects.Certificate.SANType; +import club.wpia.gigi.testUtils.ManagedTest; + +public class TestDomain extends ManagedTest { + + @Test + public void testDeleteDomainWithCertificate() throws GigiApiException, GeneralSecurityException, IOException, InterruptedException { + User u = User.getById(createVerificationUser("Kurti", "Hansel", createUniqueName() + "@email.com", TEST_PASSWORD)); + String domain = createUniqueName() + ".org"; + Domain d = new Domain(u, u, domain); + KeyPair kp = generateKeypair(); + String key = generatePEMCSR(kp, "CN=" + domain); + Certificate c = new Certificate(u, u, Certificate.buildDN("CN", domain), Digest.SHA256, key, CSRType.CSR, getClientProfile(), new Certificate.SubjectAlternateName(SANType.DNS, domain)); + c.issue(null, "2y", u).waitFor(60000); + + c = new Certificate(u, u, Certificate.buildDN("CN", domain), Digest.SHA256, key, CSRType.CSR, getClientProfile(), new Certificate.SubjectAlternateName(SANType.DNS, "www." + domain)); + c.issue(null, "2y", u).waitFor(60000); + + Certificate[] certs = d.fetchActiveCertificates(); + assertEquals(2, certs.length); + + d.delete(); + + certs = u.getCertificates(false); + assertEquals(0, certs.length); + certs = d.fetchActiveCertificates(); + assertEquals(0, certs.length); + + } + +} diff --git a/tests/club/wpia/gigi/dbObjects/TestUser.java b/tests/club/wpia/gigi/dbObjects/TestUser.java index e7aa70cf..7d7b6dba 100644 --- a/tests/club/wpia/gigi/dbObjects/TestUser.java +++ b/tests/club/wpia/gigi/dbObjects/TestUser.java @@ -134,4 +134,19 @@ public class TestUser extends ClientBusinessTest { assertThat(result, ArrayContains.contains(CoreMatchers.equalTo(type))); } + @Test + public void testValidVerification() throws GigiApiException { + User u0 = User.getById(createVerifiedUser("f", "l", createUniqueName() + "@email.com", TEST_PASSWORD)); + assertFalse(u0.isValidNameVerification(u0.getPreferredName().toString())); + + add100Points(u0.getId()); + assertTrue(u0.isValidNameVerification(u0.getPreferredName().toString())); + + setVerificationDateToPast(u0.getPreferredName()); + assertFalse(u0.isValidNameVerification(u0.getPreferredName().toString())); + + add100Points(u0.getId()); + assertTrue(u0.isValidNameVerification(u0.getPreferredName().toString())); + } + } diff --git a/tests/club/wpia/gigi/dbObjects/TestUserManaged.java b/tests/club/wpia/gigi/dbObjects/TestUserManaged.java new file mode 100644 index 00000000..d0906ae0 --- /dev/null +++ b/tests/club/wpia/gigi/dbObjects/TestUserManaged.java @@ -0,0 +1,39 @@ +package club.wpia.gigi.dbObjects; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.security.KeyPair; + +import org.junit.Test; + +import club.wpia.gigi.GigiApiException; +import club.wpia.gigi.dbObjects.Certificate.CSRType; +import club.wpia.gigi.dbObjects.Certificate.SANType; +import club.wpia.gigi.testUtils.ManagedTest; + +public class TestUserManaged extends ManagedTest { + + @Test + public void testDeleteEmailWithCertificate() throws GigiApiException, GeneralSecurityException, IOException, InterruptedException { + + int id = createVerifiedUser("Test", "User", createUniqueName() + "test@test.tld", TEST_PASSWORD); + String email = createUniqueName() + "test@test.tld"; + User u = User.getById(id); + Certificate[] certs = u.getCertificates(false); + int certCount = certs.length; + EmailAddress testAddress = createVerifiedEmail(u, email); + KeyPair kp = generateKeypair(); + String key = generatePEMCSR(kp, "CN=" + email); + Certificate c = new Certificate(u, u, Certificate.buildDN("CN", email), Digest.SHA256, key, CSRType.CSR, getClientProfile(), new Certificate.SubjectAlternateName(SANType.EMAIL, email)); + c.issue(null, "2y", u).waitFor(Job.WAIT_MIN); + + u.deleteEmail(testAddress); + + assertFalse(c.getRevocationDate().toString().isEmpty()); + certs = u.getCertificates(false); + assertEquals(certCount, certs.length); + + } +} diff --git a/tests/club/wpia/gigi/dbObjects/TestVerifyName.java b/tests/club/wpia/gigi/dbObjects/TestVerifyName.java index 7f3af269..7ad2c7f4 100644 --- a/tests/club/wpia/gigi/dbObjects/TestVerifyName.java +++ b/tests/club/wpia/gigi/dbObjects/TestVerifyName.java @@ -5,13 +5,9 @@ import static org.junit.Assert.*; import org.junit.Test; import club.wpia.gigi.GigiApiException; -import club.wpia.gigi.dbObjects.Country; -import club.wpia.gigi.dbObjects.Name; -import club.wpia.gigi.dbObjects.NamePart; -import club.wpia.gigi.dbObjects.User; -import club.wpia.gigi.dbObjects.Verification.VerificationType; import club.wpia.gigi.dbObjects.Country.CountryCodeType; import club.wpia.gigi.dbObjects.NamePart.NamePartType; +import club.wpia.gigi.dbObjects.Verification.VerificationType; import club.wpia.gigi.testUtils.ClientBusinessTest; import club.wpia.gigi.util.Notary; @@ -35,4 +31,20 @@ public class TestVerifyName extends ClientBusinessTest { assertEquals(10, n4.getVerificationPoints()); assertEquals(10, u.getMaxVerifyPoints()); } + + @Test + public void testValidVerification() throws GigiApiException { + User u0 = User.getById(createVerifiedUser("f", "l", createUniqueName() + "@email.com", TEST_PASSWORD)); + assertFalse(u0.getPreferredName().isValidVerification()); + + add100Points(u0.getId()); + assertTrue(u0.getPreferredName().isValidVerification()); + + setVerificationDateToPast(u0.getPreferredName()); + assertFalse(u0.getPreferredName().isValidVerification()); + + add100Points(u0.getId()); + assertTrue(u0.getPreferredName().isValidVerification()); + } + } diff --git a/tests/club/wpia/gigi/pages/account/TestCertificateRequest.java b/tests/club/wpia/gigi/pages/account/TestCertificateRequest.java index bb6c575d..372f2bfa 100644 --- a/tests/club/wpia/gigi/pages/account/TestCertificateRequest.java +++ b/tests/club/wpia/gigi/pages/account/TestCertificateRequest.java @@ -15,6 +15,7 @@ import club.wpia.gigi.database.GigiPreparedStatement; import club.wpia.gigi.dbObjects.EmailAddress; import club.wpia.gigi.dbObjects.Group; import club.wpia.gigi.pages.account.certs.CertificateRequest; +import club.wpia.gigi.testUtils.ClientBusinessTest; import club.wpia.gigi.testUtils.ClientTest; import club.wpia.gigi.util.AuthorizationContext; import club.wpia.gigi.util.TimeConditions; @@ -135,4 +136,19 @@ public class TestCertificateRequest extends ClientTest { } } + + @Test + public void testVerificationInPast() throws IOException, GeneralSecurityException, GigiApiException { + + ClientBusinessTest.setVerificationDateToPast(u.getPreferredName()); + try { + CertificateRequest cr = new CertificateRequest(ac, generatePEMCSR(kp, "CN=a ab")); + cr.update(u.getPreferredName().toString(), "SHA512", "client-a", null, null, "email:" + email); + cr.draft(); + fail(); + } catch (GigiApiException e) { + assertThat(e.getMessage(), containsString("The entered name needs a valid verification within the last")); + } + + } } diff --git a/tests/club/wpia/gigi/testUtils/BusinessTest.java b/tests/club/wpia/gigi/testUtils/BusinessTest.java index 28da80f8..4566d0e1 100644 --- a/tests/club/wpia/gigi/testUtils/BusinessTest.java +++ b/tests/club/wpia/gigi/testUtils/BusinessTest.java @@ -183,4 +183,13 @@ public abstract class BusinessTest extends ConfiguredTest { supporter.refreshGroups(); return supporter; } + + public EmailAddress createVerifiedEmail(User u, String email) throws InterruptedException, GigiApiException { + EmailAddress addr = new EmailAddress(u, email, Locale.ENGLISH); + TestMail testMail = getMailReceiver().receive(addr.getAddress()); + String hash = testMail.extractLink().substring(testMail.extractLink().lastIndexOf('=') + 1); + addr.verify(hash); + getMailReceiver().assertEmpty(); + return addr; + } } diff --git a/tests/club/wpia/gigi/testUtils/ClientBusinessTest.java b/tests/club/wpia/gigi/testUtils/ClientBusinessTest.java index 023d55ed..3a615694 100644 --- a/tests/club/wpia/gigi/testUtils/ClientBusinessTest.java +++ b/tests/club/wpia/gigi/testUtils/ClientBusinessTest.java @@ -1,8 +1,14 @@ package club.wpia.gigi.testUtils; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + import club.wpia.gigi.GigiApiException; +import club.wpia.gigi.database.GigiPreparedStatement; import club.wpia.gigi.dbObjects.Name; import club.wpia.gigi.dbObjects.User; +import club.wpia.gigi.util.TimeConditions; public class ClientBusinessTest extends BusinessTest { @@ -21,4 +27,18 @@ public class ClientBusinessTest extends BusinessTest { throw new Error(e); } } + + public static void setVerificationDateToPast(Name name) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(System.currentTimeMillis()); + c.add(Calendar.MONTH, -TimeConditions.getInstance().getVerificationMonths()); + String date = sdf.format(new Date(c.getTimeInMillis())); + GigiPreparedStatement ps = new GigiPreparedStatement("UPDATE `notary` SET `date`=? WHERE `to`=? AND `date`>?"); + ps.setString(1, date); + ps.setInt(2, name.getId()); + ps.setString(3, date); + ps.execute(); + ps.close(); + } } diff --git a/tests/club/wpia/gigi/testUtils/ConfiguredTest.java b/tests/club/wpia/gigi/testUtils/ConfiguredTest.java index 322af0bc..43be01db 100644 --- a/tests/club/wpia/gigi/testUtils/ConfiguredTest.java +++ b/tests/club/wpia/gigi/testUtils/ConfiguredTest.java @@ -360,9 +360,11 @@ public abstract class ConfiguredTest { } public static void add100Points(int uid) { - try (GigiPreparedStatement ps2 = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, points='100'")) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + try (GigiPreparedStatement ps2 = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, points='100', `date`=?")) { ps2.setInt(1, uid); ps2.setInt(2, User.getById(uid).getPreferredName().getId()); + ps2.setString(3, sdf.format(new Date(System.currentTimeMillis()))); ps2.execute(); } } diff --git a/util-testing/club/wpia/gigi/pages/Manager.java b/util-testing/club/wpia/gigi/pages/Manager.java index f68d307b..0ca61199 100644 --- a/util-testing/club/wpia/gigi/pages/Manager.java +++ b/util-testing/club/wpia/gigi/pages/Manager.java @@ -48,6 +48,7 @@ import club.wpia.gigi.dbObjects.DomainPingExecution; import club.wpia.gigi.dbObjects.DomainPingType; import club.wpia.gigi.dbObjects.EmailAddress; import club.wpia.gigi.dbObjects.Group; +import club.wpia.gigi.dbObjects.Name; import club.wpia.gigi.dbObjects.NamePart; import club.wpia.gigi.dbObjects.NamePart.NamePartType; import club.wpia.gigi.dbObjects.User; @@ -447,6 +448,17 @@ public class Manager extends Page { resp.getWriter().println("User has been verified " + verifications + " times." + info); + } else if (req.getParameter("verifyexpire") != null) { + String mail = req.getParameter("verifyEmail"); + User byEmail = User.getByEmail(mail); + if (byEmail == null) { + resp.getWriter().println("User not found."); + return; + } else { + setVerificationDateToPast(byEmail.getPreferredName()); + } + + resp.getWriter().println("Verification set to time past the limit."); } else if (req.getParameter("letverify") != null) { String mail = req.getParameter("letverifyEmail"); User byEmail = User.getByEmail(mail); @@ -628,4 +640,18 @@ public class Manager extends Page { form.output(resp.getWriter(), getLanguage(req), vars); } + + private static void setVerificationDateToPast(Name name) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(System.currentTimeMillis()); + c.add(Calendar.MONTH, -TimeConditions.getInstance().getVerificationMonths()); + String date = sdf.format(new Date(c.getTimeInMillis())); + GigiPreparedStatement ps = new GigiPreparedStatement("UPDATE `notary` SET `date`=? WHERE `to`=? AND `date`>?"); + ps.setString(1, date); + ps.setInt(2, name.getId()); + ps.setString(3, date); + ps.execute(); + ps.close(); + } } diff --git a/util-testing/club/wpia/gigi/pages/Manager.templ b/util-testing/club/wpia/gigi/pages/Manager.templ index 89627aee..f6e1519a 100644 --- a/util-testing/club/wpia/gigi/pages/Manager.templ +++ b/util-testing/club/wpia/gigi/pages/Manager.templ @@ -70,6 +70,7 @@ Email: Verification Points to issue to preferred name:
+