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());
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")) {
+ 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.");
+ throw new GigiApiException(SprintfCommand.createSimple("You have already verified this applicant within the last {0} days.", LIMIT_DAYS_VERIFICATION));
}
}
if ( !assurer.canAssure()) {
import org.cacert.gigi.GigiApiException;
import org.cacert.gigi.database.GigiPreparedStatement;
import org.cacert.gigi.testUtils.BusinessTest;
+import org.cacert.gigi.util.DayDate;
+import org.cacert.gigi.util.Notary;
+import org.junit.Before;
import org.junit.Test;
public class TestAssurance extends BusinessTest {
- private final Timestamp yesterday = new Timestamp(System.currentTimeMillis() - 24L * 60 * 60 * 1000L);
+ private final Timestamp yesterday = new Timestamp(System.currentTimeMillis() - DayDate.MILLI_DAY);
- private final Timestamp tomorrow = new Timestamp(System.currentTimeMillis() + 24L * 60 * 60 * 1000L);
+ private final Timestamp tomorrow = new Timestamp(System.currentTimeMillis() + DayDate.MILLI_DAY);
/**
* at least 39 months ago, so is outside the window of
* {@link User#VERIFICATION_MONTHS}
*/
- private final Timestamp min39month = new Timestamp(System.currentTimeMillis() - 24L * 60 * 60 * 39 * 31 * 1000L);
+ private final Timestamp min39month = new Timestamp(System.currentTimeMillis() - DayDate.MILLI_DAY * 39 * 31);
/**
* at least 24 months ago (but less than 39), so is inside the window of
* {@link User#VERIFICATION_MONTHS}
*/
- private final Timestamp min24month = new Timestamp(System.currentTimeMillis() - 24L * 60 * 60 * 24 * 31 * 1000L);
+ private final Timestamp min24month = new Timestamp(System.currentTimeMillis() - DayDate.MILLI_DAY * 24 * 31);
- private final int agentID;
+ private int agentID;
- private final int applicantID;
+ private int agent2ID;
+
+ private int applicantID;
+
+ private int applicantMultID;
public TestAssurance() throws GigiApiException {
- agentID = createAssuranceUser("a", "b", createUniqueName() + "@example.com", TEST_PASSWORD);
- applicantID = createVerifiedUser("a", "c", createUniqueName() + "@example.com", TEST_PASSWORD);
+
}
// test for verification in 39 month period
}
}
+ private void enterAssuranceWhen(int agentID, int applicantID, Timestamp when, int points) {
+ try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?, `when`=? ")) {
+ ps.setInt(1, agentID);
+ ps.setInt(2, applicantID);
+ ps.setInt(3, points);
+ ps.setString(4, "test-location");
+ ps.setString(5, "2010-01-01");
+ ps.setTimestamp(6, when);
+ ps.execute();
+ }
+ }
+
private void enterAssuranceDeleted(int agentID, int applicantID, Timestamp deleted) {
try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?, `deleted`=? ")) {
ps.setInt(1, agentID);
}
}
+ @Before
+ public void initTest() throws GigiApiException {
+ agentID = createAssuranceUser("a", "b", createUniqueName() + "@example.com", TEST_PASSWORD);
+ agent2ID = createAssuranceUser("a", "d", createUniqueName() + "@example.com", TEST_PASSWORD);
+ applicantID = createVerifiedUser("a", "c", createUniqueName() + "@example.com", TEST_PASSWORD);
+ applicantMultID = createVerifiedUser("a", "e", createUniqueName() + "@example.com", TEST_PASSWORD);
+ }
+
@Test
public void testVerificationYesterday() throws IOException {
enterAssuranceWhen(agentID, applicantID, yesterday);
enterAssuranceDeleted(agentID, applicantID, yesterday);
assertFalse(User.isInVerificationLimit(applicantID));
}
+
+ @Test
+ public void testMultipleAssurancePossible() throws IOException {
+
+ User agent = User.getById(agentID);
+ User applicantMult = User.getById(applicantMultID);
+
+ enterAssuranceWhen(agentID, applicantMultID, min39month);
+
+ // test that new entry would be possible
+ try {
+ Notary.checkAssuranceIsPossible(agent, applicantMult);
+ } catch (GigiApiException e) {
+ assertTrue(false);
+ }
+
+ // enter new entry
+ enterAssuranceWhen(agentID, applicantMultID, yesterday);
+
+ // test that new entry is not possible
+ try {
+ Notary.checkAssuranceIsPossible(agent, applicantMult);
+ } catch (GigiApiException e) {
+ assertTrue(true);
+ }
+
+ }
+
+ @Test
+ public void testMultipleAssurancePointsCalculation() throws IOException {
+
+ User agent = User.getById(agentID);
+ User applicantMult = User.getById(applicantMultID);
+
+ enterAssuranceWhen(agentID, applicantMultID, min39month);
+
+ int xPoints = agent.getExperiencePoints();
+
+ // test that VP after first entry
+
+ assertEquals(applicantMult.getAssurancePoints(), 10);
+
+ // enter second entry to check correct calculation with larger points
+ enterAssuranceWhen(agentID, applicantMultID, min24month, 20);
+ assertEquals(applicantMult.getAssurancePoints(), 20);
+
+ // test correct XP calculation
+ assertEquals(agent.getExperiencePoints(), xPoints);
+
+ // enter third entry to check correct calculation with less points
+ enterAssuranceWhen(agentID, applicantMultID, yesterday, 15);
+ assertEquals(applicantMult.getAssurancePoints(), 15);
+
+ // test correct XP calculation
+ assertEquals(agent.getExperiencePoints(), xPoints);
+
+ // enter expired entry
+ enterAssuranceExpired(agentID, applicantMultID, yesterday);
+ assertEquals(applicantMult.getAssurancePoints(), 15);
+
+ // enter deleted entry same agent
+ enterAssuranceDeleted(agentID, applicantMultID, yesterday);
+ assertEquals(applicantMult.getAssurancePoints(), 15);
+
+ // enter expired entry future
+ enterAssuranceExpired(agentID, applicantMultID, tomorrow);
+ assertEquals(applicantMult.getAssurancePoints(), 10);
+
+ // test correct XP calculation
+ assertEquals(agent.getExperiencePoints(), xPoints);
+
+ // enter entry from different agent
+ enterAssuranceWhen(agent2ID, applicantMultID, yesterday);
+ assertEquals(applicantMult.getAssurancePoints(), 20);
+
+ // enter entry for second applicant
+ enterAssuranceWhen(agentID, applicantID, yesterday);
+ assertEquals(agent.getExperiencePoints(), xPoints + 2);
+
+ }
}
import java.net.URLConnection;
import java.net.URLEncoder;
import java.sql.SQLException;
+import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;
+import org.cacert.gigi.database.GigiPreparedStatement;
+import org.cacert.gigi.dbObjects.User;
import org.cacert.gigi.pages.account.MyDetails;
import org.cacert.gigi.testUtils.IOUtils;
import org.cacert.gigi.testUtils.ManagedTest;
+import org.cacert.gigi.util.DayDate;
import org.hamcrest.Matcher;
import org.junit.Before;
import org.junit.Test;
return uc;
}
+ @Test
+ public void testMultipleAssurance() throws IOException {
+
+ User users[] = User.findByEmail(assurerM);
+ int agentID = users[0].getId();
+
+ users = User.findByEmail(assureeM);
+ int applicantID = users[0].getId();
+
+ // enter first entry 200 days in the past
+ try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?, `when`=? ")) {
+ ps.setInt(1, agentID);
+ ps.setInt(2, applicantID);
+ ps.setInt(3, 10);
+ ps.setString(4, "test-location");
+ ps.setString(5, "2010-01-01");
+ ps.setTimestamp(6, new Timestamp(System.currentTimeMillis() - DayDate.MILLI_DAY * 200));
+ ps.execute();
+ }
+
+ // enter second entry
+ String uniqueLoc = createUniqueName();
+ executeSuccess("date=2000-01-01&location=" + uniqueLoc + "&certify=1&rules=1&assertion=1&points=10");
+
+ // enter third entry on the same day
+ URLConnection uc = get(cookie, AssurePage.PATH);
+ uc.setDoOutput(true);
+ uc.getOutputStream().write(("email=" + URLEncoder.encode(assureeM, "UTF-8") + "&day=1&month=1&year=1910&search").getBytes("UTF-8"));
+ assertThat(IOUtils.readURL(uc), hasError());
+
+ }
}