X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2FEmailAddress.java;h=5259fbcdaf7aee47de93cb8627a139c29371e994;hb=446d3aa82c177eb844f6f19c8f85d4a6e631efe7;hp=fda01ed06b69de28005be3555b2760b283a199e7;hpb=5725fc461f2f5d3d767a9d2d445eff96857287a5;p=gigi.git diff --git a/src/org/cacert/gigi/EmailAddress.java b/src/org/cacert/gigi/EmailAddress.java index fda01ed0..5259fbcd 100644 --- a/src/org/cacert/gigi/EmailAddress.java +++ b/src/org/cacert/gigi/EmailAddress.java @@ -1,73 +1,112 @@ package org.cacert.gigi; +import java.io.IOException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.cacert.gigi.database.DatabaseConnection; +import org.cacert.gigi.email.EmailProvider; +import org.cacert.gigi.email.MailProbe; +import org.cacert.gigi.localisation.Language; +import org.cacert.gigi.util.RandomToken; public class EmailAddress { - String address; - int id; - User owner; - String hash = null; - - private EmailAddress(int id) throws SQLException { - PreparedStatement ps = DatabaseConnection.getInstance().prepare( - "SELECT memid, email, hash FROM `email` WHERE id=? AND deleted=0"); - ps.setInt(1, id); - - ResultSet rs = ps.executeQuery(); - if (!rs.next()) { - throw new IllegalArgumentException("Invalid email id " + id); - } - this.id = id; - owner = User.getById(rs.getInt(1)); - address = rs.getString(2); - hash = rs.getString(3); - rs.close(); - } - - public int getId() { - return id; - } - - public String getAddress() { - return address; - } - - public synchronized void verify(String hash) throws GigiApiException { - if (this.hash.equals(hash)) { - - try { - PreparedStatement ps = DatabaseConnection.getInstance() - .prepare("UPDATE `email` 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(); - } catch (SQLException e) { - throw new GigiApiException(e); - } - - } else { - throw new GigiApiException("Email verification hash is invalid."); - } - } - - public static EmailAddress getById(int id) throws IllegalArgumentException { - // TODO cache - try { - EmailAddress e = new EmailAddress(id); - return e; - } catch (SQLException e) { - throw new IllegalArgumentException(e); - } - } + + private String address; + + private int id; + + private User owner; + + 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"); + ps.setInt(1, id); + + ResultSet rs = ps.executeQuery(); + if ( !rs.next()) { + throw new IllegalArgumentException("Invalid email id " + id); + } + this.id = id; + owner = User.getById(rs.getInt(1)); + address = rs.getString(2); + hash = rs.getString(3); + rs.close(); + } + + public EmailAddress(String address, User owner) { + if ( !EmailProvider.MAIL.matcher(address).matches()) { + throw new IllegalArgumentException("Invalid email."); + } + this.address = address; + this.owner = owner; + this.hash = RandomToken.generateToken(16); + } + + public void insert(Language l) { + if (id != 0) { + throw new IllegalStateException("already inserted."); + } + try { + PreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO `emails` SET memid=?, hash=?, email=?"); + ps.setInt(1, owner.getId()); + ps.setString(2, hash); + ps.setString(3, address); + ps.execute(); + id = DatabaseConnection.lastInsertId(ps); + MailProbe.sendMailProbe(l, "email", id, hash, address); + } catch (SQLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public int getId() { + return id; + } + + public String getAddress() { + return address; + } + + 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); + } + + } else { + throw new GigiApiException("Email verification hash is invalid."); + } + } + + public static EmailAddress getById(int id) throws IllegalArgumentException { + // TODO cache + try { + EmailAddress e = new EmailAddress(id); + return e; + } catch (SQLException e) { + throw new IllegalArgumentException(e); + } + } + + public boolean isVerified() { + return hash.isEmpty(); + } }