[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