[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