add: implement password change log
authorINOPIAE <m.maengel@inopiae.de>
Sat, 23 Feb 2019 05:40:54 +0000 (06:40 +0100)
committerINOPIAE <m.maengel@inopiae.de>
Wed, 11 Sep 2019 03:54:39 +0000 (05:54 +0200)
fixes issue #42

Change-Id: I64a8ab5ff675852029b19e2e325f8fcd738544d5

src/club/wpia/gigi/dbObjects/CertificateOwner.java
src/club/wpia/gigi/dbObjects/SupportedUser.java
src/club/wpia/gigi/dbObjects/User.java
src/club/wpia/gigi/pages/PasswordResetPage.java
src/club/wpia/gigi/pages/account/ChangeForm.java
src/club/wpia/gigi/pages/wot/VerificationForm.java
tests/club/wpia/gigi/dbObjects/TestUser.java
tests/club/wpia/gigi/pages/account/TestChangePassword.java
tests/club/wpia/gigi/pages/account/TestPasswordResetExternal.java
tests/club/wpia/gigi/pages/admin/TestSEAdminNotificationMail.java
tests/club/wpia/gigi/testUtils/ArrayContains.java [new file with mode: 0644]

index 72e5a81..5801f60 100644 (file)
@@ -134,7 +134,11 @@ public abstract class CertificateOwner implements IdCachable, Serializable {
             List<String> entries = new LinkedList<String>();
 
             while (res.next()) {
-                entries.add(res.getString(2) + " (" + res.getString(3) + ")");
+                String info = res.getString(3);
+                if ( !info.isEmpty()) {
+                    info = " (" + info + ")";
+                }
+                entries.add(res.getString(2) + info);
             }
             return entries.toArray(new String[0]);
         }
index 5d023e9..84c43ab 100644 (file)
@@ -175,13 +175,14 @@ public class SupportedUser {
         }
     }
 
-    public void triggerPasswordReset(String aword, HttpServletRequest req) {
+    public void triggerPasswordReset(String aword, HttpServletRequest req) throws GigiApiException {
         Language l = Language.getInstance(target.getPreferredLocale());
         String method = l.getTranslation("A password reset was triggered. Please enter the required text sent to you by support on this page:");
         String subject = l.getTranslation("Password reset by support.");
         PasswordResetPage.initPasswordResetProcess(target, req, aword, l, method, subject);
         Outputable message = new TranslateCommand("A password reset was triggered and an email was sent to user.");
         sendSupportNotification(subject, message);
+        writeSELog("SE triggered password reset");
     }
 
     private void sendBoardNotification(String subject, Outputable message) {
index 3b4f467..e3beaf8 100644 (file)
@@ -700,4 +700,13 @@ public class User extends CertificateOwner {
     public boolean hasValidTTPAgentChallenge() {
         return CATS.isInCatsLimit(getId(), CATSType.TTP_AGENT_CHALLENGE.getId());
     }
+
+    public void writeUserLog(User actor, String type) throws GigiApiException {
+        try (GigiPreparedStatement prep = new GigiPreparedStatement("INSERT INTO `adminLog` SET uid=?, admin=?, type=?")) {
+            prep.setInt(1, actor.getId());
+            prep.setInt(2, getId());
+            prep.setString(3, type);
+            prep.executeUpdate();
+        }
+    }
 }
index af1829a..b5132f0 100644 (file)
@@ -76,6 +76,7 @@ public class PasswordResetPage extends Page {
                 throw new GigiApiException("New passwords differ.");
             }
             u.consumePasswordResetTicket(id, tok, p1);
+            u.writeUserLog(u, "User token based password reset");
             return new SuccessMessageResult(new TranslateCommand("Password reset successful."));
         }
 
index 53c04de..de2a182 100644 (file)
@@ -42,6 +42,7 @@ public class ChangeForm extends Form {
         }
         try {
             target.changePassword(oldpassword, p1);
+            target.writeUserLog(target, "User triggered password reset");
         } catch (GigiApiException e) {
             error.mergeInto(e);
         }
index 327b6eb..78ddcea 100644 (file)
@@ -228,6 +228,7 @@ public class VerificationForm extends Form {
             String subject = langApplicant.getTranslation("Password reset by verification");
             PasswordResetPage.initPasswordResetProcess(applicant, req, aword, langApplicant, method, subject);
             result = new ConcatOutputable(result, new TranslateCommand("Password reset successful."));
+            agent.writeUserLog(applicant, "RA Agent triggered password reset");
         }
         return new SuccessMessageResult(result);
     }
index ed3f1c9..6ec0abe 100644 (file)
@@ -6,11 +6,13 @@ import java.io.IOException;
 import java.security.GeneralSecurityException;
 import java.sql.Date;
 
+import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 
 import club.wpia.gigi.GigiApiException;
 import club.wpia.gigi.dbObjects.CATS.CATSType;
 import club.wpia.gigi.dbObjects.NamePart.NamePartType;
+import club.wpia.gigi.testUtils.ArrayContains;
 import club.wpia.gigi.testUtils.ClientBusinessTest;
 
 public class TestUser extends ClientBusinessTest {
@@ -105,4 +107,18 @@ public class TestUser extends ClientBusinessTest {
         assertTrue(u.hasValidTTPAgentChallenge());
     }
 
+    @Test
+    public void testWriteUserLog() throws GigiApiException {
+        String type = "Log test";
+        u.writeUserLog(u, type);
+        String[] result = u.getAdminLog();
+        assertThat(result, ArrayContains.contains(CoreMatchers.equalTo(type)));
+
+        String type1 = "Log test1";
+        u.writeUserLog(u, type1);
+        result = u.getAdminLog();
+        assertThat(result, ArrayContains.contains(CoreMatchers.equalTo(type1)));
+        assertThat(result, ArrayContains.contains(CoreMatchers.equalTo(type)));
+    }
+
 }
index 7a2a6a9..e18ec02 100644 (file)
@@ -5,10 +5,11 @@ import static org.junit.Assert.*;
 import java.io.IOException;
 import java.net.URLEncoder;
 
+import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 
 import club.wpia.gigi.GigiApiException;
-import club.wpia.gigi.pages.account.ChangePasswordPage;
+import club.wpia.gigi.testUtils.ArrayContains;
 import club.wpia.gigi.testUtils.ClientTest;
 
 public class TestChangePassword extends ClientTest {
@@ -44,6 +45,9 @@ public class TestChangePassword extends ClientTest {
         assertTrue(isLoggedin(login(u.getEmail(), TEST_PASSWORD + "v2")));
         assertFalse(isLoggedin(login(u.getEmail(), TEST_PASSWORD)));
 
+        String[] result = u.getAdminLog();
+        assertThat(result, ArrayContains.contains(CoreMatchers.equalTo("User triggered password reset")));
+
     }
 
     @Test
index 31510ab..439c0f5 100644 (file)
@@ -12,12 +12,14 @@ import java.net.URLConnection;
 import java.net.URLEncoder;
 import java.security.GeneralSecurityException;
 
+import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 
 import club.wpia.gigi.GigiApiException;
 import club.wpia.gigi.dbObjects.User;
 import club.wpia.gigi.pages.PasswordResetPage;
 import club.wpia.gigi.pages.wot.TestVerification;
+import club.wpia.gigi.testUtils.ArrayContains;
 import club.wpia.gigi.testUtils.ClientTest;
 import club.wpia.gigi.testUtils.IOUtils;
 import club.wpia.gigi.testUtils.TestEmailReceiver.TestMail;
@@ -46,6 +48,10 @@ public class TestPasswordResetExternal extends ClientTest {
         assertNotNull(toPasswordReset(avalue, link, "a", "a"));
         assertNull(toPasswordReset(avalue, link, npw, npw));
         assertNotNull(login(email, npw));
+
+        String[] result = this.u.getAdminLog();
+        assertThat(result, ArrayContains.contains(CoreMatchers.equalTo("RA Agent triggered password reset")));
+        assertThat(result, ArrayContains.contains(CoreMatchers.equalTo("User token based password reset")));
     }
 
     private String toPasswordReset(String avalue, String link, String npw, String npw2) throws IOException, MalformedURLException, UnsupportedEncodingException {
index 180455c..a84e0e2 100644 (file)
@@ -12,6 +12,7 @@ import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.Locale;
 
+import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 
 import club.wpia.gigi.GigiApiException;
@@ -20,6 +21,7 @@ import club.wpia.gigi.dbObjects.User;
 import club.wpia.gigi.localisation.Language;
 import club.wpia.gigi.pages.account.MyDetails;
 import club.wpia.gigi.pages.admin.support.SupportUserDetailsPage;
+import club.wpia.gigi.testUtils.ArrayContains;
 import club.wpia.gigi.testUtils.IOUtils;
 import club.wpia.gigi.testUtils.SEClientTest;
 import club.wpia.gigi.testUtils.TestEmailReceiver.TestMail;
@@ -59,6 +61,10 @@ public class TestSEAdminNotificationMail extends SEClientTest {
         getMailReceiver().receive(targetEmail);
         TestMail tm = getMailReceiver().receive(ServerConstants.getSupportMailAddress());
         assertThat(tm.getMessage(), containsString("A password reset was triggered and an email was sent to user."));
+
+        User test = User.getById(targetID);
+        String[] result = test.getAdminLog();
+        assertThat(result, ArrayContains.contains(CoreMatchers.equalTo("SE triggered password reset (a20140808.8)")));
     }
 
     @Test
diff --git a/tests/club/wpia/gigi/testUtils/ArrayContains.java b/tests/club/wpia/gigi/testUtils/ArrayContains.java
new file mode 100644 (file)
index 0000000..12755b4
--- /dev/null
@@ -0,0 +1,35 @@
+package club.wpia.gigi.testUtils;
+
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+
+public class ArrayContains<T> extends BaseMatcher<T[]> {
+
+    Matcher<T> containee;
+
+    public ArrayContains(Matcher<T> containee) {
+        this.containee = containee;
+    }
+
+    @Override
+    public boolean matches(Object item) {
+        Object[] array = (Object[]) item;
+        for (Object t : array) {
+            if (containee.matches(t)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText("contains an element that:");
+        containee.describeTo(description);
+    }
+
+    public static <T> ArrayContains<T> contains(final Matcher<T> element) {
+        return new ArrayContains<T>(element);
+    }
+}