[java-plugin-shibd] branch main updated: More unit tests and fix to storage removal.

Codeberg noreply at shibboleth.net
Tue Apr 21 14:02:19 UTC 2026


This is an automated email from the git hooks/post-receive script.

codeberg pushed a commit to branch main
in repository java-plugin-shibd.

View the commit online:
https://codeberg.org/Shibboleth/java-plugin-shibd/commit/c1b623d005fad5aca2bfba9aea80d8d08edf4dd6

The following commit(s) were added to refs/heads/main by this push:
     new c1b623d  More unit tests and fix to storage removal.
c1b623d is described below

commit c1b623d005fad5aca2bfba9aea80d8d08edf4dd6
Author: Scott Cantor <scott at restingparrotsoftware.com>
AuthorDate: Tue Apr 21 10:02:03 2026 -0400

    More unit tests and fix to storage removal.
---
 .../sp/state/impl/StorageServiceStateManager.java  |   2 +-
 .../state/impl/StorageServiceStateManagerTest.java | 128 ++++++++++++++++++++-
 2 files changed, 127 insertions(+), 3 deletions(-)

diff --git a/sp-server-impl/src/main/java/net/shibboleth/sp/state/impl/StorageServiceStateManager.java b/sp-server-impl/src/main/java/net/shibboleth/sp/state/impl/StorageServiceStateManager.java
index 9136898..59858f7 100644
--- a/sp-server-impl/src/main/java/net/shibboleth/sp/state/impl/StorageServiceStateManager.java
+++ b/sp-server-impl/src/main/java/net/shibboleth/sp/state/impl/StorageServiceStateManager.java
@@ -189,7 +189,7 @@ public class StorageServiceStateManager extends AbstractStateManager {
         final StorageRecord<String> record = storageService.read(context, key);
         if (record != null) {
             try {
-                storageService.delete(context, stateToken);
+                storageService.delete(context, key);
             } catch (final IOException e) {
                 log.warn("Unable to delete state record ('{}', '{}') from storage", context, key, e);
             }
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 85b811f..7b6f1db 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
@@ -32,6 +32,7 @@ import org.testng.annotations.Test;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 
+import jakarta.servlet.http.Cookie;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
@@ -92,16 +93,19 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
     @BeforeMethod
     public void beforeMethod() throws ComponentInitializationException {
         super.beforeMethod();
+        
+        request = new MockHttpServletRequest();
+        response = new MockHttpServletResponse();
     }
     
     @Test
-    public void testMissing() throws IOException, ComponentInitializationException {
+    public void testMissingNoCookie() throws IOException, ComponentInitializationException {
         final var stateManager = getStateManager(false);
         Assert.assertNull(stateManager.recoverFromStateToken(agent, application, "foo", StateData.class));
     }
     
     @Test
-    public void testRecoverNoCookie() throws IOException, ComponentInitializationException {
+    public void testSuccessNoCookie() throws IOException, ComponentInitializationException {
         final var stateManager = getStateManager(false);
         
         final StateData source = buildStateData();
@@ -115,6 +119,126 @@ public class StorageServiceStateManagerTest extends BaseApplicationActionTest {
         Assert.assertNull(stateManager.recoverFromStateToken(agent, application, token, StateData.class));
     }
 
+    @Test
+    public void testSuccessNoCookieWithAddress() throws IOException, ComponentInitializationException {
+        final var stateManager = getStateManager(false);
+        
+        final StateData source = buildStateData();
+        source.setClientAddress("192.168.1.1");
+        
+        final String token = stateManager.preserveToStateToken(agent, application, source);
+        assert token != null;
+
+        request = new MockHttpServletRequest();
+        request.setRemoteAddr("192.168.1.1");
+        
+        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 testFailureNoCookieWithAddress() throws IOException, ComponentInitializationException {
+        final var stateManager = getStateManager(false);
+        
+        final StateData source = buildStateData();
+        source.setClientAddress("192.168.1.1");
+        
+        final String token = stateManager.preserveToStateToken(agent, application, source);
+        assert token != null;
+
+        request = new MockHttpServletRequest();
+        request.setRemoteAddr("192.168.1.2");
+        
+        final StateData recovered = stateManager.recoverFromStateToken(agent, application, token, StateData.class);
+        Assert.assertNull(recovered);
+
+        Assert.assertNull(stateManager.recoverFromStateToken(agent, application, token, StateData.class));
+    }
+    
+    @Test
+    public void testSuccessWithCookie() throws IOException, ComponentInitializationException {
+        final var stateManager = getStateManager(true);
+        
+        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 + '_' + "test" + '_' + 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 testSuccessWithCookieWithAddress() throws IOException, ComponentInitializationException {
+        final var stateManager = getStateManager(true);
+        
+        final StateData source = buildStateData();
+        source.setClientAddress("192.168.1.1");
+        
+        final String token = stateManager.preserveToStateToken(agent, application, source);
+        assert token != null;
+
+        // Move cookie set on response to request.
+        request = new MockHttpServletRequest();
+        request.setRemoteAddr("192.168.1.1");
+        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 + '_' + "test" + '_' + 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 testFailureWithCookieWithAddress() throws IOException, ComponentInitializationException {
+        final var stateManager = getStateManager(true);
+        
+        final StateData source = buildStateData();
+        source.setClientAddress("192.168.1.1");
+        
+        final String token = stateManager.preserveToStateToken(agent, application, source);
+        assert token != null;
+
+        // Move cookie set on response to request.
+        request = new MockHttpServletRequest();
+        request.setRemoteAddr("192.168.1.2");
+        request.setCookies(response.getCookies());
+        response = new MockHttpServletResponse();
+        
+        final StateData recovered = stateManager.recoverFromStateToken(agent, application, token, StateData.class);
+        Assert.assertNull(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 + '_' + "test" + '_' + token);
+        Assert.assertEquals(cookies[0].getValue(), null);
+        Assert.assertEquals(cookies[0].getMaxAge(), 0);
+        Assert.assertEquals(cookies[0].getAttribute("SameSite"), SameSiteValue.None.getValue());
+    }
+    
     @Nonnull private StorageServiceStateManager getStateManager(final boolean useCookie)
             throws ComponentInitializationException {
         

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list