[java-oidc-common] branch main updated: JCOMOIDC-96 - Support custom/additional metadata policy operators

Henri Mikkonen henri.mikkonen at iki.fi
Fri Feb 16 11:21:37 UTC 2024


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

hjmikkon pushed a commit to branch main
in repository java-oidc-common.

View the commit online:
http://git.shibboleth.net/view/?p=java-oidc-common.git;a=commit;h=0ab3166c1dda7b2839b0487f5fadee08a283ba5f

The following commit(s) were added to refs/heads/main by this push:
     new 0ab3166  JCOMOIDC-96 - Support custom/additional metadata policy operators
0ab3166 is described below

commit 0ab3166c1dda7b2839b0487f5fadee08a283ba5f
Author: Henri Mikkonen <henri.mikkonen at iki.fi>
AuthorDate: Fri Feb 16 13:20:59 2024 +0200

    JCOMOIDC-96 - Support custom/additional metadata policy operators
    
    https://shibboleth.atlassian.net/browse/JCOMOIDC-96
    
    Included custom operators to the merging helper method. They are treated in the same
    way as 'default', 'value' and 'regex' operators.
---
 .../oidc/metadata/policy/MetadataPolicy.java       |  3 +-
 .../metadata/policy/impl/MetadataPolicyHelper.java | 29 ++++++--
 .../policy/impl/MetadataPolicyHelperTest.java      | 81 +++++++++++++++++++++-
 3 files changed, 107 insertions(+), 6 deletions(-)

diff --git a/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/policy/MetadataPolicy.java b/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/policy/MetadataPolicy.java
index 55c39b4..eb34d7d 100644
--- a/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/policy/MetadataPolicy.java
+++ b/oidc-common-metadata-api/src/main/java/net/shibboleth/oidc/metadata/policy/MetadataPolicy.java
@@ -246,7 +246,8 @@ public class MetadataPolicy {
                 .add("subset_of", subsetOfValues)
                 .add("superset_of", supersetOfValues)
                 .add("essential", essential)
-                .add("regexp", regexp).toString();
+                .add("regexp", regexp)
+                .add("customOperators", customOperators).toString();
     }
 
     /**
diff --git a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyHelper.java b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyHelper.java
index 096ceda..72718fc 100644
--- a/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyHelper.java
+++ b/oidc-common-metadata-impl/src/main/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyHelper.java
@@ -16,8 +16,10 @@ package net.shibboleth.oidc.metadata.policy.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
@@ -94,7 +96,8 @@ public final class MetadataPolicyHelper {
      * </li>
      * </ul>
      * 
-     * <p>In addition to the list above, 'regex' operator is treated in the same way as 'value' and 'default'.</p>
+     * <p>In addition to the list above, 'regex' operator and all custom operators are treated in the same way as
+     * 'value' and 'default'.</p>
      * 
      * @param superior The superior metadata policy.
      * @param subordinate The subordinate metadata policy.
@@ -135,7 +138,21 @@ public final class MetadataPolicyHelper {
                     "Merging two regexp operators is NOT allowed unless the two operator values are equal.");
         }
 
-        return new MetadataPolicy.Builder()
+        for (final String customOperator : superior.getCustomOperators().keySet()) {
+            if (subordinate.getCustomOperators().containsKey(customOperator)) {
+                final Object superiorValue = superior.getCustomOperators().get(customOperator);
+                final Object subordinateValue = subordinate.getCustomOperators().get(customOperator);
+                if ((superiorValue != null && !superiorValue.equals(subordinateValue)) ||
+                        (superiorValue == null && subordinateValue != null)) {
+                    throw new ConstraintViolationException(
+                            "Merging two custom operators is not allowed unless the values are equal.");
+                }
+            }
+        }
+        final Map<String, Object> customOperators = new HashMap<>(superior.getCustomOperators());
+        customOperators.putAll(subordinate.getCustomOperators());
+
+        final MetadataPolicy.Builder builder = new MetadataPolicy.Builder()
                 .withSubsetOfValues(doMergeForTwoLists(superior.getSubsetOfValues(),
                         subordinate.getSubsetOfValues(), false))
                 .withOneOfValues(doMergeForTwoLists(superior.getOneOfValues(), subordinate.getOneOfValues(), false))
@@ -145,8 +162,12 @@ public final class MetadataPolicyHelper {
                 .withValue(value != null ? value : subordinate.getValue())
                 .withDefaultValue(defaultValue != null ? defaultValue : subordinate.getDefaultValue())
                 .withEssential(superior.isEssential() ? Boolean.TRUE : subordinate.getEssential())
-                .withRegexp(regexp)
-                .build();
+                .withRegexp(regexp);
+
+        for (final String customOperator : customOperators.keySet()) {
+            builder.withCustomOperator(customOperator, customOperators.get(customOperator));
+        }
+        return builder.build();
     }
  // Checkstyle: CyclomaticComplexity ON
     /**
diff --git a/oidc-common-metadata-impl/src/test/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyHelperTest.java b/oidc-common-metadata-impl/src/test/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyHelperTest.java
index b0633b9..35115dc 100644
--- a/oidc-common-metadata-impl/src/test/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyHelperTest.java
+++ b/oidc-common-metadata-impl/src/test/java/net/shibboleth/oidc/metadata/policy/impl/MetadataPolicyHelperTest.java
@@ -590,7 +590,85 @@ public class MetadataPolicyHelperTest {
         assert merged != null;
         Assert.assertTrue(merged.isEssential());
     }
-    
+
+    @Test
+    public void mergeMetadataPolicies_bothSameCustomOperator_shouldReturnSame() {
+        final MetadataPolicy superior = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", "singleValue1")
+                .build();
+        final MetadataPolicy subordinate = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", "singleValue1")
+                .build();
+        final MetadataPolicy merged = MetadataPolicyHelper.mergeMetadataPolicies(superior, subordinate);
+        assert merged != null;
+        Assert.assertEquals(merged.getCustomOperators().get("operator"), "singleValue1");
+    }
+
+    @Test
+    public void mergeMetadataPolicies_twoDifferentCustomOperator_shouldReturnUnion() {
+        final MetadataPolicy superior = new MetadataPolicy.Builder()
+                .withCustomOperator("operator1", "singleValue1")
+                .build();
+        final MetadataPolicy subordinate = new MetadataPolicy.Builder()
+                .withCustomOperator("operator2", "singleValue2")
+                .build();
+        final MetadataPolicy merged = MetadataPolicyHelper.mergeMetadataPolicies(superior, subordinate);
+        assert merged != null;
+        Assert.assertEquals(merged.getCustomOperators().get("operator1"), "singleValue1");
+        Assert.assertEquals(merged.getCustomOperators().get("operator2"), "singleValue2");
+    }
+
+    @Test(expectedExceptions = { ConstraintViolationException.class })
+    public void mergeMetadataPolicies_bothDifferentCustomOperator_shouldThrow() {
+        final MetadataPolicy superior = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", "singleValue1")
+                .build();
+        final MetadataPolicy subordinate = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", "singleValue2")
+                .build();
+        MetadataPolicyHelper.mergeMetadataPolicies(superior, subordinate);
+    }
+
+    @Test(expectedExceptions = { ConstraintViolationException.class })
+    public void mergeMetadataPolicies_bothDifferentCustomOperatorListValue_shouldThrow() {
+        final MetadataPolicy superior = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", List.of("singleValue1"))
+                .build();
+        final MetadataPolicy subordinate = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", List.of("singleValue2"))
+                .build();
+        MetadataPolicyHelper.mergeMetadataPolicies(superior, subordinate);
+    }
+
+    @Test(expectedExceptions = { ConstraintViolationException.class })
+    public void mergeMetadataPolicies_bothDifferentCustomOperatorValueType_shouldThrow() {
+        final MetadataPolicy superior = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", List.of("singleValue1"))
+                .build();
+        final MetadataPolicy subordinate = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", "singleValue1")
+                .build();
+        MetadataPolicyHelper.mergeMetadataPolicies(superior, subordinate);
+    }
+
+    @Test
+    public void mergeMetadataPolicies_subordinateEmptyCustomOperators_shouldReturnSuperior() {
+        final MetadataPolicy superior = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", "mockValue")
+                .build();
+        final MetadataPolicy merged = MetadataPolicyHelper.mergeMetadataPolicies(superior, new MetadataPolicy());
+        assertEquals(merged, superior);
+    }
+
+    @Test
+    public void mergeMetadataPolicies_superiorEmptyCustomOperators_shouldReturnSubordinate() {
+        final MetadataPolicy subordinate = new MetadataPolicy.Builder()
+                .withCustomOperator("operator", "mockValue")
+                .build();
+        final MetadataPolicy merged = MetadataPolicyHelper.mergeMetadataPolicies(new MetadataPolicy(), subordinate);
+        assertEquals(merged, subordinate);
+    }
+
     protected void assertEquals(final MetadataPolicy actual, final MetadataPolicy expected) {
         Assert.assertNotNull(actual);
         Assert.assertNotNull(expected);
@@ -602,5 +680,6 @@ public class MetadataPolicyHelperTest {
         Assert.assertEquals(actual.getSupersetOfValues(), expected.getSupersetOfValues());
         Assert.assertEquals(actual.getRegexp(), expected.getRegexp());
         Assert.assertEquals(actual.isEssential(), expected.isEssential());
+        Assert.assertEquals(actual.getCustomOperators(), expected.getCustomOperators());
     }
 }
\ No newline at end of file

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


More information about the commits mailing list