X-Git-Url: https://code.wpia.club/?p=gigi.git;a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2Futil%2FNotary.java;h=0ecc14e444fb3db2e96cdbe886f737d7abb2ec0f;hp=aa806fa929ce2b06ee4d4f31c5ce837213cddeae;hb=9def69bd08ea69eb27786d5b34f00e154e09e9f3;hpb=6e23ad9bc75d6cb2aa86cb36654a6ef44a167011 diff --git a/src/org/cacert/gigi/util/Notary.java b/src/org/cacert/gigi/util/Notary.java index aa806fa9..0ecc14e4 100644 --- a/src/org/cacert/gigi/util/Notary.java +++ b/src/org/cacert/gigi/util/Notary.java @@ -13,9 +13,12 @@ import org.cacert.gigi.dbObjects.Group; import org.cacert.gigi.dbObjects.Name; import org.cacert.gigi.dbObjects.User; import org.cacert.gigi.output.DateSelector; +import org.cacert.gigi.output.template.SprintfCommand; public class Notary { + public final static int LIMIT_DAYS_VERIFICATION = 90; // conf.getProperty("limit_days_verification"); + public static void writeUserAgreement(User member, String document, String method, String comment, boolean active, int secmemid) { try (GigiPreparedStatement q = new GigiPreparedStatement("INSERT INTO `user_agreements` SET `memid`=?, `secmemid`=?," + " `document`=?,`date`=NOW(), `active`=?,`method`=?,`comment`=?")) { q.setInt(1, member.getId()); @@ -28,21 +31,14 @@ public class Notary { } } - public static void checkAssuranceIsPossible(User assurer, User target) throws GigiApiException { - if (assurer.getId() == target.getId()) { - throw new GigiApiException("You cannot assure yourself."); - } - try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT 1 FROM `notary` where `to`=? and `from`=? AND `deleted` IS NULL")) { + public static boolean checkAssuranceIsPossible(User assurer, Name target) { + try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT 1 FROM `notary` where `to`=? and `from`=? and `method` = ? ::`notaryType` AND `deleted` IS NULL AND `when` > (now() - interval '1 days' * ?)")) { ps.setInt(1, target.getId()); ps.setInt(2, assurer.getId()); + ps.setString(3, AssuranceType.FACE_TO_FACE.getDescription()); + ps.setInt(4, LIMIT_DAYS_VERIFICATION); GigiResultSet rs = ps.executeQuery(); - if (rs.next()) { - rs.close(); - throw new GigiApiException("You have already assured this member."); - } - } - if ( !assurer.canAssure()) { - throw new GigiApiException("You are not an assurer."); + return !rs.next(); } } @@ -72,7 +68,7 @@ public class Notary { * @throws GigiApiException * if the assurance fails (for various reasons) */ - public synchronized static void assure(User assurer, User assuree, Name assureeName, Date dob, int awarded, String location, String date, AssuranceType type) throws GigiApiException { + public synchronized static void assure(User assurer, User assuree, Name assureeName, DayDate dob, int awarded, String location, String date, AssuranceType type) throws GigiApiException { may(assurer, assuree, AssuranceType.FACE_TO_FACE); GigiApiException gae = new GigiApiException(); if ( !gae.isEmpty()) { @@ -99,52 +95,62 @@ public class Notary { } else if (location.length() <= 2) { gae.mergeInto(new GigiApiException("You must enter a location with at least 3 characters eg town and country.")); } + synchronized (assuree) { + if (assurer.getId() == assuree.getId()) { + throw new GigiApiException("You cannot verify yourself."); + } + if (assureeName.getOwner() != assuree) { + throw new GigiApiException("Internal error, name does not belong to applicant."); + } + if ( !assurer.canAssure()) { + throw new GigiApiException("You are not an RA-Agent."); + } - try { - checkAssuranceIsPossible(assurer, assuree); - } catch (GigiApiException e) { - gae.mergeInto(e); - } + if ( !checkAssuranceIsPossible(assurer, assureeName)) { + gae.mergeInto(new GigiApiException(SprintfCommand.createSimple("You have already verified this applicant within the last {0} days.", LIMIT_DAYS_VERIFICATION))); + } - if ( !assuree.getName().equals(assureeName) || !assuree.getDoB().equals(dob)) { - gae.mergeInto(new GigiApiException("The person you are assuring changed his personal details.")); - } - if (awarded < 0) { - gae.mergeInto(new GigiApiException("The points you are trying to award are out of range.")); - } else { - if (type == AssuranceType.NUCLEUS) { - if (awarded > 50) { - gae.mergeInto(new GigiApiException("The points you are trying to award are out of range.")); - } + if ( !assuree.getDoB().equals(dob)) { + gae.mergeInto(new GigiApiException("The person you are assuring changed his personal details.")); + } + + if (awarded < 0) { + gae.mergeInto(new GigiApiException("The points you are trying to award are out of range.")); } else { - if (awarded > assurer.getMaxAssurePoints()) { - gae.mergeInto(new GigiApiException("The points you are trying to award are out of range.")); + if (type == AssuranceType.NUCLEUS) { + if (awarded > 50) { + gae.mergeInto(new GigiApiException("The points you are trying to award are out of range.")); + } + } else { + if (awarded > assurer.getMaxAssurePoints()) { + gae.mergeInto(new GigiApiException("The points you are trying to award are out of range.")); + } } } - } - if ( !gae.isEmpty()) { - throw gae; - } + if ( !gae.isEmpty()) { + throw gae; + } - if (type == AssuranceType.FACE_TO_FACE) { - assureF2F(assurer, assuree, awarded, location, date); - } else if (type == AssuranceType.NUCLEUS) { - assureNucleus(assurer, assuree, awarded, location, date); - } else if (type == AssuranceType.TTP_ASSISTED) { - assureTTP(assurer, assuree, awarded, location, date); - } else { - throw new GigiApiException("Unknown Assurance type: " + type); + if (type == AssuranceType.FACE_TO_FACE) { + assureF2F(assurer, assuree, assureeName, awarded, location, date); + } else if (type == AssuranceType.NUCLEUS) { + assureNucleus(assurer, assuree, assureeName, awarded, location, date); + } else if (type == AssuranceType.TTP_ASSISTED) { + assureTTP(assurer, assuree, assureeName, awarded, location, date); + } else { + throw new GigiApiException(SprintfCommand.createSimple("Unknown Assurance type: {0}", type.toString())); + } + assurer.invalidateMadeAssurances(); + assuree.invalidateReceivedAssurances(); } - assurer.invalidateMadeAssurances(); - assuree.invalidateReceivedAssurances(); } - private static void assureF2F(User assurer, User assuree, int awarded, String location, String date) throws GigiApiException { + private static void assureF2F(User assurer, User assuree, Name name, int awarded, String location, String date) throws GigiApiException { may(assurer, assuree, AssuranceType.FACE_TO_FACE); try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?")) { ps.setInt(1, assurer.getId()); - ps.setInt(2, assuree.getId()); + ps.setInt(2, name.getId()); ps.setInt(3, awarded); ps.setString(4, location); ps.setString(5, date); @@ -152,11 +158,11 @@ public class Notary { } } - private static void assureTTP(User assurer, User assuree, int awarded, String location, String date) throws GigiApiException { + private static void assureTTP(User assurer, User assuree, Name name, int awarded, String location, String date) throws GigiApiException { may(assurer, assuree, AssuranceType.TTP_ASSISTED); try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?, `method`='TTP-Assisted'")) { ps.setInt(1, assurer.getId()); - ps.setInt(2, assuree.getId()); + ps.setInt(2, name.getId()); ps.setInt(3, awarded); ps.setString(4, location); ps.setString(5, date); @@ -167,36 +173,36 @@ public class Notary { public static void may(User assurer, User assuree, AssuranceType t) throws GigiApiException { if (assuree.isInGroup(ASSUREE_BLOCKED)) { - throw new GigiApiException("The assuree is blocked."); + throw new GigiApiException("The applicant is blocked."); } if (assurer.isInGroup(ASSURER_BLOCKED)) { - throw new GigiApiException("The assurer is blocked."); + throw new GigiApiException("The RA Agent is blocked."); } if (t == AssuranceType.NUCLEUS) { if ( !assurer.isInGroup(Group.NUCLEUS_ASSURER)) { - throw new GigiApiException("Assurer needs to be Nucleus Assurer."); + throw new GigiApiException("RA Agent needs to be Nucleus RA Agent."); } return; } else if (t == AssuranceType.TTP_ASSISTED) { if ( !assurer.isInGroup(Group.TTP_ASSURER)) { - throw new GigiApiException("Assurer needs to be TTP Assurer."); + throw new GigiApiException("RA Agent needs to be TTP RA Agent."); } if ( !assuree.isInGroup(Group.TTP_APPLICANT)) { - throw new GigiApiException("Assuree needs to be TTP Applicant."); + throw new GigiApiException("Applicant needs to be TTP Applicant."); } return; } else if (t == AssuranceType.FACE_TO_FACE) { return; } - throw new GigiApiException("Assurance type not possible."); + throw new GigiApiException("Verification type not possible."); } - private static void assureNucleus(User assurer, User assuree, int awarded, String location, String date) throws GigiApiException { + private static void assureNucleus(User assurer, User assuree, Name name, int awarded, String location, String date) throws GigiApiException { may(assurer, assuree, AssuranceType.NUCLEUS); // Do up to 35 points as f2f - int f2fPoints = Math.min(35, awarded); - assureF2F(assurer, assuree, f2fPoints, location, date); + int f2fPoints = Math.min(assurer.getMaxAssurePoints(), awarded); + assureF2F(assurer, assuree, name, f2fPoints, location, date); awarded -= f2fPoints; if (awarded <= 0) { @@ -207,7 +213,7 @@ public class Notary { // Valid for 4 Weeks = 28 days try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?, `method`='Nucleus Bonus', `expire` = CURRENT_TIMESTAMP + interval '28 days'")) { ps.setInt(1, assurer.getId()); - ps.setInt(2, assuree.getId()); + ps.setInt(2, name.getId()); ps.setInt(3, awarded); ps.setString(4, location); ps.setString(5, date);