[java-identity-provider] branch main updated: IDP-1727 - Support directionality in AttributeTranscoders

Scott Cantor cantor.2 at osu.edu
Mon Dec 21 16:58:53 UTC 2020


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

The following commit(s) were added to refs/heads/main by this push:
       new  d67210d31 IDP-1727 - Support directionality in AttributeTranscoders
d67210d31 is described below

commit d67210d317637d24fee94d8a33dc283c5eca9b4b
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Dec 21 11:58:45 2020 -0500

    IDP-1727 - Support directionality in AttributeTranscoders
    
    https://issues.shibboleth.net/jira/browse/IDP-1727
---
 .../transcoding/AttributeTranscoderRegistry.java   |  8 +++-
 .../impl/AttributeTranscoderRegistryImpl.java      | 44 ++++++++++++++--------
 .../impl/AttributeTranscoderRegistryImplTest.java  | 12 +++++-
 3 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
index b9b25ed8b..598db2616 100644
--- a/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
+++ b/idp-attribute-api/src/main/java/net/shibboleth/idp/attribute/transcoding/AttributeTranscoderRegistry.java
@@ -58,7 +58,13 @@ public interface AttributeTranscoderRegistry extends IdentifiedComponent {
 
     /** Property prefix for language-specific description of attribute. */
     @Nonnull @NotEmpty static final String PROP_DESCRIPTION = "description";
-    
+
+    /** Property prefix for indicating whether a rule applies to encoding. */
+    @Nonnull @NotEmpty static final String PROP_ENCODER = "encoder";
+
+    /** Property prefix for indicating whether a rule applies to decoding. */
+    @Nonnull @NotEmpty static final String PROP_DECODER = "decoder";
+
     /**
      * Get the localized display names for an {@link IdPAttribute}.
      * 
diff --git a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
index 2f1483dff..d29b924e2 100644
--- a/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
+++ b/idp-attribute-impl/src/main/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImpl.java
@@ -265,6 +265,7 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
         return transcoders;
     }
     
+// Checkstyle: CyclomaticComplexity OFF
     /**
      * Add a mapping between an {@link IdPAttribute} name and a set of transcoding rules.
      * 
@@ -274,7 +275,6 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
      */
     private void addMapping(@Nonnull @NotEmpty final String id, @Nonnull final AttributeTranscoder<?> transcoder,
             @Nonnull final Map<String,Object> ruleset) {
-
         
         final TranscodingRule copy = new TranscodingRule(ruleset);
         copy.getMap().put(PROP_TRANSCODER, transcoder);
@@ -283,26 +283,37 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
         final String targetName = transcoder.getEncodedName(copy);
         if (targetName != null) {
             
-            log.debug("Attribute mapping: {} <-> {} via {}", id, targetName, transcoder.getClass().getSimpleName());
+            final boolean encoder = copy.getOrDefault(PROP_ENCODER, Boolean.class, true);
+            final boolean decoder = copy.getOrDefault(PROP_DECODER, Boolean.class, true);
+            if (!encoder && !decoder) {
+                log.warn("Transcoding rule for {} and type {} was disabled in both directions, ignoring",
+                        id, type.getName());
+                return;
+            }
+            
+            log.debug("Attribute mapping: {} {}-{} {} via {}", id, targetName,
+                    decoder ? "<" : "", encoder ? ">" : "", transcoder.getClass().getSimpleName());
             
             // Install mapping back to IdPAttribute's trimmed name.
             copy.getMap().put(PROP_ID, id);
-            
-            Multimap<Class<?>,TranscodingRule> rulesetsForIdPName = transcodingRegistry.get(id);
-            if (rulesetsForIdPName == null) {
-                rulesetsForIdPName = ArrayListMultimap.create();
-                transcodingRegistry.put(id, rulesetsForIdPName);
-            }
-            
-            rulesetsForIdPName.put(type, copy);
 
-            Multimap<Class<?>,TranscodingRule> rulesetsForEncodedName = transcodingRegistry.get(targetName);
-            if (rulesetsForEncodedName == null) {
-                rulesetsForEncodedName = ArrayListMultimap.create();
-                transcodingRegistry.put(targetName, rulesetsForEncodedName);
+            if (encoder) {
+                Multimap<Class<?>,TranscodingRule> rulesetsForIdPName = transcodingRegistry.get(id);
+                if (rulesetsForIdPName == null) {
+                    rulesetsForIdPName = ArrayListMultimap.create();
+                    transcodingRegistry.put(id, rulesetsForIdPName);
+                }
+                rulesetsForIdPName.put(type, copy);
             }
             
-            rulesetsForEncodedName.put(type, copy);
+            if (decoder) {
+                Multimap<Class<?>,TranscodingRule> rulesetsForEncodedName = transcodingRegistry.get(targetName);
+                if (rulesetsForEncodedName == null) {
+                    rulesetsForEncodedName = ArrayListMultimap.create();
+                    transcodingRegistry.put(targetName, rulesetsForEncodedName);
+                }
+                rulesetsForEncodedName.put(type, copy);
+            }
             
             if (displayNameRegistry.containsKey(id)) {
                 displayNameRegistry.get(id).putAll(copy.getDisplayNames());
@@ -317,9 +328,10 @@ public class AttributeTranscoderRegistryImpl extends AbstractServiceableComponen
             }
             
         } else {
-            log.warn("Transcoding rule for {} into type {} did not produce an encoded name", id, type.getName());
+            log.warn("Transcoding rule for {} and type {} did not produce an encoded name", id, type.getName());
         }
     }
+// Checkstyle: CyclomaticComplexity ON
     
     /**
      * Build an appropriate {@link Predicate} to use as an activation condition within the ruleset.
diff --git a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
index a86b7a2f9..f231bd45e 100644
--- a/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
+++ b/idp-attribute-impl/src/test/java/net/shibboleth/idp/attribute/transcoding/impl/AttributeTranscoderRegistryImplTest.java
@@ -102,13 +102,21 @@ public class AttributeTranscoderRegistryImplTest {
         ruleset5.put(AttributeTranscoderRegistry.PROP_ID, "foo bar");
         ruleset5.put(AttributeTranscoderRegistry.PROP_TRANSCODER, transcoder);
         ruleset5.put("name", "baz");
-        
+
+        final Map<String,Object> ruleset6 = new HashMap<>();
+        ruleset6.put(AttributeTranscoderRegistry.PROP_ID, "frobnitz");
+        ruleset6.put(AttributeTranscoderRegistry.PROP_TRANSCODER, transcoder);
+        ruleset6.put(AttributeTranscoderRegistry.PROP_ENCODER, "false");
+        ruleset6.put(AttributeTranscoderRegistry.PROP_DECODER, "false");
+        ruleset6.put("name", "foo");
+
         registry.setTranscoderRegistry(List.of(
                 new TranscodingRule(ruleset1),
                 new TranscodingRule(ruleset2),
                 new TranscodingRule(ruleset3),
                 new TranscodingRule(ruleset4),
-                new TranscodingRule(ruleset5)));
+                new TranscodingRule(ruleset5),
+                new TranscodingRule(ruleset6)));
         registry.setApplicationContext(new MockApplicationContext());
         registry.initialize();
         

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


More information about the commits mailing list