[java-idp-plugin-oidc-rp] branch main updated: JOIDCRP-68 - Claim sanitization fails with ill behaving OP

Phil Smart philip.smart at jisc.ac.uk
Wed Oct 9 10:20:10 UTC 2024


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

philsmart pushed a commit to branch main
in repository java-idp-plugin-oidc-rp.

View the commit online:
http://git.shibboleth.net/view/?p=java-idp-plugin-oidc-rp.git;a=commit;h=8e0885c060a92f970c048163dd7fad674ed194f5

The following commit(s) were added to refs/heads/main by this push:
     new 8e0885c  JOIDCRP-68 - Claim sanitization fails with ill behaving OP
8e0885c is described below

commit 8e0885c060a92f970c048163dd7fad674ed194f5
Author: Phil Smart <philip.smart at jisc.ac.uk>
AuthorDate: Wed Oct 9 11:20:07 2024 +0100

    JOIDCRP-68 - Claim sanitization fails with ill behaving OP
    
     - Remove claims with null values
    
    https://shibboleth.atlassian.net/browse/JOIDCRP-68
---
 .../rp/impl/DefaultClaimSanitizationStrategy.java  |  9 ++++---
 .../impl/DefaultClaimSanitizationStrategyTest.java | 31 ++++++++++++++++++++++
 2 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/idp-oidc-rp-impl/src/main/java/net/shibboleth/idp/plugin/authn/oidc/rp/impl/DefaultClaimSanitizationStrategy.java b/idp-oidc-rp-impl/src/main/java/net/shibboleth/idp/plugin/authn/oidc/rp/impl/DefaultClaimSanitizationStrategy.java
index c0421ce..4f266d7 100644
--- a/idp-oidc-rp-impl/src/main/java/net/shibboleth/idp/plugin/authn/oidc/rp/impl/DefaultClaimSanitizationStrategy.java
+++ b/idp-oidc-rp-impl/src/main/java/net/shibboleth/idp/plugin/authn/oidc/rp/impl/DefaultClaimSanitizationStrategy.java
@@ -28,8 +28,9 @@ import net.shibboleth.oidc.security.jwt.claims.impl.IDTokenClaims;
 import net.shibboleth.oidc.security.jwt.claims.impl.JWTClaims;
 
 /**
- * Produce a claims set from the JWT claims set without the validation claims, leaving the identity,
- * authorization, and misc. claims.
+ * Produce a claims set from the JWT claims set without either the validation claims or claims with null values.
+ * Leaving the identity, authorization, and misc. claims.
+ * 
  */
 public class DefaultClaimSanitizationStrategy implements UnaryOperator<ClaimsSet> {
     
@@ -60,7 +61,9 @@ public class DefaultClaimSanitizationStrategy implements UnaryOperator<ClaimsSet
         final ClaimsSet sanitizedClaims = new ClaimsSet();
         final Map<String, Object> filteredMap = jwtClaims.toJSONObject().entrySet()
             .stream()
-            .filter(c -> !validationClaims.contains(c.getKey()))
+            .filter(c -> c.getValue() != null)
+            .filter(c -> !validationClaims.contains(c.getKey()))            
+            .filter(c -> c.getKey() != null)
                 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
         sanitizedClaims.putAll(filteredMap);
         return sanitizedClaims;
diff --git a/idp-oidc-rp-impl/src/test/java/net/shibboleth/idp/plugin/authn/oidc/rp/impl/DefaultClaimSanitizationStrategyTest.java b/idp-oidc-rp-impl/src/test/java/net/shibboleth/idp/plugin/authn/oidc/rp/impl/DefaultClaimSanitizationStrategyTest.java
index 4c9598d..bf567b7 100644
--- a/idp-oidc-rp-impl/src/test/java/net/shibboleth/idp/plugin/authn/oidc/rp/impl/DefaultClaimSanitizationStrategyTest.java
+++ b/idp-oidc-rp-impl/src/test/java/net/shibboleth/idp/plugin/authn/oidc/rp/impl/DefaultClaimSanitizationStrategyTest.java
@@ -60,5 +60,36 @@ public class DefaultClaimSanitizationStrategyTest {
         assertEquals(sanClaims.getClaim(JWTClaims.SUBJECT_CLAIM.getClaimName()),"joe");
         assertEquals(sanClaims.getClaim("given_name"),"Joe");
     }
+    
+    @Test
+    public void testNullValidationClaim() {
+        final DefaultClaimSanitizationStrategy strategy = new DefaultClaimSanitizationStrategy();
+        
+        final JWTClaimsSet idToken = new JWTClaimsSet.Builder()
+                     .subject("joe")
+                     .issuer("https://op.example.com")
+                     .audience(List.of("https://rp.example.com"))
+                     .issueTime(Date.from(Instant.now()))
+                     .expirationTime(Date.from(Instant.now().plus(Duration.ofSeconds(10))))
+                     .claim(IDTokenClaims.NONCE.getClaimName(), "noncevalue")
+                     // add a null claim here
+                     .claim("given_name", null)
+                     .claim("surname", "bloggs")
+                     .build();
+        
+        final ClaimsSet idTokenClaims = new ClaimsSet();
+        idTokenClaims.putAll(idToken.getClaims());
+        final ClaimsSet sanClaims = strategy.apply(idTokenClaims);
+        assertNull(sanClaims.getAudience());
+        assertNull(sanClaims.getIssuer());
+        assertNull(sanClaims.getClaim(IDTokenClaims.NONCE.getClaimName()));
+        assertNull(sanClaims.getClaim(JWTClaims.EXPIRATION_TIME_CLAIM.getClaimName()));
+        assertNull(sanClaims.getClaim(JWTClaims.ISSUED_AT_CLAIM.getClaimName()));
+        // check the null claim has been removed
+        assertNull(sanClaims.getClaim("given_name"));
+        // Check a non-null claim still exists
+        assertEquals(sanClaims.getClaim("surname"), "bloggs");
+
+    }
 
 }

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


More information about the commits mailing list