X-Git-Url: https://code.wpia.club/?p=gigi.git;a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2Futil%2FNotary.java;h=24118fc3678f4f738818b0fbd7b95cdc738b62f3;hp=2f3a3aec56764dc520898aeea1b292ba91cf3b95;hb=c0d62ad52b65d78806431b34ed2ae24bf58c1ada;hpb=d1080ab12183cad2bab5d1f94bafe67960fbf4c8 diff --git a/src/org/cacert/gigi/util/Notary.java b/src/org/cacert/gigi/util/Notary.java index 2f3a3aec..24118fc3 100644 --- a/src/org/cacert/gigi/util/Notary.java +++ b/src/org/cacert/gigi/util/Notary.java @@ -72,7 +72,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,43 +99,47 @@ 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) { - try { - checkAssuranceIsPossible(assurer, assuree); - } catch (GigiApiException e) { - gae.mergeInto(e); - } + try { + checkAssuranceIsPossible(assurer, assuree); + } catch (GigiApiException e) { + gae.mergeInto(e); + } - 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.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 (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.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, 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); + } + assurer.invalidateMadeAssurances(); + assuree.invalidateReceivedAssurances(); } - assurer.invalidateMadeAssurances(); - assuree.invalidateReceivedAssurances(); } private static void assureF2F(User assurer, User assuree, int awarded, String location, String date) throws GigiApiException { @@ -189,4 +193,27 @@ public class Notary { } throw new GigiApiException("Assurance type not possible."); } + + private static void assureNucleus(User assurer, User assuree, int awarded, String location, String date) throws GigiApiException { + may(assurer, assuree, AssuranceType.NUCLEUS); + // Do up to 35 points as f2f + int f2fPoints = Math.min(assurer.getMaxAssurePoints(), awarded); + assureF2F(assurer, assuree, f2fPoints, location, date); + + awarded -= f2fPoints; + if (awarded <= 0) { + return; + } + + // Assure remaining points as "Nucleus Bonus" + // 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(3, awarded); + ps.setString(4, location); + ps.setString(5, date); + ps.execute(); + } + } }