From 674a051586d3b71f5b32f5dc5a4117d7fb0ff057 Mon Sep 17 00:00:00 2001 From: ljacqu Date: Fri, 15 Jul 2016 19:47:42 +0200 Subject: [PATCH] #762 Clear all stored sessions if feature gets disabled on reload --- .../fr/xephi/authme/cache/SessionManager.java | 6 +++++ .../authme/cache/SessionManagerTest.java | 26 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/xephi/authme/cache/SessionManager.java b/src/main/java/fr/xephi/authme/cache/SessionManager.java index 698c51bb..d14dc9aa 100644 --- a/src/main/java/fr/xephi/authme/cache/SessionManager.java +++ b/src/main/java/fr/xephi/authme/cache/SessionManager.java @@ -66,6 +66,12 @@ public class SessionManager implements SettingsDependent { @Override public void reload(NewSetting settings) { timeoutInMinutes = settings.getProperty(PluginSettings.SESSIONS_TIMEOUT); + boolean oldEnabled = enabled; enabled = timeoutInMinutes > 0 && settings.getProperty(PluginSettings.SESSIONS_ENABLED); + + // With this reload, the sessions feature has just been disabled, so clear all stored sessions + if (oldEnabled && !enabled) { + sessions.clear(); + } } } diff --git a/src/test/java/fr/xephi/authme/cache/SessionManagerTest.java b/src/test/java/fr/xephi/authme/cache/SessionManagerTest.java index 5a9f1d13..7298e2d8 100644 --- a/src/test/java/fr/xephi/authme/cache/SessionManagerTest.java +++ b/src/test/java/fr/xephi/authme/cache/SessionManagerTest.java @@ -9,6 +9,7 @@ import org.mockito.runners.MockitoJUnitRunner; import java.util.Map; +import static org.hamcrest.Matchers.anEmptyMap; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; import static org.mockito.BDDMockito.given; @@ -96,8 +97,7 @@ public class SessionManagerTest { NewSetting settings = mockSettings(true, timeout); String player = "patrick"; SessionManager manager = new SessionManager(settings); - Map sessions = (Map) ReflectionTestUtils - .getFieldValue(SessionManager.class, manager, "sessions"); + Map sessions = getSessionsMap(manager); // Add session entry for player that just has expired sessions.put(player, System.currentTimeMillis() - 1000); @@ -108,6 +108,28 @@ public class SessionManagerTest { assertThat(result, equalTo(false)); } + @Test + public void shouldClearAllSessionsAfterDisable() { + // given + NewSetting settings = mockSettings(true, 10); + SessionManager manager = new SessionManager(settings); + manager.addSession("player01"); + manager.addSession("player02"); + + // when + manager.reload(mockSettings(false, 20)); + + // then + assertThat(getSessionsMap(manager), anEmptyMap()); + } + + @SuppressWarnings("unchecked") + private static Map getSessionsMap(SessionManager manager) { + return (Map) ReflectionTestUtils + .getFieldValue(SessionManager.class, manager, "sessions"); + } + + private static NewSetting mockSettings(boolean isEnabled, int sessionTimeout) { NewSetting settings = mock(NewSetting.class); given(settings.getProperty(PluginSettings.SESSIONS_ENABLED)).willReturn(isEnabled);