[java-opensaml] branch master updated: Move ByReference filter out of IdP.

Scott Cantor cantor.2 at osu.edu
Tue Oct 22 09:03:02 EDT 2019


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

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

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

The following commit(s) were added to refs/heads/master by this push:
       new  5f1196e   Move ByReference filter out of IdP.
5f1196e is described below

commit 5f1196e6862d989598cda0a3e4cdaa4abeb972cd
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Oct 22 09:02:55 2019 -0400

    Move ByReference filter out of IdP.
---
 .../filter/impl/ByReferenceMetadataFilter.java     |  98 +++++++++++++++++
 .../filter/impl/ByReferenceMetadataFilterTest.java | 121 +++++++++++++++++++++
 2 files changed, 219 insertions(+)

diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/filter/impl/ByReferenceMetadataFilter.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/filter/impl/ByReferenceMetadataFilter.java
new file mode 100644
index 0000000..2dbaa59
--- /dev/null
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/filter/impl/ByReferenceMetadataFilter.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.saml.metadata.resolver.filter.impl;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.saml.metadata.resolver.filter.FilterException;
+import org.opensaml.saml.metadata.resolver.filter.MetadataFilter;
+import org.opensaml.saml.metadata.resolver.filter.MetadataFilterContext;
+import org.opensaml.saml.metadata.resolver.filter.data.impl.MetadataSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
+
+/**
+ * A {@link MetadataFilter} that associates other filters with specific
+ * {@link MetadataResolver} instances by ID.
+ * 
+ * <p>The {@link MetadataFilterContext} is used to identify which resolver is actually
+ * running, to properly identify which filters to apply.</p>
+ * 
+ * @since 4.0.0
+ */
+public class ByReferenceMetadataFilter implements MetadataFilter {
+
+    /** Class logger. */
+    @Nonnull private Logger log = LoggerFactory.getLogger(ByReferenceMetadataFilter.class);
+    
+    /** Map of resolver names to filters. */
+    @Nonnull @NonnullElements private Map<String,MetadataFilter> filterMap;
+    
+    /** Constructor. */
+    public ByReferenceMetadataFilter() {
+        filterMap = Collections.emptyMap();
+    }
+    
+    /**
+     * Mapping of resolver names to filters to run.
+     * 
+     * @param map filter mappings
+     */
+    public void setFilterMappings(@Nonnull @NonnullElements final Map<String,MetadataFilter> map) {
+        Constraint.isNotNull(map, "Filter mappings cannot be null");
+        
+        filterMap = new HashMap<>(map.size());
+        for (final Map.Entry<String,MetadataFilter> entry : map.entrySet()) {
+            final String trimmed = StringSupport.trimOrNull(entry.getKey());
+            if (trimmed != null && entry.getValue() != null) {
+                filterMap.put(trimmed, entry.getValue());
+            }
+        }
+    }
+    
+    /** {@inheritDoc} */
+    public XMLObject filter(@Nullable final XMLObject metadata, @Nonnull final MetadataFilterContext context)
+            throws FilterException {
+        
+        final MetadataSource source = context.get(MetadataSource.class);
+        if (source == null || source.getSourceId() == null) {
+            log.debug("No metadata source ID found in MetadataFilterContext");
+            return metadata;
+        }
+        
+        final MetadataFilter filter = filterMap.get(source.getSourceId());
+        if (filter == null) {
+            log.debug("No filters defined for resolver '{}', by-reference filter inactive", source.getSourceId());
+            return metadata;
+        }
+        
+        log.debug("Applying by-reference filter to metadata resolver '{}'", source.getSourceId());
+        return filter.filter(metadata, context);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/filter/impl/ByReferenceMetadataFilterTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/filter/impl/ByReferenceMetadataFilterTest.java
new file mode 100644
index 0000000..f257b7c
--- /dev/null
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/filter/impl/ByReferenceMetadataFilterTest.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.saml.metadata.resolver.filter.impl;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.function.Predicate;
+
+import org.opensaml.core.criterion.EntityIdCriterion;
+import org.opensaml.core.xml.XMLObjectBaseTestCase;
+import org.opensaml.saml.common.xml.SAMLConstants;
+import org.opensaml.saml.metadata.resolver.MetadataResolver;
+import org.opensaml.saml.metadata.resolver.filter.impl.ByReferenceMetadataFilter;
+import org.opensaml.saml.metadata.resolver.filter.impl.NameIDFormatFilter;
+import org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver;
+import org.opensaml.saml.saml2.core.NameIDType;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+/** Unit test for {@link ByReferenceMetadataFilter}. */
+public class ByReferenceMetadataFilterTest extends XMLObjectBaseTestCase implements Predicate<EntityDescriptor> {
+    
+    protected MetadataResolver resolver;
+    
+    private FilesystemMetadataResolver metadataProvider;
+    
+    private ByReferenceMetadataFilter refFilter;
+    
+    private NameIDFormatFilter nameIDFilter;
+    
+    private Collection<String> formats;
+    
+    @BeforeMethod
+    protected void setUp() throws URISyntaxException, ResolverException {
+
+        final URL mdURL = ByReferenceMetadataFilterTest.class
+                .getResource("/org/opensaml/saml/saml2/metadata/InCommon-metadata.xml");
+        final File mdFile = new File(mdURL.toURI());
+
+        metadataProvider = new FilesystemMetadataResolver(mdFile);
+        metadataProvider.setParserPool(parserPool);
+        metadataProvider.setId("ICMD");
+
+        refFilter = new ByReferenceMetadataFilter();
+        metadataProvider.setMetadataFilter(refFilter);
+        
+        nameIDFilter = new NameIDFormatFilter();
+        formats = Arrays.asList(NameIDType.EMAIL, NameIDType.KERBEROS);
+    }
+    
+    @Test
+    public void notApplicable() throws ComponentInitializationException, ResolverException {
+        
+        nameIDFilter.setRules(Collections.<Predicate<EntityDescriptor>,Collection<String>>singletonMap(this, formats));
+        nameIDFilter.initialize();
+        
+        refFilter.setFilterMappings(Collections.singletonMap("Foo", nameIDFilter));
+        
+        metadataProvider.initialize();
+        
+        validate(false);
+    }
+
+    @Test
+    public void applicable() throws ComponentInitializationException, ResolverException {
+        
+        nameIDFilter.setRules(Collections.<Predicate<EntityDescriptor>,Collection<String>>singletonMap(this, formats));
+        nameIDFilter.initialize();
+        
+        refFilter.setFilterMappings(Collections.singletonMap("ICMD", nameIDFilter));
+        
+        metadataProvider.initialize();
+        
+        validate(true);
+    }
+
+    /**
+     * Validate whether the filter was or wasn't applied.
+     */
+    private void validate(final boolean applied) throws ResolverException {
+        EntityIdCriterion key = new EntityIdCriterion("https://carmenwiki.osu.edu/shibboleth");
+        EntityDescriptor entity = metadataProvider.resolveSingle(new CriteriaSet(key));
+        Assert.assertNotNull(entity);
+        Assert.assertEquals(entity.getSPSSODescriptor(SAMLConstants.SAML20P_NS).getNameIDFormats().size(), applied ? 3 : 1);
+        
+        key = new EntityIdCriterion("https://cms.psu.edu/Shibboleth");
+        entity = metadataProvider.resolveSingle(new CriteriaSet(key));
+        Assert.assertNotNull(entity);
+        Assert.assertEquals(entity.getSPSSODescriptor(SAMLConstants.SAML11P_NS).getNameIDFormats().size(), 1);
+    }
+    
+    /** {@inheritDoc} */
+    public boolean test(EntityDescriptor input) {
+        return input.getEntityID().equals("https://carmenwiki.osu.edu/shibboleth");
+    }
+}

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


More information about the commits mailing list