diff options
Diffstat (limited to 'eidas_modules/authmodule-eIDAS-v2/src')
33 files changed, 2248 insertions, 623 deletions
| 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 83a2afa6..1091981e 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 @@ -141,6 +141,9 @@ public class Constants {    public static final String eIDAS_ATTR_LEGALPERSONIDENTIFIER = "LegalPersonIdentifier";    public static final String eIDAS_ATTR_LEGALNAME = "LegalName"; +  public static final String eIDAS_REQ_PARAM_SECTOR_PUBLIC = "public"; +  public static final String eIDAS_REQ_PARAM_SECTOR_PRIVATE = "private"; +      public static final String POLICY_DEFAULT_ALLOWED_TARGETS =        EaafConstants.URN_PREFIX_CDID.replaceAll("\\.", "\\\\.").replaceAll("\\+", "\\\\+") + ".*"; diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasSignalServlet.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasSignalServlet.java index e9302f6d..d3cac80c 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasSignalServlet.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasSignalServlet.java @@ -47,7 +47,7 @@ import eu.eidas.auth.commons.EidasParameterKeys;  import eu.eidas.auth.commons.light.ILightResponse;  import eu.eidas.specificcommunication.SpecificCommunicationDefinitionBeanNames;  import eu.eidas.specificcommunication.exception.SpecificCommunicationException; -import eu.eidas.specificcommunication.protocol.impl.SpecificConnectorCommunicationServiceImpl; +import eu.eidas.specificcommunication.protocol.SpecificCommunicationService;  /**   * Controler implementation for eIDAS Node communication. @@ -108,8 +108,8 @@ public class EidasSignalServlet extends AbstractProcessEngineSignalController {        }        log.trace("Receive eIDAS-node token: " + tokenBase64 + " Starting transaction-restore process ... "); -      final SpecificConnectorCommunicationServiceImpl specificConnectorCommunicationService = -          (SpecificConnectorCommunicationServiceImpl) context.getBean( +      final SpecificCommunicationService specificConnectorCommunicationService = +          (SpecificCommunicationService) context.getBean(                SpecificCommunicationDefinitionBeanNames.SPECIFIC_CONNECTOR_COMMUNICATION_SERVICE.toString());        final ILightResponse eidasResponse = specificConnectorCommunicationService.getAndRemoveResponse(            tokenBase64, diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/EidasPersonalIdStoreDao.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/EidasPersonalIdStoreDao.java deleted file mode 100644 index c7acdb15..00000000 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/EidasPersonalIdStoreDao.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2018 A-SIT Plus GmbH - * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ, - * A-SIT Plus GmbH, A-SIT, and Graz University of Technology. - * - * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "License"); - * You may not use this work except in compliance with the License. - * You may obtain a copy of the License at: - * https://joinup.ec.europa.eu/news/understanding-eupl-v12 - * - * 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. - * - * This product combines work with different licenses. See the "NOTICE" text - * file for details on the various modules and licenses. - * The "NOTICE" text file is part of the distribution. Any derivative works - * that you distribute must include a readable copy of the "NOTICE" text file. - */ - -package at.asitplus.eidas.specific.modules.auth.eidas.v2.dao; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import at.gv.egiz.eaaf.core.impl.data.Pair; - -@Deprecated -public class EidasPersonalIdStoreDao { -  public static final String NAME = "foreigneIDMap"; - -  // Enum with all cols of this table -  public enum Cols { -    timestamp, transactionId, eidasId, eidasSourceCountry, eidasDestinationCountry, ernbId -  } - -  public enum T { -    ID("INTEGER"), -    BIGINT("VARCHAR(265)"), -    URI("VARCHAR(256)"), -    DATE("Long"), -    TEXT("TEXT"), -    Long("BIGINT"), -    Int("INTEGER"), -    BLOB("BLOB"), -    CC("CHAR(2)"), -    BOOL("INTEGER"); - -    private final String type; - -    T(String el) { -      type = el; -    } - -    @Override -    public String toString() { -      return type; -    } -  } - -  // define Cols of the table -  public static final List<Pair<String, T>> TABLE_COLS; -   -  static { -    final List<Pair<String, T>> cols = new ArrayList<>(); -    cols.add(Pair.newInstance(Cols.timestamp.name(), T.DATE)); -    cols.add(Pair.newInstance(Cols.transactionId.name(), T.TEXT)); -    cols.add(Pair.newInstance(Cols.eidasId.name(), T.TEXT)); -    cols.add(Pair.newInstance(Cols.eidasSourceCountry.name(), T.CC)); -    cols.add(Pair.newInstance(Cols.eidasDestinationCountry.name(), T.CC)); -    cols.add(Pair.newInstance(Cols.ernbId.name(), T.TEXT)); - -    TABLE_COLS = Collections.unmodifiableList(cols); - -  } - -  public static final String CREATE = "CREATE TABLE " + NAME -      + " (" + "id" + " " + T.ID.toString() -      + " PRIMARY KEY AUTOINCREMENT, " + buildCreateTableQuery(TABLE_COLS) + ")"; - -  public static final String INSERT = "INSERT INTO " + NAME -      + "(" + buildInsertQueryKeys(TABLE_COLS) + ")" -      + " VALUES (" + buildInsertQueryValues(TABLE_COLS) + ");"; - -  public static final String SELECT_BY_ERNB_ID = "SELECT * FROM " + NAME -      + " WHERE " + Cols.ernbId.name() + "=?;"; - -  public static final String SELECT_BY_EIDAS_RAW_ID = "SELECT * FROM " + NAME -      + " WHERE " + Cols.eidasId.name() + "=?" -      + " and " + Cols.eidasSourceCountry.name() + "=?" + ";"; - -  /** -   * Build a part of a SQL query, which contains the cols of a table that should -   * be created. -   *  -   * @param cols List of DB col definitions {@link Pair} -   * @return Part of a SQL query, which contains cols that should be created -   */ -  private static String buildCreateTableQuery(List<Pair<String, T>> cols) {     -    StringBuffer buf = new StringBuffer(); -    for (final Pair<String, T> el : cols) { -      buf.append(el.getFirst()); -      buf.append(" "); -      buf.append(el.getSecond()); -      buf.append(","); -       -    } -    String sql = buf.toString(); -    return sql.substring(0, sql.length() - 1); -     -  } - -  /** -   * Build a part of a SQL query, which contains the cols keys of a table for -   * insert operation. -   *  -   * @param cols List of DB col definitions {@link Pair} -   * @return Part of a SQL query, which contains cols that should be created -   */ -  protected static String buildInsertQueryKeys(List<Pair<String, T>> cols) { -     -    StringBuffer buf = new StringBuffer(); -    for (final Pair<String, T> el : cols) { -      buf.append(el.getFirst()); -      buf.append(","); - -    } -    String sql = buf.toString(); -    return sql.substring(0, sql.length() - 1); -  } - -  /** -   * Build a part of a SQL query, which contains the cols values of a table for -   * insert operation. -   *  -   * @param cols List of DB col definitions {@link Pair} -   * @return Part of a SQL query, which contains cols that should be created -   */ -  protected static String buildInsertQueryValues(List<Pair<String, T>> cols) { -     -    StringBuffer buf = new StringBuffer(); -    Iterator<Pair<String, T>> it = cols.iterator(); -    while (it.hasNext()) { -      buf.append("?,"); -      it.next(); -       -    } - -    String sql = buf.toString(); -    return sql.substring(0, sql.length() - 1); -  } - -} 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 fe839c37..42dbfeac 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 @@ -32,6 +32,7 @@ import org.joda.time.DateTime;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.NonNull;  import com.google.common.collect.ImmutableSortedSet; @@ -43,10 +44,10 @@ import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRe  import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils;  import at.gv.e_government.reference.namespace.persondata._20020228.PostalAddressType;  import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.data.EaafConstants;  import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP;  import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;  import at.gv.egiz.eaaf.core.impl.data.Triple; -import edu.umd.cs.findbugs.annotations.NonNull;  import eu.eidas.auth.commons.attribute.AttributeDefinition;  import eu.eidas.auth.commons.attribute.ImmutableAttributeMap;  import eu.eidas.auth.commons.light.impl.LightRequest.Builder; @@ -64,11 +65,13 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {    @Override    public final void preProcess(IRequest pendingReq, Builder authnRequestBuilder) { +    buildLevelOfAssurance(pendingReq.getServiceProviderConfiguration(), authnRequestBuilder);      buildProviderNameAttribute(pendingReq, authnRequestBuilder);      buildRequestedAttributes(authnRequestBuilder);    } +    @Override    public final ErnbEidData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,        EidasAttributeException { @@ -348,10 +351,36 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {        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 + +    // TODO: update if eIDAS ref. impl. supports exact matching for non-notified LoA +    // schemes +    String loa = EaafConstants.EIDAS_LOA_HIGH; +    if (spConfig.getRequiredLoA() != null) { +      if (spConfig.getRequiredLoA().isEmpty()) { +        log.info("No eIDAS LoA requested. Use LoA HIGH as default"); +      } else { +        if (spConfig.getRequiredLoA().size() > 1) { +          log.info( +              "Currently only ONE requested LoA is supported for service provider. Use first one ... "); +        } + +        loa = spConfig.getRequiredLoA().get(0); + +      } +    } +    log.debug("Request eIdAS node with LoA: " + loa); +    authnRequestBuilder.levelOfAssurance(loa); +        }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/EidasAttributeRegistry.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/EidasAttributeRegistry.java index 98c4c2de..e73491ab 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/EidasAttributeRegistry.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/EidasAttributeRegistry.java @@ -35,13 +35,13 @@ import org.apache.commons.lang3.StringUtils;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.NonNull;  import org.springframework.stereotype.Service;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP;  import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;  import at.gv.egiz.eaaf.core.impl.utils.KeyValueUtils; -import edu.umd.cs.findbugs.annotations.NonNull;  import eu.eidas.auth.commons.attribute.AttributeRegistries;  import eu.eidas.auth.commons.attribute.AttributeRegistry; diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java index 11f8fc04..7444454d 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java @@ -150,37 +150,37 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {            // get encrypted baseId            String vsz = szrClient.getEncryptedStammzahl(personInfo); -                             +                     +          //write revision-Log entry and extended infos personal-identifier mapping +          revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_VSZ_RECEIVED); +          writeExtendedRevisionLogEntry(simpleAttrMap, eidData); +           +                      // get eIDAS bind            String signedEidasBind = szrClient.getBcBind(vsz,                 authBlockSigner.getBase64EncodedPublicKey(),                 EID_STATUS); - +          revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_EIDASBIND_RECEIVED); +          authProcessData.setGenericDataToSession(Constants.EIDAS_BIND, signedEidasBind); +                      //get signed AuthBlock            String jwsSignature = authBlockSigner.buildSignedAuthBlock(pendingReq); -        -          //inject personal-data into session +          revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.TECH_AUCHBLOCK_CREATED);            authProcessData.setGenericDataToSession(Constants.SZR_AUTHBLOCK, jwsSignature); -          authProcessData.setGenericDataToSession(Constants.EIDAS_BIND, signedEidasBind); +           +          //inject personal-data into session            authProcessData.setEidProcess(true);          } else {            //request SZR            SzrResultHolder idlResult = requestSzrForIdentityLink(personInfo); -          // write ERnB input-data into revision-log -          if (basicConfig.getBasicConfigurationBoolean( -              Constants.CONIG_PROPS_EIDAS_SZRCLIENT_WORKAROUND_REVISIONLOGDATASTORE_ACTIVE, false)) { -            revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_ERNB_EIDAS_RAW_ID, -                                     (String) simpleAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER)); -            revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_ERNB_EIDAS_ERNB_ID, eidData.getPseudonym()); - -          } +          //write revision-Log entry for personal-identifier mapping +          writeExtendedRevisionLogEntry(simpleAttrMap, eidData);            //check result-data and write revision-log based on current state            checkStateAndWriteRevisionLog(idlResult); -            //inject personal-data into session            authProcessData.setIdentityLink(idlResult.getIdentityLink());              authProcessData.setEidProcess(false); @@ -219,6 +219,17 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {      }    } +  private void writeExtendedRevisionLogEntry(Map<String, Object> simpleAttrMap, ErnbEidData eidData) { +    // write ERnB input-data into revision-log +    if (basicConfig.getBasicConfigurationBoolean( +        Constants.CONIG_PROPS_EIDAS_SZRCLIENT_WORKAROUND_REVISIONLOGDATASTORE_ACTIVE, false)) { +      revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_ERNB_EIDAS_RAW_ID, +                               (String) simpleAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER)); +      revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_ERNB_EIDAS_ERNB_ID, eidData.getPseudonym()); + +    } +  } +      private PersonInfoType generateSzrRequest(ErnbEidData eidData) {      log.debug("Starting connecting SZR Gateway");      final PersonInfoType personInfo = new PersonInfoType(); @@ -281,14 +292,18 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {      IIdentityLink identityLink = new SimpleIdentityLinkAssertionParser(idlFromSzr).parseIdentityLink();      // get bPK from SZR -    String bpk; +    String bpk = null;      if (basicConfig          .getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_DEBUG_USESRZFORBPKGENERATION, true)) { -      bpk = szrClient +      List<String> bpkList = szrClient            .getBpk(personInfo, pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier(),                    basicConfig -                      .getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_VKZ, "no VKZ defined")) -          .get(0); +                      .getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_VKZ, "no VKZ defined")); +      if (!bpkList.isEmpty()) { +        bpk = bpkList.get(0); +         +      } +              } else {        log.debug("Calculating bPK from baseId ... "); @@ -382,7 +397,7 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {        } else {          final List<String> natPersonIdObj = EidasResponseUtils -            .translateStringListAttribute(el, attributeMap.get(el).asList()); +            .translateStringListAttribute(el, attributeMap.get(el));          final String stringAttr = natPersonIdObj.get(0);          if (StringUtils.isNotEmpty(stringAttr)) {            result.put(el.getFriendlyName(), stringAttr); diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java index 0b6e9ee8..92f58877 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java @@ -41,10 +41,8 @@ import at.asitplus.eidas.specific.connector.gui.StaticGuiBuilderConfiguration;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService; -import at.gv.egiz.eaaf.core.api.data.EaafConstants;  import at.gv.egiz.eaaf.core.api.gui.ISpringMvcGuiFormBuilder;  import at.gv.egiz.eaaf.core.api.idp.IConfiguration; -import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;  import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;  import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage;  import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException; @@ -87,9 +85,6 @@ public class GenerateAuthnRequestTask extends AbstractAuthServletTask {        throws TaskExecutionException {      try { -      // get service-provider configuration -      final ISpConfiguration spConfig = pendingReq.getServiceProviderConfiguration(); -        // get target, environment and validate citizen countryCode        final String citizenCountryCode = (String) executionContext.get(            MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY); @@ -110,6 +105,13 @@ public class GenerateAuthnRequestTask extends AbstractAuthServletTask {        final LightRequest.Builder authnRequestBuilder = LightRequest.builder();        authnRequestBuilder.id(UUID.randomUUID().toString()); +      // set nameIDFormat +      authnRequestBuilder.nameIdFormat(Constants.eIDAS_REQ_NAMEID_FORMAT); + +      // set citizen country code for foreign uses +      authnRequestBuilder.citizenCountryCode(citizenCountryCode); +       +      //set Issuer        final String issur = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_ENTITYID);        if (StringUtils.isEmpty(issur)) {          log.error("Found NO 'eIDAS node issuer' in configuration. Authentication NOT possible!"); @@ -119,42 +121,7 @@ public class GenerateAuthnRequestTask extends AbstractAuthServletTask {        }        authnRequestBuilder.issuer(issur); -      // TODO: set matching mode if eIDAS ref. impl. support this method - -      // TODO: update if eIDAS ref. impl. supports exact matching for non-notified LoA -      // schemes -      String loa = EaafConstants.EIDAS_LOA_HIGH; -      if (spConfig.getRequiredLoA() != null) { -        if (spConfig.getRequiredLoA().isEmpty()) { -          log.info("No eIDAS LoA requested. Use LoA HIGH as default"); -        } else { -          if (spConfig.getRequiredLoA().size() > 1) { -            log.info( -                "Currently only ONE requested LoA is supported for service provider. Use first one ... "); -          } - -          loa = spConfig.getRequiredLoA().get(0); - -        } -      } - -      log.debug("Request eIdAS node with LoA: " + loa); -      authnRequestBuilder.levelOfAssurance(loa); - -      // set nameIDFormat -      authnRequestBuilder.nameIdFormat(Constants.eIDAS_REQ_NAMEID_FORMAT); - -      // set citizen country code for foreign uses -      authnRequestBuilder.citizenCountryCode(citizenCountryCode); - -      // set relay state -      /* -       * TODO: SecureToken PendingRequestId generates a validation exception in -       * eIDASNode because eIDASNode implements limit on size for RelayState -       * (80characaters) -       */ -      // authnRequestBuilder.relayState(pendingReq.getPendingRequestId()); - +              // Add country-specific informations into eIDAS request        ccSpecificProcessing.preProcess(citizenCountryCode, pendingReq, authnRequestBuilder); diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java index ebd2ae78..c8c5a069 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java @@ -36,6 +36,7 @@ import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.gv.egiz.eaaf.core.impl.data.Triple; @@ -98,38 +99,44 @@ public class EidasResponseUtils {     */    // TODO: check possible problem with nonLatinCharacters    public static List<String> translateStringListAttribute(AttributeDefinition<?> attributeDefinition, -      ImmutableList<? extends AttributeValue<?>> attributeValues) { +      ImmutableSet<? extends AttributeValue<?>> attributeValues) {      final List<String> stringListAttribute = new ArrayList<>(); -    final AttributeValueMarshaller<?> attributeValueMarshaller = attributeDefinition -        .getAttributeValueMarshaller(); -    for (final AttributeValue<?> attributeValue : attributeValues) { -      String valueString = null; -      try { -        valueString = attributeValueMarshaller.marshal((AttributeValue) attributeValue); - -        log.trace("Find attr: {} with value: {} nonLatinFlag: {} needTransliteration: {}", -            attributeDefinition.getFriendlyName(), attributeValue.toString(), -            attributeValue.isNonLatinScriptAlternateVersion(),  -            AttributeValueTransliterator.needsTransliteration(valueString)); - -        // if (attributeValue.isNonLatinScriptAlternateVersion()) { -        if (!AttributeValueTransliterator.needsTransliteration(valueString)) { -          stringListAttribute.add(0, valueString); - -        } else { -          log.trace("Find 'needsTransliteration' flag. Setting this value at last list element ... "); -          stringListAttribute.add(valueString); +    if (attributeValues != null) { +      final AttributeValueMarshaller<?> attributeValueMarshaller = attributeDefinition +          .getAttributeValueMarshaller(); +      for (final AttributeValue<?> attributeValue : attributeValues.asList()) { +        String valueString = null; +        try { +          valueString = attributeValueMarshaller.marshal((AttributeValue) attributeValue); -        } +          log.trace("Find attr: {} with value: {} nonLatinFlag: {} needTransliteration: {}", +              attributeDefinition.getFriendlyName(), attributeValue.toString(), +              attributeValue.isNonLatinScriptAlternateVersion(),  +              AttributeValueTransliterator.needsTransliteration(valueString)); + +          // if (attributeValue.isNonLatinScriptAlternateVersion()) { +          if (!AttributeValueTransliterator.needsTransliteration(valueString)) { +            stringListAttribute.add(0, valueString); + +          } else { +            log.trace("Find 'needsTransliteration' flag. Setting this value at last list element ... "); +            stringListAttribute.add(valueString); -      } catch (final AttributeValueMarshallingException e) { -        throw new IllegalStateException(e); +          } +        } catch (final AttributeValueMarshallingException e) { +          throw new IllegalStateException(e); + +        }        } -    } -    log.trace("Extract values: {} for attr: {}",  -        StringUtils.join(stringListAttribute, ","), attributeDefinition.getFriendlyName()); +      log.trace("Extract values: {} for attr: {}",  +          StringUtils.join(stringListAttribute, ","), attributeDefinition.getFriendlyName()); +       +    } else { +      log.info("Can not extract infos from 'null' attribute value"); +       +    }      return stringListAttribute; diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/validator/EidasResponseValidator.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/validator/EidasResponseValidator.java index 1836e87b..9d9a0647 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/validator/EidasResponseValidator.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/validator/EidasResponseValidator.java @@ -29,7 +29,7 @@ import org.apache.commons.lang3.StringUtils;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasValidationException; @@ -98,8 +98,8 @@ public class EidasResponseValidator {       */      final AttributeDefinition<?> attrDefinition = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(          Constants.eIDAS_ATTR_PERSONALIDENTIFIER).first(); -    final ImmutableList<? extends AttributeValue<?>> attributeValues = eidasResponse.getAttributes() -        .getAttributeMap().get(attrDefinition).asList(); +    final ImmutableSet<? extends AttributeValue<?>> attributeValues = eidasResponse.getAttributes() +        .getAttributeMap().get(attrDefinition);      final List<String> personalIdObj = EidasResponseUtils.translateStringListAttribute(attrDefinition,          attributeValues); diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasAuthenticationModulImplTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasAuthenticationModulImplTest.java index c66d8ec0..088c835c 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasAuthenticationModulImplTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasAuthenticationModulImplTest.java @@ -30,7 +30,9 @@ import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;  import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;  @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"})  @DirtiesContext(classMode = ClassMode.BEFORE_CLASS)  public class EidasAuthenticationModulImplTest { diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasSignalServletTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasSignalServletTest.java new file mode 100644 index 00000000..d2973e1d --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasSignalServletTest.java @@ -0,0 +1,244 @@ +package at.asitplus.eidas.specific.modules.auth.eidas.v2.test; + +import static at.asitplus.eidas.specific.connector.MsEidasNodeConstants.PROP_CONFIG_SP_NEW_EID_MODE; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummyConfigMap; +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummySpConfiguration; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.EidasSignalServlet; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummySpecificCommunicationService; +import at.gv.egiz.eaaf.core.api.IRequestStorage; +import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; +import at.gv.egiz.eaaf.core.api.data.EaafConstants; +import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage; +import at.gv.egiz.eaaf.core.exceptions.EaafException; +import at.gv.egiz.eaaf.core.exceptions.EaafStorageException; +import at.gv.egiz.eaaf.core.impl.idp.module.test.DummyProtocolAuthService; +import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; +import at.gv.egiz.eaaf.core.impl.utils.Random; +import eu.eidas.auth.commons.EidasParameterKeys; +import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse; +import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse.Builder; +import eu.eidas.auth.commons.tx.BinaryLightToken; +import eu.eidas.specificcommunication.exception.SpecificCommunicationException; + +@RunWith(SpringJUnit4ClassRunner.class) +@PrepareForTest(CreateIdentityLinkTask.class) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"}) +@EnableWebMvc +public class EidasSignalServletTest { + +  @Autowired private MsConnectorDummyConfigMap basicConfig; +  @Autowired private EidasSignalServlet controller; +  @Autowired private IRequestStorage storage; +  @Autowired private ITransactionStorage transStore; +  @Autowired private DummyProtocolAuthService protAuthService; +  @Autowired private DummySpecificCommunicationService connector; +   +   +  private MockHttpServletRequest httpReq; +  private MockHttpServletResponse httpResp; +  private TestRequestImpl pendingReq; +  private MsConnectorDummySpConfiguration oaParam; +   +    +  /** +   * jUnit test set-up. +   */ +  @Before +  public void setUp() throws EaafStorageException, URISyntaxException { +    httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); +    httpResp = new MockHttpServletResponse(); +    RequestContextHolder.resetRequestAttributes(); +    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp)); +     +    final Map<String, String> spConfig = new HashMap<>(); +    spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp"); +    spConfig.put("target", "urn:publicid:gv.at:cdid+XX"); +    spConfig.put(PROP_CONFIG_SP_NEW_EID_MODE, "true"); +    oaParam = new MsConnectorDummySpConfiguration(spConfig, basicConfig); +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH)); +    pendingReq = new TestRequestImpl(); + +    pendingReq.setSpConfig(oaParam); +    pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue()); +    pendingReq.setAuthUrl("http://test.com/"); +    pendingReq.setTransactionId("avaasbav"); +    pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10)); +    +    connector.setiLightResponse(null); +     +     +  } +   +  @Test +  public void noResponsToken() throws IOException, EaafException { +    //set-up +          +    //execute test +    controller.restoreEidasAuthProcess(httpReq, httpResp); +        +    //validate state +    Assert.assertNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE)); +    Assert.assertNotNull("missing error", protAuthService.getException()); +    Assert.assertEquals("Wrong errorId", "auth.26",  +        ((EaafException) protAuthService.getException()).getErrorId()); +     +  } +   +  @Test +  public void unknownResponseToken() throws IOException, EaafException { +    //set-up +    httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),  +        RandomStringUtils.randomAlphanumeric(10)); +          +    //execute test +    controller.restoreEidasAuthProcess(httpReq, httpResp); +        +    //validate state +    Assert.assertNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE)); +    Assert.assertNotNull("missing error", protAuthService.getException()); +    Assert.assertEquals("Wrong errorId", "auth.26",  +        ((EaafException) protAuthService.getException()).getErrorId()); +     +  } +   +  @Test +  public void withRelayState() throws IOException, EaafException, SpecificCommunicationException { +    //set-up                  +    String relayState = RandomStringUtils.randomAlphanumeric(10);     +    pendingReq.setPendingReqId(relayState); +    storage.storePendingRequest(pendingReq); +     +    Builder iLightResponse = new AuthenticationResponse.Builder(); +    iLightResponse.id("_".concat(Random.nextHexRandom16())) +        .issuer(RandomStringUtils.randomAlphabetic(10)) +        .subject(RandomStringUtils.randomAlphabetic(10)) +        .statusCode(Constants.SUCCESS_URI) +        .inResponseTo("_".concat(Random.nextHexRandom16())) +        .subjectNameIdFormat("afaf") +        .relayState(relayState); +      +    AuthenticationResponse eidasResp = iLightResponse.build(); +    BinaryLightToken token = connector.putResponse(eidasResp);     +    httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),  +        Base64.getEncoder().encodeToString(token.getTokenBytes())); + +     +    //execute test +    controller.restoreEidasAuthProcess(httpReq, httpResp); +        +     +    //validate state +    Assert.assertNotNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE)); +    Assert.assertEquals("wrong eIDAS response", eidasResp,  +        httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE)); +     +    Assert.assertNotNull("missing error", protAuthService.getException());     +    Assert.assertEquals("Wrong errorId", "PendingRequest object is not of type 'RequestImpl.class'",  +        ((EaafException) protAuthService.getException()).getErrorId()); +     +  } +   +  @Test +  public void withOutRelayStateMissingPendingReq() throws IOException, EaafException, SpecificCommunicationException { +    //set-up                  +    String pendingReqId = RandomStringUtils.randomAlphanumeric(10);     +    pendingReq.setPendingReqId(pendingReqId); +    storage.storePendingRequest(pendingReq); +     +    String inResponseTo = "_".concat(Random.nextHexRandom16()); +     +    Builder iLightResponse = new AuthenticationResponse.Builder(); +    iLightResponse.id("_".concat(Random.nextHexRandom16())) +        .issuer(RandomStringUtils.randomAlphabetic(10)) +        .subject(RandomStringUtils.randomAlphabetic(10)) +        .statusCode(Constants.SUCCESS_URI) +        .inResponseTo(inResponseTo) +        .subjectNameIdFormat("afaf"); +      +    AuthenticationResponse eidasResp = iLightResponse.build(); +    BinaryLightToken token = connector.putResponse(eidasResp);     +    httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),  +        Base64.getEncoder().encodeToString(token.getTokenBytes())); + +     +    //execute test +    controller.restoreEidasAuthProcess(httpReq, httpResp); +        +     +    //validate state +    Assert.assertNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE)); +    Assert.assertNotNull("missing error", protAuthService.getException()); +    Assert.assertEquals("Wrong errorId", "auth.26",  +        ((EaafException) protAuthService.getException()).getErrorId()); +     +  } +   +  @Test +  public void withInResponseToElement() throws IOException, EaafException, SpecificCommunicationException { +    //set-up                  +    String pendingReqId = RandomStringUtils.randomAlphanumeric(10);     +    pendingReq.setPendingReqId(pendingReqId); +    storage.storePendingRequest(pendingReq); +             +    String inResponseTo = "_".concat(Random.nextHexRandom16()); +    transStore.put(inResponseTo, pendingReqId, -1); +     +    Builder iLightResponse = new AuthenticationResponse.Builder(); +    iLightResponse.id("_".concat(Random.nextHexRandom16())) +        .issuer(RandomStringUtils.randomAlphabetic(10)) +        .subject(RandomStringUtils.randomAlphabetic(10)) +        .statusCode(Constants.SUCCESS_URI) +        .inResponseTo(inResponseTo) +        .subjectNameIdFormat("afaf"); +      +    AuthenticationResponse eidasResp = iLightResponse.build(); +    BinaryLightToken token = connector.putResponse(eidasResp);     +    httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),  +        Base64.getEncoder().encodeToString(token.getTokenBytes())); + +     +    //execute test +    controller.restoreEidasAuthProcess(httpReq, httpResp); +        +     +    //validate state +    Assert.assertNotNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE)); +    Assert.assertEquals("wrong eIDAS response", eidasResp,  +        httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE)); +     +    Assert.assertNotNull("missing error", protAuthService.getException());     +    Assert.assertEquals("Wrong errorId", "PendingRequest object is not of type 'RequestImpl.class'",  +        ((EaafException) protAuthService.getException()).getErrorId()); +     +  } +   +} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTest.java index 9709aeb9..b54b8800 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTest.java @@ -31,7 +31,6 @@ import java.io.IOException;  import java.security.InvalidKeyException;  import java.security.MessageDigest;  import java.security.NoSuchProviderException; -import java.util.Arrays;  import java.util.List;  import javax.xml.bind.JAXBContext; @@ -45,7 +44,6 @@ import org.apache.commons.lang3.StringUtils;  import org.apache.cxf.binding.soap.SoapFault;  import org.junit.Assert;  import org.junit.Before; -import org.junit.BeforeClass;  import org.junit.Ignore;  import org.junit.Rule;  import org.junit.Test; @@ -88,7 +86,9 @@ import szrservices.SignContentResponseType;  import szrservices.TravelDocumentType;  @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"})  public class SzrClientTest {    private static final Logger log = LoggerFactory.getLogger(SzrClientTest.class); @@ -110,18 +110,6 @@ public class SzrClientTest {    public SoapServiceRule soap = SoapServiceRule.newInstance();    /** -   * jUnit class initializer. -   * -   * @throws IOException In case of an error -   */ -  @BeforeClass -  public static void classInitializer() throws IOException { -    final String current = new java.io.File(".").toURI().toString(); -    System.setProperty("eidas.ms.configuration", current + "../../basicConfig/default_config.properties"); - -  } - -  /**     * Initialize jUnit test.     */    @Before diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTestProduction.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTestProduction.java index 2f573f53..f9a134a6 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTestProduction.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTestProduction.java @@ -61,7 +61,9 @@ import szrservices.TravelDocumentType;  @Ignore  @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_basic_test.xml") +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_realConfig.xml"})  public class SzrClientTestProduction {    private static final Logger log = LoggerFactory.getLogger(SzrClientTestProduction.class); diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java index 44fa01e8..8cda745a 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java @@ -6,8 +6,6 @@ import static org.mockito.Mockito.times;  import static org.mockito.Mockito.verify;  import static org.powermock.api.mockito.PowerMockito.when; -import java.io.IOException; -import java.net.URI;  import java.net.URISyntaxException;  import java.security.KeyStore;  import java.security.Provider; @@ -19,8 +17,6 @@ import java.util.Iterator;  import java.util.List;  import java.util.Map; -import javax.xml.namespace.QName; -  import org.apache.commons.lang3.RandomStringUtils;  import org.jetbrains.annotations.NotNull;  import org.jose4j.jwa.AlgorithmConstraints; @@ -28,7 +24,6 @@ import org.jose4j.jwa.AlgorithmConstraints.ConstraintType;  import org.jose4j.jws.AlgorithmIdentifiers;  import org.junit.Assert;  import org.junit.Before; -import org.junit.BeforeClass;  import org.junit.Rule;  import org.junit.Test;  import org.junit.runner.RunWith; @@ -48,6 +43,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;  import com.skjolberg.mockito.soap.SoapServiceRule;  import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummyConfigMap;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.SzrCommunicationException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry; @@ -59,7 +55,6 @@ import at.gv.egiz.eaaf.core.api.IRequestStorage;  import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants;  import at.gv.egiz.eaaf.core.api.data.EaafConstants;  import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions; -import at.gv.egiz.eaaf.core.api.idp.IConfiguration;  import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;  import at.gv.egiz.eaaf.core.exceptions.EaafException;  import at.gv.egiz.eaaf.core.exceptions.EaafStorageException; @@ -75,7 +70,7 @@ import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;  import at.gv.egiz.eaaf.core.impl.utils.Random;  import eu.eidas.auth.commons.attribute.AttributeDefinition;  import eu.eidas.auth.commons.attribute.ImmutableAttributeMap; -import eu.eidas.auth.commons.attribute.PersonType; +import eu.eidas.auth.commons.attribute.ImmutableAttributeMap.Builder;  import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;  import lombok.val;  import szrservices.JwsHeaderParam; @@ -85,18 +80,18 @@ import szrservices.SignContentEntry;  import szrservices.SignContentResponseType;  @RunWith(SpringJUnit4ClassRunner.class) -//@RunWith(PowerMockRunner.class) -//@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)  @PrepareForTest(CreateIdentityLinkTask.class)  @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"})  public class CreateIdentityLinkTaskEidNewTest {    @Autowired(required = true)    private CreateIdentityLinkTask task;    @Autowired(required = true) -  private IConfiguration basicConfig; +  private MsConnectorDummyConfigMap basicConfig;    @Autowired    protected EidasAttributeRegistry attrRegistry; @@ -129,18 +124,6 @@ public class CreateIdentityLinkTaskEidNewTest {    public final SoapServiceRule soap = SoapServiceRule.newInstance();    /** -   * jUnit class initializer. -   * -   * @throws IOException In case of an error -   */ -  @BeforeClass -  public static void classInitializer() throws IOException { -    final String current = new java.io.File(".").toURI().toString(); -    System.setProperty("eidas.ms.configuration", current + "src/test/resources/config/junit_config_3.properties"); - -  } - -  /**     * jUnit test set-up.     */    @Before @@ -150,7 +133,9 @@ public class CreateIdentityLinkTaskEidNewTest {      httpResp = new MockHttpServletResponse();      RequestContextHolder.resetRequestAttributes();      RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp)); - +        +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +          final Map<String, String> spConfig = new HashMap<>();      spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp");      spConfig.put("target", "urn:publicid:gv.at:cdid+XX"); @@ -158,10 +143,11 @@ public class CreateIdentityLinkTaskEidNewTest {      oaParam = new DummySpConfiguration(spConfig, basicConfig);      pendingReq = new TestRequestImpl(); -    response = buildDummyAuthResponse(); - +    response = buildDummyAuthResponse(false);      pendingReq.getSessionData(AuthProcessDataWrapper.class)          .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response); + +          pendingReq.setSpConfig(oaParam);      pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue());      pendingReq.setAuthUrl("http://test.com/"); @@ -175,8 +161,12 @@ public class CreateIdentityLinkTaskEidNewTest {    }    @Test -  public void successfulProcess() throws Exception { +  public void successfulProcessWithDeInfos() throws Exception {      //initialize test +    response = buildDummyAuthResponse(true); +    pendingReq.getSessionData(AuthProcessDataWrapper.class) +        .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response); +          String vsz = RandomStringUtils.randomNumeric(10);      when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(vsz);      val signContentResp = new SignContentResponseType(); @@ -255,6 +245,15 @@ public class CreateIdentityLinkTaskEidNewTest {              .toString().split("T")[0],           person.getPerson().getDateOfBirth()); +    Assert.assertEquals("PlaceOfBirth",  +        response.getAttributes().getAttributeValuesByFriendlyName("PlaceOfBirth").getFirstValue( +            response.getAttributes().getDefinitionsByFriendlyName("PlaceOfBirth").iterator().next()),  +        person.getPerson().getPlaceOfBirth());     +    Assert.assertEquals("BirthName",  +        response.getAttributes().getAttributeValuesByFriendlyName("BirthName").getFirstValue( +            response.getAttributes().getDefinitionsByFriendlyName("BirthName").iterator().next()),  +        person.getPerson().getAlternativeName().getFamilyName()); +          Assert.assertEquals("CitizenCountry", "LU", person.getTravelDocument().getIssuingCountry());      Assert.assertEquals("DocumentType", "ELEKTR_DOKUMENT", person.getTravelDocument().getDocumentType()); @@ -304,6 +303,81 @@ public class CreateIdentityLinkTaskEidNewTest {    }    @Test +  public void successfulProcessWithStandardInfos() throws Exception { +    //initialize test     +    String vsz = RandomStringUtils.randomNumeric(10); +    when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(vsz); +    val signContentResp = new SignContentResponseType(); +    final SignContentEntry signContentEntry = new SignContentEntry(); +    signContentEntry.setValue(RandomStringUtils.randomAlphanumeric(10)); +    signContentResp.getOut().add(signContentEntry); +    when(szrMock, "signContent", any(), any(), any()).thenReturn(signContentResp); + +    String randomTestSp = RandomStringUtils.randomAlphabetic(10); +    pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp); +     +    //perform test +    task.execute(pendingReq, executionContext); + +    //validate state     +    // check if pendingRequest was stored +    IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId()); +    Assert.assertNotNull("pendingReq not stored", storedPendingReq); +     +    //check data in session +    final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class); +    Assert.assertNotNull("AuthProcessData", authProcessData); +    Assert.assertNotNull("eidasBind", authProcessData.getGenericDataFromSession(Constants.EIDAS_BIND, String.class)); + +    String authBlock = authProcessData.getGenericDataFromSession(Constants.SZR_AUTHBLOCK, String.class); +    Assert.assertNotNull("AuthBlock", authBlock); +     +    Assert.assertTrue("EID process", authProcessData.isEidProcess()); +    Assert.assertTrue("foreigner process", authProcessData.isForeigner()); +    Assert.assertEquals("EID-ISSUING_NATION", "LU",  +        authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class)); +    Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel()); +    Assert.assertEquals("LoA", response.getLevelOfAssurance(),  +        authProcessData.getQaaLevel()); +       +    // check vsz request +    ArgumentCaptor<PersonInfoType> argument4 = ArgumentCaptor.forClass(PersonInfoType.class); +    ArgumentCaptor<Boolean> argument5 = ArgumentCaptor.forClass(Boolean.class);         +    verify(szrMock, times(1)).getStammzahlEncrypted(argument4.capture(), argument5.capture()); +     +    Boolean param5 = argument5.getValue(); +    Assert.assertTrue("insertERnP flag", param5);     +    PersonInfoType person = argument4.getValue(); +    Assert.assertEquals("FamilyName",  +        response.getAttributes().getAttributeValuesByFriendlyName("FamilyName").getFirstValue( +            response.getAttributes().getDefinitionsByFriendlyName("FamilyName").iterator().next()),  +        person.getPerson().getName().getFamilyName()); +    Assert.assertEquals("GivenName",  +        response.getAttributes().getAttributeValuesByFriendlyName("FirstName").getFirstValue( +            response.getAttributes().getDefinitionsByFriendlyName("FirstName").iterator().next()),  +        person.getPerson().getName().getGivenName()); +    Assert.assertEquals("DateOfBirth",  +        response.getAttributes().getAttributeValuesByFriendlyName("DateOfBirth").getFirstValue( +            response.getAttributes().getDefinitionsByFriendlyName("DateOfBirth").iterator().next()) +            .toString().split("T")[0],  +        person.getPerson().getDateOfBirth()); +     +    Assert.assertNull("PlaceOfBirth", person.getPerson().getPlaceOfBirth());      +    Assert.assertNull("BirthName", person.getPerson().getAlternativeName()); +     +    Assert.assertEquals("CitizenCountry", "LU", person.getTravelDocument().getIssuingCountry()); +    Assert.assertEquals("DocumentType", "ELEKTR_DOKUMENT", person.getTravelDocument().getDocumentType()); +     +    Assert.assertEquals("Identifier",  +        response.getAttributes().getAttributeValuesByFriendlyName("PersonIdentifier").getFirstValue( +            response.getAttributes().getDefinitionsByFriendlyName("PersonIdentifier").iterator().next()) +            .toString().split("/")[2],  +        person.getTravelDocument().getDocumentNumber()); +            +    +  } +   +  @Test    public void getStammzahlEncryptedExceptionTest() throws Exception {      try {        when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(null); @@ -355,38 +429,40 @@ public class CreateIdentityLinkTaskEidNewTest {    }    @NotNull -  private AuthenticationResponse buildDummyAuthResponse() throws URISyntaxException { -    final AttributeDefinition attributeDef = AttributeDefinition.builder() -        .friendlyName(Constants.eIDAS_ATTR_PERSONALIDENTIFIER).nameUri(new URI("ad", "sd", "ff")) -        .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", "af")) -        .attributeValueMarshaller("eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller").build(); -    final AttributeDefinition attributeDef2 = AttributeDefinition.builder() -        .friendlyName(Constants.eIDAS_ATTR_CURRENTFAMILYNAME).nameUri(new URI("ad", "sd", "fff")) -        .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", "aff")) -        .attributeValueMarshaller("eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller").build(); -    final AttributeDefinition attributeDef3 = AttributeDefinition.builder() -        .friendlyName(Constants.eIDAS_ATTR_CURRENTGIVENNAME).nameUri(new URI("ad", "sd", "ffff")) -        .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", "afff")) -        .attributeValueMarshaller("eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller").build(); -    final AttributeDefinition attributeDef4 = AttributeDefinition.builder() -        .friendlyName(Constants.eIDAS_ATTR_DATEOFBIRTH).nameUri(new URI("ad", "sd", "fffff")) -        .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", "affff")) -        .attributeValueMarshaller("eu.eidas.auth.commons.attribute.impl.DateTimeAttributeValueMarshaller").build(); - -    final ImmutableAttributeMap attributeMap = ImmutableAttributeMap.builder() -        .put(attributeDef, "LU/ST/" + RandomStringUtils.randomNumeric(64)) -        .put(attributeDef2, RandomStringUtils.randomAlphabetic(10)) -        .put(attributeDef3, RandomStringUtils.randomAlphabetic(10)).put(attributeDef4, "2001-01-01").build(); +  private AuthenticationResponse buildDummyAuthResponse(boolean withAll) throws URISyntaxException { +    final AttributeDefinition attributeDef = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_PERSONALIDENTIFIER).first(); +    final AttributeDefinition attributeDef2 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_CURRENTFAMILYNAME).first(); +    final AttributeDefinition attributeDef3 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_CURRENTGIVENNAME).first(); +    final AttributeDefinition attributeDef4 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_DATEOFBIRTH).first(); +    final AttributeDefinition attributeDef5 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_PLACEOFBIRTH).first(); +    final AttributeDefinition attributeDef6 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_BIRTHNAME).first(); +    +    final Builder attributeMap = ImmutableAttributeMap.builder(); +    attributeMap.put(attributeDef, "LU/AT/" + RandomStringUtils.randomNumeric(64)); +    attributeMap.put(attributeDef2, RandomStringUtils.randomAlphabetic(10)); +    attributeMap.put(attributeDef3, RandomStringUtils.randomAlphabetic(10)); +    attributeMap.put(attributeDef4, "2001-01-01"); +    if (withAll) { +      attributeMap.put(attributeDef5, RandomStringUtils.randomAlphabetic(10)); +      attributeMap.put(attributeDef6, RandomStringUtils.randomAlphabetic(10)); +       +    }      val b = new AuthenticationResponse.Builder();      return b.id("_".concat(Random.nextHexRandom16()))          .issuer(RandomStringUtils.randomAlphabetic(10))          .subject(RandomStringUtils.randomAlphabetic(10)) -        .statusCode("200") +        .statusCode(Constants.SUCCESS_URI)          .inResponseTo("_".concat(Random.nextHexRandom16()))          .subjectNameIdFormat("afaf")          .levelOfAssurance(EaafConstants.EIDAS_LOA_PREFIX + RandomStringUtils.randomAlphabetic(5)) -        .attributes(attributeMap) +        .attributes(attributeMap.build())          .build();    }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskTest.java new file mode 100644 index 00000000..382041e5 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskTest.java @@ -0,0 +1,464 @@ +package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks; + +import static at.asitplus.eidas.specific.connector.MsEidasNodeConstants.PROP_CONFIG_SP_NEW_EID_MODE; +import static org.mockito.ArgumentMatchers.any; + +import java.net.URISyntaxException; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; + +import org.apache.commons.lang3.RandomStringUtils; +import org.jetbrains.annotations.NotNull; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import com.skjolberg.mockito.soap.SoapServiceRule; + +import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummyConfigMap; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask; +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.IRequestStorage; +import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; +import at.gv.egiz.eaaf.core.api.data.EaafConstants; +import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.exceptions.EaafException; +import at.gv.egiz.eaaf.core.exceptions.EaafStorageException; +import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; +import at.gv.egiz.eaaf.core.impl.credential.EaafKeyStoreFactory; +import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper; +import at.gv.egiz.eaaf.core.impl.idp.module.test.DummySpConfiguration; +import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; +import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl; +import at.gv.egiz.eaaf.core.impl.utils.Random; +import eu.eidas.auth.commons.attribute.AttributeDefinition; +import eu.eidas.auth.commons.attribute.ImmutableAttributeMap; +import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse; +import lombok.val; +import szrservices.GetBPK; +import szrservices.GetBPKResponse; +import szrservices.GetIdentityLinkEidasResponse; +import szrservices.PersonInfoType; +import szrservices.SZR; +import szrservices.SZRException_Exception; + +@RunWith(SpringJUnit4ClassRunner.class) +@PrepareForTest(CreateIdentityLinkTask.class) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"}) +public class CreateIdentityLinkTaskTest { + +  @Autowired(required = true) +  private CreateIdentityLinkTask task; + +  @Autowired(required = true) +  private MsConnectorDummyConfigMap basicConfig; +  @Autowired +  protected EidasAttributeRegistry attrRegistry; + +  @Autowired +  EaafKeyStoreFactory keyStoreFactory; + +  @Autowired +  private IRequestStorage requestStorage; + +  final ExecutionContext executionContext = new ExecutionContextImpl(); +  private MockHttpServletRequest httpReq; +  private MockHttpServletResponse httpResp; +  private TestRequestImpl pendingReq; +  private DummySpConfiguration oaParam; +  private SZR szrMock; +   +  private AuthenticationResponse response; +  private Map<String, String> spConfig; +   +  @Rule +  public final SoapServiceRule soap = SoapServiceRule.newInstance(); + +  /** +   * jUnit test set-up. +   */ +  @Before +  public void setUp() throws EaafStorageException, URISyntaxException { + +    httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); +    httpResp = new MockHttpServletResponse(); +    RequestContextHolder.resetRequestAttributes(); +    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp)); + +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "false"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.params.useSZRForbPKCalculation", "false"); +     +    spConfig = new HashMap<>(); +    spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp"); +    spConfig.put("target", "urn:publicid:gv.at:cdid+XX"); +    spConfig.put(PROP_CONFIG_SP_NEW_EID_MODE, "false"); +    oaParam = new DummySpConfiguration(spConfig, basicConfig); +    pendingReq = new TestRequestImpl(); + +    response = buildDummyAuthResponse(); + +    pendingReq.getSessionData(AuthProcessDataWrapper.class) +        .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response); +    pendingReq.setSpConfig(oaParam); +    pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue()); +    pendingReq.setAuthUrl("http://test.com/"); +    pendingReq.setTransactionId("avaasbav"); +    pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10)); +         +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "XX"); +    executionContext.put(EaafConstants.PROCESS_ENGINE_REQUIRES_NO_POSTAUTH_REDIRECT, true); + +    szrMock = soap.mock(SZR.class, "http://localhost:1234/demoszr"); +  } + +     +  @Test +  public void buildIdentityLink() throws Exception { +    //initialize test    +    setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml"); +      +    String randomTestSp = RandomStringUtils.randomAlphabetic(10); +    pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp); +        +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +     +     +    //perform test +    task.execute(pendingReq, executionContext); + +     +    //validate state     +    // check if pendingRequest was stored +    IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId()); +    Assert.assertNotNull("pendingReq not stored", storedPendingReq); +     +    //check data in session +    final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class); +    Assert.assertNotNull("AuthProcessData", authProcessData); +    Assert.assertNull("eidasBind", authProcessData.getGenericDataFromSession(Constants.EIDAS_BIND, String.class)); + +    String authBlock = authProcessData.getGenericDataFromSession(Constants.SZR_AUTHBLOCK, String.class); +    Assert.assertNull("AuthBlock", authBlock); +     +    Assert.assertFalse("EID process", authProcessData.isEidProcess()); +    Assert.assertTrue("foreigner process", authProcessData.isForeigner()); +    Assert.assertEquals("EID-ISSUING_NATION", "LU",  +        authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class)); +    Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel()); +    Assert.assertEquals("LoA", response.getLevelOfAssurance(),  +        authProcessData.getQaaLevel()); +         +    Assert.assertNotNull("IDL", authProcessData.getIdentityLink()); +    checkElement("Mustermann", authProcessData.getIdentityLink().getFamilyName()); +    checkElement("Hans", authProcessData.getIdentityLink().getGivenName()); +    checkElement("1989-05-05", authProcessData.getIdentityLink().getDateOfBirth()); +    checkElement("urn:publicid:gv.at:baseid", authProcessData.getIdentityLink().getIdentificationType()); +    checkElement("k+zDM1BVpN1WJO4x7ZQ3ng==", authProcessData.getIdentityLink().getIdentificationValue()); +    Assert.assertNotNull(authProcessData.getIdentityLink().getSerializedSamlAssertion()); +    Assert.assertNotNull(authProcessData.getIdentityLink().getSamlAssertion());     +    +    Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME)); +    Assert.assertEquals("wrong bPK", "XX:FkXtOaSSeR3elyL9KLLvijIYDMU=",  +        authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME)); +     +  } +   +  @Test +  public void buildIdentityLinkWithWbpk() throws Exception { +    //initialize test +    setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml"); +    spConfig.put("target", EaafConstants.URN_PREFIX_WBPK + "FN+123456i"); +     +    String randomTestSp = RandomStringUtils.randomAlphabetic(10); +    pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp); +        +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true"); +     +    //perform test +    task.execute(pendingReq, executionContext); + +     +    //validate state     +    // check if pendingRequest was stored +    IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId()); +    Assert.assertNotNull("pendingReq not stored", storedPendingReq); +     +    //check data in session +    final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class); +    Assert.assertNotNull("AuthProcessData", authProcessData); +    Assert.assertNull("eidasBind", authProcessData.getGenericDataFromSession(Constants.EIDAS_BIND, String.class)); + +    String authBlock = authProcessData.getGenericDataFromSession(Constants.SZR_AUTHBLOCK, String.class); +    Assert.assertNull("AuthBlock", authBlock); +     +    Assert.assertFalse("EID process", authProcessData.isEidProcess()); +    Assert.assertTrue("foreigner process", authProcessData.isForeigner()); +    Assert.assertEquals("EID-ISSUING_NATION", "LU",  +        authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class)); +    Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel()); +    Assert.assertEquals("LoA", response.getLevelOfAssurance(),  +        authProcessData.getQaaLevel()); +    +    Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME)); +    Assert.assertEquals("wrong bPK", "FN+123456i:D26vJncPS2W790RH/LP04V+vNOQ=",  +        authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME)); +     +  } +   +  @Test +  public void buildIdentityLinkWithEidasBpk() throws Exception { +    //initialize test +    setSzrResponseIdentityLink("/data/szr/szr_resp_valid_2.xml"); +    spConfig.put("target", EaafConstants.URN_PREFIX_EIDAS + "AT+EU"); +     +    String randomTestSp = RandomStringUtils.randomAlphabetic(10); +    pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp); +        +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true"); +     +    //perform test +    task.execute(pendingReq, executionContext); + +     +    //validate state     +    // check if pendingRequest was stored +    IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId()); +    Assert.assertNotNull("pendingReq not stored", storedPendingReq); +     +    //check data in session +    final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class); +    Assert.assertNotNull("AuthProcessData", authProcessData); +    Assert.assertNull("eidasBind", authProcessData.getGenericDataFromSession(Constants.EIDAS_BIND, String.class)); + +    String authBlock = authProcessData.getGenericDataFromSession(Constants.SZR_AUTHBLOCK, String.class); +    Assert.assertNull("AuthBlock", authBlock); +     +    Assert.assertFalse("EID process", authProcessData.isEidProcess()); +    Assert.assertTrue("foreigner process", authProcessData.isForeigner()); +    Assert.assertEquals("EID-ISSUING_NATION", "LU",  +        authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class)); +    Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel()); +    Assert.assertEquals("LoA", response.getLevelOfAssurance(),  +        authProcessData.getQaaLevel()); +    +    Assert.assertNotNull("IDL", authProcessData.getIdentityLink()); +    checkElement("Musterfrau", authProcessData.getIdentityLink().getFamilyName()); +    checkElement("Martina", authProcessData.getIdentityLink().getGivenName()); +    checkElement("1991-04-15", authProcessData.getIdentityLink().getDateOfBirth()); +    checkElement("urn:publicid:gv.at:baseid", authProcessData.getIdentityLink().getIdentificationType()); +    checkElement("k+zDM1BV1312312332x7ZQ3ng==", authProcessData.getIdentityLink().getIdentificationValue()); +     +    Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME)); +    Assert.assertEquals("wrong bPK", "AT+EU:AT/EU/1+wqDl059/02Ptny0g+LyuLDJV0=",  +        authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME)); +     +  } +   +  @Test +  public void buildIdentityLinkWithUnknownBpk() throws Exception { +    //initialize test +    setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml"); +    spConfig.put("target", "urn:notextis:1234"); +     +    String randomTestSp = RandomStringUtils.randomAlphabetic(10); +    pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp); +        +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true"); +     +    try { +      task.execute(pendingReq, executionContext); +      Assert.fail("unknown bPKType not detected"); +       +    } catch (TaskExecutionException e) { +      Assert.assertEquals("ErrorId", "builder.33",  +          ((EaafException) e.getOriginalException()).getErrorId()); +      Assert.assertEquals("wrong parameter size", 1, ((EaafException) e.getOriginalException()) +          .getParams().length); + +    }       +  } +   +  @Test +  public void noBpkResult() throws Exception { +    //initialize test +    setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml"); +    GetBPKResponse getBpkResp = new GetBPKResponse(); +    org.mockito.Mockito.when(szrMock.getBPK(any(GetBPK.class))).thenReturn(getBpkResp ); +     +    spConfig.put("target", "urn:notextis:1234"); +     +    String randomTestSp = RandomStringUtils.randomAlphabetic(10); +    pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp); +        +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.params.useSZRForbPKCalculation", "true"); +     +    try { +      task.execute(pendingReq, executionContext); +      Assert.fail("unknown bPKType not detected"); +       +    } catch (TaskExecutionException e) { +      Assert.assertEquals("ErrorId", "ernb.01",  +          ((EaafException) e.getOriginalException()).getErrorId()); +       +    }       +  } +   +  @Test +  public void bPKFromSzr() throws Exception { +    //initialize test +    setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml"); +    String bpk = RandomStringUtils.randomAlphanumeric(10); +    GetBPKResponse getBpkResp = new GetBPKResponse(); +    getBpkResp.getGetBPKReturn().add(bpk); +    org.mockito.Mockito.when(szrMock.getBPK(any(GetBPK.class))).thenReturn(getBpkResp ); +     +    spConfig.put("target", "urn:notextis:1234"); +     +    String randomTestSp = RandomStringUtils.randomAlphabetic(10); +    pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp); +        +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.params.useSZRForbPKCalculation", "true"); +     +    //execute test +      task.execute(pendingReq, executionContext); +      +       +      //validate state     +      // check if pendingRequest was stored +      IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId()); +      Assert.assertNotNull("pendingReq not stored", storedPendingReq); +       +      //check data in session +      final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class); +      Assert.assertNotNull("AuthProcessData", authProcessData); +      Assert.assertNull("eidasBind", authProcessData.getGenericDataFromSession(Constants.EIDAS_BIND, String.class)); + +      String authBlock = authProcessData.getGenericDataFromSession(Constants.SZR_AUTHBLOCK, String.class); +      Assert.assertNull("AuthBlock", authBlock); +       +      Assert.assertFalse("EID process", authProcessData.isEidProcess()); +      Assert.assertTrue("foreigner process", authProcessData.isForeigner()); +      Assert.assertEquals("EID-ISSUING_NATION", "LU",  +          authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class)); +      Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel()); +      Assert.assertEquals("LoA", response.getLevelOfAssurance(),  +          authProcessData.getQaaLevel()); +       +      Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME)); +      Assert.assertEquals("wrong bPK", bpk,  +          authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME)); +  } +   +  @Test +  public void buildDummyIdl() throws Exception { +    //initialize test +    String randomTestSp = RandomStringUtils.randomAlphabetic(10); +    pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp); +        +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "true"); +     +     +    //perform test +    task.execute(pendingReq, executionContext); + +     +    //validate state     +    // check if pendingRequest was stored +    IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId()); +    Assert.assertNotNull("pendingReq not stored", storedPendingReq); +     +    //check data in session +    final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class); +    Assert.assertNotNull("AuthProcessData", authProcessData); +    Assert.assertNull("eidasBind", authProcessData.getGenericDataFromSession(Constants.EIDAS_BIND, String.class)); + +    String authBlock = authProcessData.getGenericDataFromSession(Constants.SZR_AUTHBLOCK, String.class); +    Assert.assertNull("AuthBlock", authBlock); +     +    Assert.assertFalse("EID process", authProcessData.isEidProcess()); +    Assert.assertTrue("foreigner process", authProcessData.isForeigner()); +    Assert.assertEquals("EID-ISSUING_NATION", "LU",  +        authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class)); +    Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel()); +    Assert.assertEquals("LoA", response.getLevelOfAssurance(),  +        authProcessData.getQaaLevel()); +         +    Assert.assertNotNull("IDL", authProcessData.getIdentityLink()); +         +  } + +  private void setSzrResponseIdentityLink(String responseXmlPath) throws JAXBException, SZRException_Exception { +    final JAXBContext jaxbContext = JAXBContext +        .newInstance(szrservices.ObjectFactory.class, org.w3._2001._04.xmldsig_more.ObjectFactory.class, +                     org.w3._2000._09.xmldsig.ObjectFactory.class, +                     at.gv.e_government.reference.namespace.persondata._20020228.ObjectFactory.class); +    final Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); +    final GetIdentityLinkEidasResponse szrResponse = (GetIdentityLinkEidasResponse) jaxbUnmarshaller +        .unmarshal(this.getClass().getResourceAsStream(responseXmlPath)); +    org.mockito.Mockito.when(szrMock.getIdentityLinkEidas(any(PersonInfoType.class))).thenReturn(szrResponse.getGetIdentityLinkReturn()); + +  } +  private void checkElement(String expected, String value) { +    Assert.assertNotNull(value); +    Assert.assertEquals(expected, value); + +  } +   +  @NotNull +  private AuthenticationResponse buildDummyAuthResponse() throws URISyntaxException { +    final AttributeDefinition attributeDef = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_PERSONALIDENTIFIER).first(); +    final AttributeDefinition attributeDef2 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_CURRENTFAMILYNAME).first(); +    final AttributeDefinition attributeDef3 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_CURRENTGIVENNAME).first(); +    final AttributeDefinition attributeDef4 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_DATEOFBIRTH).first(); +    +    final ImmutableAttributeMap attributeMap = ImmutableAttributeMap.builder() +        .put(attributeDef, "LU/AT/" + RandomStringUtils.randomNumeric(64)) +        .put(attributeDef2, RandomStringUtils.randomAlphabetic(10)) +        .put(attributeDef3, RandomStringUtils.randomAlphabetic(10)).put(attributeDef4, "2001-01-01").build(); + +    val b = new AuthenticationResponse.Builder(); +    return b.id("_".concat(Random.nextHexRandom16())) +        .issuer(RandomStringUtils.randomAlphabetic(10)) +        .subject(RandomStringUtils.randomAlphabetic(10)) +        .statusCode("200") +        .inResponseTo("_".concat(Random.nextHexRandom16())) +        .subjectNameIdFormat("afaf") +        .levelOfAssurance(EaafConstants.EIDAS_LOA_PREFIX + RandomStringUtils.randomAlphabetic(5)) +        .attributes(attributeMap) +        .build(); +  } +} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskSecondTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskSecondTest.java deleted file mode 100644 index 10896f48..00000000 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskSecondTest.java +++ /dev/null @@ -1,140 +0,0 @@ -package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.annotation.DirtiesContext.ClassMode; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAuthnRequestTask; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummySpecificCommunicationService; -import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; -import at.gv.egiz.eaaf.core.api.idp.IConfiguration; -import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; -import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException; -import at.gv.egiz.eaaf.core.exceptions.EaafException; -import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; -import at.gv.egiz.eaaf.core.impl.idp.module.test.DummySpConfiguration; -import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; -import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl; -import eu.eidas.auth.commons.light.ILightRequest; -import eu.eidas.specificcommunication.exception.SpecificCommunicationException; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") -@DirtiesContext(classMode = ClassMode.BEFORE_CLASS) -public class GenerateAuthnRequestTaskSecondTest { - -  @Autowired(required = true) -  private GenerateAuthnRequestTask task; -  @Autowired(required = true) -  private DummySpecificCommunicationService commService; -  @Autowired(required = true) -  private IConfiguration basicConfig; - -  final ExecutionContext executionContext = new ExecutionContextImpl(); -  private MockHttpServletRequest httpReq; -  private MockHttpServletResponse httpResp; -  private TestRequestImpl pendingReq; -  private DummySpConfiguration oaParam; - -  /** -   * jUnit class initializer. -   *  -   * @throws IOException In case of an error -   */ -  @BeforeClass -  public static void classInitializer() throws IOException { -    final String current = new java.io.File(".").toURI().toString(); -    System.setProperty("eidas.ms.configuration", current + "../../basicConfig/default_config.properties"); - -  } - -  /** -   * jUnit test set-up. -   *  -   */ -  @Before -  public void setUp() { - -    httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); -    httpResp = new MockHttpServletResponse(); -    RequestContextHolder.resetRequestAttributes(); -    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp)); - -    final Map<String, String> spConfig = new HashMap<>(); -    spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp"); -    spConfig.put("target", "urn:publicid:gv.at:cdid+XX"); -    oaParam = new DummySpConfiguration(spConfig, basicConfig); - -    pendingReq = new TestRequestImpl(); -    pendingReq.setSpConfig(oaParam); -    pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue()); -    pendingReq.setAuthUrl("http://test.com/"); - -  } - -  @Test -  public void noCountryCode() { -    try { -      task.execute(pendingReq, executionContext); -      Assert.fail("No countryCode not detected"); - -    } catch (final TaskExecutionException e) { -      Assert.assertEquals("wrong pendingReqId", pendingReq.getPendingRequestId(), e.getPendingRequestID()); -      org.springframework.util.Assert.isInstanceOf(EidasSAuthenticationException.class, e -          .getOriginalException(), "Wrong exception"); -      Assert.assertEquals("wrong errorCode", "eidas.03", ((EaafException) e.getOriginalException()) -          .getErrorId()); - -    } - -  } - -  @Test -  @DirtiesContext -  public void withStaticProviderNameForPublicSPs() throws TaskExecutionException, -      SpecificCommunicationException { -    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); - -    try { -      task.execute(pendingReq, executionContext); - -    } catch (final TaskExecutionException e) { -      // forward URL is not set in example config -      org.springframework.util.Assert.isInstanceOf(EaafConfigurationException.class, e.getOriginalException(), -          "Wrong exception"); -      Assert.assertEquals("wrong errorCode", "config.08", ((EaafException) e.getOriginalException()) -          .getErrorId()); -      Assert.assertEquals("wrong parameter size", 1, ((EaafException) e.getOriginalException()) -          .getParams().length); -      Assert.assertEquals("wrong errorMsg", Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL, ((EaafException) e -          .getOriginalException()).getParams()[0]); - -    } - -    final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null); - -    Assert.assertEquals("ProviderName is not Static", -        Constants.DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP, eidasReq.getProviderName()); -    Assert.assertEquals("no PublicSP", "public", 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/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 e8fcdd3d..83ac6044 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 @@ -1,12 +1,12 @@  package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks; -import java.io.IOException; +import java.io.UnsupportedEncodingException;  import java.util.HashMap;  import java.util.Map; +import org.apache.commons.lang3.RandomStringUtils;  import org.junit.Assert;  import org.junit.Before; -import org.junit.BeforeClass;  import org.junit.Test;  import org.junit.runner.RunWith;  import org.springframework.beans.factory.annotation.Autowired; @@ -20,14 +20,18 @@ import org.springframework.web.context.request.RequestContextHolder;  import org.springframework.web.context.request.ServletRequestAttributes;  import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummyConfigMap;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAuthnRequestTask;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummySpecificCommunicationService;  import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; -import at.gv.egiz.eaaf.core.api.idp.IConfiguration; +import at.gv.egiz.eaaf.core.api.data.EaafConstants;  import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;  import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;  import at.gv.egiz.eaaf.core.exceptions.EaafException; +import at.gv.egiz.eaaf.core.exceptions.EaafStorageException; +import at.gv.egiz.eaaf.core.exceptions.GuiBuildException;  import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;  import at.gv.egiz.eaaf.core.impl.idp.module.test.DummySpConfiguration;  import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; @@ -36,36 +40,27 @@ import eu.eidas.auth.commons.light.ILightRequest;  import eu.eidas.specificcommunication.exception.SpecificCommunicationException;  @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"})  @DirtiesContext(classMode = ClassMode.BEFORE_CLASS) -public class GenerateAuthnRequestTaskFirstTest { +public class GenerateAuthnRequestTaskTest {    @Autowired(required = true)    private GenerateAuthnRequestTask task;    @Autowired(required = true)    private DummySpecificCommunicationService commService;    @Autowired(required = true) -  private IConfiguration basicConfig; +  private MsConnectorDummyConfigMap basicConfig;    final ExecutionContext executionContext = new ExecutionContextImpl();    private MockHttpServletRequest httpReq;    private MockHttpServletResponse httpResp;    private TestRequestImpl pendingReq;    private DummySpConfiguration oaParam; - -  /** -   * jUnit class initializer. -   *   -   * @throws IOException In case of an error -   */ -  @BeforeClass -  public static void classInitializer() throws IOException { -    final String current = new java.io.File(".").toURI().toString(); -    System.setProperty("eidas.ms.configuration", current -        + "src/test/resources/config/junit_config_1.properties"); - -  } - +  private Map<String, String> spConfig; +     +      /**     * jUnit test set-up.     *  @@ -78,7 +73,7 @@ public class GenerateAuthnRequestTaskFirstTest {      RequestContextHolder.resetRequestAttributes();      RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp)); -    final Map<String, String> spConfig = new HashMap<>(); +    spConfig = new HashMap<>();      spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp");      spConfig.put("target", "urn:publicid:gv.at:cdid+XX");      oaParam = new DummySpConfiguration(spConfig, basicConfig); @@ -88,16 +83,47 @@ public class GenerateAuthnRequestTaskFirstTest {      pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue());      pendingReq.setAuthUrl("http://test.com/"); +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.node_v2.entityId",  +        RandomStringUtils.randomAlphabetic(10)); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.endpoint",  +        "http://test/" + RandomStringUtils.randomAlphabetic(5));   +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.method", "GET"); +            } - +      @Test -  @DirtiesContext -  public void withCustomStaticProviderNameForPublicSPs() throws TaskExecutionException, -      SpecificCommunicationException { -    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +  public void missingIssuer() { +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC");    +    basicConfig.removeConfigValue("eidas.ms.auth.eIDAS.node_v2.entityId"); +     +    //execute test +    try { +      task.execute(pendingReq, executionContext); +      Assert.fail("Missing Issuer not detected"); +    } catch (final TaskExecutionException e) { +      // forward URL is not set in example config +      org.springframework.util.Assert.isInstanceOf(EaafConfigurationException.class, e.getOriginalException(), +          "Wrong exception"); +      Assert.assertEquals("wrong errorCode", "config.27", ((EaafException) e.getOriginalException()) +          .getErrorId()); +      Assert.assertEquals("wrong parameter size", 1, ((EaafException) e.getOriginalException()) +          .getParams().length); +      +    } +  } +   +  @Test +  public void missingForwardUrl() { +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC");    +    basicConfig.removeConfigValue("eidas.ms.auth.eIDAS.node_v2.forward.endpoint"); +     +    //execute test      try {        task.execute(pendingReq, executionContext); +      Assert.fail("Missing Forward-URL not detected");      } catch (final TaskExecutionException e) {        // forward URL is not set in example config @@ -111,12 +137,350 @@ public class GenerateAuthnRequestTaskFirstTest {            .getOriginalException()).getParams()[0]);      } +  } +    +  @Test +  public void selectUnknownStage() { +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +    String stage = RandomStringUtils.randomAlphabetic(5); +    executionContext.put("selectedEnvironment", stage); +     +    //execute test +    try { +      task.execute(pendingReq, executionContext); +      Assert.fail("Missing Forward-URL not detected"); + +    } catch (final TaskExecutionException e) { +      // forward URL is not set in example config +      org.springframework.util.Assert.isInstanceOf(EaafConfigurationException.class, e.getOriginalException(), +          "Wrong exception"); +      Assert.assertEquals("wrong errorCode", "config.08", ((EaafException) e.getOriginalException()) +          .getErrorId()); +      Assert.assertEquals("wrong parameter size", 1, ((EaafException) e.getOriginalException()) +          .getParams().length); +      Assert.assertEquals("wrong errorMsg", Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL + "." + stage, ((EaafException) e +          .getOriginalException()).getParams()[0]); + +    } +  } +   +  @Test +  public void selectQsEndpoint() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException { +    //set-up test     +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +    executionContext.put("selectedEnvironment", "qs");         +     +    String dynEndPoint = "http://test/" + RandomStringUtils.randomAlphabetic(5); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.endpoint.qs", 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)); +     +  } +   +  @Test +  public void selectTestEndpoint() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException { +    //set-up test     +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +    executionContext.put("selectedEnvironment", "test");         +     +    String dynEndPoint = "http://test/" + RandomStringUtils.randomAlphabetic(5); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.endpoint.test", 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)); +     +  } +   +  @Test +  public void selectDevEndpoint() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException { +    //set-up test     +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +    executionContext.put("selectedEnvironment", "dev");         +     +    String dynEndPoint = "http://test/" + RandomStringUtils.randomAlphabetic(5); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.forward.endpoint.dev", 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)); +     +  } +   +  @Test +  public void noCountryCode() { +    try { +      task.execute(pendingReq, executionContext); +      Assert.fail("No countryCode not detected"); + +    } catch (final TaskExecutionException e) { +      Assert.assertEquals("wrong pendingReqId", pendingReq.getPendingRequestId(), e.getPendingRequestID()); +      org.springframework.util.Assert.isInstanceOf(EidasSAuthenticationException.class, e +          .getOriginalException(), "Wrong exception"); +      Assert.assertEquals("wrong errorCode", "eidas.03", ((EaafException) e.getOriginalException()) +          .getErrorId()); + +    } +  } + +  @Test +  public void withStaticProviderNameForPublicSPs() throws TaskExecutionException, +      SpecificCommunicationException { +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); + +    basicConfig.putConfigValue( +        "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"); +    basicConfig.removeConfigValue("eidas.ms.auth.eIDAS.node_v2.staticProviderNameForPublicSPs"); +     +    //execute test +    task.execute(pendingReq, executionContext); + +    //validate state +    final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null); + +    Assert.assertEquals("ProviderName is not Static", +        Constants.DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP, eidasReq.getProviderName()); +    Assert.assertEquals("no PublicSP", "public", eidasReq.getSpType()); +    Assert.assertEquals("wrong LoA", "http://eidas.europa.eu/LoA/high", eidasReq.getLevelOfAssurance()); +     +  } +       +  @Test +  public void withCustomStaticProviderNameForPublicSPs() throws TaskExecutionException, +      SpecificCommunicationException { +    String cc = RandomStringUtils.randomAlphabetic(2); +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, cc); +     +    basicConfig.putConfigValue( +        "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"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.staticProviderNameForPublicSPs", "myNode"); +     +    //execute test +    task.execute(pendingReq, executionContext); + +    //validate state      final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null); +    Assert.assertEquals("wrong issuer",  +        basicConfig.getBasicConfiguration("eidas.ms.auth.eIDAS.node_v2.entityId"), eidasReq.getIssuer());      Assert.assertEquals("ProviderName is not Static", "myNode", eidasReq.getProviderName());      Assert.assertEquals("no PublicSP", "public", eidasReq.getSpType());      Assert.assertEquals("wrong LoA", "http://eidas.europa.eu/LoA/high", eidasReq.getLevelOfAssurance()); +    Assert.assertEquals("wrong CC", cc, eidasReq.getCitizenCountryCode()); +    Assert.assertEquals("NameIdFormat", Constants.eIDAS_REQ_NAMEID_FORMAT, eidasReq.getNameIdFormat()); +     +     +  } + +  @Test +  public void withDynamicProviderNameForPublicSPs() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException, UnsupportedEncodingException { +    //set-up test +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +    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"); +    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"); +     +    //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.assertNotNull("ProviderName found", eidasReq.getProviderName()); +    Assert.assertEquals("PrividerName", providerName, eidasReq.getProviderName()); +    Assert.assertNull("RequesterId found", 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 withEidasNodePostReqNotValidTemplate() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException, UnsupportedEncodingException { +    //set-up test +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +    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"); +    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", "POST"); +     +    //execute test +    try { +      task.execute(pendingReq, executionContext); +      Assert.fail("Missing template not detected"); +              +    } catch (TaskExecutionException e) { +      Assert.assertEquals("ErrorCode", "Could not resolve view with name 'eidas_node_forward.html' ",  +          ((GuiBuildException) e.getOriginalException()).getMessage()); +       +    }     +  } +   +  @Test +  public void withDynamicProviderNameForPrivateSPs() 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); +    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"); +    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", providerName, eidasReq.getRequesterId()); +    Assert.assertEquals("no PublicSP", "private", eidasReq.getSpType()); +    Assert.assertEquals("wrong LoA", "http://eidas.europa.eu/LoA/high", eidasReq.getLevelOfAssurance()); +        } +   +  @Test +  public void withoutProviderNameForPublicSPs() throws TaskExecutionException, +      SpecificCommunicationException, EaafStorageException { +    //set-up test +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); +    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", "false"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier", "false"); +    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"); +     +     +    //execute test +    task.execute(pendingReq, executionContext); +         +    //validate state +    Assert.assertEquals("Wrong http statusCode", 302, httpResp.getStatus()); + +    final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null); +    Assert.assertNull("ProviderName found", eidasReq.getProviderName()); +    Assert.assertNull("RequesterId found", eidasReq.getRequesterId()); +    Assert.assertEquals("no PublicSP", "public", 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/tasks/GenerateAuthnRequestTaskThirdTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskThirdTest.java deleted file mode 100644 index f2e44ed1..00000000 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAuthnRequestTaskThirdTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.annotation.DirtiesContext.ClassMode; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAuthnRequestTask; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummySpecificCommunicationService; -import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; -import at.gv.egiz.eaaf.core.api.idp.IConfiguration; -import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; -import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; -import at.gv.egiz.eaaf.core.impl.idp.module.test.DummySpConfiguration; -import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; -import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl; -import eu.eidas.auth.commons.light.ILightRequest; -import eu.eidas.specificcommunication.exception.SpecificCommunicationException; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") -@DirtiesContext(classMode = ClassMode.BEFORE_CLASS) -public class GenerateAuthnRequestTaskThirdTest { - -  @Autowired(required = true) -  private GenerateAuthnRequestTask task; -  @Autowired(required = true) -  private DummySpecificCommunicationService commService; -  @Autowired(required = true) -  private IConfiguration basicConfig; - -  final ExecutionContext executionContext = new ExecutionContextImpl(); -  private MockHttpServletRequest httpReq; -  private MockHttpServletResponse httpResp; -  private TestRequestImpl pendingReq; -  private DummySpConfiguration oaParam; - -  /** -   * jUnit class initializer. -   *  -   * @throws IOException In case of an error -   */ -  @BeforeClass -  public static void classInitializer() throws IOException { -    final String current = new java.io.File(".").toURI().toString(); -    System.setProperty("eidas.ms.configuration", current -        + "src/test/resources/config/junit_config_2.properties"); - -  } - -  /** -   * jUnit test set-up. -   *  -   */ -  @Before -  public void setUp() { - -    httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); -    httpResp = new MockHttpServletResponse(); -    RequestContextHolder.resetRequestAttributes(); -    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp)); - -    final Map<String, String> spConfig = new HashMap<>(); -    spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp"); -    spConfig.put("target", "urn:publicid:gv.at:cdid+XX"); -    oaParam = new DummySpConfiguration(spConfig, basicConfig); - -    pendingReq = new TestRequestImpl(); -    pendingReq.setSpConfig(oaParam); -    pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue()); -    pendingReq.setAuthUrl("http://test.com/"); - -  } - -  @Test -  @DirtiesContext -  public void withDynamicProviderNameForPublicSPs() throws TaskExecutionException, -      SpecificCommunicationException { -    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "CC"); - -    task.execute(pendingReq, executionContext); -    Assert.assertEquals("Wrong http statusCode", 302, httpResp.getStatus()); - -    final ILightRequest eidasReq = commService.getAndRemoveRequest(null, null); - -    Assert.assertNull("ProviderName found", eidasReq.getProviderName()); -    Assert.assertEquals("no PublicSP", "public", 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/tasks/ReceiveEidasResponseTaskTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveEidasResponseTaskTest.java new file mode 100644 index 00000000..f5ae9b01 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveEidasResponseTaskTest.java @@ -0,0 +1,193 @@ +package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks; + +import static at.asitplus.eidas.specific.connector.MsEidasNodeConstants.PROP_CONFIG_SP_NEW_EID_MODE; + +import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.RandomStringUtils; +import org.jetbrains.annotations.NotNull; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummyConfigMap; +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummySpConfiguration; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseTask; +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.IRequestStorage; +import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; +import at.gv.egiz.eaaf.core.api.data.EaafConstants; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.exceptions.EaafException; +import at.gv.egiz.eaaf.core.exceptions.EaafStorageException; +import at.gv.egiz.eaaf.core.exceptions.PendingReqIdValidationException; +import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; +import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper; +import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; +import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl; +import at.gv.egiz.eaaf.core.impl.utils.Random; +import eu.eidas.auth.commons.attribute.AttributeDefinition; +import eu.eidas.auth.commons.attribute.ImmutableAttributeMap; +import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse; +import lombok.val; + +@RunWith(SpringJUnit4ClassRunner.class) +@PrepareForTest(CreateIdentityLinkTask.class) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"}) +public class ReceiveEidasResponseTaskTest { + +  @Autowired(required = true) +  private ReceiveAuthnResponseTask task; + +  @Autowired(required = true) +  private MsConnectorDummyConfigMap basicConfig; +  @Autowired +  protected EidasAttributeRegistry attrRegistry; +   +  @Autowired private IRequestStorage storage; +   +  final ExecutionContext executionContext = new ExecutionContextImpl(); +  private MockHttpServletRequest httpReq; +  private MockHttpServletResponse httpResp; +  private TestRequestImpl pendingReq; +  private MsConnectorDummySpConfiguration oaParam; +   +  /** +   * jUnit test set-up. +   */ +  @Before +  public void setUp() throws EaafStorageException, URISyntaxException { + +    httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); +    httpResp = new MockHttpServletResponse(); +    RequestContextHolder.resetRequestAttributes(); +    RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp)); + +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false"); +     +    final Map<String, String> spConfig = new HashMap<>(); +    spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp"); +    spConfig.put("target", "urn:publicid:gv.at:cdid+XX"); +    spConfig.put(PROP_CONFIG_SP_NEW_EID_MODE, "true"); +    oaParam = new MsConnectorDummySpConfiguration(spConfig, basicConfig); +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH)); +    pendingReq = new TestRequestImpl(); + +    pendingReq.setSpConfig(oaParam); +    pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue()); +    pendingReq.setAuthUrl("http://test.com/"); +    pendingReq.setTransactionId("avaasbav"); +    pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10)); +         +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU"); +    executionContext.put(EaafConstants.PROCESS_ENGINE_REQUIRES_NO_POSTAUTH_REDIRECT, true); + +  } +   +  @Test +  public void missingEidasResponse() {     +    try { +      task.execute(pendingReq, executionContext); +      Assert.fail("No eIDAS response not detected"); +       +    } catch (TaskExecutionException e) { +      Assert.assertEquals("ErrorId", "eidas.01",  +          ((EaafException) e.getOriginalException()).getErrorId()); +       +    }         +  } +   +  @Test +  public void notSuccessEidasResponse() throws URISyntaxException {     +    String statusCode = RandomStringUtils.randomAlphabetic(10); +    httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE,  +        buildDummyAuthResponse(statusCode)); +     +     +    try { +      task.execute(pendingReq, executionContext); +      Assert.fail("No eIDAS response not detected"); +       +    } catch (TaskExecutionException e) { +      Assert.assertEquals("ErrorId", "eidas.02",  +          ((EaafException) e.getOriginalException()).getErrorId()); +      Assert.assertEquals("wrong parameter size", 2, ((EaafException) e.getOriginalException()) +          .getParams().length); +      Assert.assertEquals("wrong errorMsg", statusCode, ((EaafException) e +          .getOriginalException()).getParams()[0]); + +    }         +  } +     +  @Test +  public void success() throws URISyntaxException, TaskExecutionException, PendingReqIdValidationException {     +    @NotNull +    AuthenticationResponse eidasResponse = buildDummyAuthResponse(Constants.SUCCESS_URI); +    httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse); +    executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU");     +       +    //execute test +    task.execute(pendingReq, executionContext); +     +    //validate state +    IRequest storedReq = storage.getPendingRequest(pendingReq.getPendingRequestId()); +    Assert.assertNotNull("pendingReq not stored", storedReq); +     +    final AuthProcessDataWrapper authProcessData = storedReq.getSessionData(AuthProcessDataWrapper.class); +    Assert.assertEquals("LoA", eidasResponse.getLevelOfAssurance(), authProcessData.getQaaLevel()); +    Assert.assertNotNull("eIDAS response",  +        authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE)); +    Assert.assertEquals("eIDAS response", eidasResponse,  +        authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE)); +         +  } +   +  @NotNull +  private AuthenticationResponse buildDummyAuthResponse(String statusCode) throws URISyntaxException { +    final AttributeDefinition attributeDef = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_PERSONALIDENTIFIER).first(); +    final AttributeDefinition attributeDef2 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_CURRENTFAMILYNAME).first(); +    final AttributeDefinition attributeDef3 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_CURRENTGIVENNAME).first(); +    final AttributeDefinition attributeDef4 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_DATEOFBIRTH).first(); +    +    final ImmutableAttributeMap attributeMap = ImmutableAttributeMap.builder() +        .put(attributeDef, "LU/AT/" + RandomStringUtils.randomNumeric(64)) +        .put(attributeDef2, RandomStringUtils.randomAlphabetic(10)) +        .put(attributeDef3, RandomStringUtils.randomAlphabetic(10)).put(attributeDef4, "2001-01-01").build(); + +    val b = new AuthenticationResponse.Builder(); +    return b.id("_".concat(Random.nextHexRandom16())) +        .issuer(RandomStringUtils.randomAlphabetic(10)) +        .subject(RandomStringUtils.randomAlphabetic(10)) +        .statusCode(statusCode) +        .inResponseTo("_".concat(Random.nextHexRandom16())) +        .subjectNameIdFormat("afaf") +        .levelOfAssurance(EaafConstants.EIDAS_LOA_HIGH) +        .attributes(attributeMap) +        .build(); +  } +   +} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/utils/JoseUtilsTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/utils/JoseUtilsTest.java new file mode 100644 index 00000000..ad38e371 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/utils/JoseUtilsTest.java @@ -0,0 +1,139 @@ +package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.utils; + +import java.io.IOException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.Provider; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.lang3.RandomStringUtils; +import org.jose4j.jwa.AlgorithmConstraints; +import org.jose4j.jwa.AlgorithmConstraints.ConstraintType; +import org.jose4j.jws.AlgorithmIdentifiers; +import org.jose4j.lang.JoseException; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.JoseUtils; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.JoseUtils.JwsResult; +import at.gv.egiz.eaaf.core.exceptions.EaafException; +import at.gv.egiz.eaaf.core.impl.credential.EaafKeyStoreFactory; +import at.gv.egiz.eaaf.core.impl.credential.EaafKeyStoreUtils; +import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration; +import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration.KeyStoreType; +import at.gv.egiz.eaaf.core.impl.data.Pair; + +@RunWith(SpringJUnit4ClassRunner.class) +@PrepareForTest(CreateIdentityLinkTask.class) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"}) +public class JoseUtilsTest { +   +  @Autowired private EaafKeyStoreFactory keyStoreFactory; +   +  private static final List<String> AUTH_ALGORITHM_WHITELIST_SIGNING = Collections.unmodifiableList( +      Arrays.asList( +          AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_AND_SHA256, +          AlgorithmIdentifiers.ECDSA_USING_P521_CURVE_AND_SHA512, +          AlgorithmIdentifiers.RSA_PSS_USING_SHA256, +          AlgorithmIdentifiers.RSA_PSS_USING_SHA512)); + +   +  @Test +  public void missingKey() throws EaafException, JoseException, KeyStoreException, IOException { +     +    KeyStoreConfiguration config = new KeyStoreConfiguration(); +    config.setFriendlyName("jUnittest"); +    config.setKeyStoreType(KeyStoreType.JKS); +    config.setSoftKeyStoreFilePath("../data/junit.jks"); +    config.setSoftKeyStorePassword("password"); +     +    Pair<KeyStore, Provider> keyStore = keyStoreFactory.buildNewKeyStore(config); +    String payLoad = RandomStringUtils.randomAlphanumeric(100); +     +    //check signing +    try { +      JoseUtils.createSignature(keyStore, "notExist", "password".toCharArray(), payLoad , true, "jUnitTest"); +      Assert.fail("missing Key not detected"); +       +    } catch (EaafException e) {       +      Assert.assertEquals("ErrorId", "internal.keystore.09", e.getErrorId()); +       +    } +  } +   +  @Test +  public void createRsaSignature() throws EaafException, JoseException, KeyStoreException, IOException { +     +    KeyStoreConfiguration config = new KeyStoreConfiguration(); +    config.setFriendlyName("jUnittest"); +    config.setKeyStoreType(KeyStoreType.JKS); +    config.setSoftKeyStoreFilePath("../data/junit.jks"); +    config.setSoftKeyStorePassword("password"); +     +    Pair<KeyStore, Provider> keyStore = keyStoreFactory.buildNewKeyStore(config); +    String payLoad = RandomStringUtils.randomAlphanumeric(100); +     +    //check signing +    String result = JoseUtils.createSignature(keyStore, "meta", "password".toCharArray(), payLoad , true, "jUnitTest"); +    +    Assert.assertNotNull("signed message", result); +    Assert.assertFalse("signed msg empty", result.isEmpty()); +     + +    //validate +    List<X509Certificate> trustedCerts = EaafKeyStoreUtils.readCertsFromKeyStore(keyStore.getFirst()); +    final AlgorithmConstraints constraints = new AlgorithmConstraints(ConstraintType.PERMIT, +        AUTH_ALGORITHM_WHITELIST_SIGNING +            .toArray(new String[AUTH_ALGORITHM_WHITELIST_SIGNING.size()])); +    JwsResult verify = JoseUtils.validateSignature(result, trustedCerts, constraints); +     +    Assert.assertTrue("sig. verify", verify.isValid()); +    Assert.assertEquals("payload", payLoad, verify.getPayLoad()); +         +  } +   +  @Test +  public void createEccSignature() throws EaafException, JoseException, KeyStoreException, IOException { +     +    KeyStoreConfiguration config = new KeyStoreConfiguration(); +    config.setFriendlyName("jUnittest"); +    config.setKeyStoreType(KeyStoreType.JKS); +    config.setSoftKeyStoreFilePath("../data/junit.jks"); +    config.setSoftKeyStorePassword("password"); +     +    Pair<KeyStore, Provider> keyStore = keyStoreFactory.buildNewKeyStore(config); +    String payLoad = RandomStringUtils.randomAlphanumeric(100); +     +    //check signing +    String result = JoseUtils.createSignature(keyStore, "sig", "password".toCharArray(), payLoad , true, "jUnitTest"); +    +    Assert.assertNotNull("signed message", result); +    Assert.assertFalse("signed msg empty", result.isEmpty()); +     + +    //validate +    List<X509Certificate> trustedCerts = EaafKeyStoreUtils.readCertsFromKeyStore(keyStore.getFirst()); +    final AlgorithmConstraints constraints = new AlgorithmConstraints(ConstraintType.PERMIT, +        AUTH_ALGORITHM_WHITELIST_SIGNING +            .toArray(new String[AUTH_ALGORITHM_WHITELIST_SIGNING.size()])); +    JwsResult verify = JoseUtils.validateSignature(result, trustedCerts, constraints); +     +    Assert.assertTrue("sig. verify", verify.isValid()); +    Assert.assertEquals("payload", payLoad, verify.getPayLoad()); +         +  } +   +} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java index 55a3ce99..9bb51cd9 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java @@ -21,7 +21,7 @@   * that you distribute must include a readable copy of the "NOTICE" text file.  */ -package at.asitplus.eidas.specific.modules.auth.eidas.v2.test; +package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.validation;  import static org.junit.Assert.fail; @@ -45,7 +45,9 @@ import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.CcSpecificEidProcessingService;  @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"})  @DirtiesContext(classMode = ClassMode.AFTER_CLASS)  public class EidasAttributePostProcessingTest { 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 880c32ae..b4c8f20c 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 @@ -21,7 +21,7 @@   * that you distribute must include a readable copy of the "NOTICE" text file.  */ -package at.asitplus.eidas.specific.modules.auth.eidas.v2.test; +package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.validation;  import java.io.IOException;  import java.util.HashMap; @@ -43,6 +43,7 @@ import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.CcSpecificEidProcessingService;  import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; +import at.gv.egiz.eaaf.core.api.data.EaafConstants;  import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP;  import at.gv.egiz.eaaf.core.impl.idp.module.test.DummySpConfiguration;  import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; @@ -50,7 +51,9 @@ import eu.eidas.auth.commons.light.impl.LightRequest;  import eu.eidas.auth.commons.light.impl.LightRequest.Builder;  @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_realConfig.xml"})  @DirtiesContext(classMode = ClassMode.AFTER_CLASS)  public class EidasRequestPreProcessingFirstTest { @@ -95,6 +98,7 @@ public class EidasRequestPreProcessingFirstTest {      authnRequestBuilder = LightRequest.builder();      authnRequestBuilder.id(UUID.randomUUID().toString());      authnRequestBuilder.issuer("Test"); +    authnRequestBuilder.levelOfAssurance(EaafConstants.EIDAS_LOA_HIGH);    } 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 da7e3d85..6d46f6e0 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 @@ -21,16 +21,14 @@   * that you distribute must include a readable copy of the "NOTICE" text file.  */ -package at.asitplus.eidas.specific.modules.auth.eidas.v2.test; +package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.validation; -import java.io.IOException;  import java.util.HashMap;  import java.util.Map;  import java.util.UUID;  import org.junit.Assert;  import org.junit.Before; -import org.junit.BeforeClass;  import org.junit.Test;  import org.junit.runner.RunWith;  import org.springframework.beans.factory.annotation.Autowired; @@ -39,22 +37,25 @@ import org.springframework.test.annotation.DirtiesContext.ClassMode;  import org.springframework.test.context.ContextConfiguration;  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummyConfigMap;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.CcSpecificEidProcessingService;  import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; -import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP; +import at.gv.egiz.eaaf.core.api.data.EaafConstants;  import at.gv.egiz.eaaf.core.impl.idp.module.test.DummySpConfiguration;  import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;  import eu.eidas.auth.commons.light.impl.LightRequest;  import eu.eidas.auth.commons.light.impl.LightRequest.Builder;  @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("/SpringTest-context_tasks_test.xml") +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"})  @DirtiesContext(classMode = ClassMode.AFTER_CLASS)  public class EidasRequestPreProcessingSecondTest {    @Autowired -  private IConfigurationWithSP basicConfig; +  private MsConnectorDummyConfigMap basicConfig;    @Autowired    private CcSpecificEidProcessingService preProcessor; @@ -62,18 +63,6 @@ public class EidasRequestPreProcessingSecondTest {    private DummySpConfiguration oaParam;    private Builder authnRequestBuilder; -  /** -   * jUnit class initializer. -   *  -   * @throws IOException In case of an error -   */ -  @BeforeClass -  public static void classInitializer() throws IOException { -    final String current = new java.io.File(".").toURI().toString(); -    System.setProperty("eidas.ms.configuration", current -        + "src/test/resources/config/junit_config_1.properties"); - -  }    /**     * jUnit test set-up. @@ -95,12 +84,16 @@ public class EidasRequestPreProcessingSecondTest {      authnRequestBuilder = LightRequest.builder();      authnRequestBuilder.id(UUID.randomUUID().toString());      authnRequestBuilder.issuer("Test"); +    authnRequestBuilder.levelOfAssurance(EaafConstants.EIDAS_LOA_HIGH);    }    @Test    public void prePreProcessDeUnknownAttribute() throws EidPostProcessingException { - +    basicConfig.putConfigValue("eidas.ms.auth.eIDAS.node_v2.staticProviderNameForPublicSPs", "myNode"); +    basicConfig.putConfigValue( +        "eidas.ms.auth.eIDAS.node_v2.workarounds.useStaticProviderNameForPublicSPs", "true"); +          final String testCountry = "DE";      authnRequestBuilder.citizenCountryCode(testCountry);      preProcessor.preProcess(testCountry, pendingReq, authnRequestBuilder); diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasResponseValidatorTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasResponseValidatorTest.java new file mode 100644 index 00000000..d0e7a804 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasResponseValidatorTest.java @@ -0,0 +1,333 @@ +package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.validation; + +import static at.asitplus.eidas.specific.connector.MsEidasNodeConstants.PROP_CONFIG_SP_NEW_EID_MODE; + +import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.google.common.collect.ImmutableSet; + +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummyConfigMap; +import at.asitplus.eidas.specific.connector.test.config.MsConnectorDummySpConfiguration; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasValidationException; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.validator.EidasResponseValidator; +import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; +import at.gv.egiz.eaaf.core.api.data.EaafConstants; +import at.gv.egiz.eaaf.core.exceptions.EaafStorageException; +import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; +import at.gv.egiz.eaaf.core.impl.utils.Random; +import eu.eidas.auth.commons.attribute.AttributeDefinition; +import eu.eidas.auth.commons.attribute.ImmutableAttributeMap; +import eu.eidas.auth.commons.attribute.ImmutableAttributeMap.Builder; +import eu.eidas.auth.commons.attribute.impl.StringAttributeValue; +import eu.eidas.auth.commons.light.ILightResponse; +import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse; +import lombok.val; + +@RunWith(SpringJUnit4ClassRunner.class) +@PrepareForTest(CreateIdentityLinkTask.class) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS) +@ContextConfiguration(locations = { +    "/SpringTest-context_tasks_test.xml", +    "/SpringTest-context_basic_mapConfig.xml"}) +public class EidasResponseValidatorTest { + +  @Autowired private MsConnectorDummyConfigMap basicConfig; +  @Autowired protected EidasAttributeRegistry attrRegistry; +   +  private TestRequestImpl pendingReq; +  private MsConnectorDummySpConfiguration oaParam; +   +   +  /** +   * jUnit test set-up. +   */ +  @Before +  public void setUp() throws EaafStorageException, URISyntaxException { +     +    final Map<String, String> spConfig = new HashMap<>(); +    spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp"); +    spConfig.put("target", "urn:publicid:gv.at:cdid+XX"); +    spConfig.put(PROP_CONFIG_SP_NEW_EID_MODE, "true"); +    oaParam = new MsConnectorDummySpConfiguration(spConfig, basicConfig); +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH)); +    pendingReq = new TestRequestImpl(); + +    pendingReq.setSpConfig(oaParam); +    pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue()); +    pendingReq.setAuthUrl("http://test.com/"); +    pendingReq.setTransactionId("avaasbav"); +    pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10)); +         +  } +   +   +  @Test +  public void loaFromResponseToLow() throws URISyntaxException { +    //set-up +    ILightResponse eidasResponse = buildDummyAuthResponse(  +        "LU/AT/" + RandomStringUtils.randomNumeric(10),  +        EaafConstants.EIDAS_LOA_LOW, +        false); +    String spCountry = "AT"; +    String citizenCountryCode = "XX"; +                     +    //execute test +    try { +      EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry); +      Assert.fail("Wrong eIDAS response not detected"); +       +    } catch (EidasValidationException e) { +      Assert.assertEquals("ErrorId", "eidas.06", e.getErrorId());     +      Assert.assertEquals("wrong parameter size", 1, e.getParams().length); +      Assert.assertEquals("wrong errorMsg", "http://eidas.europa.eu/LoA/low",  +          e.getParams()[0]); +   +    }     +  } +   +  @Test +  public void noEidasSpCountry() throws URISyntaxException { +    //set-up +    ILightResponse eidasResponse = buildDummyAuthResponse(  +        "LU/AT/" + RandomStringUtils.randomNumeric(10),  +        EaafConstants.EIDAS_LOA_SUBSTANTIAL, +        false); +    String spCountry = null; +    String citizenCountryCode = "LU"; +     +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL)); +     +                     +    //execute test +    try { +      EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry); +      Assert.fail("Wrong eIDAS response not detected"); +       +    } catch (EidasValidationException e) { +      Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());     +      Assert.assertEquals("wrong parameter size", 2, e.getParams().length); +      Assert.assertEquals("wrong errorMsg", "PersonIdentifier",  +          e.getParams()[0]); +      Assert.assertEquals("wrong errorMsg",  +          "Destination country does not match to SP country",  +          e.getParams()[1]); +   +    }     +  } +   +  @Test +  public void noEidasResponseCountry() throws URISyntaxException { +    //set-up +    ILightResponse eidasResponse = buildDummyAuthResponse(  +        "LU/AT/" + RandomStringUtils.randomNumeric(10),  +        EaafConstants.EIDAS_LOA_SUBSTANTIAL, +        false); +    String spCountry = "AT"; +    String citizenCountryCode = null; +     +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL)); +     +                     +    //execute test +    try { +      EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry); +      Assert.fail("Wrong eIDAS response not detected"); +       +    } catch (EidasValidationException e) { +      Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());     +      Assert.assertEquals("wrong parameter size", 2, e.getParams().length); +      Assert.assertEquals("wrong errorMsg", "PersonIdentifier",  +          e.getParams()[0]); +      Assert.assertEquals("wrong errorMsg",  +          "Citizen country does not match to eIDAS-node country that generates the response",  +          e.getParams()[1]); +   +    }     +  } +   +  @Test +  public void wrongEidasResponseCountry() throws URISyntaxException { +    //set-up +    ILightResponse eidasResponse = buildDummyAuthResponse(  +        "LU/AT/" + RandomStringUtils.randomNumeric(10),  +        EaafConstants.EIDAS_LOA_SUBSTANTIAL, +        false); +    String spCountry = "AT"; +    String citizenCountryCode = "XX"; +     +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL)); +     +                     +    //execute test +    try { +      EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry); +      Assert.fail("Wrong eIDAS response not detected"); +       +    } catch (EidasValidationException e) { +      Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());     +      Assert.assertEquals("wrong parameter size", 2, e.getParams().length); +      Assert.assertEquals("wrong errorMsg", "PersonIdentifier",  +          e.getParams()[0]); +      Assert.assertEquals("wrong errorMsg",  +          "Citizen country does not match to eIDAS-node country that generates the response",  +          e.getParams()[1]); +   +    }     +  } +   +  @Test +  public void missingPersonalIdentifier() throws URISyntaxException { +    //set-up +    ILightResponse eidasResponse = buildDummyAuthResponse(  +        null,  +        EaafConstants.EIDAS_LOA_SUBSTANTIAL, +        false); +    String spCountry = "AT"; +    String citizenCountryCode = "LU"; +     +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL)); +     +                     +    //execute test +    try { +      EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry); +      Assert.fail("Wrong eIDAS response not detected"); +       +    } catch (EidasValidationException e) { +      Assert.assertEquals("ErrorId", "eidas.05", e.getErrorId());     +      Assert.assertEquals("wrong parameter size", 1, e.getParams().length); +      Assert.assertEquals("wrong errorMsg", "NO 'PersonalIdentifier' attriubte",  +          e.getParams()[0]); +   +    }     +  } +   +  @Test +  public void moreThanOnePersonalIdentifier() throws URISyntaxException { +    //set-up +    ILightResponse eidasResponse = buildDummyAuthResponse(  +        null,  +        EaafConstants.EIDAS_LOA_SUBSTANTIAL, +        true); +    String spCountry = "AT"; +    String citizenCountryCode = "LU"; +     +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL)); +     +                     +    //execute test +    try { +      EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry); +      Assert.fail("Wrong eIDAS response not detected"); +       +    } catch (EidasValidationException e) { +      Assert.assertEquals("ErrorId", "eidas.05", e.getErrorId());     +      Assert.assertEquals("wrong parameter size", 1, e.getParams().length); +      Assert.assertEquals("wrong errorMsg", "NO 'PersonalIdentifier' attriubte",  +          e.getParams()[0]); +   +    }     +  } +   +  @Test +  public void emptyPersonalIdentifier() throws URISyntaxException { +    //set-up +    ILightResponse eidasResponse = buildDummyAuthResponse(  +        "",  +        EaafConstants.EIDAS_LOA_SUBSTANTIAL, +        false); +    String spCountry = "AT"; +    String citizenCountryCode = "LU"; +     +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL)); +     +                     +    //execute test +    try { +      EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry); +      Assert.fail("Wrong eIDAS response not detected"); +       +    } catch (EidasValidationException e) { +      Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());     +      Assert.assertEquals("wrong parameter size", 2, e.getParams().length); +      Assert.assertEquals("wrong errorMsg", "PersonIdentifier",  +          e.getParams()[0]); +      Assert.assertEquals("wrong errorMsg",  +          "Wrong identifier format",  +          e.getParams()[1]); +   +    }     +  } +   +  @Test +  public void validResponse() throws URISyntaxException, EidasValidationException { +    //set-up +     +    String spCountry = RandomStringUtils.randomAlphabetic(2).toUpperCase(); +    String cCountry = RandomStringUtils.randomAlphabetic(2).toUpperCase(); +     +    ILightResponse eidasResponse = buildDummyAuthResponse(  +        cCountry + "/" + spCountry + "/" + RandomStringUtils.randomAlphanumeric(20),  +        EaafConstants.EIDAS_LOA_SUBSTANTIAL, +        false); +     +    oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL)); +     +                     +    //execute test + +    EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, cCountry, attrRegistry); +     +  } +   +   +  private AuthenticationResponse buildDummyAuthResponse(String personalId, String loa, boolean moreThanOnePersonalId)  +      throws URISyntaxException { +     +         +    final AttributeDefinition personIdattributeDef = attrRegistry.getCoreAttributeRegistry().getByFriendlyName( +        Constants.eIDAS_ATTR_PERSONALIDENTIFIER).first(); + +    final Builder attributeMap = ImmutableAttributeMap.builder(); +    if (personalId != null) { +      if (moreThanOnePersonalId) { +        ImmutableSet values = ImmutableSet.of(new StringAttributeValue(personalId),  +            new StringAttributeValue("XX/YY/" + RandomStringUtils.randomAlphanumeric(10))); +        attributeMap.put(personIdattributeDef, values);  +         +      } else { +        attributeMap.put(personIdattributeDef, personalId); +         +      }       +    } +     +    val b = new AuthenticationResponse.Builder(); +    return b.id("_".concat(Random.nextHexRandom16())) +        .issuer(RandomStringUtils.randomAlphabetic(10)) +        .subject(RandomStringUtils.randomAlphabetic(10)) +        .statusCode(Constants.SUCCESS_URI) +        .inResponseTo("_".concat(Random.nextHexRandom16())) +        .subjectNameIdFormat("afaf") +        .levelOfAssurance(loa) +        .attributes(attributeMap.build()) +        .build(); +  } +} + diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_mapConfig.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_mapConfig.xml new file mode 100644 index 00000000..3863df59 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_mapConfig.xml @@ -0,0 +1,20 @@ +<?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:tx="http://www.springframework.org/schema/tx" +  xmlns:aop="http://www.springframework.org/schema/aop" +  xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd +    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-3.1.xsd +    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> + +  <context:annotation-config /> + +  <bean id="dummyMapBasedConfiguration" +        class="at.asitplus.eidas.specific.connector.test.config.MsConnectorDummyConfigMap"> +    <constructor-arg value="/config/junit_config_1.properties" /> +    <property name="configRootDirSufix" value="src/test/resources/config" /> +  </bean> + +</beans>
\ No newline at end of file diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_realConfig.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_realConfig.xml new file mode 100644 index 00000000..bcca90b5 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_realConfig.xml @@ -0,0 +1,20 @@ +<?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:tx="http://www.springframework.org/schema/tx" +  xmlns:aop="http://www.springframework.org/schema/aop" +  xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd +    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-3.1.xsd +    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> + +  <context:annotation-config /> + +  <bean id="BasicMSSpecificNodeConfig" +    class="at.asitplus.eidas.specific.connector.config.BasicConfigurationProvider"> +    <constructor-arg +      value="#{systemProperties['eidas.ms.configuration']}" /> +  </bean> + +</beans>
\ No newline at end of file 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 0bb5d419..956cfcc9 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 @@ -11,6 +11,8 @@    <context:annotation-config /> + +      <bean id="SZRClientForeIDAS"      class="at.asitplus.eidas.specific.modules.auth.eidas.v2.szr.SzrClient" /> @@ -58,10 +60,4 @@      <property name="priority" value="0" />    </bean> -  <bean id="BasicMSSpecificNodeConfig" -    class="at.asitplus.eidas.specific.connector.config.BasicConfigurationProvider"> -    <constructor-arg -      value="#{systemProperties['eidas.ms.configuration']}" /> -  </bean> -  </beans>
\ No newline at end of file diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml index 7d5a4c53..60ecfa8c 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml @@ -17,7 +17,7 @@    <import resource="SpringTest-context_authManager.xml" /> -  <import resource="SpringTest-context_basic_test.xml" /> +  <import resource="SpringTest-context_basic_test.xml" />      <bean id="mvcGUIBuilderImpl"      class="at.asitplus.eidas.specific.connector.gui.SpringMvcGuiFormBuilderImpl" /> @@ -48,6 +48,9 @@    <bean id="authBlockSigningService"          class="at.asitplus.eidas.specific.modules.auth.eidas.v2.service.AuthBlockSigningService" /> +  <bean id="EidasSignalServlet" +        class="at.asitplus.eidas.specific.modules.auth.eidas.v2.EidasSignalServlet" /> +    <!-- Authentication Process Tasks -->    <bean id="ConnecteIDASNodeTask"      class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAuthnRequestTask" diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties index 21ed51e7..a662379c 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties @@ -101,6 +101,7 @@ eidas.ms.pvp2.metadata.validity=24  eidas.ms.sp.0.uniqueID=  eidas.ms.sp.0.pvp2.metadata.truststore=  eidas.ms.sp.0.pvp2.metadata.truststore.password= +eidas.ms.sp.0.newEidMode=true  #eidas.ms.sp.0.friendlyName=  #eidas.ms.sp.0.pvp2.metadata.url= diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties index dcdadce5..7c5e5a40 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties @@ -28,7 +28,7 @@ eidas.ms.auth.eIDAS.node_v2.entityId=ownSpecificConnector  eidas.ms.auth.eIDAS.node_v2.forward.endpoint=http://test  eidas.ms.auth.eIDAS.node_v2.forward.method=GET  eidas.ms.auth.eIDAS.node_v2.countrycode=AT -eidas.ms.auth.eIDAS.node_v2.publicSectorTargets=.* +#eidas.ms.auth.eIDAS.node_v2.publicSectorTargets=.*  eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderName=true  eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier=true  eidas.ms.auth.eIDAS.node_v2.workarounds.useStaticProviderNameForPublicSPs=false diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_4.properties b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_4.properties new file mode 100644 index 00000000..01e72069 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_4.properties @@ -0,0 +1,114 @@ +## Basic service configuration +eidas.ms.context.url.prefix= +eidas.ms.context.url.request.validation=false + +eidas.ms.context.use.clustermode=true + +##Monitoring +eidas.ms.monitoring.eIDASNode.metadata.url= + + +##Specific logger configuration +eidas.ms.technicallog.write.MDS.into.techlog=true +eidas.ms.revisionlog.write.MDS.into.revisionlog=true +eidas.ms.revisionlog.logIPAddressOfUser=true + +##Directory for static Web content +eidas.ms.webcontent.static.directory=webcontent/ +eidas.ms.webcontent.templates=templates/ +eidas.ms.webcontent.properties=properties/messages + +## extended validation of pending-request Id's +eidas.ms.core.pendingrequestid.maxlifetime=300 +eidas.ms.core.pendingrequestid.digist.algorithm=HmacSHA256 +eidas.ms.core.pendingrequestid.digist.secret=pendingReqIdSecret + +## eIDAS Ref. Implementation connector ### +eidas.ms.auth.eIDAS.node_v2.entityId=ownSpecificConnector +eidas.ms.auth.eIDAS.node_v2.forward.endpoint=http://test +eidas.ms.auth.eIDAS.node_v2.forward.method=GET +eidas.ms.auth.eIDAS.node_v2.countrycode=AT +#eidas.ms.auth.eIDAS.node_v2.publicSectorTargets=.* +eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderName=false +eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier=true +eidas.ms.auth.eIDAS.node_v2.workarounds.useStaticProviderNameForPublicSPs=false + +eidas.ms.auth.eIDAS.node_v2.loa.requested.minimum=http://eidas.europa.eu/LoA/high + +eidas.ms.auth.eIDAS.szrclient.useTestService=true +eidas.ms.auth.eIDAS.szrclient.endpoint.prod= +eidas.ms.auth.eIDAS.szrclient.endpoint.test=http://localhost:1234/demoszr +eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.path=keys/..... +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.ms.auth.eIDAS.szrclient.timeout.connection=15 +eidas.ms.auth.eIDAS.szrclient.timeout.response=30 +eidas.ms.auth.eIDAS.szrclient.params.vkz= + +eidas.ms.auth.eIDAS.szrclient.params.useSZRForbPKCalculation=false + + +eidas.ms.auth.eIDAS.authblock.keystore.password=f/+saJBc3a}*/T^s +eidas.ms.auth.eIDAS.authblock.keystore.friendlyName=connectorkeypair +eidas.ms.auth.eIDAS.authblock.keystore.path=./../keystore/teststore.jks +eidas.ms.auth.eIDAS.authblock.keystore.type=jks +eidas.ms.auth.eIDAS.authblock.key.alias=connectorkeypair +eidas.ms.auth.eIDAS.authblock.key.password=f/+saJBc3a}*/T^s + + +#Raw eIDAS Id data storage +eidas.ms.auth.eIDAS.szrclient.workarounds.eidmapping.revisionlog.active=true + +eidas.ms.auth.eIDAS.szrclient.params.setPlaceOfBirthIfAvailable=true +eidas.ms.auth.eIDAS.szrclient.params.setBirthNameIfAvailable=true + +eidas.ms.auth.eIDAS.szrclient.debug.logfullmessages=true +eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution=true + +##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 +eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.2=FirstName,true +eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.3=DateOfBirth,true + +eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.4=PlaceOfBirth,false +eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.5=BirthName,false +eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.6=Gender,false +eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.7=CurrentAddress,false + +##with mandates ---- NOT FULLY SUPPORTED AT THE MOMENT ----- +eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.0=PersonIdentifier,true +eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.1=FamilyName,true +eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.2=FirstName,true +eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.3=DateOfBirth,true +eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.4=LegalPerson,true +eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.5=LegalName,true + + +## PVP2 S-Profile end-point configuration +eidas.ms.pvp2.keystore.path=keys/..... +eidas.ms.pvp2.keystore.password= +eidas.ms.pvp2.key.metadata.alias= +eidas.ms.pvp2.key.metadata.password= +eidas.ms.pvp2.key.signing.alias= +eidas.ms.pvp2.key.signing.password= +eidas.ms.pvp2.metadata.validity=24 + +## Service Provider configuration +eidas.ms.sp.0.uniqueID= +eidas.ms.sp.0.pvp2.metadata.truststore= +eidas.ms.sp.0.pvp2.metadata.truststore.password= + +#eidas.ms.sp.0.friendlyName= +#eidas.ms.sp.0.pvp2.metadata.url= +#eidas.ms.sp.0.policy.allowed.requested.targets=.* +#eidas.ms.sp.0.policy.hasBaseIdTransferRestriction=false + + +##only for advanced config +eidas.ms.configuration.sp.disableRegistrationRequirement= +eidas.ms.configuration.restrictions.baseID.spTransmission= +eidas.ms.configuration.auth.default.countrycode= +eidas.ms.configuration.pvp.scheme.validation= +eidas.ms.configuration.pvp.enable.entitycategories=
\ No newline at end of file diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/junit.jks b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/junit.jksBinary files differ new file mode 100644 index 00000000..a18df332 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/junit.jks diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/szr/szr_resp_valid_2.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/szr/szr_resp_valid_2.xml new file mode 100644 index 00000000..f07c67d6 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/szr/szr_resp_valid_2.xml @@ -0,0 +1,50 @@ +<ns6:GetIdentityLinkEidasResponse xmlns="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:ns2="http://egov.gv.at/pvp1.xsd" xmlns:ns3="http://www.w3.org/2000/09/xmldsig#" xmlns:ns4="http://www.w3.org/2001/04/xmldsig-more#" xmlns:ns5="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns6="urn:SZRServices"><ns6:GetIdentityLinkReturn><ns6:PersonInfo><ns6:Person><Identification><Value>k+zDM1BVpN1WJO4x7ZQ3ng==</Value><Type>urn:publicid:gv.at:baseid</Type></Identification><Name><GivenName>Franz</GivenName><FamilyName>Mustermann</FamilyName></Name><Sex>unknown</Sex><DateOfBirth>1989-05-05</DateOfBirth></ns6:Person></ns6:PersonInfo><ns6:Assertion><saml:Assertion xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:ecdsa="http://www.w3.org/2001/04/xmldsig-more#" xmlns:pr="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:si="http://www.w3.org/2001/XMLSchema-instance" AssertionID="szr.bmi.gv.at-AssertionID15650069652921" IssueInstant="2019-08-05T14:09:25+01:00" Issuer="http://portal.bmi.gv.at/ref/szr/issuer" MajorVersion="1" MinorVersion="0"> +	<saml:AttributeStatement> +		<saml:Subject> +			<saml:SubjectConfirmation> +				<saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:sender-vouches</saml:ConfirmationMethod> +				<saml:SubjectConfirmationData> +					<pr:Person si:type="pr:PhysicalPersonType"><pr:Identification><pr:Value>k+zDM1BV1312312332x7ZQ3ng==</pr:Value><pr:Type>urn:publicid:gv.at:baseid</pr:Type></pr:Identification><pr:Name><pr:GivenName>Martina</pr:GivenName><pr:FamilyName primary="undefined">Musterfrau</pr:FamilyName></pr:Name><pr:DateOfBirth>1991-04-15</pr:DateOfBirth></pr:Person> +				</saml:SubjectConfirmationData> +			</saml:SubjectConfirmation> +		</saml:Subject> +	</saml:AttributeStatement> +	<dsig:Signature> +		<dsig:SignedInfo> +			<dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> +			<dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> +			<dsig:Reference URI=""> +				<dsig:Transforms> +					<dsig:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> +						<dsig:XPath>not(ancestor-or-self::pr:Identification)</dsig:XPath> +					</dsig:Transform> +					<dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> +				</dsig:Transforms> +				<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> +				<dsig:DigestValue>GZjlsEXIhUPBSbOR1R8P4dzRJHE=</dsig:DigestValue> +			</dsig:Reference> +			<dsig:Reference Type="http://www.w3.org/2000/09/xmldsig#Manifest" URI="#manifest"> +				<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> +				<dsig:DigestValue>lCnWsFICFg0ogj0Ha7++Y9gyOQg=</dsig:DigestValue> +			</dsig:Reference> +		</dsig:SignedInfo> +		<dsig:SignatureValue> +    a6tPfkdriEzAyQh2jU3/4j48baaPnY/i510OHx0vwHRvXLz80UyZzffdmtaRuk3iHVxgUMd9 +    Ld0DLsRt6tFJiPLyBCo0QCuqaOwgTcuUI3Ku/oySpqMjqug3AMdrhxW2j41yQlzvkjiZTT4j +    zQ9GHFnZnnob0+bBflqIjZOl4xc= +  </dsig:SignatureValue><dsig:KeyInfo><dsig:X509Data><dsig:X509Certificate>MIICTzCCAbigAwIBAgIBADANBgkqhkiG9w0BAQUFADATMREwDwYDVQQDEwhTWlJQRVJTQjAeFw0wNTA3MDEwMDAwMDBaFw00MDEyMzEyMzU5NTlaMBMxETAPBgNVBAMTCFNaUlBFUlNCMIIBHzANBgkqhkiG9w0BAQEFAAOCAQwAMIIBBwKBgQDGNmo9LOohefioGreKU6j6R05jUwHuddziSOQPolmMSXQG6NnnlLQaITv7BEmFj+EBqaOc+891wgZCRvNA2h+fHdJ69QXi/xjCovJI5SHh9jA+ssqhZ68iXOZHPq4WeegtYiYyJaRxWF+iPLqSm+bknS/KuBUcZol9SM3r6CMf0wKBgHytGrIelzc9ZN97VYXLkOJxi4TNSSj3Q/1TIC0s+HSzjbD694Y6ufINpR+IQm5epLTdXx9Dxv19bYnsLEIt0niMd2Cnm1DxXe8iNaDzpWec7fbRT6vDBwtTnyQkGfu2GGF3nSvVZ5AUDbLdAfZLOlbwsZmPnWU1zktSkLgKnT2XozIwMDAuBglghkgBhvhCAQ0EIRMfQ3JlYXRlZCBieSB6L09TIElDU0YgLSBIQ1I3NzgwIDANBgkqhkiG9w0BAQUFAAOBgQBwPc3l/Qf4myH8rsAAM5HqdCR68bMegWgNVxlPNl5DNJEE2hbPhIJ/K6TF6cjROYKDVuQ/+drtsZcrEOaqhqD3qw7MXAiT9GurV99YM/qTBsMy13yjU3LqeFX25Om8JlccGF5G+iHrVjfNQEUocGnGxCAPMlBvGwia4JjJcIPx7Q==</dsig:X509Certificate></dsig:X509Data></dsig:KeyInfo> +		<dsig:Object> +			<dsig:Manifest Id="manifest"> +				<dsig:Reference URI=""> +					<dsig:Transforms> +						<dsig:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> +							<dsig:XPath>not(ancestor-or-self::dsig:Signature)</dsig:XPath> +						</dsig:Transform> +					</dsig:Transforms> +					<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> +					<dsig:DigestValue>SbpaaSlLolEX5D9P7HyTPnImvns=</dsig:DigestValue> +				</dsig:Reference> +			</dsig:Manifest> +		</dsig:Object> +	</dsig:Signature> +</saml:Assertion></ns6:Assertion><ns6:AdditionalInfo>ERN</ns6:AdditionalInfo></ns6:GetIdentityLinkReturn></ns6:GetIdentityLinkEidasResponse>
\ No newline at end of file | 
