diff options
10 files changed, 381 insertions, 59 deletions
| diff --git a/basicConfig/default_config.properties b/basicConfig/default_config.properties index 8a1bc3a0..ad883284 100644 --- a/basicConfig/default_config.properties +++ b/basicConfig/default_config.properties @@ -31,6 +31,9 @@ eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.password=  eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.path=  eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.password= +## eIDAS Request configuration +eidas.ms.auth.eIDAS.node_v2.staticProviderNameForPublicSPs=Austria +  ## E-AuthBlock configuration  eidas.ms.auth.eIDAS.authblock.keystore.type=jks diff --git a/connector/src/main/resources/application.properties b/connector/src/main/resources/application.properties index b13b6c18..b92102ed 100644 --- a/connector/src/main/resources/application.properties +++ b/connector/src/main/resources/application.properties @@ -51,10 +51,23 @@ eidas.ms.auth.eIDAS.node_v2.entityId=ownSpecificConnector  #eidas.ms.auth.eIDAS.node_v2.forward.endpoint=  eidas.ms.auth.eIDAS.node_v2.forward.method=POST  eidas.ms.auth.eIDAS.node_v2.countrycode=AT +#eidas.ms.auth.eIDAS.node_v2.publicSectorTargets=urn:publicid:gv.at:cdid\+.*  eidas.ms.auth.eIDAS.node_v2.publicSectorTargets=.* -eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderName=true + +## use SAML2 requestId as transactionIdentifier to mitigate problems with SAML2 relaystate  eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier=true -eidas.ms.auth.eIDAS.node_v2.workarounds.useStaticProviderNameForPublicSPs=true + +## use hashed version of unique SP-Identifier as requesterId +eidas.ms.auth.eIDAS.node_v2.requesterId.useHashedForm=true + +## user static requesterId for all SP's in case of LU +eidas.ms.auth.eIDAS.node_v2.requesterId.lu.useStaticRequesterForAll=true + +  +## set provider name for all public SPs +eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderName=false + +  eidas.ms.auth.eIDAS.node_v2.loa.requested.minimum=http://eidas.europa.eu/LoA/high @@ -92,6 +105,10 @@ eidas.ms.auth.eIDAS.szrclient.params.setBirthNameIfAvailable=true  eidas.ms.auth.eIDAS.szrclient.debug.logfullmessages=false  eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution=false + + + +  ##without mandates  eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.0=PersonIdentifier,true  eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.1=FamilyName,true diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java index cdc17654..c175d999 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java @@ -56,15 +56,21 @@ public class Constants {        CONIG_PROPS_EIDAS_NODE + ".attributes.requested.{0}.onlynatural";    public static final String CONIG_PROPS_EIDAS_NODE_ATTRIBUTES_REQUESTED_REPRESENTATION =        CONIG_PROPS_EIDAS_NODE + ".attributes.requested.representation"; +   +  public static final String CONIG_PROPS_EIDAS_NODE_REQUESTERID_USE_HASHED_VERSION = +      CONIG_PROPS_EIDAS_NODE + ".requesterId.useHashedForm"; +  public static final String CONIG_PROPS_EIDAS_NODE_WORKAROUND_USE_STATIC_REQUESTERID_FOR_LUX = +      CONIG_PROPS_EIDAS_NODE + ".requesterId.lu.useStaticRequesterForAll"; +      public static final String CONIG_PROPS_EIDAS_NODE_WORKAROUND_ADD_ALWAYS_PROVIDERNAME = -      CONIG_PROPS_EIDAS_NODE + ".workarounds.addAlwaysProviderName"; +      CONIG_PROPS_EIDAS_NODE + ".workarounds.addAlwaysProviderName";      public static final String CONIG_PROPS_EIDAS_NODE_WORKAROUND_USEREQUESTIDASTRANSACTIONIDENTIFIER =        CONIG_PROPS_EIDAS_NODE + ".workarounds.useRequestIdAsTransactionIdentifier"; -  public static final String CONIG_PROPS_EIDAS_NODE_WORKAROUND_USE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP = -      CONIG_PROPS_EIDAS_NODE + ".workarounds.useStaticProviderNameForPublicSPs"; +   +      public static final String CONIG_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP = CONIG_PROPS_EIDAS_NODE        + ".staticProviderNameForPublicSPs"; -  public static final String DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP = "ERnP"; +  public static final String DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP = "Austria";    public static final String FORWARD_METHOD_POST = "POST";    public static final String FORWARD_METHOD_GET = "GET"; diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java index 42dbfeac..90be9a7a 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java @@ -23,6 +23,10 @@  package at.asitplus.eidas.specific.modules.auth.eidas.v2.handler; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64;  import java.util.Map;  import java.util.regex.Matcher;  import java.util.regex.Pattern; @@ -66,7 +70,7 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {    public final void preProcess(IRequest pendingReq, Builder authnRequestBuilder) {      buildLevelOfAssurance(pendingReq.getServiceProviderConfiguration(), authnRequestBuilder); -    buildProviderNameAttribute(pendingReq, authnRequestBuilder); +    buildProviderNameAndRequesterIdAttribute(pendingReq, authnRequestBuilder);      buildRequestedAttributes(authnRequestBuilder);    } @@ -272,6 +276,83 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {    } +  /** +   * Set ProviderName and RequestId into eIDAS AuthnRequest. +   *  +   * @param pendingReq Current pendingRequest +   * @param authnRequestBuilder AuthnREquest builer +   */ +  protected void buildProviderNameAndRequesterIdAttribute(IRequest pendingReq, Builder authnRequestBuilder) { +    final ISpConfiguration spConfig = pendingReq.getServiceProviderConfiguration(); + +    // set correct SPType for requested target sector +    final String publicSectorTargetSelector = basicConfig.getBasicConfiguration( +        Constants.CONIG_PROPS_EIDAS_NODE_PUBLICSECTOR_TARGETS, +        Constants.POLICY_DEFAULT_ALLOWED_TARGETS); +    final Pattern p = Pattern.compile(publicSectorTargetSelector); +    final Matcher m = p.matcher(spConfig.getAreaSpecificTargetIdentifier()); +    if (m.matches()) { +      log.debug("Map " + spConfig.getAreaSpecificTargetIdentifier() + " to 'PublicSector'"); +      authnRequestBuilder.spType(SpType.PUBLIC.getValue()); + +      final String providerName = pendingReq.getRawData(Constants.DATA_PROVIDERNAME, String.class); +      if (basicConfig.getBasicConfigurationBoolean( +              Constants.CONIG_PROPS_EIDAS_NODE_WORKAROUND_ADD_ALWAYS_PROVIDERNAME, +              false)) { +        //TODO: only for eIDAS ref. node 2.0 and 2.1 because it need 'Providername' for +        if (StringUtils.isNotEmpty(providerName)) { +          log.debug("Set 'providername' to: {}", providerName); +          authnRequestBuilder.providerName(providerName);   +           +        } else { +          authnRequestBuilder.providerName(basicConfig.getBasicConfiguration( +              Constants.CONIG_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP, +              Constants.DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP)); +           +        }                  +      } + +    } else { +      log.debug("Map " + spConfig.getAreaSpecificTargetIdentifier() + " to 'PrivateSector'"); +      authnRequestBuilder.spType(SpType.PRIVATE.getValue()); + +      // TODO: switch to RequesterId in further version +      // set provider name for private sector applications +      final String providerName = pendingReq.getRawData(Constants.DATA_PROVIDERNAME, String.class); +      if (StringUtils.isNotEmpty(providerName)) { +        authnRequestBuilder.providerName(providerName); +                       +      } +       +      authnRequestBuilder.requesterId( +          generateRequesterId(pendingReq.getRawData(Constants.DATA_REQUESTERID, String.class))); +             +    } +  } +   +  private String generateRequesterId(String requesterId) { +    if (requesterId != null && basicConfig.getBasicConfigurationBoolean( +        Constants.CONIG_PROPS_EIDAS_NODE_REQUESTERID_USE_HASHED_VERSION, true)) {             +      try { +        log.trace("Building hashed 'requesterId' for private SP ... "); +        MessageDigest digest = MessageDigest.getInstance("SHA-256"); +        String encodedRequesterId = Base64.getEncoder().encodeToString( +            digest.digest(requesterId.getBytes(StandardCharsets.UTF_8)));                 +        log.debug("Set 'requesterId' for: {} to: {}", requesterId, encodedRequesterId); +        return encodedRequesterId; +         +      } catch (NoSuchAlgorithmException e) { +        log.error("Can NOT generate hashed 'requesterId' from: {}. Use it as it is", requesterId, e); +         +      } +             +    } +     +    return requesterId; +     +  } + +    private void buildRequestedAttributes(Builder authnRequestBuilder) {      // build and add requested attribute set      final Map<String, Boolean> ccSpecificReqAttr = getCountrySpecificRequestedAttributes(); @@ -308,55 +389,6 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {      return builder.build();    } - -  private void buildProviderNameAttribute(IRequest pendingReq, Builder authnRequestBuilder) { -    final ISpConfiguration spConfig = pendingReq.getServiceProviderConfiguration(); - -    // set correct SPType for requested target sector -    final String publicSectorTargetSelector = basicConfig.getBasicConfiguration( -        Constants.CONIG_PROPS_EIDAS_NODE_PUBLICSECTOR_TARGETS, -        Constants.POLICY_DEFAULT_ALLOWED_TARGETS); -    final Pattern p = Pattern.compile(publicSectorTargetSelector); -    final Matcher m = p.matcher(spConfig.getAreaSpecificTargetIdentifier()); -    if (m.matches()) { -      log.debug("Map " + spConfig.getAreaSpecificTargetIdentifier() + " to 'PublicSector'"); -      authnRequestBuilder.spType(SpType.PUBLIC.getValue()); - -      if (basicConfig.getBasicConfigurationBoolean( -          Constants.CONIG_PROPS_EIDAS_NODE_WORKAROUND_USE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP, -          true)) { -        authnRequestBuilder.providerName(basicConfig.getBasicConfiguration( -            Constants.CONIG_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP, -            Constants.DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP)); - -      } else { -        // TODO: only for eIDAS ref. node 2.0 and 2.1 because it need 'Providername' for -        // any SPType -        final String providerName = pendingReq.getRawData(Constants.DATA_PROVIDERNAME, String.class); -        if (StringUtils.isNotEmpty(providerName) -            && basicConfig.getBasicConfigurationBoolean( -                Constants.CONIG_PROPS_EIDAS_NODE_WORKAROUND_ADD_ALWAYS_PROVIDERNAME, -                false)) { -          authnRequestBuilder.providerName(providerName); - -        } -      } - -    } else { -      log.debug("Map " + spConfig.getAreaSpecificTargetIdentifier() + " to 'PrivateSector'"); -      authnRequestBuilder.spType(SpType.PRIVATE.getValue()); - -      // TODO: switch to RequesterId in further version -      // set provider name for private sector applications -      final String providerName = pendingReq.getRawData(Constants.DATA_PROVIDERNAME, String.class); -      if (StringUtils.isNotEmpty(providerName)) { -        authnRequestBuilder.providerName(providerName); -        authnRequestBuilder.requesterId(providerName); -         -      } - -    } -  }    private void buildLevelOfAssurance(ISpConfiguration spConfig, Builder authnRequestBuilder) {      // TODO: set matching mode if eIDAS ref. impl. support this method diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/LuEidProcessor.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/LuEidProcessor.java new file mode 100644 index 00000000..8402457f --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/LuEidProcessor.java @@ -0,0 +1,61 @@ +package at.asitplus.eidas.specific.modules.auth.eidas.v2.handler; + +import java.util.HashMap; +import java.util.Map; + +import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants; +import at.gv.egiz.eaaf.core.api.IRequest; +import eu.eidas.auth.commons.light.impl.LightRequest.Builder; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class LuEidProcessor extends AbstractEidProcessor { + +   +   +  private static final String canHandleCC = "LU"; + +  @Getter +  @Setter +  private int priority = 1; +   +  @Override +  public String getName() { +    return "LU-PostProcessor"; +     +  } + +  @Override +  public boolean canHandle(String countryCode) { +    return countryCode != null && countryCode.equalsIgnoreCase(canHandleCC); +     +  } + +  @Override +  protected void buildProviderNameAndRequesterIdAttribute(IRequest pendingReq, Builder authnRequestBuilder) { +    super.buildProviderNameAndRequesterIdAttribute(pendingReq, authnRequestBuilder);     +    if (basicConfig.getBasicConfigurationBoolean( +        Constants.CONIG_PROPS_EIDAS_NODE_WORKAROUND_USE_STATIC_REQUESTERID_FOR_LUX, true)) {       +      String staticName = basicConfig.getBasicConfiguration( +          Constants.CONIG_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP, +          Constants.DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP);                 +      authnRequestBuilder.providerName(staticName); +      authnRequestBuilder.requesterId(staticName); +      log.debug("Use static name: {} as 'providerName' and 'RequesterId' for all 'LU' requests ", staticName); +                  +    } else {  +      log.info("Static 'providerName' and 'RequesterId' for country: LU is deactivated"); +       +    } +     +  } +   +  @Override +  protected Map<String, Boolean> getCountrySpecificRequestedAttributes() { +    return new HashMap<>(); +     +  } + +} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml b/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml index 6cc704ab..3b0cee54 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml @@ -69,6 +69,11 @@      <property name="priority" value="1" />    </bean> +  <bean id="LU-Processor" +    class="at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.LuEidProcessor"> +    <property name="priority" value="1" /> +  </bean> +    <bean id="Default-Processor"      class="at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.GenericEidProcessor">      <property name="priority" value="0" /> diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskTest.java index c416b515..f796bd86 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskTest.java @@ -83,6 +83,7 @@ public class GenerateAuthnRequestTaskTest {      pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue());      pendingReq.setAuthUrl("http://test.com/"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.node_v2.requesterId.useHashedForm", "true");      basicConfig.putConfigValue("eidas.ms.auth.eIDAS.node_v2.entityId",           RandomStringUtils.randomAlphabetic(10));      basicConfig.putConfigValue( @@ -297,7 +298,7 @@ public class GenerateAuthnRequestTaskTest {      basicConfig.putConfigValue(          "eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier", "true");      basicConfig.putConfigValue( -        "eidas.ms.auth.eIDAS.node_v2.workarounds.useStaticProviderNameForPublicSPs", "true"); +        "eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderNames", "true");      basicConfig.putConfigValue(          "eidas.ms.auth.eIDAS.node_v2.staticProviderNameForPublicSPs", "myNode"); @@ -366,6 +367,101 @@ public class GenerateAuthnRequestTaskTest {    }    @Test +  public void publicSpWithCountryLu() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException, UnsupportedEncodingException { +    //set-up test +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU"); +    executionContext.put("selectedEnvironment", "prod"); +     +    String providerName = RandomStringUtils.randomAlphanumeric(10); +    pendingReq.setRawDataToTransaction(Constants.DATA_PROVIDERNAME, providerName); +             +    basicConfig.removeConfigValue("eidas.ms.auth.eIDAS.node_v2.publicSectorTargets"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderName", "true"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier", "true"); +             +    String dynEndPoint = "http://test/" + RandomStringUtils.randomAlphabetic(5); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.endpoint", dynEndPoint);     +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.method", "GET"); +     +    //execute test +    task.execute(pendingReq, executionContext); +         +    //validate state +    Assert.assertEquals("Wrong http statusCode", 302, httpResp.getStatus()); +    Assert.assertNotNull("No redirect header", httpResp.getHeaderValue("Location")); +    Assert.assertTrue("Wrong redirect endpoint",  +        ((String) httpResp.getHeaderValue("Location")).startsWith(dynEndPoint)); +         +     +    final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null); + +    Assert.assertEquals("PrividerName", "myNode", eidasReq.getProviderName()); +    Assert.assertEquals("RequesterId found", "myNode", eidasReq.getRequesterId()); +    Assert.assertEquals("no PublicSP", "public", eidasReq.getSpType()); +    Assert.assertEquals("wrong LoA", EaafConstants.EIDAS_LOA_HIGH,  +        eidasReq.getLevelOfAssurance()); +     +    Assert.assertEquals("Wrong req. attr. size", 4, eidasReq.getRequestedAttributes().size()); +     +  } +   +  @Test +  public void privateSpWithCountryLu() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException, UnsupportedEncodingException { +    //set-up test +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU"); +    executionContext.put("selectedEnvironment", "prod"); +     +    String providerName = RandomStringUtils.randomAlphanumeric(10); +    String requesterId = RandomStringUtils.randomAlphanumeric(10); +    pendingReq.setRawDataToTransaction(Constants.DATA_PROVIDERNAME, providerName); +    pendingReq.setRawDataToTransaction(Constants.DATA_REQUESTERID, requesterId); +     +    spConfig.put("target",  +        EaafConstants.URN_PREFIX_WBPK_TARGET_WITH_X + "FN+" + RandomStringUtils.randomNumeric(6)); +             +    basicConfig.removeConfigValue("eidas.ms.auth.eIDAS.node_v2.publicSectorTargets"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderName", "true"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier", "true"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.useStaticProviderNameForPublicSPs", "true"); +             +    String dynEndPoint = "http://test/" + RandomStringUtils.randomAlphabetic(5); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.endpoint", dynEndPoint);     +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.method", "GET"); +     +    //execute test +    task.execute(pendingReq, executionContext); +         +    //validate state +    Assert.assertEquals("Wrong http statusCode", 302, httpResp.getStatus()); +    Assert.assertNotNull("No redirect header", httpResp.getHeaderValue("Location")); +    Assert.assertTrue("Wrong redirect endpoint",  +        ((String) httpResp.getHeaderValue("Location")).startsWith(dynEndPoint)); +         +     +    final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null); + +    Assert.assertEquals("PrividerName", "myNode", eidasReq.getProviderName()); +    Assert.assertEquals("RequesterId", "myNode", eidasReq.getRequesterId()); +    Assert.assertEquals("no PublicSP", "private", eidasReq.getSpType()); +    Assert.assertEquals("wrong LoA", EaafConstants.EIDAS_LOA_HIGH,  +        eidasReq.getLevelOfAssurance()); +     +    Assert.assertEquals("Wrong req. attr. size", 4, eidasReq.getRequestedAttributes().size()); +     +  } +   +  @Test    public void withEidasNodePostReqNotValidTemplate() throws TaskExecutionException,        SpecificCommunicationException, EaafStorageException, UnsupportedEncodingException {      //set-up test @@ -409,6 +505,53 @@ public class GenerateAuthnRequestTaskTest {          EaafConstants.URN_PREFIX_WBPK_TARGET_WITH_X + "FN+" + RandomStringUtils.randomNumeric(6));      String providerName = RandomStringUtils.randomAlphanumeric(10);      pendingReq.setRawDataToTransaction(Constants.DATA_PROVIDERNAME, providerName); +    pendingReq.setRawDataToTransaction(Constants.DATA_REQUESTERID, "http://junit.sp"); + +    basicConfig.removeConfigValue("eidas.ms.auth.eIDAS.node_v2.publicSectorTargets"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderName", "true"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier", "true"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.useStaticProviderNameForPublicSPs", "false"); +     +    String dynEndPoint = "http://test/" + RandomStringUtils.randomAlphabetic(5); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.endpoint", dynEndPoint);     +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.method", "GET"); +         +     +    //perform test +    task.execute(pendingReq, executionContext); +     +    //validate state +    Assert.assertEquals("Wrong http statusCode", 302, httpResp.getStatus()); +    Assert.assertNotNull("No redirect header", httpResp.getHeaderValue("Location")); +    Assert.assertTrue("Wrong redirect endpoint",  +        ((String) httpResp.getHeaderValue("Location")).startsWith(dynEndPoint)); +     + +    final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null); + +    Assert.assertEquals("PrividerName", providerName, eidasReq.getProviderName()); +    Assert.assertEquals("RequesterId", "Wr8LrrVf5SYneblOlZdZNaLQQCCgzklfKQvyeZjBx10=", eidasReq.getRequesterId()); +    Assert.assertEquals("no PublicSP", "private", eidasReq.getSpType()); +    Assert.assertEquals("wrong LoA", "http://eidas.europa.eu/LoA/high", eidasReq.getLevelOfAssurance()); +     +  } +   +  @Test +  public void privateSPWithoutRequestIdHashing() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException { +    //set-up test +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +    spConfig.put("target",  +        EaafConstants.URN_PREFIX_WBPK_TARGET_WITH_X + "FN+" + RandomStringUtils.randomNumeric(6)); +    String providerName = RandomStringUtils.randomAlphanumeric(10); +    String requesterId = RandomStringUtils.randomAlphanumeric(10); +    pendingReq.setRawDataToTransaction(Constants.DATA_PROVIDERNAME, providerName); +    pendingReq.setRawDataToTransaction(Constants.DATA_REQUESTERID, requesterId);      basicConfig.removeConfigValue("eidas.ms.auth.eIDAS.node_v2.publicSectorTargets");      basicConfig.putConfigValue( @@ -417,6 +560,7 @@ public class GenerateAuthnRequestTaskTest {          "eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier", "true");      basicConfig.putConfigValue(          "eidas.ms.auth.eIDAS.node_v2.workarounds.useStaticProviderNameForPublicSPs", "false"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.node_v2.requesterId.useHashedForm", "false");      String dynEndPoint = "http://test/" + RandomStringUtils.randomAlphabetic(5);      basicConfig.putConfigValue( @@ -438,7 +582,7 @@ public class GenerateAuthnRequestTaskTest {      final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null);      Assert.assertEquals("PrividerName", providerName, eidasReq.getProviderName()); -    Assert.assertEquals("RequesterId", providerName, eidasReq.getRequesterId()); +    Assert.assertEquals("RequesterId", requesterId, eidasReq.getRequesterId());      Assert.assertEquals("no PublicSP", "private", eidasReq.getSpType());      Assert.assertEquals("wrong LoA", "http://eidas.europa.eu/LoA/high", eidasReq.getLevelOfAssurance()); diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java index d0ab50f4..7ac41500 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java @@ -146,9 +146,10 @@ public class EidasRequestPreProcessingFirstTest {      Assert.assertEquals("ProviderName is not Static",          Constants.DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP, lightReq.getProviderName()); +    Assert.assertNotSame("RequesterId was set", lightReq.getRequesterId());      Assert.assertEquals("no PublicSP", "public", lightReq.getSpType());      Assert.assertEquals("Requested attribute size not match", 8, lightReq.getRequestedAttributes().size());    } - +      } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java index c44e803b..4a03fac1 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java @@ -86,6 +86,9 @@ public class EidasRequestPreProcessingSecondTest {      authnRequestBuilder.issuer("Test");      authnRequestBuilder.levelOfAssurance(EaafConstants.EIDAS_LOA_HIGH); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.requesterId.lu.useStaticRequesterForAll", "true"); +        }    @Test @@ -106,4 +109,49 @@ public class EidasRequestPreProcessingSecondTest {    } + +  /* +   * Set ProviderName according to general configuration +   */ +  @Test +  public void prePreProcessLuPublicSpWithoutRequestId() throws EidPostProcessingException { + +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.requesterId.lu.useStaticRequesterForAll", "false"); +     +    final String testCountry = "LU"; +    authnRequestBuilder.citizenCountryCode(testCountry); +    preProcessor.preProcess(testCountry, pendingReq, authnRequestBuilder); + +    final LightRequest lightReq = authnRequestBuilder.build(); + +    Assert.assertEquals("ProviderName is not Static", "myNode", lightReq.getProviderName()); +    Assert.assertNull("RequesterId", lightReq.getRequesterId()); +    Assert.assertEquals("no PublicSP", "public", lightReq.getSpType()); +    Assert.assertEquals("Requested attribute size not match", 4, lightReq.getRequestedAttributes().size()); + +  } +   +  /*  +   * Always set requesterId and providername in case of country LU +   */ +  @Test +  public void prePreProcessLuPublicSpWithStaticRequesterId() throws EidPostProcessingException { + +     +    final String testCountry = "LU"; +    authnRequestBuilder.citizenCountryCode(testCountry); +    preProcessor.preProcess(testCountry, pendingReq, authnRequestBuilder); + +    final LightRequest lightReq = authnRequestBuilder.build(); + +    Assert.assertEquals("ProviderName is not Static", +        "myNode", lightReq.getProviderName()); +    Assert.assertEquals("RequesterId is not Static", +        "myNode", lightReq.getRequesterId()); +    Assert.assertEquals("no PublicSP", "public", lightReq.getSpType()); +    Assert.assertEquals("Requested attribute size not match", 4, lightReq.getRequestedAttributes().size()); + +  } +    } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml index 956cfcc9..cd2888c1 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml @@ -50,6 +50,11 @@      <property name="priority" value="1" />    </bean> +  <bean id="LU-PostProcessor" +    class="at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.LuEidProcessor"> +    <property name="priority" value="1" /> +  </bean> +   <bean id="eIDASAuthModule"      class="at.asitplus.eidas.specific.modules.auth.eidas.v2.EidasAuthenticationModulImpl">      <property name="priority" value="2" /> | 
