]> WPIA git - gigi.git/blobdiff - src/org/cacert/gigi/dbObjects/User.java
add: country information where verification took place
[gigi.git] / src / org / cacert / gigi / dbObjects / User.java
index 91ab46cbe8b3c70aa081208ad0b75c4abe683199..a6e1d3f13c3abb43a776cdbdde0e4b5b4839cb0e 100644 (file)
@@ -1,5 +1,8 @@
 package org.cacert.gigi.dbObjects;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -13,6 +16,7 @@ import org.cacert.gigi.database.GigiPreparedStatement;
 import org.cacert.gigi.database.GigiResultSet;
 import org.cacert.gigi.dbObjects.Assurance.AssuranceType;
 import org.cacert.gigi.dbObjects.CATS.CATSType;
+import org.cacert.gigi.dbObjects.CountryCode.CountryCodeType;
 import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.output.DateSelector;
 import org.cacert.gigi.pages.PasswordResetPage;
@@ -21,6 +25,7 @@ import org.cacert.gigi.util.DayDate;
 import org.cacert.gigi.util.Notary;
 import org.cacert.gigi.util.PasswordHash;
 import org.cacert.gigi.util.PasswordStrengthChecker;
+import org.cacert.gigi.util.TimeConditions;
 
 /**
  * Represents an acting, assurable, user. Synchronizing on user means: no
@@ -28,6 +33,8 @@ import org.cacert.gigi.util.PasswordStrengthChecker;
  */
 public class User extends CertificateOwner {
 
+    private static final long serialVersionUID = -7915843843752264176L;
+
     private DayDate dob;
 
     private String email;
@@ -42,16 +49,20 @@ public class User extends CertificateOwner {
 
     public static final int MINIMUM_AGE = 16;
 
+    public static final int MAXIMUM_PLAUSIBLE_AGE = 120;
+
     public static final int POJAM_AGE = 14;
 
     public static final int ADULT_AGE = 18;
 
     public static final boolean POJAM_ENABLED = false;
 
+    public static final int EXPERIENCE_POINTS = 4;
+
     /**
      * Time in months a verification is considered "recent".
      */
-    public static final int VERIFICATION_MONTHS = 39;
+    public static final int VERIFICATION_MONTHS = TimeConditions.getInstance().getVerificationMonths();
 
     private Name preferredName;
 
@@ -131,7 +142,15 @@ public class User extends CertificateOwner {
     public void setDoB(DayDate dob) throws GigiApiException {
         synchronized (Notary.class) {
             if (getReceivedAssurances().length != 0) {
-                throw new GigiApiException("No change after assurance allowed.");
+                throw new GigiApiException("No change after verification allowed.");
+            }
+
+            if ( !CalendarUtil.isOfAge(dob, User.MINIMUM_AGE)) {
+                throw new GigiApiException("Entered date of birth is below the restricted age requirements.");
+            }
+
+            if (CalendarUtil.isOfAge(dob, User.MAXIMUM_PLAUSIBLE_AGE)) {
+                throw new GigiApiException("Entered date of birth exceeds the maximum age set in our policies. Please check your DoB is correct and contact support if the issue persists.");
             }
             this.dob = dob;
             rawUpdateUserData();
@@ -231,7 +250,7 @@ public class User extends CertificateOwner {
             int points = 0;
 
             if (rs.next()) {
-                points = rs.getInt(1) * 2;
+                points = rs.getInt(1) * EXPERIENCE_POINTS;
             }
 
             return points;
@@ -244,6 +263,7 @@ public class User extends CertificateOwner {
      * 
      * @return the maximal points @
      */
+    @SuppressWarnings("unused")
     public int getMaxAssurePoints() {
         if ( !CalendarUtil.isOfAge(dob, ADULT_AGE) && POJAM_ENABLED) {
             return 10; // PoJAM
@@ -252,19 +272,19 @@ public class User extends CertificateOwner {
         int exp = getExperiencePoints();
         int points = 10;
 
-        if (exp >= 10) {
+        if (exp >= 5 * EXPERIENCE_POINTS) {
             points += 5;
         }
-        if (exp >= 20) {
+        if (exp >= 10 * EXPERIENCE_POINTS) {
             points += 5;
         }
-        if (exp >= 30) {
+        if (exp >= 15 * EXPERIENCE_POINTS) {
             points += 5;
         }
-        if (exp >= 40) {
+        if (exp >= 20 * EXPERIENCE_POINTS) {
             points += 5;
         }
-        if (exp >= 50) {
+        if (exp >= 25 * EXPERIENCE_POINTS) {
             points += 5;
         }
 
@@ -320,7 +340,7 @@ public class User extends CertificateOwner {
 
     public synchronized Assurance[] getReceivedAssurances() {
         if (receivedAssurances == null) {
-            try (GigiPreparedStatement query = new GigiPreparedStatement("SELECT * FROM `notary` INNER JOIN `names` ON `names`.`id` = `notary`.`to` WHERE `names`.`uid`=? AND `notary`.`deleted` IS NULL")) {
+            try (GigiPreparedStatement query = new GigiPreparedStatement("SELECT * FROM `notary` INNER JOIN `names` ON `names`.`id` = `notary`.`to` WHERE `names`.`uid`=? AND `notary`.`deleted` IS NULL ORDER BY `when` DESC")) {
                 query.setInt(1, getId());
 
                 GigiResultSet res = query.executeQuery();
@@ -339,7 +359,7 @@ public class User extends CertificateOwner {
 
     public synchronized Assurance[] getMadeAssurances() {
         if (madeAssurances == null) {
-            try (GigiPreparedStatement query = new GigiPreparedStatement("SELECT * FROM notary WHERE `from`=? AND deleted is NULL")) {
+            try (GigiPreparedStatement query = new GigiPreparedStatement("SELECT * FROM notary WHERE `from`=? AND deleted is NULL ORDER BY `when` DESC")) {
                 query.setInt(1, getId());
 
                 try (GigiResultSet res = query.executeQuery()) {
@@ -382,7 +402,7 @@ public class User extends CertificateOwner {
 
     }
 
-    public Name getPreferredName() {
+    public synchronized Name getPreferredName() {
         return preferredName;
     }
 
@@ -576,7 +596,11 @@ public class User extends CertificateOwner {
     }
 
     private Assurance assuranceByRes(GigiResultSet res) {
-        return new Assurance(res.getInt("id"), User.getById(res.getInt("from")), Name.getById(res.getInt("to")), res.getString("location"), res.getString("method"), res.getInt("points"), res.getString("date"));
+        try {
+            return new Assurance(res.getInt("id"), User.getById(res.getInt("from")), Name.getById(res.getInt("to")), res.getString("location"), res.getString("method"), res.getInt("points"), res.getString("date"), res.getString("country") == null ? null : CountryCode.getCountryCode(res.getString("country"), CountryCodeType.CODE_2_CHARS));
+        } catch (GigiApiException e) {
+            throw new Error(e);
+        }
     }
 
     public boolean isInVerificationLimit() {
@@ -589,4 +613,8 @@ public class User extends CertificateOwner {
         }
     }
 
+    private void writeObject(ObjectOutputStream oos) throws IOException {}
+
+    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {}
+
 }