[java-identity-provider] 02/02: IDP-1902 - Support alternative RP lookup in RP config resolver

Scott Cantor cantor.2 at osu.edu
Wed Feb 9 21:40:00 UTC 2022


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

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

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=63890e0dabf8c564ae4e1c41540f48914583eeb8

commit 63890e0dabf8c564ae4e1c41540f48914583eeb8
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Feb 9 16:39:54 2022 -0500

    IDP-1902 - Support alternative RP lookup in RP config resolver
    
    https://shibboleth.atlassian.net/browse/IDP-1902
    
    Rework original profile action to support criteria-based resolver.
---
 .../impl/SelectRelyingPartyConfiguration.java      | 41 ++++++++++++++++++++--
 1 file changed, 38 insertions(+), 3 deletions(-)

diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectRelyingPartyConfiguration.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectRelyingPartyConfiguration.java
index 5f49309ac..2c8f2fcee 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectRelyingPartyConfiguration.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/SelectRelyingPartyConfiguration.java
@@ -24,18 +24,23 @@ import javax.annotation.Nullable;
 
 import org.opensaml.profile.action.ActionSupport;
 import org.opensaml.profile.context.ProfileRequestContext;
+import org.opensaml.profile.criterion.ProfileRequestContextCriterion;
 
 import net.shibboleth.idp.profile.AbstractProfileAction;
 import net.shibboleth.idp.profile.IdPEventIds;
 import net.shibboleth.idp.profile.context.RelyingPartyContext;
+import net.shibboleth.idp.relyingparty.CriteriaRelyingPartyConfigurationResolver;
 import net.shibboleth.idp.relyingparty.RelyingPartyConfiguration;
 import net.shibboleth.idp.relyingparty.RelyingPartyConfigurationResolver;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
+import net.shibboleth.utilities.java.support.resolver.Resolver;
 import net.shibboleth.utilities.java.support.resolver.ResolverException;
 
+import org.opensaml.messaging.context.BaseContext;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,6 +49,8 @@ import org.slf4j.LoggerFactory;
  * This action attempts to resolve a {@link RelyingPartyConfiguration} and adds it to the {@link RelyingPartyContext}
  * that was looked up.
  * 
+ * <p>Both the original and the later-added criteria-driven resolvers are supported.</p>
+ * 
  * @event {@link org.opensaml.profile.action.EventIds#PROCEED_EVENT_ID}
  * @event {@link IdPEventIds#INVALID_RELYING_PARTY_CTX}
  * @event {@link IdPEventIds#INVALID_RELYING_PARTY_CONFIG}
@@ -57,7 +64,7 @@ public final class SelectRelyingPartyConfiguration extends AbstractProfileAction
     @Nonnull private final Logger log = LoggerFactory.getLogger(SelectRelyingPartyConfiguration.class);
 
     /** Resolver used to look up relying party configurations. */
-    @NonnullAfterInit private RelyingPartyConfigurationResolver rpConfigResolver;
+    @NonnullAfterInit private Resolver<RelyingPartyConfiguration,?> rpConfigResolver;
 
     /**
      * Strategy used to locate the {@link RelyingPartyContext} associated with a given {@link ProfileRequestContext}.
@@ -77,7 +84,7 @@ public final class SelectRelyingPartyConfiguration extends AbstractProfileAction
      * 
      * @param resolver  the resolver to use
      */
-    public void setRelyingPartyConfigurationResolver(@Nonnull final RelyingPartyConfigurationResolver resolver) {
+    public void setRelyingPartyConfigurationResolver(@Nonnull final Resolver<RelyingPartyConfiguration,?> resolver) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         
         rpConfigResolver = Constraint.isNotNull(resolver, "Relying party configuration resolver cannot be null");
@@ -130,7 +137,34 @@ public final class SelectRelyingPartyConfiguration extends AbstractProfileAction
     public void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
 
         try {
-            final RelyingPartyConfiguration config = rpConfigResolver.resolveSingle(profileRequestContext);
+            final RelyingPartyConfiguration config;
+            if (rpConfigResolver instanceof RelyingPartyConfigurationResolver) {
+                // Old style.
+                config = ((RelyingPartyConfigurationResolver) rpConfigResolver).resolveSingle(profileRequestContext);
+            } else if (rpConfigResolver instanceof CriteriaRelyingPartyConfigurationResolver) {
+                // New style.
+                final CriteriaSet criteria = new CriteriaSet();
+                if (relyingPartyCtx.getParent() == profileRequestContext) {
+                    // Works as is.
+                    criteria.add(new ProfileRequestContextCriterion(profileRequestContext));
+                    config = ((CriteriaRelyingPartyConfigurationResolver) rpConfigResolver).resolveSingle(criteria);
+                } else {
+                    // Temporarily re-root for compatibility.
+                    final ProfileRequestContext newPRC = new ProfileRequestContext();
+                    final BaseContext originalParent = relyingPartyCtx.getParent();
+                    newPRC.addSubcontext(relyingPartyCtx);
+                    criteria.add(new ProfileRequestContextCriterion(newPRC));
+                    config = ((CriteriaRelyingPartyConfigurationResolver) rpConfigResolver).resolveSingle(criteria);
+                    if (originalParent != null) {
+                        originalParent.addSubcontext(relyingPartyCtx);
+                    }
+                }
+            } else {
+                log.error("{} Unsupported resolver type: {}", getLogPrefix(), rpConfigResolver.getClass().getName());
+                ActionSupport.buildEvent(profileRequestContext, IdPEventIds.INVALID_RELYING_PARTY_CONFIG);
+                return;
+            }
+            
             if (config == null) {
                 log.debug("{} No relying party configuration applies to this request", getLogPrefix());
                 ActionSupport.buildEvent(profileRequestContext, IdPEventIds.INVALID_RELYING_PARTY_CONFIG);
@@ -144,4 +178,5 @@ public final class SelectRelyingPartyConfiguration extends AbstractProfileAction
             ActionSupport.buildEvent(profileRequestContext, IdPEventIds.INVALID_RELYING_PARTY_CONFIG);
         }
     }
+    
 }
\ 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