X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2FdbObjects%2FEmailAddress.java;h=b945f9eecc23028575b8d4368738ecd5d652c42e;hb=8d98e8c550a5fc426d7efbd57436dcb61bd41243;hp=f0ce010f5ed4fedd559906832c44ff4f04a67de3;hpb=e409ba881965634f63f0b67824bc93dda4ec4327;p=gigi.git diff --git a/src/org/cacert/gigi/dbObjects/EmailAddress.java b/src/org/cacert/gigi/dbObjects/EmailAddress.java index f0ce010f..b945f9ee 100644 --- a/src/org/cacert/gigi/dbObjects/EmailAddress.java +++ b/src/org/cacert/gigi/dbObjects/EmailAddress.java @@ -1,12 +1,11 @@ package org.cacert.gigi.dbObjects; import java.io.IOException; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; import org.cacert.gigi.GigiApiException; import org.cacert.gigi.database.DatabaseConnection; +import org.cacert.gigi.database.GigiPreparedStatement; +import org.cacert.gigi.database.GigiResultSet; import org.cacert.gigi.email.EmailProvider; import org.cacert.gigi.email.MailProbe; import org.cacert.gigi.localisation.Language; @@ -22,11 +21,11 @@ public class EmailAddress implements IdCachable { private String hash = null; - private EmailAddress(int id) throws SQLException { - PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT memid, email, hash FROM `emails` WHERE id=? AND deleted=0"); + private EmailAddress(int id) { + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT memid, email, hash FROM `emails` WHERE id=? AND deleted is NULL"); ps.setInt(1, id); - ResultSet rs = ps.executeQuery(); + GigiResultSet rs = ps.executeQuery(); if ( !rs.next()) { throw new IllegalArgumentException("Invalid email id " + id); } @@ -37,7 +36,7 @@ public class EmailAddress implements IdCachable { rs.close(); } - public EmailAddress(String address, User owner) { + public EmailAddress(User owner, String address) { if ( !EmailProvider.MAIL.matcher(address).matches()) { throw new IllegalArgumentException("Invalid email."); } @@ -46,23 +45,27 @@ public class EmailAddress implements IdCachable { this.hash = RandomToken.generateToken(16); } - public void insert(Language l) { + public void insert(Language l) throws GigiApiException { if (id != 0) { throw new IllegalStateException("already inserted."); } try { - PreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO `emails` SET memid=?, hash=?, email=?"); + GigiPreparedStatement psCheck = DatabaseConnection.getInstance().prepare("SELECT 1 FROM `emails` WHERE email=? AND deleted is NULL"); + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO `emails` SET memid=?, hash=?, email=?"); ps.setInt(1, owner.getId()); ps.setString(2, hash); ps.setString(3, address); + psCheck.setString(1, address); synchronized (EmailAddress.class) { + GigiResultSet res = psCheck.executeQuery(); + if (res.next()) { + throw new GigiApiException("The email is currently valid"); + } ps.execute(); - id = DatabaseConnection.lastInsertId(ps); + id = ps.lastInsertId(); myCache.put(this); } MailProbe.sendMailProbe(l, "email", id, hash, address); - } catch (SQLException e) { - e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } @@ -78,22 +81,17 @@ public class EmailAddress implements IdCachable { public synchronized void verify(String hash) throws GigiApiException { if (this.hash.equals(hash)) { - - try { - PreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE `emails` SET hash='' WHERE id=?"); - ps.setInt(1, id); - ps.execute(); - hash = ""; - - // Verify user with that primary email - PreparedStatement ps2 = DatabaseConnection.getInstance().prepare("update `users` set `verified`='1' where `id`=? and `email`=? and `verified`='0'"); - ps2.setInt(1, owner.getId()); - ps2.setString(2, address); - ps2.execute(); - this.hash = ""; - } catch (SQLException e) { - throw new GigiApiException(e); - } + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("UPDATE `emails` SET hash='' WHERE id=?"); + ps.setInt(1, id); + ps.execute(); + hash = ""; + + // Verify user with that primary email + GigiPreparedStatement ps2 = DatabaseConnection.getInstance().prepare("update `users` set `verified`='1' where `id`=? and `email`=? and `verified`='0'"); + ps2.setInt(1, owner.getId()); + ps2.setString(2, address); + ps2.execute(); + this.hash = ""; } else { throw new GigiApiException("Email verification hash is invalid."); @@ -106,16 +104,10 @@ public class EmailAddress implements IdCachable { private static ObjectCache myCache = new ObjectCache<>(); - public static EmailAddress getById(int id) throws IllegalArgumentException { + public static synchronized EmailAddress getById(int id) throws IllegalArgumentException { EmailAddress em = myCache.get(id); if (em == null) { - try { - synchronized (EmailAddress.class) { - myCache.put(em = new EmailAddress(id)); - } - } catch (SQLException e1) { - throw new IllegalArgumentException(e1); - } + myCache.put(em = new EmailAddress(id)); } return em; }