diff options
11 files changed, 330 insertions, 192 deletions
| diff --git a/connector/src/test/resources/config/templates/other_login_method.html b/connector/src/test/resources/config/templates/other_login_method.html index 3a3f9a4a..56c368c6 100644 --- a/connector/src/test/resources/config/templates/other_login_method.html +++ b/connector/src/test/resources/config/templates/other_login_method.html @@ -231,6 +231,7 @@              <input type="hidden" name="selectedCountry" value="NONE">              <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>          </form> +        <!-- todo wohnsitz -->      </div>      <!-- Abbrechen Button --> 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 c2fc44b9..76c026ae 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 @@ -34,9 +34,26 @@ public class Constants {    public static final String DATA_REQUESTED_LOA_LIST = "req_requestedLoA";    public static final String DATA_REQUESTED_LOA_COMPERISON = "req_requestedLoAComperision";    public static final String DATA_FULL_EIDAS_RESPONSE = "resp_fulleIDASResponse"; -  public static final String DATA_RESULT_MATCHING_BPK = "matching-result-bpk"; -  public static final String DATA_SIMPLE_EIDAS = "simple_eidas_data"; -  public static final String DATA_INITIAL_REGISTER_RESULT = "initial_register_result"; + +  /** +   * Stored when one match from register was found +   */ +  public static final String DATA_RESULT_MATCHING_BPK = "matching_result_bpk"; + +  /** +   * Stored before Step 2 from Matching Concept, input from user eIDAS authn +   */ +  public static final String DATA_SIMPLE_EIDAS = "matching_simple_eidas_data"; + +  /** +   * Stored after Step 2 from Matching Concept, first results from search with Person Identifier +   */ +  public static final String DATA_INITIAL_REGISTER_RESULT = "matching_initial_register_result"; + +  /** +   * Stored after Step 8 from Matching Concept, results from search in registers with MDS +   */ +  public static final String DATA_FURTHER_REGISTER_RESULT = "matching_further_register_result";    // templates for post-binding forwarding    public static final String TEMPLATE_POST_FORWARD_NAME = "eidas_node_forward.html"; @@ -183,13 +200,32 @@ public class Constants {    public static final String COUNTRY_CODE_DE = "DE";    public static final String COUNTRY_CODE_IT = "IT"; +  /** +   * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateNewErnpEntryTask} +   */    public static final String TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK = "TASK_CreateNewErnpEntryTask"; + +  /** +   * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateOtherLoginMethodGuiTask} +   */    public static final String TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK =        "TASK_GenerateOtherLoginMethodGuiTask"; + +  /** +   * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAustrianResidenceGuiTask} +   */    public static final String TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK =        "TASK_GenerateAustrianResidenceGuiTask"; + +  /** +   * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateMobilePhoneSignatureRequestTask} +   */    public static final String TRANSITION_TO_GENERATE_MOBILE_PHONE_SIGNATURE_REQUEST_TASK =        "TASK_GenerateMobilePhoneSignatureRequestTask"; + +  /** +   * TODO Second eidas login +   */    public static final String TRANSITION_TO_GENERATE_EIDAS_LOGIN = "TASK_TODO";    public static final String REQ_SELECTED_LOGIN_METHOD_PARAMETER = "loginSelection"; diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java index fad985c2..6b524e36 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java @@ -30,30 +30,32 @@ public class RegisterSearchService {     * Automatic process to fix the register entries.     *     * @param initialSearchResult Result of initial register search -   * @param specificDetailSearchResult Result of last register search +   * @param specificSearchResult Result of last register search     * @param eidasData Received eidas data     * @param pendingReq Pending request     * @return The bpk     * @throws TaskExecutionException if an error occurs during the register update     */    public String step7aKittProcess(MergedRegisterSearchResult initialSearchResult, -                                  MergedRegisterSearchResult specificDetailSearchResult, -                                  SimpleEidasData eidasData, IRequest pendingReq) throws TaskExecutionException { +                                  MergedRegisterSearchResult specificSearchResult, +                                  SimpleEidasData eidasData, +                                  IRequest pendingReq) throws TaskExecutionException { +    log.trace("Starting step7aKittProcess");      // TODO verify with which data this method gets called      try {        if (initialSearchResult.getResultCount() != 0) {          throw new WorkflowException("initialSearchResult.getResultCount() != 0");        } -      if (specificDetailSearchResult.getResultCount() != 1) { -        throw new WorkflowException("countrySpecificDetailSearchResult.getResultCount() != 1"); +      if (specificSearchResult.getResultCount() != 1) { +        throw new WorkflowException("specificSearchResult.getResultCount() != 1");        } -      if (specificDetailSearchResult.getResultsZmr().size() == 1) { -        zmrClient.update(specificDetailSearchResult.getResultsZmr().get(0), eidasData); +      if (specificSearchResult.getResultsZmr().size() == 1) { +        zmrClient.update(specificSearchResult.getResultsZmr().get(0), eidasData);        } -      if (specificDetailSearchResult.getResultsErnp().size() == 1) { -        ernpClient.update(specificDetailSearchResult.getResultsErnp().get(0), eidasData); +      if (specificSearchResult.getResultsErnp().size() == 1) { +        ernpClient.update(specificSearchResult.getResultsErnp().get(0), eidasData);        } -      return specificDetailSearchResult.getBpk(); +      return specificSearchResult.getBpk();      } catch (WorkflowException e) {        throw new TaskExecutionException(pendingReq, "Step7a failed.", e);      } 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 b519354c..65e9028f 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 @@ -85,6 +85,10 @@ import szrservices.TravelDocumentType;   * Task that creates the IdentityLink for an eIDAS authenticated person.   *   * @author tlenz + * + * TODO Take Constants#DATA_SIMPLE_EIDAS and Constants#DATA_RESULT_MATCHING_BPK + * TODO Only do VSZ Erstellung and eidasBind -- this is always the end of the whole process + * TODO Move Eintragung to separate Task, as it does not happen every time   */  @Slf4j  @Component("CreateIdentityLinkTask") @@ -96,12 +100,12 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {    private SzrClient szrClient;    @Autowired    private ICcSpecificEidProcessingService eidPostProcessor; -   +    @Autowired    private AuthBlockSigningService authBlockSigner;    private static final String EID_STATUS = "urn:eidgvat:eid.status.eidas"; -   +    /*     * (non-Javadoc)     * @@ -131,81 +135,81 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {        if (basicConfig.getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_DEBUG_USEDUMMY, false)) {          SzrResultHolder idlResult = createDummyIdentityLinkForTestDeployment(eidData);          //inject personal-data into session -        authProcessData.setIdentityLink(idlResult.getIdentityLink());   -         +        authProcessData.setIdentityLink(idlResult.getIdentityLink()); +          // set bPK and bPKType into auth session          authProcessData.setGenericDataToSession(PvpAttributeDefinitions.BPK_NAME, extendBpkByPrefix(              idlResult.getBpK(), pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier()));          authProcessData.setGenericDataToSession(PvpAttributeDefinitions.EID_SECTOR_FOR_IDENTIFIER_NAME,                                                  pendingReq.getServiceProviderConfiguration()                                                            .getAreaSpecificTargetIdentifier()); -                  +        } else { -        //build SZR request from eIDAS data         +        //build SZR request from eIDAS data          final PersonInfoType personInfo = generateSzrRequest(eidData); -         +          //request SZR based on IDL or E-ID mode          if (pendingReq.getServiceProviderConfiguration()              .isConfigurationValue(MsEidasNodeConstants.PROP_CONFIG_SP_NEW_EID_MODE, false)) {            // 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.getEidsaBind(vsz,  -              authBlockSigner.getBase64EncodedPublicKey(),  +          String signedEidasBind = szrClient.getEidsaBind(vsz, +              authBlockSigner.getBase64EncodedPublicKey(),                EID_STATUS, eidData);            revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_EIDASBIND_RECEIVED);            authProcessData.setGenericDataToSession(Constants.EIDAS_BIND, signedEidasBind); -           +            //get signed AuthBlock            String jwsSignature = authBlockSigner.buildSignedAuthBlock(pendingReq);            revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.TECH_AUCHBLOCK_CREATED);            authProcessData.setGenericDataToSession(Constants.SZR_AUTHBLOCK, jwsSignature); -           +            //inject personal-data into session            authProcessData.setEidProcess(true); -                +          } else {            //request SZR            SzrResultHolder idlResult = requestSzrForIdentityLink(personInfo); -           +            //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.setIdentityLink(idlResult.getIdentityLink());            authProcessData.setEidProcess(false); -           +            // set bPK and bPKType into auth session            authProcessData.setGenericDataToSession(PvpAttributeDefinitions.BPK_NAME, extendBpkByPrefix(                idlResult.getBpK(), pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier()));            authProcessData.setGenericDataToSession(PvpAttributeDefinitions.EID_SECTOR_FOR_IDENTIFIER_NAME,                                                    pendingReq.getServiceProviderConfiguration()                                                              .getAreaSpecificTargetIdentifier()); -           +          }        } -       +        //add generic info's into session        authProcessData.setForeigner(true);        authProcessData.setGenericDataToSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, EidasResponseUtils            .parseEidasPersonalIdentifier((String) simpleAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER))            .getFirst());        authProcessData.setQaaLevel(eidasResponse.getLevelOfAssurance()); -            +        // store pending-request        requestStoreage.storePendingRequest(pendingReq); -       -       + +      } catch (final EidasAttributeException e) {        throw new TaskExecutionException(pendingReq, "Minimum required eIDAS attributeset not found.", e); @@ -229,7 +233,7 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {      }    } -   +    private PersonInfoType generateSzrRequest(ErnbEidData eidData) {      log.debug("Starting connecting SZR Gateway");      final PersonInfoType personInfo = new PersonInfoType(); @@ -278,16 +282,16 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {        }      } -     +      return personInfo; -     +    } -  private SzrResultHolder requestSzrForIdentityLink(PersonInfoType personInfo)  +  private SzrResultHolder requestSzrForIdentityLink(PersonInfoType personInfo)        throws SzrCommunicationException, EaafException {      //request IdentityLink from SZR      final IdentityLinkType result = szrClient.getIdentityLinkInRawMode(personInfo); -     +      final Element idlFromSzr = (Element) result.getAssertion();      IIdentityLink identityLink = new SimpleIdentityLinkAssertionParser(idlFromSzr).parseIdentityLink(); @@ -301,9 +305,9 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {                        .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 ... "); @@ -316,11 +320,11 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {        bpk = bpkCalc.getFirst();      } -     +      return new SzrResultHolder(identityLink, bpk); -     +    } -   +    private void checkStateAndWriteRevisionLog(SzrResultHolder idlResult) throws SzrCommunicationException {      // write some infos into revision log      if (idlResult.getIdentityLink() == null) { @@ -341,9 +345,9 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {      }      revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_BPK_RECEIVED);      log.debug("ERnB communication was successfull"); -         +    } -   +    private String extendBpkByPrefix(String bpk, String type) {      String bpkType = null; @@ -433,20 +437,20 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {      }    } -   +    @Data -  private static class SzrResultHolder {     +  private static class SzrResultHolder {      final IIdentityLink identityLink;      final String bpK; -     +    } -     +    /**     * Build a dummy IdentityLink and a dummy bPK based on eIDAS information. -   *  +   *     * <br><br>     * <b>FOR LOCAL TESTING ONLY!!!</b> -   *  +   *     * @param eidData Information from eIDAS response     * @return IdentityLink and bPK     * @throws ParserConfigurationException In case of an IDL processing error @@ -454,7 +458,7 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {     * @throws IOException In case of an IDL processing error     * @throws EaafException In case of a bPK generation error     */ -  private SzrResultHolder createDummyIdentityLinkForTestDeployment(ErnbEidData eidData)  +  private SzrResultHolder createDummyIdentityLinkForTestDeployment(ErnbEidData eidData)        throws ParserConfigurationException, SAXException, IOException, EaafException {      log.warn("SZR-Dummy IS ACTIVE! IdentityLink is NOT VALID!!!!");      // create fake IdL @@ -495,9 +499,9 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {          .generateAreaSpecificPersonIdentifier(identityLink.getIdentificationValue(),                                                identityLink.getIdentificationType(),                                                pendingReq.getServiceProviderConfiguration() -                                                        .getAreaSpecificTargetIdentifier());    +                                                        .getAreaSpecificTargetIdentifier());      return new SzrResultHolder(identityLink, bpkCalc.getFirst()); -     +    }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateNewErnpEntryTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateNewErnpEntryTask.java index bab1945a..b89af3a0 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateNewErnpEntryTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateNewErnpEntryTask.java @@ -23,6 +23,7 @@  package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp.IErnpClient;  import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; @@ -30,18 +31,29 @@ 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.auth.modules.AbstractAuthServletTask;  import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull;  import org.springframework.stereotype.Component;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_SIMPLE_EIDAS; -  /** - * Task that searches ErnB and ZMR before adding person to SZR. + * Task that searches ERnP and ZMR before adding person to SZR. + * This corresponds to Step 9 in the eIDAS Matching Concept. + * + * Input: + * <ul> + *   <li>{@link Constants#DATA_SIMPLE_EIDAS}</li> + * </ul> + * Output: + * <ul> + *   <li>TODO MDS, BPK of new entry</li> + * </ul> + * + * TODO Import code from CreateIdentityLinkTask + * TODO Nicht mit BMI abgestimmt: ERnP Eintrag über SZR anzulegen?   *   * @author amarsalek + * @author ckollmann   */  @Slf4j  @Component("CreateNewErnbEntryTask") @@ -61,25 +73,21 @@ public class CreateNewErnpEntryTask extends AbstractAuthServletTask {    public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)        throws TaskExecutionException {      try { -      // TODO really the correct key? -      SimpleEidasData simpleEidasData = getAuthProcessData().getGenericDataFromSession(DATA_SIMPLE_EIDAS, -          SimpleEidasData.class); -      step9CreateNewErnpEntry(simpleEidasData); +      SimpleEidasData simpleEidasData = getInitialEidasData(); +      //TODO Does this return the BPK? +      ernpClient.createNewEntry(simpleEidasData);      } catch (final Exception e) {        log.error("Initial search FAILED.", e);        throw new TaskExecutionException(pendingReq, "Initial search FAILED.", e);      }    } -  @NotNull -  private AuthProcessDataWrapper getAuthProcessData() { -    return pendingReq.getSessionData(AuthProcessDataWrapper.class); +  private SimpleEidasData getInitialEidasData() { +    return getAuthProcessDataWrapper().getGenericDataFromSession(Constants.DATA_SIMPLE_EIDAS, SimpleEidasData.class);    } -  private void step9CreateNewErnpEntry(SimpleEidasData simpleEidasData) { - -    //TODO can i get bpk from response? -    ernpClient.createNewEntry(simpleEidasData); +  private AuthProcessDataWrapper getAuthProcessDataWrapper() { +    return pendingReq.getSessionData(AuthProcessDataWrapper.class);    }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateOtherLoginMethodGuiTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateOtherLoginMethodGuiTask.java index 56aaa2db..8c3cc994 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateOtherLoginMethodGuiTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateOtherLoginMethodGuiTask.java @@ -53,6 +53,7 @@ public class GenerateOtherLoginMethodGuiTask extends AbstractAuthServletTask {    @Autowired    private ISpringMvcGuiFormBuilder guiBuilder; +    @Autowired    private IConfiguration basicConfig; diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/InitialSearchTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/InitialSearchTask.java index 81035f6d..d7bec42b 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/InitialSearchTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/InitialSearchTask.java @@ -23,6 +23,7 @@  package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MergedRegisterSearchResult;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException; @@ -55,10 +56,6 @@ import java.util.HashMap;  import java.util.List;  import java.util.Map; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_FULL_EIDAS_RESPONSE; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_INITIAL_REGISTER_RESULT; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_RESULT_MATCHING_BPK; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_SIMPLE_EIDAS;  import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK;  import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK;  import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.eIDAS_ATTR_BIRTHNAME; @@ -72,6 +69,27 @@ import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.eIDAS_A  /**   * Task that searches registers (ERnP and ZMR) before adding person to SZR. + * <p> + * Input: + * <ul> + *   <li>{@link Constants#DATA_FULL_EIDAS_RESPONSE}</li> + * </ul> + * Output: + * <ul> + *   <li>{@link Constants#DATA_SIMPLE_EIDAS} converted from Full eIDAS Response</li> + *   <li>{@link Constants#DATA_INITIAL_REGISTER_RESULT} results from first search in registers with + *   PersonIdentifier</li> + *   <li>{@link Constants#DATA_FURTHER_REGISTER_RESULT} results after second search in registers with MDS</li> + *   <li>{@link Constants#DATA_RESULT_MATCHING_BPK} if one register result found</li> + * </ul> + * <p> + * Transitions: + * <ul> + *   <li>{@link CreateNewErnpEntryTask} if no results in registers where found for this user</li> + *   <li>{@link GenerateOtherLoginMethodGuiTask} if search with MDS returns more than one match, user may provide + *   alternative login methods to get an unique match</li> + *   <li>{@link CreateIdentityLinkTask} if search in register returned one match, user is uniquely identified</li> + * </ul>   *   * @author amarsalek   * @author ckollmann @@ -102,11 +120,8 @@ public class InitialSearchTask extends AbstractAuthServletTask {        throws TaskExecutionException {      try {        final SimpleEidasData eidasData = convertEidasAttrToSimpleData(); -      storeSimpleEidasData(eidasData); +      storeInitialEidasData(eidasData);        step2RegisterSearchWithPersonIdentifier(executionContext, eidasData); -    } catch (final TaskExecutionException e) { -      log.error("Initial search failed", e); -      throw e;      } catch (final Exception e) {        log.error("Initial search failed", e);        throw new TaskExecutionException(pendingReq, "Initial search failed", e); @@ -117,52 +132,41 @@ public class InitialSearchTask extends AbstractAuthServletTask {        ExecutionContext executionContext, SimpleEidasData eidasData)        throws TaskExecutionException, EaafStorageException, ManualFixNecessaryException {      log.trace("Starting step2RegisterSearchWithPersonIdentifier"); -    String personIdentifier = eidasData.getPseudonym(); -    MergedRegisterSearchResult registerData = registerSearchService.searchWithPersonIdentifier(eidasData); -    storeInitialRegisterResult(registerData); -    int resultCount = registerData.getResultCount(); +    MergedRegisterSearchResult initialSearchResult = registerSearchService.searchWithPersonIdentifier(eidasData); +    storeInitialRegisterResult(initialSearchResult); +    int resultCount = initialSearchResult.getResultCount();      if (resultCount == 0) { -      step5CheckAndPerformCountrySpecificSearchIfPossible(executionContext, registerData, eidasData); +      step5CountrySpecificSearchCheck(executionContext, initialSearchResult, eidasData);      } else if (resultCount == 1) { -      step3CheckRegisterUpdateNecessary(registerData, eidasData); +      step3CheckRegisterUpdateNecessary(initialSearchResult, eidasData);      } else { -      throw new ManualFixNecessaryException(personIdentifier); +      throw new ManualFixNecessaryException(eidasData);      }    } -  private void step3CheckRegisterUpdateNecessary(MergedRegisterSearchResult registerData, SimpleEidasData eidasData) +  private void step3CheckRegisterUpdateNecessary( +      MergedRegisterSearchResult initialSearchResult, SimpleEidasData eidasData)        throws ManualFixNecessaryException {      log.trace("Starting step3CheckRegisterUpdateNecessary");      try { -      if (eidasData.equalsRegisterData(registerData)) { -        String bpk = registerData.getBpk(); -        storeMatchingBpk(bpk); +      if (eidasData.equalsRegisterData(initialSearchResult)) { +        storeMatchingBpk(initialSearchResult.getBpk());        } else { -        step4UpdateRegisterData(registerData, eidasData); +        // TODO Update "initialSearchResult" in register with "eidasData" from login not possible for now +        storeMatchingBpk(initialSearchResult.getBpk());        }      } catch (WorkflowException | EaafStorageException e) {        throw new ManualFixNecessaryException(eidasData);      }    } -  private void step4UpdateRegisterData(MergedRegisterSearchResult registerData, SimpleEidasData eidasData) -      throws WorkflowException, EaafStorageException { -    log.trace("Starting step4UpdateRegisterData"); -    log.debug("Update {} with {}", registerData, eidasData); -    //TODO wann rechtlich möglich? - -    String bpk = registerData.getBpk(); -    storeMatchingBpk(bpk); -  } - -  private void step5CheckAndPerformCountrySpecificSearchIfPossible( -      ExecutionContext executionContext, MergedRegisterSearchResult registerData, -      SimpleEidasData eidasData) +  private void step5CountrySpecificSearchCheck( +      ExecutionContext executionContext, MergedRegisterSearchResult initialSearchResult, SimpleEidasData eidasData)        throws TaskExecutionException, ManualFixNecessaryException, EaafStorageException {      log.trace("Starting step5CheckAndPerformCountrySpecificSearchIfPossible");      CountrySpecificDetailSearchProcessor specificHandler = findSpecificProcessor(eidasData);      if (specificHandler != null) { -      step6CountrySpecificSearch(executionContext, specificHandler, registerData, eidasData); +      step6CountrySpecificSearch(executionContext, specificHandler, initialSearchResult, eidasData);      } else {        step8RegisterSearchWithMds(executionContext, eidasData);      } @@ -182,7 +186,7 @@ public class InitialSearchTask extends AbstractAuthServletTask {    private void step6CountrySpecificSearch(ExecutionContext executionContext,                                            CountrySpecificDetailSearchProcessor processor, -                                          MergedRegisterSearchResult registerData, +                                          MergedRegisterSearchResult initialSearchResult,                                            SimpleEidasData eidasData)        throws TaskExecutionException, ManualFixNecessaryException, EaafStorageException {      log.trace("Starting step6CountrySpecificSearch"); @@ -191,57 +195,51 @@ public class InitialSearchTask extends AbstractAuthServletTask {      if (resultCount == 0) {        step8RegisterSearchWithMds(executionContext, eidasData);      } else if (resultCount == 1) { -      step7aKittProcess(registerData, countrySearchResult, eidasData); +      String bpk = registerSearchService +          .step7aKittProcess(initialSearchResult, countrySearchResult, eidasData, pendingReq); +      storeMatchingBpk(bpk);      } else {        throw new ManualFixNecessaryException(eidasData);      }    } -  private void step7aKittProcess(MergedRegisterSearchResult registerData, -                                 MergedRegisterSearchResult countrySpecificDetailSearchResult, -                                 SimpleEidasData eidasData) -      throws TaskExecutionException, EaafStorageException { -    log.trace("Starting step7aKittProcess"); -    String bpk = registerSearchService.step7aKittProcess(registerData, countrySpecificDetailSearchResult, -        eidasData, pendingReq); -    storeMatchingBpk(bpk); -  } -    private void step8RegisterSearchWithMds(ExecutionContext executionContext, SimpleEidasData eidasData)        throws EaafStorageException {      log.trace("Starting step8RegisterSearchWithMds");      MergedRegisterSearchResult registerData = registerSearchService.searchWithMds(eidasData);      if (registerData.getResultCount() == 0) { -      // TODO really the correct key to store data? -      storeSimpleEidasData(eidasData);        executionContext.put(TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK, true);      } else { +      storeFurtherRegisterResults(registerData);        executionContext.put(TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK, true);      }    } -  private void storeSimpleEidasData(SimpleEidasData eidasData) throws EaafStorageException { -    getAuthProcessData().setGenericDataToSession(DATA_SIMPLE_EIDAS, eidasData); +  private void storeInitialRegisterResult(MergedRegisterSearchResult registerData) throws EaafStorageException { +    getAuthProcessDataWrapper().setGenericDataToSession(Constants.DATA_INITIAL_REGISTER_RESULT, registerData);    } -  private void storeInitialRegisterResult(MergedRegisterSearchResult registerData) throws EaafStorageException { -    getAuthProcessData().setGenericDataToSession(DATA_INITIAL_REGISTER_RESULT, registerData); +  private void storeFurtherRegisterResults(MergedRegisterSearchResult registerData) throws EaafStorageException { +    getAuthProcessDataWrapper().setGenericDataToSession(Constants.DATA_FURTHER_REGISTER_RESULT, registerData); +  } + +  private void storeInitialEidasData(SimpleEidasData eidasData) throws EaafStorageException { +    getAuthProcessDataWrapper().setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, eidasData);    }    private void storeMatchingBpk(String bpk) throws EaafStorageException { -    getAuthProcessData().setGenericDataToSession(DATA_RESULT_MATCHING_BPK, bpk); +    getAuthProcessDataWrapper().setGenericDataToSession(Constants.DATA_RESULT_MATCHING_BPK, bpk);    } -  @NotNull -  private AuthProcessDataWrapper getAuthProcessData() { +  private AuthProcessDataWrapper getAuthProcessDataWrapper() {      return pendingReq.getSessionData(AuthProcessDataWrapper.class);    }    @NotNull    private SimpleEidasData convertEidasAttrToSimpleData()        throws EidasAttributeException { -    final ILightResponse eidasResponse = getAuthProcessData() -        .getGenericDataFromSession(DATA_FULL_EIDAS_RESPONSE, ILightResponse.class); +    final ILightResponse eidasResponse = getAuthProcessDataWrapper() +        .getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE, ILightResponse.class);      Map<String, Object> simpleMap = convertEidasAttrToSimpleMap(eidasResponse.getAttributes().getAttributeMap());      return convertSimpleMapToSimpleData(simpleMap);    } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAustrianResidenceGuiResponseTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAustrianResidenceGuiResponseTask.java index d565c329..6d050dc1 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAustrianResidenceGuiResponseTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAustrianResidenceGuiResponseTask.java @@ -31,6 +31,7 @@ import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ManualFixNeces  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;  import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;  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.auth.modules.AbstractAuthServletTask; @@ -46,12 +47,26 @@ import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import java.util.Enumeration; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_INITIAL_REGISTER_RESULT; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_SIMPLE_EIDAS;  /**   * Task receives the response of {@link GenerateAustrianResidenceGuiTask} and handles it.   * This corresponds to Steps 17B, 18, 19 in the eIDAS Matching Concept. + * <p> + * Input: + * <ul> + *   <li>{@link Constants#DATA_SIMPLE_EIDAS} initial login data from user</li> + *   <li>{@link Constants#DATA_INITIAL_REGISTER_RESULT} results from search in registers with personIdentifier</li> + * </ul> + * Output: + * <ul> + *   <li>{@link Constants#DATA_RESULT_MATCHING_BPK} if one register result found</li> + * </ul> + * Transitions: + * <ul> + *   <li>{@link CreateNewErnpEntryTask}</li> if no results from search with residency data in registers + *   <li>{@link CreateIdentityLinkTask}</li> if one exact match between initial register search (with MDS) and results + *   from search with residency data in registers exists + * </ul>   *   * @author amarsalek   * @author ckollmann @@ -85,45 +100,68 @@ public class ReceiveAustrianResidenceGuiResponseTask extends AbstractAuthServlet        throws TaskExecutionException {      log.trace("Starting ReceiveAustrianResidenceGuiResponseTask");      UserInput input = parseHtmlInput(request); -    if (input.isFormerResidenceAvailable()) { -      if (input.getStreet().isEmpty() || input.getCity().isEmpty() || input.getZipcode().isEmpty()) { -        // form should ensure that mandatory fields are field => this should never happen -        throw new TaskExecutionException(pendingReq, "Invalid user input", new InvalidUserInputException()); -      } -      // TODO Also search with MDS? -      MergedRegisterSearchResult result = registerSearchService +    if (!input.isFormerResidenceAvailable()) { +      moveToNextTask(executionContext); +      return; +    } +    if (input.getStreet().isEmpty() || input.getCity().isEmpty() || input.getZipcode().isEmpty()) { +      // HTML form should ensure that mandatory fields are set => this should never happen +      throw new TaskExecutionException(pendingReq, "Invalid user input", new InvalidUserInputException()); +    } +    // TODO Also search with MDS? But MDS Search has already happened? +    try { +      SimpleEidasData eidasData = getInitialEidasData(); +      MergedRegisterSearchResult residencyResult = registerSearchService            .searchWithResidence(input.zipcode, input.city, input.street); -      if (result.getResultCount() == 0) { +      if (residencyResult.getResultCount() == 0) {          moveToNextTask(executionContext); -        return; -      } else if (result.getResultCount() == 1) { -        compareSearchResultWithInitialData(executionContext, result); +      } else if (residencyResult.getResultCount() == 1) { +        compareSearchResultWithInitialData(executionContext, residencyResult, eidasData);        } else { -        throw new TaskExecutionException(pendingReq, "Manual Fix necessary", new ManualFixNecessaryException("todo")); +        throw new TaskExecutionException(pendingReq, +            "Manual Fix necessary", new ManualFixNecessaryException(eidasData));        } -    } else { -      moveToNextTask(executionContext); +    } catch (EaafStorageException e) { +      log.error("Search with residency data failed", e); +      throw new TaskExecutionException(pendingReq, "Search with residency data failed", e);      }    } -  private void compareSearchResultWithInitialData(ExecutionContext executionContext, MergedRegisterSearchResult result) -      throws TaskExecutionException { +  private void compareSearchResultWithInitialData(ExecutionContext executionContext, +                                                  MergedRegisterSearchResult residencyResult, SimpleEidasData eidasData) +      throws TaskExecutionException, EaafStorageException {      try { -      AuthProcessDataWrapper authProcessDataWrapper = pendingReq.getSessionData(AuthProcessDataWrapper.class); -      MergedRegisterSearchResult initialSearchResult = authProcessDataWrapper -          .getGenericDataFromSession(DATA_INITIAL_REGISTER_RESULT, MergedRegisterSearchResult.class); -      SimpleEidasData simpleEidasData = authProcessDataWrapper -          .getGenericDataFromSession(DATA_SIMPLE_EIDAS, SimpleEidasData.class); -      if (simpleEidasData.equalsRegisterData(result)) { -        registerSearchService.step7aKittProcess(initialSearchResult, result, simpleEidasData, pendingReq); +      MergedRegisterSearchResult initialSearchResult = getInitialRegisterResult(); +      // TODO search "residencyResult" in "initialSearchResult"!? +      if (eidasData.equalsRegisterData(residencyResult)) { +        String bpk = registerSearchService +            .step7aKittProcess(initialSearchResult, residencyResult, eidasData, pendingReq); +        storeMatchingBpk(bpk);        } else {          moveToNextTask(executionContext);        }      } catch (WorkflowException e) { -      throw new TaskExecutionException(pendingReq, "Search failed", new ManualFixNecessaryException("todo")); +      throw new TaskExecutionException(pendingReq, "Search failed", new ManualFixNecessaryException(eidasData));      }    } +  private SimpleEidasData getInitialEidasData() { +    return getAuthProcessDataWrapper().getGenericDataFromSession(Constants.DATA_SIMPLE_EIDAS, SimpleEidasData.class); +  } + +  private MergedRegisterSearchResult getInitialRegisterResult() { +    return getAuthProcessDataWrapper().getGenericDataFromSession(Constants.DATA_INITIAL_REGISTER_RESULT, +        MergedRegisterSearchResult.class); +  } + +  private void storeMatchingBpk(String bpk) throws EaafStorageException { +    getAuthProcessDataWrapper().setGenericDataToSession(Constants.DATA_RESULT_MATCHING_BPK, bpk); +  } + +  private AuthProcessDataWrapper getAuthProcessDataWrapper() { +    return pendingReq.getSessionData(AuthProcessDataWrapper.class); +  } +    private void moveToNextTask(ExecutionContext executionContext) {      // Later on, this should transition to Step 20      executionContext.put(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK, true); diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveMobilePhoneSignatureResponseTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveMobilePhoneSignatureResponseTask.java index 8c7815be..57531493 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveMobilePhoneSignatureResponseTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveMobilePhoneSignatureResponseTask.java @@ -37,6 +37,7 @@ import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchSe  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.EaafBuilderException; +import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;  import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;  import at.gv.egiz.eaaf.core.impl.data.Pair;  import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper; @@ -73,15 +74,30 @@ import java.io.IOException;  import java.util.List;  import java.util.Set; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_INITIAL_REGISTER_RESULT; -import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.DATA_SIMPLE_EIDAS;  import static at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants.MODULE_NAME_FOR_LOGGING;  /**   * Task that receives the SAML2 response from ID Austria system.   * This corresponds to Step 15 in the eIDAS Matching Concept.   * + * Input: + * <ul> + *   <li>{@link Constants#DATA_SIMPLE_EIDAS} initial login data from user</li> + *   <li>{@link Constants#DATA_INITIAL_REGISTER_RESULT} results from search in registers with personIdentifier</li> + * </ul> + * Output: + * <ul> + *   <li>{@link Constants#DATA_RESULT_MATCHING_BPK} if one register result found</li> + * </ul> + * Transitions: + * <ul> + *   <li>{@link GenerateAustrianResidenceGuiTask}</li> if no results in registers were found + *   <li>{@link CreateIdentityLinkTask}</li> if one exact match between initial register search (with MDS) data and + *   register search with MPS data exists + * </ul> + *   * @author tlenz + * @author ckollmann   */  @Slf4j  @Component("ReceiveMobilePhoneSignatureResponseTask") @@ -108,6 +124,7 @@ public class ReceiveMobilePhoneSignatureResponseTask extends AbstractAuthServlet    /**     * Creates the new task, with autowired dependencies from Spring.     */ +  @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")    public ReceiveMobilePhoneSignatureResponseTask(SamlVerificationEngine samlVerificationEngine,                                                   RegisterSearchService registerSearchService,                                                   IdAustriaClientAuthCredentialProvider credentialProvider, @@ -146,22 +163,24 @@ public class ReceiveMobilePhoneSignatureResponseTask extends AbstractAuthServlet         *         */ -      AuthProcessDataWrapper authProcessData = pendingReq.getSessionData(AuthProcessDataWrapper.class); -      MergedRegisterSearchResult initialSearchResult = -          authProcessData.getGenericDataFromSession(DATA_INITIAL_REGISTER_RESULT, MergedRegisterSearchResult.class); -      SimpleEidasData eidasData = authProcessData.getGenericDataFromSession(DATA_SIMPLE_EIDAS, SimpleEidasData.class); -      String bpkZp = extractBpkZp(extractor, authProcessData, eidasData); +      MergedRegisterSearchResult initialSearchResult = getInitialRegisterResult(); +      SimpleEidasData eidasData = getInitialEidasData(); +      String bpkZp = extractBpkZp(extractor, eidasData); -      MergedRegisterSearchResult result = registerSearchService.searchWithBpkZp(bpkZp); -      if (result.getResultCount() == 0) { +      // TODO Hier ist wohl keine Register-Suche notwendig, denn das ergibt sicher einen Treffer +      // TODO Soll: In den Ergebnissen aus Step8 matchen! Über BPK matchen, und dann schauen, ob zumindest +      //  Geburtsdatum passt +      MergedRegisterSearchResult registerResult = registerSearchService.searchWithBpkZp(bpkZp); +      if (registerResult.getResultCount() == 0) {          executionContext.put(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK, true);          return; -      } else if (result.getResultCount() == 1) { -        String bpk = registerSearchService.step7aKittProcess(initialSearchResult, result, eidasData, pendingReq); -        authProcessData.setGenericDataToSession(Constants.DATA_RESULT_MATCHING_BPK, bpk); +      } else if (registerResult.getResultCount() == 1) { +        String bpk = registerSearchService +            .step7aKittProcess(initialSearchResult, registerResult, eidasData, pendingReq); +        storeMatchingBpk(bpk);          return; -      } else if (result.getResultCount() > 1) { -        throw new ManualFixNecessaryException("bpkZp: " + bpkZp); +      } else if (registerResult.getResultCount() > 1) { +        throw new ManualFixNecessaryException(eidasData);        }        // set NeedConsent to false, because user gives consent during authentication @@ -192,16 +211,31 @@ public class ReceiveMobilePhoneSignatureResponseTask extends AbstractAuthServlet    }    private String extractBpkZp(AssertionAttributeExtractor extractor, -                              AuthProcessDataWrapper authProcessData,                                SimpleEidasData eidasData) throws EaafBuilderException, InvalidUserInputException { -    SimpleMobileSignatureData simpleMobileSignatureData = getAuthDataFromInterfederation(extractor, authProcessData); +    SimpleMobileSignatureData simpleMobileSignatureData = getAuthDataFromInterfederation(extractor);      if (!simpleMobileSignatureData.equalsSimpleEidasData(eidasData)) { -      //TODO User has cheated? -      throw new InvalidUserInputException(); +      throw new InvalidUserInputException(); // user has cheated!?      }      return simpleMobileSignatureData.getBpk();    } +  private SimpleEidasData getInitialEidasData() { +    return getAuthProcessDataWrapper().getGenericDataFromSession(Constants.DATA_SIMPLE_EIDAS, SimpleEidasData.class); +  } + +  private MergedRegisterSearchResult getInitialRegisterResult() { +    return getAuthProcessDataWrapper().getGenericDataFromSession(Constants.DATA_INITIAL_REGISTER_RESULT, +        MergedRegisterSearchResult.class); +  } + +  private void storeMatchingBpk(String bpk) throws EaafStorageException { +    getAuthProcessDataWrapper().setGenericDataToSession(Constants.DATA_RESULT_MATCHING_BPK, bpk); +  } + +  private AuthProcessDataWrapper getAuthProcessDataWrapper() { +    return pendingReq.getSessionData(AuthProcessDataWrapper.class); +  } +    @NotNull    private InboundMessage decodeAndVerifyMessage(HttpServletRequest request, HttpServletResponse response,                                                  IDecoder decoder, EaafUriCompare comparator) throws Exception { @@ -303,8 +337,7 @@ public class ReceiveMobilePhoneSignatureResponseTask extends AbstractAuthServlet      return null;    } -  private SimpleMobileSignatureData getAuthDataFromInterfederation(AssertionAttributeExtractor extractor, -                                                                   AuthProcessDataWrapper authProcessData) +  private SimpleMobileSignatureData getAuthDataFromInterfederation(AssertionAttributeExtractor extractor)        throws EaafBuilderException {      List<String> requiredAttributes = IdAustriaClientAuthConstants.DEFAULT_REQUIRED_PVP_ATTRIBUTE_NAMES;      SimpleMobileSignatureData result = new SimpleMobileSignatureData(); @@ -329,10 +362,10 @@ public class ReceiveMobilePhoneSignatureResponseTask extends AbstractAuthServlet          result.setDateOfBirth(extractor.getSingleAttributeValue(attrName));        }        if (PvpAttributeDefinitions.EID_CITIZEN_EIDAS_QAA_LEVEL_NAME.equals(attrName)) { -        authProcessData.setQaaLevel(extractor.getSingleAttributeValue(attrName)); +        getAuthProcessDataWrapper().setQaaLevel(extractor.getSingleAttributeValue(attrName));        }      } -    authProcessData.setIssueInstant(extractor.getAssertionIssuingDate()); +    getAuthProcessDataWrapper().setIssueInstant(extractor.getAssertionIssuingDate());      return result;    } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveOtherLoginMethodGuiResponseTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveOtherLoginMethodGuiResponseTask.java index 12eb7a83..b3c994c9 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveOtherLoginMethodGuiResponseTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveOtherLoginMethodGuiResponseTask.java @@ -41,6 +41,21 @@ import java.util.Enumeration;   * Handles user's selection from {@link GenerateOtherLoginMethodGuiTask}.   * This corresponds to Steps 10, 14, 16 in the eIDAS Matching Concept.   * + * Input: + * <ul> + *   <li>{@link Constants#DATA_SIMPLE_EIDAS} initial login data from user</li> + *   <li>{@link Constants#DATA_INITIAL_REGISTER_RESULT} results from search in registers with personIdentifier</li> + * </ul> + * Output: + * <ul> + *   <li>{@link Constants#DATA_RESULT_MATCHING_BPK} if one register result found</li> + * </ul> + * Transitions: + * <ul> + *   <li>{@link GenerateMobilePhoneSignatureRequestTask}</li> if selected by user + *   <li>{@link GenerateAustrianResidenceGuiTask}</li> if selected by user + * </ul> + *   * @author amarsalek   * @author ckollmann   */ diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml b/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml index f60bb5f9..369af4c4 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml @@ -44,37 +44,39 @@    <pd:Transition  from="initialRegisterSearch"                    to="generateOtherLoginMethodGuiTask"                    conditionExpression="ctx['TASK_GenerateOtherLoginMethodGuiTask']"/> +  <pd:Transition  from="initialRegisterSearch" +                  to="generateIdentityLink" />    <pd:Transition  from="generateOtherLoginMethodGuiTask"                    to="receiveOtherLoginMethodGuiResponseTask" />    <pd:Transition  from="receiveOtherLoginMethodGuiResponseTask"                    to="generateMobilePhoneSignatureRequestTask"                    conditionExpression="ctx['TASK_GenerateMobilePhoneSignatureRequestTask']"/> -  <pd:Transition  from="generateMobilePhoneSignatureRequestTask" -                  to="receiveMobilePhoneSignatureResponseTask" /> -  <pd:Transition  from="receiveMobilePhoneSignatureResponseTask" -                  to="createNewErnpEntryTask" /> - +  <pd:Transition  from="receiveOtherLoginMethodGuiResponseTask" +                  to="generateAustrianResidenceGuiTask" +                  conditionExpression="ctx['TASK_GenerateAustrianResidenceGuiTask']"/>    <!-- TRANSITION_TO_GENERATE_EIDAS_LOGIN -->    <!-- <pd:Transition  from="receiveOtherLoginMethodGuiResponseTask" -->    <!--                 to="generateAustrianResidenceGuiTask" -->    <!--                 conditionExpression="ctx['TASK_TODO']"/> --> -  <pd:Transition  from="receiveOtherLoginMethodGuiResponseTask" +  <pd:Transition  from="generateMobilePhoneSignatureRequestTask" +                  to="receiveMobilePhoneSignatureResponseTask" /> + +  <pd:Transition  from="receiveMobilePhoneSignatureResponseTask"                    to="generateAustrianResidenceGuiTask" -                  conditionExpression="ctx['TASK_GenerateAustrianResidenceGuiTask']"/> +                  conditionExpression="ctx['TASK_GenerateAustrianResidenceGuiTask']" /> +  <pd:Transition  from="receiveMobilePhoneSignatureResponseTask" +                  to="generateIdentityLink" />    <pd:Transition  from="generateAustrianResidenceGuiTask"                    to="receiveAustrianResidenceGuiResponseTask" />    <pd:Transition  from="receiveAustrianResidenceGuiResponseTask" -                  to="generateIdentityLink" -                  conditionExpression="ctx['TASK_TODO']"/> - -  <pd:Transition  from="receiveAustrianResidenceGuiResponseTask"                    to="createNewErnpEntryTask" -                  conditionExpression="ctx['TASK_TODO']"/> - +                  conditionExpression="ctx['TASK_CreateNewErnpEntryTask']"/> +  <pd:Transition  from="receiveAustrianResidenceGuiResponseTask" +                  to="generateIdentityLink"/>    <pd:Transition  from="createNewErnpEntryTask"                    to="generateIdentityLink" /> | 
