[java-opensaml] branch master updated: IDP-1229 - Add Scoping/RequesterID chains into various IdP features

Scott Cantor cantor.2 at osu.edu
Wed Oct 25 20:16:07 EDT 2017


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=c803a0878c7f8488b0d828254b3885f6da694b37

The following commit(s) were added to refs/heads/master by this push:
       new  c803a08   IDP-1229 -  Add Scoping/RequesterID chains into various IdP features
c803a08 is described below

commit c803a0878c7f8488b0d828254b3885f6da694b37
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Oct 25 20:15:57 2017 -0400

    IDP-1229 -  Add Scoping/RequesterID chains into various IdP features
    
    https://issues.shibboleth.net/jira/browse/IDP-1229
    
    Add context and message handler for proxied requesters.
---
 .../profile/context/ProxiedRequesterContext.java   | 57 +++++++++++++
 .../impl/ExtractProxiedRequestersHandler.java      | 88 ++++++++++++++++++++
 .../impl/ExtractProxiedRequestersHandlerTest.java  | 94 ++++++++++++++++++++++
 3 files changed, 239 insertions(+)

diff --git a/opensaml-profile-api/src/main/java/org/opensaml/profile/context/ProxiedRequesterContext.java b/opensaml-profile-api/src/main/java/org/opensaml/profile/context/ProxiedRequesterContext.java
new file mode 100644
index 0000000..ade61be
--- /dev/null
+++ b/opensaml-profile-api/src/main/java/org/opensaml/profile/context/ProxiedRequesterContext.java
@@ -0,0 +1,57 @@
+/*
+ * 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.profile.context;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.annotation.Nonnull;
+
+import org.opensaml.messaging.context.BaseContext;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.Live;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
+
+
+/**
+ * A context which expresses one or more requesters on whose behalf a request is being handled.
+ * 
+ * <p>An ordering of proxied requesters is not implied or guaranteed.</p>
+ * 
+ * @since 3.4.0
+ */
+public class ProxiedRequesterContext extends BaseContext {
+
+    /** The resource. */
+    @Nonnull @NonnullElements private Collection<String> requesters;
+
+    /** Constructor. */
+    public ProxiedRequesterContext() {
+        requesters = new ArrayList<>();
+    }
+    
+    /**
+     * Get the proxied requesters.
+     * 
+     * @return the proxied requesters
+     */
+    @Nonnull @NonnullElements @Live public Collection<String> getRequesters() {
+        return requesters;
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/impl/ExtractProxiedRequestersHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/impl/ExtractProxiedRequestersHandler.java
new file mode 100644
index 0000000..9b0f996
--- /dev/null
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/binding/impl/ExtractProxiedRequestersHandler.java
@@ -0,0 +1,88 @@
+/*
+ * 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.saml2.binding.impl;
+
+import javax.annotation.Nonnull;
+
+import net.shibboleth.utilities.java.support.logic.Constraint;
+
+import org.opensaml.messaging.context.MessageContext;
+import org.opensaml.messaging.context.navigate.ChildContextLookup;
+import org.opensaml.messaging.handler.AbstractMessageHandler;
+import org.opensaml.messaging.handler.MessageHandlerException;
+import org.opensaml.profile.context.ProxiedRequesterContext;
+import org.opensaml.saml.saml2.core.AuthnRequest;
+import org.opensaml.saml.saml2.core.RequesterID;
+import org.opensaml.saml.saml2.core.Scoping;
+
+import com.google.common.base.Function;
+
+/**
+ * MessageHandler to extract the proxied chain of requesters from an {@link AuthnRequest} message's
+ * {@link Scoping} element.
+ * 
+ * @since 3.4.0
+ */
+public class ExtractProxiedRequestersHandler extends AbstractMessageHandler {
+    
+    /** Strategy for creating {@link ProxiedRequesterContext}. */
+    @Nonnull private Function<MessageContext,ProxiedRequesterContext> proxiedContextCreationStrategy;
+
+    /** Constructor. */
+    public ExtractProxiedRequestersHandler() {
+        proxiedContextCreationStrategy = new ChildContextLookup<>(ProxiedRequesterContext.class, true);
+    }
+    
+    /**
+     * Set the strategy for creating {@link ProxiedRequesterContext}.
+     * 
+     * @param strategy  lookup strategy
+     */
+    public void setProxiedRequesterContextCreationStrategy(
+            @Nonnull final Function<MessageContext,ProxiedRequesterContext> strategy) {
+        proxiedContextCreationStrategy = Constraint.isNotNull(strategy,
+                "ProxiedRequesterContext creation strategy cannot be null");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected void doInvoke(@Nonnull final MessageContext messageContext) throws MessageHandlerException {
+
+        final Object request = messageContext.getMessage();
+        if (request == null) {
+            throw new MessageHandlerException("Message not found");
+        } else if (!(request instanceof AuthnRequest)) {
+            throw new MessageHandlerException("Message was not an AuthnRequest");
+        }
+        
+        final Scoping scoping = ((AuthnRequest) request).getScoping();
+        if (scoping != null && !scoping.getRequesterIDs().isEmpty()) {
+            final ProxiedRequesterContext proxyContext = proxiedContextCreationStrategy.apply(messageContext);
+            if (proxyContext == null) {
+                throw new MessageHandlerException("Failed to create/locate ProxiedRequesterContext");
+            }
+            
+            for (final RequesterID id : scoping.getRequesterIDs()) {
+                if (id != null && id.getRequesterID() != null) {
+                    proxyContext.getRequesters().add(id.getRequesterID());
+                }
+            }
+        }
+    }
+    
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/impl/ExtractProxiedRequestersHandlerTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/impl/ExtractProxiedRequestersHandlerTest.java
new file mode 100644
index 0000000..9030171
--- /dev/null
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/binding/impl/ExtractProxiedRequestersHandlerTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.saml2.binding.impl;
+
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+
+import java.util.Arrays;
+
+import org.opensaml.core.OpenSAMLInitBaseTestCase;
+import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.messaging.context.MessageContext;
+import org.opensaml.messaging.handler.MessageHandlerException;
+import org.opensaml.profile.context.ProxiedRequesterContext;
+import org.opensaml.saml.common.SAMLObjectBuilder;
+import org.opensaml.saml.saml2.core.AuthnRequest;
+import org.opensaml.saml.saml2.core.RequestAbstractType;
+import org.opensaml.saml.saml2.core.RequesterID;
+import org.opensaml.saml.saml2.core.Scoping;
+import org.opensaml.saml.saml2.profile.SAML2ActionTestingSupport;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/** {@link ExtractProxiedRequestersHandler} unit test. */
+public class ExtractProxiedRequestersHandlerTest extends OpenSAMLInitBaseTestCase {
+    
+    SAMLObjectBuilder<Scoping> scopingBuilder;
+    
+    SAMLObjectBuilder<RequesterID> requesterIDBuilder;
+    
+    @BeforeClass public void setUp() {
+        scopingBuilder = (SAMLObjectBuilder<Scoping>)
+                XMLObjectProviderRegistrySupport.getBuilderFactory().<Scoping>getBuilderOrThrow(
+                        Scoping.DEFAULT_ELEMENT_NAME);
+        requesterIDBuilder = (SAMLObjectBuilder<RequesterID>)
+                XMLObjectProviderRegistrySupport.getBuilderFactory().<RequesterID>getBuilderOrThrow(
+                        RequesterID.DEFAULT_ELEMENT_NAME);
+    }
+    
+    
+    /** Test that the handler errors on a missing request. */
+    @Test(expectedExceptions=MessageHandlerException.class)
+    public void testMissingRequest() throws MessageHandlerException, ComponentInitializationException {
+        final MessageContext<RequestAbstractType> messageCtx = new MessageContext<>();
+
+        final ExtractProxiedRequestersHandler handler = new ExtractProxiedRequestersHandler();
+        handler.initialize();
+        
+        handler.invoke(messageCtx);
+    }
+
+    /** Test that the handler works. */
+    @Test public void testSuccess() throws MessageHandlerException, ComponentInitializationException {
+        final MessageContext<AuthnRequest> messageCtx = new MessageContext<>();
+        messageCtx.setMessage(SAML2ActionTestingSupport.buildAuthnRequest());
+        
+        final Scoping scoping = scopingBuilder.buildObject();
+        final RequesterID one = requesterIDBuilder.buildObject();
+        one.setRequesterID("one");
+        final RequesterID two = requesterIDBuilder.buildObject();
+        two.setRequesterID("two");
+        scoping.getRequesterIDs().addAll(Arrays.asList(one, two));
+        
+        messageCtx.getMessage().setScoping(scoping);
+        
+        final ExtractProxiedRequestersHandler handler = new ExtractProxiedRequestersHandler();
+        handler.initialize();
+        
+        handler.invoke(messageCtx);
+        
+        final ProxiedRequesterContext ctx = messageCtx.getSubcontext(ProxiedRequesterContext.class);
+        Assert.assertNotNull(ctx);
+        Assert.assertEquals(ctx.getRequesters().size(), 2);
+        Assert.assertTrue(ctx.getRequesters().contains("one"));
+        Assert.assertTrue(ctx.getRequesters().contains("two"));
+        Assert.assertFalse(ctx.getRequesters().contains("foo"));
+    }
+    
+}
\ 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