[java-opensaml] branch main updated: OSJ-363 - Add activationCondition support to MetadataResolvers

Scott Cantor cantor.2 at osu.edu
Wed Oct 19 16:23:38 UTC 2022


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

scantor pushed a commit to branch main
in repository java-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=5ae72825dff2f4714c32d9bcd3b49701142a44ea

The following commit(s) were added to refs/heads/main by this push:
     new 5ae72825d OSJ-363 - Add activationCondition support to MetadataResolvers
5ae72825d is described below

commit 5ae72825dff2f4714c32d9bcd3b49701142a44ea
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Oct 19 12:23:36 2022 -0400

    OSJ-363 - Add activationCondition support to MetadataResolvers
    
    https://shibboleth.atlassian.net/browse/OSJ-363
---
 .../resolver/ChainingMetadataResolver.java         | 34 ++++++++++++++++++++++
 .../impl/ChainingMetadataResolverTest.java         | 21 ++++++++++---
 2 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/ChainingMetadataResolver.java b/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/ChainingMetadataResolver.java
index fdcd7d496..f064edb60 100644
--- a/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/ChainingMetadataResolver.java
+++ b/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/ChainingMetadataResolver.java
@@ -23,12 +23,15 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.opensaml.profile.criterion.ProfileRequestContextCriterion;
 import org.opensaml.saml.metadata.criteria.entity.DetectDuplicateEntityIDsCriterion;
 import org.opensaml.saml.metadata.resolver.filter.MetadataFilter;
 import org.opensaml.saml.saml2.metadata.EntityDescriptor;
@@ -61,6 +64,9 @@ public class ChainingMetadataResolver extends AbstractIdentifiableInitializableC
     /** Strategy for detecting duplicate entityIDs across resolvers. */
     @Nonnull private DetectDuplicateEntityIDs detectDuplicateEntityIDs;
 
+    /** Activation condition. */
+    @Nullable private Predicate<ProfileRequestContext> activationCondition;
+    
     /** Constructor. */
     public ChainingMetadataResolver() {
         resolvers = Collections.emptyList();
@@ -110,6 +116,7 @@ public class ChainingMetadataResolver extends AbstractIdentifiableInitializableC
      * @param strategy the strategy to configure
      */
     public void setDetectDuplicateEntityIDs(@Nullable final DetectDuplicateEntityIDs strategy) {
+        checkSetterPreconditions();
         detectDuplicateEntityIDs = strategy != null ? strategy : DetectDuplicateEntityIDs.Off;
     }
 
@@ -135,6 +142,25 @@ public class ChainingMetadataResolver extends AbstractIdentifiableInitializableC
         throw new UnsupportedOperationException("Metadata filters are not supported on ChainingMetadataResolver");
     }
 
+    /**
+     * Get an activation condition for this resolver.
+     * 
+     * @return activation condition
+     */
+    @Nullable public Predicate<ProfileRequestContext> getActivationCondition() {
+        return activationCondition;
+    }
+    
+    /**
+     * Set an activation condition for this resolver.
+     * 
+     * @param condition condition to set
+     */
+    public void setActivationCondition(@Nullable final Predicate<ProfileRequestContext> condition) {
+        checkSetterPreconditions();
+        activationCondition = condition;
+    }
+    
     /** {@inheritDoc} */
     @Override
     @Nullable public EntityDescriptor resolveSingle(@Nullable final CriteriaSet criteria) throws ResolverException {
@@ -155,6 +181,14 @@ public class ChainingMetadataResolver extends AbstractIdentifiableInitializableC
     @Nonnull public Iterable<EntityDescriptor> resolve(@Nullable final CriteriaSet criteria) throws ResolverException {
         checkComponentActive();
 
+        if (activationCondition != null) {
+            final ProfileRequestContextCriterion prc = criteria.get(ProfileRequestContextCriterion.class);
+            if (!activationCondition.test(prc != null ? prc.getProfileRequestContext() : null)) {
+                log.info("Metadata Resolver {}: Bypassed due to failed activation condition", getId());
+                return null;
+            }
+        }
+        
         DetectDuplicateEntityIDs detectDuplicates = getDetectDuplicateEntityIDs();
         if (criteria.contains(DetectDuplicateEntityIDsCriterion.class)) {
             detectDuplicates = criteria.get(DetectDuplicateEntityIDsCriterion.class).getValue();
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/ChainingMetadataResolverTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/ChainingMetadataResolverTest.java
index 2acfc070a..c34f43f5e 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/ChainingMetadataResolverTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/ChainingMetadataResolverTest.java
@@ -33,8 +33,10 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Predicates;
+
+import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.resolver.CriteriaSet;
-import net.shibboleth.shared.resolver.ResolverException;
 
 public class ChainingMetadataResolverTest extends XMLObjectBaseTestCase {
 
@@ -76,12 +78,21 @@ public class ChainingMetadataResolverTest extends XMLObjectBaseTestCase {
         
         metadataProvider.setResolvers(resolvers);
         metadataProvider.setId("test");
-
+    }
+    
+    @Test()
+    public void testInactive() throws Exception {
+        metadataProvider.setActivationCondition(Predicates.alwaysFalse());
         metadataProvider.initialize();
+        
+        EntityDescriptor descriptor = metadataProvider.resolveSingle(new CriteriaSet(new EntityIdCriterion(entityID)));
+        Assert.assertNull(descriptor, "Retrieved entity descriptor was not null");
     }
 
     @Test()
-    public void testGetEntityDescriptor() throws ResolverException {
+    public void testGetEntityDescriptor() throws Exception {
+        metadataProvider.initialize();
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(new CriteriaSet(new EntityIdCriterion(entityID)));
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -92,7 +103,9 @@ public class ChainingMetadataResolverTest extends XMLObjectBaseTestCase {
     }
 
     @Test()
-    public void testFilterDisallowed() {
+    public void testFilterDisallowed() throws ComponentInitializationException {
+        metadataProvider.initialize();
+
         try {
             metadataProvider.setMetadataFilter(new SchemaValidationFilter(new SAMLSchemaBuilder(SAML1Version.SAML_11)));
             Assert.fail("Should fail with an UnsupportedOperationException");

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


More information about the commits mailing list