From ca50cb8dda0a24b5a4589db126bfab8d0d885b00 Mon Sep 17 00:00:00 2001
From: Thomas <>
Date: Tue, 16 Aug 2022 10:56:54 +0200
Subject: feat(proxy): add support for custom eIDAS attribute-handler into
 ProxyEidasAttributeRegistry

 This allow more sopisticated attribute-processing than simple mapping to IDA attributes
---
 .../dto/attributes/AttrMappingElement.java         |  6 ++++++
 .../service/ProxyEidasAttributeRegistry.java       | 18 +++++++++++++++-
 .../services/ProxyEidasAttributeRegistryTest.java  | 20 ++++++++++++++++++
 .../resources/config/additional-attributes.xml     | 19 +++++++++++++++++
 .../test/resources/config/idaAttributeMapping.json | 24 ++++++++++++++++++++++
 5 files changed, 86 insertions(+), 1 deletion(-)

(limited to 'modules/eidas_proxy-sevice/src')

diff --git a/modules/eidas_proxy-sevice/src/main/java/at/asitplus/eidas/specific/modules/msproxyservice/dto/attributes/AttrMappingElement.java b/modules/eidas_proxy-sevice/src/main/java/at/asitplus/eidas/specific/modules/msproxyservice/dto/attributes/AttrMappingElement.java
index cf106bad..2dffbc2d 100644
--- a/modules/eidas_proxy-sevice/src/main/java/at/asitplus/eidas/specific/modules/msproxyservice/dto/attributes/AttrMappingElement.java
+++ b/modules/eidas_proxy-sevice/src/main/java/at/asitplus/eidas/specific/modules/msproxyservice/dto/attributes/AttrMappingElement.java
@@ -13,6 +13,8 @@ import lombok.Data;
 @JsonPropertyOrder({
     "eidasAttribute",
     "idaAttribute",
+    "addionalRequiredAttributes",
+    "specificAttributeHandlerClass",
     "type"
 })
 @Data
@@ -34,6 +36,10 @@ public class AttrMappingElement {
   @JsonProperty("addionalRequiredAttributes")
   private List<String> addionalRequiredAttributes;
   
+
+  @JsonProperty("specificAttributeHandlerClass")
+  private String specificAttributeHandlerClass;
+   
   /**
    * attribute characteristics.
    */
diff --git a/modules/eidas_proxy-sevice/src/main/java/at/asitplus/eidas/specific/modules/msproxyservice/service/ProxyEidasAttributeRegistry.java b/modules/eidas_proxy-sevice/src/main/java/at/asitplus/eidas/specific/modules/msproxyservice/service/ProxyEidasAttributeRegistry.java
index a6a50100..a0c99019 100644
--- a/modules/eidas_proxy-sevice/src/main/java/at/asitplus/eidas/specific/modules/msproxyservice/service/ProxyEidasAttributeRegistry.java
+++ b/modules/eidas_proxy-sevice/src/main/java/at/asitplus/eidas/specific/modules/msproxyservice/service/ProxyEidasAttributeRegistry.java
@@ -111,7 +111,7 @@ public class ProxyEidasAttributeRegistry {
   }
 
   /**
-   * Get eIDAS related IDA attribute.
+   * Get eIDAS related IDA attribute for a specific mode-operation.
    *  
    * @param eidasAttributeName Name of the eIDAS attribute.
    * @param withMandates <code>true</code> if mandates are supported, otherwise <code>false</code>
@@ -127,6 +127,22 @@ public class ProxyEidasAttributeRegistry {
             
   }
     
+  /**
+   * Get eIDAS related custom attribute-handler.
+   *  
+   * @param eidasAttributeName Name of the eIDAS attribute.
+   * @return full classname of the handler implementation if available 
+   */
+  public Optional<String> mapEidasAttributeToAttributeHandler(String eidasAttributeName) {
+    return attributeConfiguration.stream()
+        .filter(el -> el.getEidasAttributeName().equals(eidasAttributeName))
+        .filter(el -> StringUtils.isNotEmpty(el.getSpecificAttributeHandlerClass()))
+        .findFirst()
+        .map(el -> el.getSpecificAttributeHandlerClass());
+    
+  }
+  
+  
   @PostConstruct
   private void initialize() throws EaafConfigurationException {
     final String attrConfPath = basicConfig.getBasicConfiguration(
diff --git a/modules/eidas_proxy-sevice/src/test/java/at/asitplus/eidas/specific/modules/msproxyservice/test/services/ProxyEidasAttributeRegistryTest.java b/modules/eidas_proxy-sevice/src/test/java/at/asitplus/eidas/specific/modules/msproxyservice/test/services/ProxyEidasAttributeRegistryTest.java
index 8d417c1a..fb7d257e 100644
--- a/modules/eidas_proxy-sevice/src/test/java/at/asitplus/eidas/specific/modules/msproxyservice/test/services/ProxyEidasAttributeRegistryTest.java
+++ b/modules/eidas_proxy-sevice/src/test/java/at/asitplus/eidas/specific/modules/msproxyservice/test/services/ProxyEidasAttributeRegistryTest.java
@@ -127,6 +127,26 @@ public class ProxyEidasAttributeRegistryTest {
     
   }
   
+  @Test
+  public void specificAttributeHandler() {        
+    assertFalse("find wrong attribute", 
+        attrRegistry.mapEidasAttributeToAttributeHandler(
+            "http://eidas.europa.eu/attributes/jUnit/no/custom/handler").isPresent());
+    
+    assertFalse("find wrong attribute", 
+        attrRegistry.mapEidasAttributeToAttributeHandler(
+            "http://eidas.europa.eu/attributes/naturalperson/representative/DateOfBirth").isPresent());
+    
+    
+    Optional<String> attr2 = attrRegistry.mapEidasAttributeToAttributeHandler(
+        "http://e-justice.europa.eu/attributes/naturalperson/eJusticeNaturalPersonRole");
+    assertTrue("find wrong IDA mapping", attr2.isPresent());
+    assertEquals("find wrong specific attribute-handler", 
+        "at.asitplus.eidas.specific.modules.msproxyservice.handler.EJusticePersonRoleHandler", attr2.get());
+    
+  }
+  
+  
   private void checkAttributeMapping(String eidasAttr, boolean withMandates, List<String> idaAttributes) {    
     @NonNull
     Set<String> idaAttrResult = attrRegistry.getIdaAttributesForEidasAttribute(eidasAttr, withMandates);
diff --git a/modules/eidas_proxy-sevice/src/test/resources/config/additional-attributes.xml b/modules/eidas_proxy-sevice/src/test/resources/config/additional-attributes.xml
index 6510546e..e40ebdc4 100644
--- a/modules/eidas_proxy-sevice/src/test/resources/config/additional-attributes.xml
+++ b/modules/eidas_proxy-sevice/src/test/resources/config/additional-attributes.xml
@@ -36,4 +36,23 @@
     <entry key="2.XmlType.NamespacePrefix">xs</entry>
     <entry key="2.AttributeValueMarshaller">eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller</entry>
 
+    <entry key="3.NameUri">http://e-justice.europa.eu/attributes/naturalperson/eJusticeNaturalPersonRole</entry>
+    <entry key="3.FriendlyName">eJusticeNaturalPersonRole</entry>
+    <entry key="3.PersonType">NaturalPerson</entry>
+    <entry key="3.Required">false</entry>
+    <entry key="3.XmlType.NamespaceUri">http://www.w3.org/2001/XMLSchema</entry>
+    <entry key="3.XmlType.LocalPart">string</entry>
+    <entry key="3.XmlType.NamespacePrefix">xs</entry>
+    <entry key="3.AttributeValueMarshaller">eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller</entry>
+
+    <entry key="4.NameUri">http://e-justice.europa.eu/attributes/legalperson/eJusticeLegalPersonRole</entry>
+    <entry key="4.FriendlyName">eJusticeLegalPersonRole</entry>
+    <entry key="4.PersonType">LegalPerson</entry>
+    <entry key="4.Required">false</entry>
+    <entry key="4.XmlType.NamespaceUri">http://www.w3.org/2001/XMLSchema</entry>
+    <entry key="4.XmlType.LocalPart">string</entry>
+    <entry key="4.XmlType.NamespacePrefix">xs</entry>
+    <entry key="4.AttributeValueMarshaller">eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller</entry>
+
+
 </properties>
diff --git a/modules/eidas_proxy-sevice/src/test/resources/config/idaAttributeMapping.json b/modules/eidas_proxy-sevice/src/test/resources/config/idaAttributeMapping.json
index 7e41d8f6..daaaa37d 100644
--- a/modules/eidas_proxy-sevice/src/test/resources/config/idaAttributeMapping.json
+++ b/modules/eidas_proxy-sevice/src/test/resources/config/idaAttributeMapping.json
@@ -128,6 +128,22 @@
       "autoIncludeWithMandates": true
     }
   },
+  {
+    "eidasAttribute": "http://e-justice.europa.eu/attributes/naturalperson/eJusticeNaturalPersonRole",
+    "specificAttributeHandlerClass": "at.asitplus.eidas.specific.modules.msproxyservice.handler.EJusticePersonRoleHandler",
+    "type": {
+      "mds": false,
+      "autoIncludeWithMandates": false
+    }
+  },  
+  {
+    "eidasAttribute": "http://e-justice.europa.eu/attributes/legalperson/eJusticeLegalPersonRole",
+    "specificAttributeHandlerClass": "at.asitplus.eidas.specific.modules.msproxyservice.handler.EJusticePersonRoleHandler",
+    "type": {
+      "mds": false,
+      "autoIncludeWithMandates": false
+    }
+  },  
   {
     "eidasAttribute": "*",
     "idaAttribute": {
@@ -179,5 +195,13 @@
       "mds": false,
       "autoIncludeWithMandates": false  
     }
+  },
+    {
+    "eidasAttribute": "http://eidas.europa.eu/attributes/jUnit/no/custom/handler",
+    "specificAttributeHandlerClass": "",
+    "type": {
+      "mds": false,
+      "autoIncludeWithMandates": false
+    }
   }
 ]
\ No newline at end of file
-- 
cgit v1.2.3