From: INOPIAE Date: Sat, 23 Feb 2019 05:40:54 +0000 (+0100) Subject: add: implement password change log X-Git-Url: https://code.wpia.club/?p=gigi.git;a=commitdiff_plain;h=eebeeee1e9fa524482d5f0029d7a70ce9aedd5e8 add: implement password change log fixes issue #42 Change-Id: I64a8ab5ff675852029b19e2e325f8fcd738544d5 --- diff --git a/src/club/wpia/gigi/dbObjects/CertificateOwner.java b/src/club/wpia/gigi/dbObjects/CertificateOwner.java index 72e5a816..5801f602 100644 --- a/src/club/wpia/gigi/dbObjects/CertificateOwner.java +++ b/src/club/wpia/gigi/dbObjects/CertificateOwner.java @@ -134,7 +134,11 @@ public abstract class CertificateOwner implements IdCachable, Serializable { List entries = new LinkedList(); 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]); } diff --git a/src/club/wpia/gigi/dbObjects/SupportedUser.java b/src/club/wpia/gigi/dbObjects/SupportedUser.java index 5d023e9b..84c43ab8 100644 --- a/src/club/wpia/gigi/dbObjects/SupportedUser.java +++ b/src/club/wpia/gigi/dbObjects/SupportedUser.java @@ -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) { diff --git a/src/club/wpia/gigi/dbObjects/User.java b/src/club/wpia/gigi/dbObjects/User.java index 3b4f4671..e3beaf86 100644 --- a/src/club/wpia/gigi/dbObjects/User.java +++ b/src/club/wpia/gigi/dbObjects/User.java @@ -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(); + } + } } diff --git a/src/club/wpia/gigi/pages/PasswordResetPage.java b/src/club/wpia/gigi/pages/PasswordResetPage.java index af1829a0..b5132f05 100644 --- a/src/club/wpia/gigi/pages/PasswordResetPage.java +++ b/src/club/wpia/gigi/pages/PasswordResetPage.java @@ -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.")); } diff --git a/src/club/wpia/gigi/pages/account/ChangeForm.java b/src/club/wpia/gigi/pages/account/ChangeForm.java index 53c04de6..de2a182d 100644 --- a/src/club/wpia/gigi/pages/account/ChangeForm.java +++ b/src/club/wpia/gigi/pages/account/ChangeForm.java @@ -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); } diff --git a/src/club/wpia/gigi/pages/wot/VerificationForm.java b/src/club/wpia/gigi/pages/wot/VerificationForm.java index 327b6eb5..78ddcea1 100644 --- a/src/club/wpia/gigi/pages/wot/VerificationForm.java +++ b/src/club/wpia/gigi/pages/wot/VerificationForm.java @@ -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); } diff --git a/tests/club/wpia/gigi/dbObjects/TestUser.java b/tests/club/wpia/gigi/dbObjects/TestUser.java index ed3f1c95..6ec0abec 100644 --- a/tests/club/wpia/gigi/dbObjects/TestUser.java +++ b/tests/club/wpia/gigi/dbObjects/TestUser.java @@ -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))); + } + } diff --git a/tests/club/wpia/gigi/pages/account/TestChangePassword.java b/tests/club/wpia/gigi/pages/account/TestChangePassword.java index 7a2a6a92..e18ec02a 100644 --- a/tests/club/wpia/gigi/pages/account/TestChangePassword.java +++ b/tests/club/wpia/gigi/pages/account/TestChangePassword.java @@ -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 diff --git a/tests/club/wpia/gigi/pages/account/TestPasswordResetExternal.java b/tests/club/wpia/gigi/pages/account/TestPasswordResetExternal.java index 31510abe..439c0f5b 100644 --- a/tests/club/wpia/gigi/pages/account/TestPasswordResetExternal.java +++ b/tests/club/wpia/gigi/pages/account/TestPasswordResetExternal.java @@ -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 { diff --git a/tests/club/wpia/gigi/pages/admin/TestSEAdminNotificationMail.java b/tests/club/wpia/gigi/pages/admin/TestSEAdminNotificationMail.java index 180455ce..a84e0e2f 100644 --- a/tests/club/wpia/gigi/pages/admin/TestSEAdminNotificationMail.java +++ b/tests/club/wpia/gigi/pages/admin/TestSEAdminNotificationMail.java @@ -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 index 00000000..12755b49 --- /dev/null +++ b/tests/club/wpia/gigi/testUtils/ArrayContains.java @@ -0,0 +1,35 @@ +package club.wpia.gigi.testUtils; + +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.hamcrest.Matcher; + +public class ArrayContains extends BaseMatcher { + + Matcher containee; + + public ArrayContains(Matcher 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 ArrayContains contains(final Matcher element) { + return new ArrayContains(element); + } +}