X-Git-Url: https://code.wpia.club/?p=gigi.git;a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2FdbObjects%2FEmailAddress.java;h=b2106d8bff71c901c3e51c1bfe9e6b3d8f160c8c;hp=04108ea2ec3831284f479ecd186f843d6a7790ee;hb=a34a7467a812ed5735b8ce196f9821f75134250b;hpb=159676e365e1eb7a1039ba427c8acb1bb2bcfc81 diff --git a/src/org/cacert/gigi/dbObjects/EmailAddress.java b/src/org/cacert/gigi/dbObjects/EmailAddress.java index 04108ea2..b2106d8b 100644 --- a/src/org/cacert/gigi/dbObjects/EmailAddress.java +++ b/src/org/cacert/gigi/dbObjects/EmailAddress.java @@ -1,11 +1,9 @@ package org.cacert.gigi.dbObjects; import java.io.IOException; -import java.util.Arrays; import java.util.Date; -import java.util.HashMap; +import java.util.LinkedList; import java.util.Locale; -import java.util.Map; import org.cacert.gigi.GigiApiException; import org.cacert.gigi.database.GigiPreparedStatement; @@ -13,7 +11,6 @@ import org.cacert.gigi.database.GigiResultSet; import org.cacert.gigi.email.EmailProvider; import org.cacert.gigi.email.MailProbe; import org.cacert.gigi.localisation.Language; -import org.cacert.gigi.output.template.Scope; import org.cacert.gigi.output.template.SprintfCommand; import org.cacert.gigi.util.RandomToken; @@ -43,7 +40,7 @@ public class EmailAddress implements IdCachable, Verifyable { public EmailAddress(User owner, String address, Locale mailLocale) throws GigiApiException { address = address.toLowerCase(); - if ( !EmailProvider.MAIL.matcher(address).matches()) { + if ( !EmailProvider.isValidMailAddress(address)) { throw new IllegalArgumentException("Invalid email."); } this.address = address; @@ -57,14 +54,16 @@ public class EmailAddress implements IdCachable, Verifyable { if (id != 0) { throw new IllegalStateException("already inserted."); } - try (GigiPreparedStatement psCheck = new GigiPreparedStatement("SELECT 1 FROM `emails` WHERE email=? AND deleted is NULL"); GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `emails` SET memid=?, email=?")) { - ps.setInt(1, owner.getId()); - ps.setString(2, address); + try (GigiPreparedStatement psCheck = new GigiPreparedStatement("SELECT 1 FROM `emails` WHERE email=? AND deleted is NULL")) { psCheck.setString(1, address); GigiResultSet res = psCheck.executeQuery(); if (res.next()) { throw new GigiApiException("The email address is already known to the system."); } + } + try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `emails` SET memid=?, email=?")) { + ps.setInt(1, owner.getId()); + ps.setString(2, address); ps.execute(); id = ps.lastInsertId(); } @@ -97,11 +96,13 @@ public class EmailAddress implements IdCachable, Verifyable { } public synchronized void verify(String hash) throws GigiApiException { - try (GigiPreparedStatement stmt = new GigiPreparedStatement("UPDATE `emailPinglog` SET `status`='success'::`pingState` WHERE `email`=? AND `uid`=? AND `type`='active' AND `challenge`=?")) { + try (GigiPreparedStatement stmt = new GigiPreparedStatement("UPDATE `emailPinglog` SET `status`='success'::`pingState` WHERE `email`=? AND `uid`=? AND `type`='active' AND `challenge`=? AND `status`='open'::`pingState`")) { stmt.setString(1, address); stmt.setInt(2, owner.getId()); stmt.setString(3, hash); - stmt.executeUpdate(); + if ( !stmt.executeMaybeUpdate()) { + throw new IllegalArgumentException("Given token could not be found to complete the verification process (Domain Ping)."); + } } // Verify user with that primary email try (GigiPreparedStatement ps2 = new GigiPreparedStatement("update `users` set `verified`='1' where `id`=? and `email`=? and `verified`='0'")) { @@ -138,9 +139,7 @@ public class EmailAddress implements IdCachable, Verifyable { Date lastExecution = getLastPing(false); if (lastExecution != null && lastExecution.getTime() + REPING_MINIMUM_DELAY >= System.currentTimeMillis()) { - Map data = new HashMap(); - data.put("data", new Date(lastExecution.getTime() + REPING_MINIMUM_DELAY)); - throw new GigiApiException(new Scope(new SprintfCommand("Reping is only allowed after 5 minutes, yours end at {0}.", Arrays.asList("${data}")), data)); + throw new GigiApiException(SprintfCommand.createSimple("Reping is only allowed after {0} minutes, yours end at {1}.", REPING_MINIMUM_DELAY / 60 / 1000, new Date(lastExecution.getTime() + REPING_MINIMUM_DELAY))); } ping(l); return; @@ -155,4 +154,20 @@ public class EmailAddress implements IdCachable, Verifyable { } return em; } + + public User getOwner() { + return owner; + } + + public static EmailAddress[] findByAllEmail(String mail) { + LinkedList results = new LinkedList(); + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT `emails`.`id` FROM `emails` INNER JOIN `users` ON `users`.`id` = `emails`.`memid` INNER JOIN `certOwners` ON `certOwners`.`id` = `users`.`id` WHERE `emails`.`email` LIKE ? AND `emails`.`deleted` IS NULL AND `certOwners`.`deleted` IS NULL ORDER BY `users`.`id`, `emails`.`email` LIMIT 100")) { + ps.setString(1, mail); + GigiResultSet rs = ps.executeQuery(); + while (rs.next()) { + results.add(EmailAddress.getById(rs.getInt(1))); + } + return results.toArray(new EmailAddress[results.size()]); + } + } }