[java-shib-attribute] branch main updated: Update scripted extension APIs and add unit tests.

Scott Cantor cantor.2 at osu.edu
Thu Jun 23 13:55:51 UTC 2022


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

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

View the commit online:
http://git.shibboleth.net/view/?p=java-shib-attribute.git;a=commit;h=4040d79db36dddc4f731edfcac70e7325d56067d

The following commit(s) were added to refs/heads/main by this push:
     new 4040d79db Update scripted extension APIs and add unit tests.
4040d79db is described below

commit 4040d79db36dddc4f731edfcac70e7325d56067d
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Jun 23 09:55:48 2022 -0400

    Update scripted extension APIs and add unit tests.
---
 .../filter/FilterScriptContextExtender.java        | 29 ++++++++++
 .../filter/matcher/impl/ScriptedMatcher.java       | 35 +++++++++++--
 .../filter/policyrule/impl/ScriptedPolicyRule.java | 33 ++++++++++++
 .../spring/basic/impl/ScriptedMatcherParser.java   |  2 +
 .../filter/spring/basic/ScriptedTest.java          | 12 ++---
 .../spring/testing/MockScriptContextExtender.java  | 45 ++++++++++++++++
 .../idp/attribute/filter/matcher/customBean.xml    |  8 ++-
 .../attribute/filter/matcher/scripted-rhino.xml    |  4 +-
 .../idp/attribute/filter/matcher/scripted.xml      |  5 +-
 .../idp/attribute/filter/policyrule/file.script    |  2 +-
 .../attribute/filter/policyrule/file.script.rhino  |  2 +-
 .../scripted/ResolverScriptContextExtender.java    | 29 ++++++++++
 .../ad/impl/ScriptedAttributeDefinition.java       |  7 +--
 .../resolver/dc/impl/ScriptedDataConnector.java    | 36 +++++++------
 ...arser.java => ScriptedDataConnectorParser.java} |  7 +--
 .../impl/AttributeResolverNamespaceHandler.java    |  4 +-
 .../dc/impl/ScriptDataConnectorParserTest.java     |  8 +--
 .../spring/testing/MockScriptContextExtender.java  | 45 ++++++++++++++++
 .../idp/attribute/resolver/filter/resolver.xml     | 33 ------------
 .../idp/attribute/resolver/filter/service.xml      | 61 ----------------------
 .../attribute/resolver/filter/withAttributes.xml   | 26 ---------
 .../idp/attribute/resolver/spring/customBean.xml   |  2 +
 .../resolver/spring/dc/scriptedConnector.8.js      |  5 ++
 23 files changed, 277 insertions(+), 163 deletions(-)

diff --git a/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/FilterScriptContextExtender.java b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/FilterScriptContextExtender.java
new file mode 100644
index 000000000..357f8497a
--- /dev/null
+++ b/shib-attribute-filter-api/src/main/java/net/shibboleth/idp/attribute/filter/FilterScriptContextExtender.java
@@ -0,0 +1,29 @@
+/*
+ * 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 net.shibboleth.idp.attribute.filter;
+
+import net.shibboleth.utilities.java.support.scripting.ScriptContextExtender;
+
+/**
+ * Marker interface for an extender of filter engine scripting.
+ * 
+ * @since 5.0.0
+ */
+public interface FilterScriptContextExtender extends ScriptContextExtender {
+
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
index 4d0c1ccf9..b434e24e9 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/matcher/impl/ScriptedMatcher.java
@@ -17,11 +17,12 @@
 
 package net.shibboleth.idp.attribute.filter.matcher.impl;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
-import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -30,6 +31,7 @@ import javax.script.ScriptContext;
 
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
+import net.shibboleth.idp.attribute.filter.FilterScriptContextExtender;
 import net.shibboleth.idp.attribute.filter.Matcher;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
@@ -66,11 +68,16 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
     /** Evaluator. */
     @NonnullAfterInit private MatcherScriptEvaluator scriptEvaluator;
 
+    /** Extenders for script context. */
+    @Nonnull @NonnullElements private Collection<FilterScriptContextExtender> contextExtenders;
+
     /** Custom object for script. */
     @Nullable private Object customObject;
-    
-    /** Strategy used to locate the {@link ProfileRequestContext} to use. */
-    @Nonnull private Function<AttributeFilterContext,ProfileRequestContext> prcLookupStrategy;
+
+    /** Constructor. */
+    public ScriptedMatcher() {
+        contextExtenders = Collections.emptyList();
+    }
 
     /**
      * Return the custom (externally provided) object.
@@ -114,6 +121,25 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
         script = Constraint.isNotNull(matcherScript, "Attribute value matching script cannot be null");
     }
 
+    /**
+     * Set any script context extenders to apply.
+     * 
+     * @param extenders script extenders
+     * 
+     * @since 5.0.0
+     */
+    @Nullable public void setScriptContextExtenders(
+            @Nullable @NonnullElements final Collection<FilterScriptContextExtender> extenders) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+
+        if (extenders != null) {
+            contextExtenders = List.copyOf(extenders);
+        } else {
+            contextExtenders = Collections.emptyList();
+        }
+    }
+    
     /** {@inheritDoc} */
     @Override
     protected void doInitialize() throws ComponentInitializationException {
@@ -125,6 +151,7 @@ public class ScriptedMatcher extends AbstractIdentifiableInitializableComponent
         
         scriptEvaluator = new MatcherScriptEvaluator(script);
         scriptEvaluator.setCustomObject(customObject);
+        scriptEvaluator.setContextExtenders(contextExtenders);
         
         final StringBuilder builder = new StringBuilder("Scripted Attribute Filter '").append(getId()).append("':");
         scriptEvaluator.setLogPrefix(builder.toString());
diff --git a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
index 87a0c8cfc..0766c64ce 100644
--- a/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
+++ b/shib-attribute-filter-impl/src/main/java/net/shibboleth/idp/attribute/filter/policyrule/impl/ScriptedPolicyRule.java
@@ -17,6 +17,9 @@
 
 package net.shibboleth.idp.attribute.filter.policyrule.impl;
 
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import java.util.Objects;
 
 import javax.annotation.Nonnull;
@@ -24,9 +27,11 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 import javax.script.ScriptContext;
 
+import net.shibboleth.idp.attribute.filter.FilterScriptContextExtender;
 import net.shibboleth.idp.attribute.filter.PolicyRequirementRule;
 import net.shibboleth.idp.attribute.filter.context.AttributeFilterContext;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.component.AbstractIdentifiableInitializableComponent;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
@@ -59,9 +64,17 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
     /** Evaluator. */
     @NonnullAfterInit private PolicyRuleScriptEvaluator scriptEvaluator;
 
+    /** Extenders for script context. */
+    @Nonnull @NonnullElements private Collection<FilterScriptContextExtender> contextExtenders;
+
     /** The custom object we inject into all scripts. */
     @Nullable private Object customObject;
 
+    /** Constructor. */
+    public ScriptedPolicyRule() {
+        contextExtenders = Collections.emptyList();
+    }
+    
     /**
      * Return the custom (externally provided) object.
      * 
@@ -104,6 +117,25 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
         script = Constraint.isNotNull(matcherScript, "Attribute value matching script can not be null");
     }
 
+    /**
+     * Set any script context extenders to apply.
+     * 
+     * @param extenders script extenders
+     * 
+     * @since 5.0.0
+     */
+    @Nullable public void setScriptContextExtenders(
+            @Nullable @NonnullElements final Collection<FilterScriptContextExtender> extenders) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+
+        if (extenders != null) {
+            contextExtenders = List.copyOf(extenders);
+        } else {
+            contextExtenders = Collections.emptyList();
+        }
+    }
+    
     /**
      * Calculate the PolicyRule.
      * <p>
@@ -141,6 +173,7 @@ public class ScriptedPolicyRule extends AbstractIdentifiableInitializableCompone
 
         scriptEvaluator = new PolicyRuleScriptEvaluator(script);
         scriptEvaluator.setCustomObject(customObject);
+        scriptEvaluator.setContextExtenders(contextExtenders);
         
         final StringBuilder builder = new StringBuilder("Scripted Attribute Filter '").append(getId()).append("':");
         scriptEvaluator.setLogPrefix(builder.toString());
diff --git a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/basic/impl/ScriptedMatcherParser.java b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/basic/impl/ScriptedMatcherParser.java
index 50625d130..5e5e993f0 100644
--- a/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/basic/impl/ScriptedMatcherParser.java
+++ b/shib-attribute-filter-spring/src/main/java/net/shibboleth/idp/attribute/filter/spring/basic/impl/ScriptedMatcherParser.java
@@ -68,6 +68,8 @@ public class ScriptedMatcherParser extends BaseFilterParser {
     @Override protected void doParse(@Nonnull final Element config, @Nonnull final ParserContext parserContext,
             @Nonnull final BeanDefinitionBuilder builder) {
         super.doParse(config, parserContext, builder);
+        
+        builder.addAutowiredProperty("scriptContextExtenders");
 
         final String myId = builder.getBeanDefinition().getAttribute(BaseFilterParser.QUALIFIED_ID).toString();
         final String logPrefix = new StringBuilder("Scipted Filter '").append(myId).append("' :").toString();
diff --git a/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/basic/ScriptedTest.java b/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/basic/ScriptedTest.java
index 27969d5ef..5e0e8c3ed 100644
--- a/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/basic/ScriptedTest.java
+++ b/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/basic/ScriptedTest.java
@@ -60,7 +60,7 @@ public class ScriptedTest extends BaseAttributeFilterParserTest {
     @Test public void policy() throws ComponentInitializationException {
         final ScriptedPolicyRule rule = (ScriptedPolicyRule) getPolicyRule(NASHORN_SCRIPT);
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
         filterContext.setPrefilteredIdPAttributes(epaUid.values());
         assertEquals(rule.matches(filterContext), Tristate.FALSE);
     }
@@ -68,7 +68,7 @@ public class ScriptedTest extends BaseAttributeFilterParserTest {
     @Test public void policyRhino() throws ComponentInitializationException {
         final ScriptedPolicyRule rule = (ScriptedPolicyRule) getPolicyRule(RHINO_SCRIPT);
 
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
         filterContext.setPrefilteredIdPAttributes(epaUid.values());
         assertEquals(rule.matches(filterContext), Tristate.FALSE);
     }
@@ -82,7 +82,7 @@ public class ScriptedTest extends BaseAttributeFilterParserTest {
     @Test public void matcher()  throws ComponentInitializationException {
         final ScriptedMatcher matcher = (ScriptedMatcher) getMatcher(NASHORN_SCRIPT);
         
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
         filterContext.setPrefilteredIdPAttributes(epaUid.values());
         Set<IdPAttributeValue> x = matcher.getMatchingValues(epaUid.get("uid"), filterContext);
         assertEquals(x.size(), 1);
@@ -93,7 +93,7 @@ public class ScriptedTest extends BaseAttributeFilterParserTest {
     @Test public void matcherRhino()  throws ComponentInitializationException {
         final ScriptedMatcher matcher = (ScriptedMatcher) getMatcher(RHINO_SCRIPT);
         
-        AttributeFilterContext filterContext = new AttributeFilterContext();
+        final AttributeFilterContext filterContext = new AttributeFilterContext();
         filterContext.setPrefilteredIdPAttributes(epaUid.values());
         Set<IdPAttributeValue> x = matcher.getMatchingValues(epaUid.get("uid"), filterContext);
         assertEquals(x.size(), 1);
@@ -118,8 +118,6 @@ public class ScriptedTest extends BaseAttributeFilterParserTest {
      
         assertEquals(custom.size(), 1);
         assertEquals(custom.get("bar"), "foo");
-        
     }
 
-    
-}
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/testing/MockScriptContextExtender.java b/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/testing/MockScriptContextExtender.java
new file mode 100644
index 000000000..4413c5373
--- /dev/null
+++ b/shib-attribute-filter-spring/src/test/java/net/shibboleth/idp/attribute/filter/spring/testing/MockScriptContextExtender.java
@@ -0,0 +1,45 @@
+/*
+ * 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 net.shibboleth.idp.attribute.filter.spring.testing;
+
+import javax.annotation.Nonnull;
+import javax.script.ScriptContext;
+
+import net.shibboleth.idp.attribute.filter.FilterScriptContextExtender;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.scripting.ScriptContextExtender;
+
+/**
+ * Mock implementation of {@link ScriptContextExtender}.
+ * 
+ * @since 5.0.0
+ */
+public class MockScriptContextExtender implements FilterScriptContextExtender {
+    
+    /** Context extension name. */
+    @Nonnull @NotEmpty public static final String NAME = "zorkmid";
+    
+    /** Context extension value. */
+    @Nonnull @NotEmpty public static final String VALUE = "frobnitz";
+
+    /** {@inheritDoc} */
+    public void extendContext(@Nonnull final ScriptContext scriptContext) {
+        scriptContext.setAttribute(NAME, VALUE, ScriptContext.ENGINE_SCOPE);
+    }
+
+}
\ No newline at end of file
diff --git a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/customBean.xml b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/customBean.xml
index 9ca79241d..0fbc9f33b 100644
--- a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/customBean.xml
+++ b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/customBean.xml
@@ -8,13 +8,17 @@
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
                            
-       default-init-method="initialize"
-       default-destroy-method="destroy">
+       default-init-method="initialize">
+
     <util:map id="shibboleth.CustomScriptObject">
         <entry key="foo" value="bar"/>
     </util:map>    
     <util:map id="other.CustomScriptObject">
         <entry key="bar" value="foo"/>
     </util:map>    
+
+    <!-- Should be auto-wired via builders into Scripted plugins. -->
+    <bean class="net.shibboleth.idp.attribute.filter.spring.testing.MockScriptContextExtender" />
+
 </beans>
        
\ No newline at end of file
diff --git a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/scripted-rhino.xml b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/scripted-rhino.xml
index 262a9d298..f73b41391 100644
--- a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/scripted-rhino.xml
+++ b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/scripted-rhino.xml
@@ -7,7 +7,9 @@
         <![CDATA[
             importPackage(Packages.java.util);
             x = new HashSet();
-            x.add(attribute.getValues().iterator().next());
+            if (typeof zorkmid != "undefined" && zorkmid != null && zorkmid == "frobnitz") {
+                x.add(attribute.getValues().iterator().next());
+            }
             x;
         ]]>
 		</Script>
diff --git a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/scripted.xml b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/scripted.xml
index 4596bd68d..cfd93e5a4 100644
--- a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/scripted.xml
+++ b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/matcher/scripted.xml
@@ -5,7 +5,10 @@
         <![CDATA[
             hs = Java.type("java.util.HashSet");
             x = new hs();
-            x.add(attribute.getValues().iterator().next());
+            
+            if (typeof zorkmid != "undefined" && zorkmid != null && zorkmid == "frobnitz") {
+                x.add(attribute.getValues().iterator().next());
+            }
             x;
         ]]>
 		</Script>
diff --git a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/policyrule/file.script b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/policyrule/file.script
index 9370154d1..e0e06ffbd 100644
--- a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/policyrule/file.script
+++ b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/policyrule/file.script
@@ -1,2 +1,2 @@
 bool = Java.type("java.lang.Boolean");
-new bool(false);
\ No newline at end of file
+new bool(typeof zorkmid == "undefined" || zorkmid == null || zorkmid != "frobnitz")
diff --git a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/policyrule/file.script.rhino b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/policyrule/file.script.rhino
index 44f4cd4a5..cb3668328 100644
--- a/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/policyrule/file.script.rhino
+++ b/shib-attribute-filter-spring/src/test/resources/net/shibboleth/idp/attribute/filter/policyrule/file.script.rhino
@@ -1 +1 @@
-new java.lang.Boolean(false);
\ No newline at end of file
+new java.lang.Boolean(typeof zorkmid == "undefined" || zorkmid == null || zorkmid != "frobnitz");
diff --git a/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/ResolverScriptContextExtender.java b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/ResolverScriptContextExtender.java
new file mode 100644
index 000000000..9516185ae
--- /dev/null
+++ b/shib-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/scripted/ResolverScriptContextExtender.java
@@ -0,0 +1,29 @@
+/*
+ * 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 net.shibboleth.idp.attribute.resolver.scripted;
+
+import net.shibboleth.utilities.java.support.scripting.ScriptContextExtender;
+
+/**
+ * Marker interface for an extender of resolver scripting.
+ * 
+ * @since 5.0.0
+ */
+public interface ResolverScriptContextExtender extends ScriptContextExtender {
+
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
index 63377ce7d..f305f184b 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
@@ -40,6 +40,7 @@ import net.shibboleth.idp.attribute.resolver.PluginDependencySupport;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
+import net.shibboleth.idp.attribute.resolver.scripted.ResolverScriptContextExtender;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
@@ -47,7 +48,7 @@ import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 import net.shibboleth.utilities.java.support.scripting.AbstractScriptEvaluator;
 import net.shibboleth.utilities.java.support.scripting.EvaluableScript;
-import net.shibboleth.utilities.java.support.scripting.ScriptContextExtender;
+
 
 /**
  * An {@link net.shibboleth.idp.attribute.resolver.AttributeDefinition} that executes a script in order to populate the
@@ -84,7 +85,7 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
     @NonnullAfterInit private AttributeDefinitionScriptEvaluator scriptEvaluator;
 
     /** Extenders for script context. */
-    @Nonnull @NonnullElements private Collection<ScriptContextExtender> contextExtenders;
+    @Nonnull @NonnullElements private Collection<ResolverScriptContextExtender> contextExtenders;
     
     /** The custom object we inject into all scripts. */
     @Nullable private Object customObject;
@@ -144,7 +145,7 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
      * @since 5.0.0
      */
     @Nullable public void setScriptContextExtenders(
-            @Nullable @NonnullElements final Collection<ScriptContextExtender> extenders) {
+            @Nullable @NonnullElements final Collection<ResolverScriptContextExtender> extenders) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
 
diff --git a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
index 8160fca7e..d2b9c21d5 100644
--- a/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
+++ b/shib-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
@@ -25,14 +25,12 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.script.ScriptContext;
 import javax.script.ScriptException;
 
-import org.opensaml.messaging.context.navigate.ParentContextLookup;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,7 +43,9 @@ import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.ad.impl.ScriptedIdPAttributeImpl;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
+import net.shibboleth.idp.attribute.resolver.scripted.ResolverScriptContextExtender;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
@@ -69,16 +69,15 @@ public class ScriptedDataConnector extends AbstractDataConnector {
     /** Evaluator. */
     @NonnullAfterInit private DataConnectorScriptEvaluator scriptEvaluator;
     
-    /** Strategy used to locate the {@link ProfileRequestContext} to use. */
-    @Nonnull private Function<AttributeResolutionContext,ProfileRequestContext> prcLookupStrategy;
-
+    /** Extenders for script context. */
+    @Nonnull @NonnullElements private Collection<ResolverScriptContextExtender> contextExtenders;
+    
     /** The custom object we inject into all scripts. */
     @Nullable private Object customObject;
 
     /** Constructor. */
     public ScriptedDataConnector() {
-        // Defaults to ProfileRequestContext -> RelyingPartyContext -> AttributeContext.
-        prcLookupStrategy = new ParentContextLookup<>(ProfileRequestContext.class);
+        contextExtenders = Collections.emptyList();
     }
 
     /**
@@ -124,18 +123,22 @@ public class ScriptedDataConnector extends AbstractDataConnector {
     }
 
     /**
-     * Set the strategy used to locate the {@link ProfileRequestContext} associated with a given
-     * {@link AttributeResolutionContext}.
+     * Set any script context extenders to apply.
      * 
-     * @param strategy strategy used to locate the {@link ProfileRequestContext} associated with a given
-     *            {@link AttributeResolutionContext}
+     * @param extenders script extenders
+     * 
+     * @since 5.0.0
      */
-    public void setProfileRequestContextLookupStrategy(
-            @Nonnull final Function<AttributeResolutionContext, ProfileRequestContext> strategy) {
+    @Nullable public void setScriptContextExtenders(
+            @Nullable @NonnullElements final Collection<ResolverScriptContextExtender> extenders) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
 
-        prcLookupStrategy = Constraint.isNotNull(strategy, "ProfileRequestContext lookup strategy cannot be null");
+        if (extenders != null) {
+            contextExtenders = List.copyOf(extenders);
+        } else {
+            contextExtenders = Collections.emptyList();
+        }
     }
 
     /** {@inheritDoc} */
@@ -148,6 +151,7 @@ public class ScriptedDataConnector extends AbstractDataConnector {
         
         scriptEvaluator = new DataConnectorScriptEvaluator(script);
         scriptEvaluator.setCustomObject(customObject);
+        scriptEvaluator.setContextExtenders(contextExtenders);
         scriptEvaluator.setLogPrefix(getLogPrefix());
     }
     
@@ -205,7 +209,9 @@ public class ScriptedDataConnector extends AbstractDataConnector {
             log.debug("{} Adding current attribute resolution contexts to script context", getLogPrefix());
             scriptContext.setAttribute("resolutionContext", input[0], ScriptContext.ENGINE_SCOPE);
             
-            final ProfileRequestContext prc = prcLookupStrategy.apply((AttributeResolutionContext) input[0]);
+            final ProfileRequestContext prc =
+                    ((AttributeResolutionContext) input[0]).getProfileRequestContextLookupStrategy().apply(
+                            (AttributeResolutionContext) input[0]);
             if (null == prc) {
                 log.error("{} ProfileRequestContext could not be located", getLogPrefix());
             }
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptDataConnectorParser.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParser.java
similarity index 96%
rename from shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptDataConnectorParser.java
rename to shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParser.java
index b5fb3e2e3..9ab2f1235 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptDataConnectorParser.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptedDataConnectorParser.java
@@ -31,7 +31,6 @@ import org.w3c.dom.Element;
 
 import net.shibboleth.ext.spring.factory.EvaluableScriptFactoryBean;
 import net.shibboleth.idp.attribute.resolver.dc.impl.ScriptedDataConnector;
-import net.shibboleth.idp.attribute.resolver.spring.ad.impl.ScriptedAttributeDefinitionParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.AbstractDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
 import net.shibboleth.utilities.java.support.primitive.DeprecationSupport;
@@ -40,7 +39,7 @@ import net.shibboleth.utilities.java.support.primitive.StringSupport;
 import net.shibboleth.utilities.java.support.xml.ElementSupport;
 
 /** Bean definition Parser for a {@link ScriptedDataConnector}. */
-public class ScriptDataConnectorParser extends AbstractDataConnectorParser {
+public class ScriptedDataConnectorParser extends AbstractDataConnectorParser {
 
     /** Schema type - resolver. */
     @Nonnull public static final QName TYPE_NAME_RESOLVER =
@@ -55,7 +54,7 @@ public class ScriptDataConnectorParser extends AbstractDataConnectorParser {
             new QName(AttributeResolverNamespaceHandler.NAMESPACE, "Script");
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(ScriptedAttributeDefinitionParser.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(ScriptedDataConnectorParser.class);
 
     /** {@inheritDoc} */
     @Override protected Class<ScriptedDataConnector> getNativeBeanClass() {
@@ -70,6 +69,8 @@ public class ScriptDataConnectorParser extends AbstractDataConnectorParser {
             DeprecationSupport.warnOnce(ObjectType.ATTRIBUTE, ATTR_SPRING_RESOURCE, null,null);
         }
         super.doParse(config, parserContext, builder);
+        
+        builder.addAutowiredProperty("scriptContextExtenders");       
     }
 
     /** {@inheritDoc} */
diff --git a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverNamespaceHandler.java b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverNamespaceHandler.java
index 90f7c0dba..b9dca0289 100644
--- a/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverNamespaceHandler.java
+++ b/shib-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverNamespaceHandler.java
@@ -39,7 +39,7 @@ import net.shibboleth.idp.attribute.resolver.spring.ad.mapped.impl.ValueMapParse
 import net.shibboleth.idp.attribute.resolver.spring.dc.http.impl.HTTPDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.ComputedIdDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.PairwiseIdDataConnectorParser;
-import net.shibboleth.idp.attribute.resolver.spring.dc.impl.ScriptDataConnectorParser;
+import net.shibboleth.idp.attribute.resolver.spring.dc.impl.ScriptedDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.StaticDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.StoredIdDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.dc.ldap.impl.LDAPDataConnectorParser;
@@ -116,7 +116,7 @@ public class AttributeResolverNamespaceHandler extends BaseSpringNamespaceHandle
         registerBeanDefinitionParser(PairwiseIdDataConnectorParser.TYPE_NAME_RESOLVER,
                 new PairwiseIdDataConnectorParser());
         registerBeanDefinitionParser(HTTPDataConnectorParser.TYPE_NAME, new HTTPDataConnectorParser());
-        registerBeanDefinitionParser(ScriptDataConnectorParser.TYPE_NAME_RESOLVER, new ScriptDataConnectorParser());
+        registerBeanDefinitionParser(ScriptedDataConnectorParser.TYPE_NAME_RESOLVER, new ScriptedDataConnectorParser());
         registerBeanDefinitionParser(StaticDataConnectorParser.TYPE_NAME_RESOLVER, new StaticDataConnectorParser());
         registerBeanDefinitionParser(StoredIdDataConnectorParser.TYPE_NAME_RESOLVER, new StoredIdDataConnectorParser());
         // Implement in IdP layer.
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptDataConnectorParserTest.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptDataConnectorParserTest.java
index 2dc6a33da..4c4c53a58 100644
--- a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptDataConnectorParserTest.java
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/impl/ScriptDataConnectorParserTest.java
@@ -32,13 +32,12 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.dc.impl.ScriptedDataConnector;
-import net.shibboleth.idp.attribute.resolver.spring.dc.impl.ScriptDataConnectorParser;
 import net.shibboleth.idp.attribute.resolver.spring.testing.BaseAttributeDefinitionParserTest;
 import net.shibboleth.idp.attribute.resolver.testing.TestSources;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
 /**
- * test for {@link ScriptDataConnectorParser}
+ * test for {@link ScriptedDataConnectorParser}
  */
 @SuppressWarnings("javadoc")
 public class ScriptDataConnectorParserTest extends BaseAttributeDefinitionParserTest {
@@ -63,7 +62,7 @@ public class ScriptDataConnectorParserTest extends BaseAttributeDefinitionParser
                         TestSources.SP_ENTITY_ID);
         final Map<String, IdPAttribute> result = dataConnector.resolve(context);
         
-        assertEquals(result.size(), 2);
+        assertEquals(result.size(), 3);
         
         List<IdPAttributeValue> values = result.get("ScriptedOne").getValues();
         assertEquals(values.size(), 2);
@@ -76,6 +75,9 @@ public class ScriptDataConnectorParserTest extends BaseAttributeDefinitionParser
         assertTrue(values.contains(new StringAttributeValue("2Value")));
         assertTrue(values.contains(new StringAttributeValue("3Value")));
         
+        values = result.get("zorkmid").getValues();
+        assertEquals(values.size(), 1);
+        assertTrue(values.contains(new StringAttributeValue("frobnitz")));
     }
     
     @Test public void tooManyFiles() throws ComponentInitializationException, ResolutionException {
diff --git a/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/testing/MockScriptContextExtender.java b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/testing/MockScriptContextExtender.java
new file mode 100644
index 000000000..5af339c24
--- /dev/null
+++ b/shib-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/testing/MockScriptContextExtender.java
@@ -0,0 +1,45 @@
+/*
+ * 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 net.shibboleth.idp.attribute.resolver.spring.testing;
+
+import javax.annotation.Nonnull;
+import javax.script.ScriptContext;
+
+import net.shibboleth.idp.attribute.resolver.scripted.ResolverScriptContextExtender;
+import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.utilities.java.support.scripting.ScriptContextExtender;
+
+/**
+ * Mock implementation of {@link ScriptContextExtender}.
+ * 
+ * @since 5.0.0
+ */
+public class MockScriptContextExtender implements ResolverScriptContextExtender {
+    
+    /** Context extension name. */
+    @Nonnull @NotEmpty public static final String NAME = "zorkmid";
+    
+    /** Context extension value. */
+    @Nonnull @NotEmpty public static final String VALUE = "frobnitz";
+
+    /** {@inheritDoc} */
+    public void extendContext(@Nonnull final ScriptContext scriptContext) {
+        scriptContext.setAttribute(NAME, VALUE, ScriptContext.ENGINE_SCOPE);
+    }
+
+}
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/resolver.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/resolver.xml
deleted file mode 100644
index 04f4be695..000000000
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/resolver.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<AttributeResolver xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="TestID"
-	xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd">
-
-	<DataConnector id="staticAttributes" xsi:type="Static">
-		<Attribute id="eduPersonAffiliation"><Value>member</Value></Attribute>
-		<Attribute id="eduPersonEntitlement">
-			<Value>urn:example.org:entitlement:entitlement1</Value>
-			<Value>urn:mace:dir:entitlement:common-lib-terms</Value>
-		</Attribute>
-	</DataConnector>
-
-	<AttributeDefinition id="dn1" xsi:type="Simple" >
-	<InputDataConnector ref="staticAttributes" attributeNames="dn1"></InputDataConnector>
-		<AttributeEncoder xsi:type="SAML2String"
-			name="urn:mace:dir:attribute-def:displayName" nameFormat="urn:mace:shibboleth:1.0:attributeNamespace:uri"
-			friendlyName="dn1" />
-	</AttributeDefinition>
-
-	<AttributeDefinition id="dn2" xsi:type="Simple" >
-        <InputDataConnector ref="staticAttributes" attributeNames="dn2"/>
-		<AttributeEncoder xsi:type="SAML2String"
-			name="urn:oid:2.16.840.1.113730.3.1.241" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"
-			friendlyName="dn2" />
-	</AttributeDefinition>
-
-	<AttributeDefinition id="eppn" xsi:type="Simple" >
-		<AttributeEncoder xsi:type="SAML2String" name="urn:mace:dir:attribute-def:eduPersonPrincipalName" friendlyName="dn2"  
-			nameFormat="urn:mace:shibboleth:1.0:attributeNamespace:uri"/>
-        <InputDataConnector ref="staticAttributes" allAttributes="true"/>
-	</AttributeDefinition>
-
-</AttributeResolver>
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/service.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/service.xml
deleted file mode 100644
index ba6c027fb..000000000
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/service.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:context="http://www.springframework.org/schema/context"
-    xmlns:util="http://www.springframework.org/schema/util"
-	xmlns:p="http://www.springframework.org/schema/p"
-    xmlns:c="http://www.springframework.org/schema/c"
-	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-	default-init-method="initialize" default-destroy-method="destroy">
-
-    <context:annotation-config />
-
-	<bean id="shibboleth.AttributeRegistryService" class="net.shibboleth.ext.spring.service.ReloadableSpringService"
-		depends-on="shibboleth.VelocityEngine" p:failFast="true"
-		p:reloadCheckDelay="0">
-
-		<constructor-arg name="claz"
-			value="net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry" />
-		<constructor-arg name="strategy">
-			<bean class="net.shibboleth.idp.attribute.transcoding.impl.AttributeRegistryServiceStrategy"
-				p:id="shibboleth.AttributeRegistryService" />
-		</constructor-arg>
-		<property name="serviceConfigurations">
-			<util:list>
-				<value>/net/shibboleth/idp/attribute/resolver/filter/resolver.xml</value>
-			</util:list>
-		</property>
-	</bean>
-
-    <bean class="net.shibboleth.idp.attribute.transcoding.BasicNamingFunction"
-            c:claz="org.opensaml.saml.saml2.core.Attribute">
-        <constructor-arg name="function">
-            <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML2AttributeTranscoder.NamingFunction" />
-        </constructor-arg>    
-    </bean>
-
-    <bean class="net.shibboleth.idp.attribute.transcoding.BasicNamingFunction"
-            c:claz="org.opensaml.saml.saml1.core.AttributeDesignator">
-        <constructor-arg name="function">
-            <bean class="net.shibboleth.idp.saml.attribute.transcoding.AbstractSAML1AttributeTranscoder.NamingFunction" />
-        </constructor-arg>    
-    </bean>
-
-    <bean id="shibboleth.VelocityEngine"
-        class="net.shibboleth.ext.spring.velocity.VelocityEngineFactoryBean">
-        <property name="velocityProperties">
-            <props>
-                <prop key="resource.loaders">classpath, string</prop>
-                <prop key="resource.loader.classpath.class">
-                    org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
-                </prop>
-                <prop key="resource.loader.string.class">
-                    org.apache.velocity.runtime.resource.loader.StringResourceLoader
-                </prop>
-            </props>
-        </property>
-    </bean>
-
-</beans>
\ No newline at end of file
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/withAttributes.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/withAttributes.xml
deleted file mode 100644
index b94e1651f..000000000
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/filter/withAttributes.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<EntityDescriptor entityID="https://example.org/shibboleth"
-	xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
-	<Extensions xmlns:mdattr="urn:oasis:names:tc:SAML:metadata:attribute">
-		<mdattr:EntityAttributes xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
-			<saml:Attribute Name="http://macedir.org/entity-category"
-				NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
-				<saml:AttributeValue>http://id.incommon.org/category/research-and-scholarship
-				</saml:AttributeValue>
-			</saml:Attribute>
-		</mdattr:EntityAttributes>
-	</Extensions>
-	<SPSSODescriptor
-		protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
-        <AssertionConsumerService Location="https://foo" index="1" Binding="urn:foo" />
-		<AttributeConsumingService xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
-			index="1">
-            <ServiceName xml:lang="en">Foo</ServiceName>
-			<RequestedAttribute FriendlyName="displayName"
-				Name="urn:mace:dir:attribute-def:displayName" NameFormat="urn:mace:shibboleth:1.0:attributeNamespace:uri" />
-			<RequestedAttribute FriendlyName="displayName" isRequired="true"
-				Name="urn:oid:2.16.840.1.113730.3.1.241" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
-			<RequestedAttribute FriendlyName="eduPersonPrincipalName"
-				Name="urn:mace:dir:attribute-def:eduPersonPrincipalName" NameFormat="urn:mace:shibboleth:1.0:attributeNamespace:uri" />
-		</AttributeConsumingService>
-	</SPSSODescriptor>
-</EntityDescriptor>
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/customBean.xml b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/customBean.xml
index 247e20bbb..dd6791596 100644
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/customBean.xml
+++ b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/customBean.xml
@@ -26,6 +26,8 @@
         class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"
         p:placeholderPrefix="%{" p:placeholderSuffix="}" />
 
+    <bean class="net.shibboleth.idp.attribute.resolver.spring.testing.MockScriptContextExtender" />
+
     <!-- Necessary for encoder parsing to function, normally part of registry wiring. -->
     
     <bean id="SAML2StringTranscoder"
diff --git a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/scriptedConnector.8.js b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/scriptedConnector.8.js
index a3358da57..0ef646b5c 100644
--- a/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/scriptedConnector.8.js
+++ b/shib-attribute-resolver-spring/src/test/resources/net/shibboleth/idp/attribute/resolver/spring/dc/scriptedConnector.8.js
@@ -17,3 +17,8 @@ set.add(new StringAttributeValue("3Value"));
 attr.setValues(set);
 connectorResults.add(attr);
 
+attr = new IdPAttribute("zorkmid");
+set = new HashSet(1);
+set.add(new StringAttributeValue(zorkmid));
+attr.setValues(set);
+connectorResults.add(attr);

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


More information about the commits mailing list