[java-plugin-shibd] branch dev/StateMgmtWIP updated: Add sealed tests to staorage-backed state manager.
Codeberg
noreply at shibboleth.net
Tue May 5 13:09:08 UTC 2026
This is an automated email from the git hooks/post-receive script.
codeberg pushed a commit to branch dev/StateMgmtWIP
in repository java-plugin-shibd.
View the commit online:
https://codeberg.org/Shibboleth/java-plugin-shibd/commit/127f555dd43f092615983373dd49a8a3e3cc8143
The following commit(s) were added to refs/heads/dev/StateMgmtWIP by this push:
new 127f555 Add sealed tests to staorage-backed state manager.
127f555 is described below
commit 127f555dd43f092615983373dd49a8a3e3cc8143
Author: Scott Cantor <scott at restingparrotsoftware.com>
AuthorDate: Tue May 5 09:08:13 2026 -0400
Add sealed tests to staorage-backed state manager.
---
.../state/impl/StorageServiceStateManagerTest.java | 94 ++++++++++++++++++++--
1 file changed, 86 insertions(+), 8 deletions(-)
diff --git a/sp-server-impl/src/test/java/net/shibboleth/sp/state/impl/StorageServiceStateManagerTest.java b/sp-server-impl/src/test/java/net/shibboleth/sp/state/impl/StorageServiceStateManagerTest.java
index b3d6e51..f83c6d0 100644
--- a/sp-server-impl/src/test/java/net/shibboleth/sp/state/impl/StorageServiceStateManagerTest.java
+++ b/sp-server-impl/src/test/java/net/shibboleth/sp/state/impl/StorageServiceStateManagerTest.java
@@ -22,6 +22,7 @@ import java.time.Instant;
import javax.annotation.Nonnull;
import org.opensaml.storage.impl.MemoryStorageService;
+import org.springframework.core.io.ClassPathResource;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.testng.Assert;
@@ -41,8 +42,12 @@ import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.net.CookieManager;
import net.shibboleth.shared.net.CookieManager.SameSiteValue;
import net.shibboleth.shared.primitive.NonnullSupplier;
+import net.shibboleth.shared.resource.Resource;
+import net.shibboleth.shared.security.DataSealer;
+import net.shibboleth.shared.security.impl.BasicKeystoreKeyStrategy;
import net.shibboleth.sp.profile.impl.BaseApplicationActionTest;
import net.shibboleth.sp.state.StateData;
+import net.shibboleth.sp.testing.TestResourceConverter;
/**
* Unit tests for {@link StorageServiceStateManager}.
@@ -60,6 +65,10 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
private MockHttpServletRequest request;
private MockHttpServletResponse response;
+ private Resource keystoreResource;
+ private Resource versionResource;
+
+ private DataSealer sealer;
private CookieManager cookieManager;
private MemoryStorageService storageService;
@@ -87,11 +96,35 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
storageService.setId("test");
storageService.setCleanupInterval(Duration.ZERO);
storageService.initialize();
+
+ ClassPathResource resource =
+ new ClassPathResource("/net/shibboleth/sp/profile/impl/SealerKeyStore.jks");
+ Assert.assertTrue(resource.exists());
+ keystoreResource = TestResourceConverter.of(resource);
+
+ resource =
+ new ClassPathResource("/net/shibboleth/sp/profile/impl/SealerKeyStore.kver");
+ Assert.assertTrue(resource.exists());
+ versionResource = TestResourceConverter.of(resource);
+
+ final BasicKeystoreKeyStrategy strategy = new BasicKeystoreKeyStrategy();
+ strategy.setKeyAlias("secret");
+ strategy.setKeyPassword("kpassword");
+ strategy.setKeystorePassword("password");
+ strategy.setKeystoreResource(keystoreResource);
+ strategy.setKeyVersionResource(versionResource);
+ strategy.initialize();
+
+ sealer = new DataSealer();
+ sealer.setKeyStrategy(strategy);
+ sealer.initialize();
}
@AfterClass
public void tearDown() {
+ cookieManager.destroy();
storageService.destroy();
+ sealer.destroy();
}
@BeforeMethod
@@ -104,13 +137,13 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
@Test
public void testMissingNoCookie() throws IOException, ComponentInitializationException {
- final var stateManager = getStateManager(false);
+ final var stateManager = getStateManager(false, false);
Assert.assertNull(stateManager.recoverFromStateToken(agent, application, "foo", StateData.class));
}
@Test
public void testSuccessNoCookie() throws IOException, ComponentInitializationException {
- final var stateManager = getStateManager(false);
+ final var stateManager = getStateManager(false, false);
final StateData source = buildStateData();
@@ -123,9 +156,24 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
Assert.assertNull(stateManager.recoverFromStateToken(agent, application, token, StateData.class));
}
+ @Test
+ public void testSuccessNoCookieSealed() throws IOException, ComponentInitializationException {
+ final var stateManager = getStateManager(false, true);
+
+ final StateData source = buildStateData();
+
+ final String token = stateManager.preserveToStateToken(agent, application, source);
+ assert token != null;
+
+ final StateData recovered = stateManager.recoverFromStateToken(agent, application, token, StateData.class);
+ Assert.assertEquals(source, recovered);
+
+ Assert.assertNull(stateManager.recoverFromStateToken(agent, application, token, StateData.class));
+ }
+
@Test
public void testSuccessNoCookieWithAddress() throws IOException, ComponentInitializationException {
- final var stateManager = getStateManager(false);
+ final var stateManager = getStateManager(false, false);
final StateData source = buildStateData();
source.setClientAddress("192.168.1.1");
@@ -144,7 +192,7 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
@Test
public void testFailureNoCookieWithAddress() throws IOException, ComponentInitializationException {
- final var stateManager = getStateManager(false);
+ final var stateManager = getStateManager(false, false);
final StateData source = buildStateData();
source.setClientAddress("192.168.1.1");
@@ -163,7 +211,33 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
@Test
public void testSuccessWithCookie() throws IOException, ComponentInitializationException {
- final var stateManager = getStateManager(true);
+ final var stateManager = getStateManager(true, false);
+
+ final StateData source = buildStateData();
+
+ final String token = stateManager.preserveToStateToken(agent, application, source);
+ assert token != null;
+
+ // Move cookie set on response to request.
+ request = new MockHttpServletRequest();
+ request.setCookies(response.getCookies());
+ response = new MockHttpServletResponse();
+
+ final StateData recovered = stateManager.recoverFromStateToken(agent, application, token, StateData.class);
+ Assert.assertEquals(source, recovered);
+
+ // Check that old token is unset.
+ final Cookie[] cookies = response.getCookies();
+ Assert.assertEquals(cookies.length, 1);
+ Assert.assertEquals(cookies[0].getName(), CookieStateManager.DEFAULT_PREFIX + '_' + "default" + '_' + token);
+ Assert.assertEquals(cookies[0].getValue(), null);
+ Assert.assertEquals(cookies[0].getMaxAge(), 0);
+ Assert.assertEquals(cookies[0].getAttribute("SameSite"), SameSiteValue.None.getValue());
+ }
+
+ @Test
+ public void testSuccessWithCookieSealed() throws IOException, ComponentInitializationException {
+ final var stateManager = getStateManager(true, true);
final StateData source = buildStateData();
@@ -189,7 +263,7 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
@Test
public void testSuccessWithCookieWithAddress() throws IOException, ComponentInitializationException {
- final var stateManager = getStateManager(true);
+ final var stateManager = getStateManager(true, false);
final StateData source = buildStateData();
source.setClientAddress("192.168.1.1");
@@ -217,7 +291,7 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
@Test
public void testFailureWithCookieWithAddress() throws IOException, ComponentInitializationException {
- final var stateManager = getStateManager(true);
+ final var stateManager = getStateManager(true, false);
final StateData source = buildStateData();
source.setClientAddress("192.168.1.1");
@@ -243,7 +317,7 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
Assert.assertEquals(cookies[0].getAttribute("SameSite"), SameSiteValue.None.getValue());
}
- @Nonnull private StorageServiceStateManager getStateManager(final boolean useCookie)
+ @Nonnull private StorageServiceStateManager getStateManager(final boolean useCookie, final boolean sealed)
throws ComponentInitializationException {
final var stateManager = new StorageServiceStateManager();
@@ -254,6 +328,10 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
stateManager.setCookieManager(cookieManager);
}
+ if (sealed) {
+ stateManager.setDataSealer(sealer);
+ }
+
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
stateManager.setObjectMapper(mapper);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list