X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2FdbObjects%2FUser.java;h=fc7b1c3f07aaa0260d5111dc46ce2b46e18f7dd1;hb=6857b65a9147a61ef0e4c1286beb6d6c3f2f5404;hp=eeb79dfdbaa4d3bb03abafe68122c8f44923443c;hpb=673e3f834a719f3b1bfceedfd801a21ca7842cf2;p=gigi.git diff --git a/src/org/cacert/gigi/dbObjects/User.java b/src/org/cacert/gigi/dbObjects/User.java index eeb79dfd..fc7b1c3f 100644 --- a/src/org/cacert/gigi/dbObjects/User.java +++ b/src/org/cacert/gigi/dbObjects/User.java @@ -15,6 +15,7 @@ import org.cacert.gigi.database.DatabaseConnection; import org.cacert.gigi.database.GigiPreparedStatement; import org.cacert.gigi.database.GigiResultSet; import org.cacert.gigi.localisation.Language; +import org.cacert.gigi.output.DateSelector; import org.cacert.gigi.util.Notary; import org.cacert.gigi.util.PasswordHash; import org.cacert.gigi.util.PasswordStrengthChecker; @@ -97,10 +98,6 @@ public class User extends CertificateOwner { return email; } - public void setEmail(String email) { - this.email = email; - } - public void changePassword(String oldPass, String newPass) throws GigiApiException { GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `password` FROM `users` WHERE `id`=?"); ps.setInt(1, getId()); @@ -112,7 +109,11 @@ public class User extends CertificateOwner { throw new GigiApiException("Old password does not match."); } } + setPassword(newPass); + } + private void setPassword(String newPass) throws GigiApiException { + GigiPreparedStatement ps; PasswordStrengthChecker.assertStrongPassword(newPass, getName(), getEmail()); ps = DatabaseConnection.getInstance().prepare("UPDATE users SET `password`=? WHERE id=?"); ps.setString(1, PasswordHash.hash(newPass)); @@ -137,8 +138,9 @@ public class User extends CertificateOwner { } public boolean hasPassedCATS() { - GigiPreparedStatement query = DatabaseConnection.getInstance().prepare("SELECT 1 FROM `cats_passed` where `user_id`=?"); + GigiPreparedStatement query = DatabaseConnection.getInstance().prepare("SELECT 1 FROM `cats_passed` where `user_id`=? AND `variant_id`=?"); query.setInt(1, getId()); + query.setInt(2, CATS.ASSURER_CHALLANGE_ID); try (GigiResultSet rs = query.executeQuery()) { if (rs.next()) { return true; @@ -461,11 +463,61 @@ public class User extends CertificateOwner { public boolean isValidEmail(String email) { for (EmailAddress em : getEmails()) { if (em.getAddress().equals(email)) { - return true; + return em.isVerified(); } } return false; } + public String[] getTrainings() { + GigiPreparedStatement prep = DatabaseConnection.getInstance().prepare("SELECT `pass_date`, `type_text` FROM `cats_passed` LEFT JOIN `cats_type` ON `cats_type`.`id`=`cats_passed`.`variant_id` WHERE `user_id`=? ORDER BY `pass_date` ASC"); + prep.setInt(1, getId()); + GigiResultSet res = prep.executeQuery(); + List entries = new LinkedList(); + + while (res.next()) { + + entries.add(DateSelector.getDateFormat().format(res.getTimestamp(1)) + " (" + res.getString(2) + ")"); + } + + return entries.toArray(new String[0]); + } + + public int generatePasswordResetTicket(User actor, String token, String privateToken) { + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("INSERT INTO `passwordResetTickets` SET `memid`=?, `creator`=?, `token`=?, `private_token`=?"); + ps.setInt(1, getId()); + ps.setInt(2, getId()); + ps.setString(3, token); + ps.setString(4, PasswordHash.hash(privateToken)); + ps.execute(); + return ps.lastInsertId(); + } + + public static User getResetWithToken(int id, String token) { + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `memid` FROM `passwordResetTickets` WHERE `id`=? AND `token`=?"); + ps.setInt(1, id); + ps.setString(2, token); + GigiResultSet res = ps.executeQuery(); + if ( !res.next()) { + return null; + } + return User.getById(res.getInt(1)); + } + + public void consumePasswordResetTicket(int id, String private_token, String newPassword) throws GigiApiException { + GigiPreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `private_token` FROM `passwordResetTickets` WHERE `id`=? AND `memid`=?"); + ps.setInt(1, id); + ps.setInt(2, getId()); + try (GigiResultSet rs = ps.executeQuery()) { + if ( !rs.next()) { + throw new GigiApiException("Token not found... very bad."); + } + if (PasswordHash.verifyHash(private_token, rs.getString(1)) == null) { + throw new GigiApiException("Private token does not match."); + } + setPassword(newPassword); + } + } + }