diff options
23 files changed, 738 insertions, 798 deletions
| diff --git a/connector/src/main/resources/properties/status_messages_en.properties b/connector/src/main/resources/properties/status_messages_en.properties index 80228a47..c430fc90 100644 --- a/connector/src/main/resources/properties/status_messages_en.properties +++ b/connector/src/main/resources/properties/status_messages_en.properties @@ -6,6 +6,9 @@ eidas.04=Request contains no sessionToken. Authentication process stops  eidas.05=Received eIDAS response-message is not valid. Reason: {0}  eidas.06=LoA from eIDAS response-message {0} does not match to requested LoA  eidas.07=eIDAS Response attribute-validation FAILED. Attribute:{0} Reason: {1} +eidas.08=An unexpected error occurred. +eidas.09=An error occurred while loading your data from official registers. Please contact the support. +  config.01=No configuration-file parameter found. Maybe Java SystemD parameter is missing  config.03=Can not load configuration from path {0} (See logs for more details) 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 9104c55f..54f7f8fa 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 @@ -32,7 +32,7 @@ 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";//TODO? +  public static final String DATA_RESULT_MATCHING_BPK = "matching-result-bpk";    // templates for post-binding forwarding    public static final String TEMPLATE_POST_FORWARD_NAME = "eidas_node_forward.html"; diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ErnbEidData.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ErnbEidData.java index 6c7eeb6b..b780d3e8 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ErnbEidData.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ErnbEidData.java @@ -1,5 +1,5 @@  /* - * Copyright 2018 A-SIT Plus GmbH + * Copyright 2020 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.   * diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/MergedRegisterSearchResult.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/MergedRegisterSearchResult.java index 056b0450..e147b8aa 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/MergedRegisterSearchResult.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/MergedRegisterSearchResult.java @@ -1,21 +1,51 @@ +/* + * Copyright 2020 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 at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;  import lombok.Data; -import java.util.ArrayList; +import java.util.List; + +@Data +public class MergedRegisterSearchResult { -@Data public class MergedRegisterSearchResult { +  final List<RegisterResult> resultsZmr; +  final List<RegisterResult> resultsErnp; -  ArrayList<RegisterResult> resultsZmr = new ArrayList<>(); -  ArrayList<RegisterResult> resultsErnb = new ArrayList<>(); +  public MergedRegisterSearchResult(List<RegisterResult> resultsZmr, List<RegisterResult> resultsErnp) { +    this.resultsZmr = resultsZmr; +    this.resultsErnp = resultsErnp; +  }    public int getResultCount() { -    return resultsZmr.size() + resultsErnb.size(); +    return resultsZmr.size() + resultsErnp.size();    }    /** -   * Verfies that there is only one match and retunrs the bpk. +   * Verifies that there is only one match and returns the bpk. +   *     * @return bpk bpk of the match     * @throws WorkflowException if multiple results have been found     */ @@ -23,10 +53,23 @@ import java.util.ArrayList;      if (getResultCount() != 1) {        throw new WorkflowException("getResultCount() != 1");      } +    return getResult().getBpk(); +  } + +  /** +   * Returns the results, if there is exactly one, throws exception otherwise. +   * +   * @return The result +   * @throws WorkflowException Results does not contain exactly one result +   */ +  public RegisterResult getResult() throws WorkflowException { +    if (getResultCount() != 1) { +      throw new WorkflowException("getResultCount() != 1"); +    }      if (resultsZmr.size() == 1) { -      return resultsZmr.get(0).getBpk(); +      return resultsZmr.get(0);      } else { -      return resultsErnb.get(0).getBpk(); +      return resultsErnp.get(0);      }    }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/RegisterResult.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/RegisterResult.java index c92808a1..1cc36fe9 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/RegisterResult.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/RegisterResult.java @@ -1,3 +1,26 @@ +/* + * Copyright 2020 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 at.gv.e_government.reference.namespace.persondata._20020228.PostalAddressType; @@ -7,18 +30,18 @@ import lombok.Data;  public class RegisterResult {    // MDS -  private String pseudonym = null; -  private String givenName = null; -  private String familyName = null; -  private String dateOfBirth = null; +  private String pseudonym; +  private String givenName; +  private String familyName; +  private String dateOfBirth;    // additional attributes -  private String placeOfBirth = null; -  private String birthName = null; -  private String taxNumber = null; -  private PostalAddressType address = null; +  private String placeOfBirth; +  private String birthName; +  private String taxNumber; +  private PostalAddressType address; -  private String bpk = null; +  private String bpk;    /**     * Register search result. @@ -46,26 +69,6 @@ public class RegisterResult {     * @param familyName   The familyName     * @param dateOfBirth  The dateOfBirth     * @param placeOfBirth The placeOfBirth -   */ -  public RegisterResult(String bpk, String pseudonym, String givenName, String familyName, String dateOfBirth, -                        String placeOfBirth) { -    this.bpk = bpk; -    this.pseudonym = pseudonym; -    this.givenName = givenName; -    this.familyName = familyName; -    this.dateOfBirth = dateOfBirth; -    this.placeOfBirth = placeOfBirth; -  } - -  /** -   * Register search result. -   * -   * @param bpk          The bpk -   * @param pseudonym    The pseudonym -   * @param givenName    The givenName -   * @param familyName   The familyName -   * @param dateOfBirth  The dateOfBirth -   * @param placeOfBirth The placeOfBirth     * @param birthName    The birthName     * @param taxNumber    The taxNumber     * @param address      The address diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleEidasData.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleEidasData.java index 674f5b48..57597122 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleEidasData.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleEidasData.java @@ -1,5 +1,5 @@  /* - * Copyright 2018 A-SIT Plus GmbH + * Copyright 2020 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.   * @@ -30,18 +30,18 @@ import lombok.Data;  @Data  public class SimpleEidasData { -  private String citizenCountryCode = null; +  private String citizenCountryCode;    // MDS -  private String pseudonym = null; -  private String givenName = null; -  private String familyName = null; -  private String dateOfBirth = null; +  private String pseudonym; +  private String givenName; +  private String familyName; +  private String dateOfBirth;    // additional attributes -  private String placeOfBirth = null; -  private String birthName = null; -  private PostalAddressType address = null; +  private String placeOfBirth; +  private String birthName; +  private PostalAddressType address;    private String taxNumber;    /** @@ -51,14 +51,7 @@ public class SimpleEidasData {     * @throws WorkflowException if multiple results have been found     */    public boolean equalsRegisterData(MergedRegisterSearchResult result) throws WorkflowException { -    if (result.getResultCount() != 1) { -      throw new WorkflowException("result.getResultCount() != 1"); -    } -    if (result.getResultsErnb().size() == 1) { -      return equalsRegisterData(result.getResultsErnb().get(0)); -    } else { -      return equalsRegisterData(result.getResultsZmr().get(0)); -    } +    return equalsRegisterData(result.getResult());    }    private boolean equalsRegisterData(RegisterResult result) { diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernb/DummyErnbClient.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernb/DummyErnbClient.java deleted file mode 100644 index 2d2fa76d..00000000 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernb/DummyErnbClient.java +++ /dev/null @@ -1,43 +0,0 @@ -package at.asitplus.eidas.specific.modules.auth.eidas.v2.ernb; - -import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; - -@Service("ErnbClientForeIDAS") -public class DummyErnbClient implements IErnbClient { - -  @Override -  public ArrayList<RegisterResult> searchWithPersonIdentifer(String personIdentifer) { -    return resultEmpty(); -  } - -  @Override -  public ArrayList<RegisterResult> searchWithMds(String givenName, String familyName, String dateOfBirth) { -    return resultEmpty();//TODO will I only receive matches where all three values match perfectly? -  } - -  @Override -  public ArrayList<RegisterResult> searchDeSpecific(String givenName, String familyName, String dateOfBirth, -                                                    String birthPlace, String birthName) { -    return resultEmpty();//TODO -  } - -  @Override -  public ArrayList<RegisterResult> searchItSpecific(String txNumber) { -    return resultEmpty();//TODO -  } - -  @Override -  public void update(RegisterResult registerResult, SimpleEidasData eidData) { -    //TODO -  } - -  private ArrayList<RegisterResult> resultEmpty() { -    return new ArrayList<RegisterResult>();//Nobody found -  } - - -} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernb/IErnbClient.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernb/IErnbClient.java deleted file mode 100644 index cda4c426..00000000 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernb/IErnbClient.java +++ /dev/null @@ -1,20 +0,0 @@ -package at.asitplus.eidas.specific.modules.auth.eidas.v2.ernb; - -import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData; - -import java.util.ArrayList; - -public interface IErnbClient { - -  ArrayList<RegisterResult> searchWithPersonIdentifer(String personIdentifer); - -  ArrayList<RegisterResult> searchWithMds(String givenName, String familyName, String dateOfBirth); - -  ArrayList<RegisterResult> searchDeSpecific(String givenName, String familyName, String dateOfBirth, -                                             String birthPlace, String birthName); - -  ArrayList<RegisterResult> searchItSpecific(String txNumber); - -  void update(RegisterResult registerResult, SimpleEidasData eidData); -} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/DummyErnpClient.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/DummyErnpClient.java new file mode 100644 index 00000000..e514c808 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/DummyErnpClient.java @@ -0,0 +1,66 @@ +/* + * Copyright 2020 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.ernp; + +import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; + +@Service("ErnbClientForeIDAS") +public class DummyErnpClient implements IErnpClient { + +  @Override +  public List<RegisterResult> searchWithPersonIdentifier(String personIdentifier) { +    return Collections.emptyList(); +  } + +  @Override +  public List<RegisterResult> searchWithMds(String givenName, String familyName, String dateOfBirth) { +    //TODO will I only receive matches where all three values match perfectly? +    return Collections.emptyList(); +  } + +  @Override +  public List<RegisterResult> searchDeSpecific(String givenName, String familyName, String dateOfBirth, +                                                    String birthPlace, String birthName) { +    //TODO +    return Collections.emptyList(); +  } + +  @Override +  public List<RegisterResult> searchItSpecific(String taxNumber) { +    //TODO +    return Collections.emptyList(); +  } + +  @Override +  public void update(RegisterResult registerResult, SimpleEidasData eidData) { +    //TODO +  } + + +} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/IErnpClient.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/IErnpClient.java new file mode 100644 index 00000000..b9641c5c --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/IErnpClient.java @@ -0,0 +1,43 @@ +/* + * Copyright 2020 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.ernp; + +import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData; + +import java.util.List; + +public interface IErnpClient { + +  List<RegisterResult> searchWithPersonIdentifier(String personIdentifier); + +  List<RegisterResult> searchWithMds(String givenName, String familyName, String dateOfBirth); + +  List<RegisterResult> searchDeSpecific(String givenName, String familyName, String dateOfBirth, +                                             String birthPlace, String birthName); + +  List<RegisterResult> searchItSpecific(String taxNumber); + +  void update(RegisterResult registerResult, SimpleEidasData eidData); +} diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ManualFixNecessaryException.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ManualFixNecessaryException.java index c22e8135..2fecaa6b 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ManualFixNecessaryException.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ManualFixNecessaryException.java @@ -1,5 +1,5 @@  /* - * Copyright 2018 A-SIT Plus GmbH + * Copyright 2020 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.   * @@ -29,10 +29,10 @@ public class ManualFixNecessaryException extends EidasSAuthenticationException {    private static final long serialVersionUID = 1L;    public ManualFixNecessaryException(String personIdentifier) { -    super("eidas.00", new Object[] { personIdentifier });//TODO "eidas.00" +    super("eidas.09", new Object[] { personIdentifier });    }    public ManualFixNecessaryException(SimpleEidasData eidData) { -    super("eidas.00", new Object[] { eidData.getPseudonym() });//TODO "eidas.00"   => what info to pass??? +    super("eidas.09", new Object[] { eidData.getPseudonym() });//TODO what info to pass???    }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/WorkflowException.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/WorkflowException.java index aa879bcc..b6f3309b 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/WorkflowException.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/WorkflowException.java @@ -1,5 +1,5 @@  /* - * Copyright 2018 A-SIT Plus GmbH + * Copyright 2020 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.   * @@ -19,7 +19,7 @@   * 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.exception; @@ -27,7 +27,7 @@ public class WorkflowException extends EidasSAuthenticationException {    private static final long serialVersionUID = 1L;    public WorkflowException(String data) { -    super("eidas.00", new Object[] { data }); +    super("eidas.08", new Object[]{data});    }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ICountrySpecificDetailSearchProcessor.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/CountrySpecificDetailSearchProcessor.java index 6a2b2c0a..c5b3b231 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ICountrySpecificDetailSearchProcessor.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/CountrySpecificDetailSearchProcessor.java @@ -1,5 +1,5 @@  /* - * Copyright 2018 A-SIT Plus GmbH + * Copyright 2020 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.   * @@ -25,15 +25,15 @@ package at.asitplus.eidas.specific.modules.auth.eidas.v2.handler;  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.ernb.IErnbClient; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp.IErnpClient;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.zmr.IZmrClient; -public abstract class ICountrySpecificDetailSearchProcessor { +public abstract class CountrySpecificDetailSearchProcessor { -  protected IErnbClient ernbClient; +  protected IErnpClient ernbClient;    protected IZmrClient zmrClient; -  public ICountrySpecificDetailSearchProcessor(IErnbClient ernbClient, IZmrClient zmrClient) { +  public CountrySpecificDetailSearchProcessor(IErnpClient ernbClient, IZmrClient zmrClient) {      this.ernbClient = ernbClient;      this.zmrClient = zmrClient;    } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/DeSpecificDetailSearchProcessor.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/DeSpecificDetailSearchProcessor.java index e8cb7a1a..544d5b0c 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/DeSpecificDetailSearchProcessor.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/DeSpecificDetailSearchProcessor.java @@ -1,17 +1,40 @@ +/* + * Copyright 2020 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.handler;  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.RegisterResult;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernb.IErnbClient; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp.IErnpClient;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.zmr.IZmrClient; -import java.util.ArrayList; +import java.util.List; -public class DeSpecificDetailSearchProcessor extends ICountrySpecificDetailSearchProcessor { +public class DeSpecificDetailSearchProcessor extends CountrySpecificDetailSearchProcessor { -  public DeSpecificDetailSearchProcessor(IErnbClient ernbClient, IZmrClient zmrClient) { +  public DeSpecificDetailSearchProcessor(IErnpClient ernbClient, IZmrClient zmrClient) {      super(ernbClient, zmrClient);    } @@ -31,17 +54,12 @@ public class DeSpecificDetailSearchProcessor extends ICountrySpecificDetailSearc    @Override    public MergedRegisterSearchResult search(SimpleEidasData eidData) { -    MergedRegisterSearchResult searchResult = new MergedRegisterSearchResult(); - -    ArrayList<RegisterResult> resultsZmr = +    List<RegisterResult> resultsZmr =          zmrClient.searchDeSpecific(eidData.getGivenName(), eidData.getFamilyName(), eidData.getDateOfBirth(),              eidData.getPlaceOfBirth(), eidData.getBirthName()); -    searchResult.setResultsZmr(resultsZmr); - -    ArrayList<RegisterResult> resultsErnb = +    List<RegisterResult> resultsErnb =          ernbClient.searchDeSpecific(eidData.getGivenName(), eidData.getFamilyName(), eidData.getDateOfBirth(),              eidData.getPlaceOfBirth(), eidData.getBirthName()); -    searchResult.setResultsErnb(resultsErnb); -    return searchResult; +    return new MergedRegisterSearchResult(resultsZmr, resultsErnb);    }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ItSpecificDetailSearchProcessor.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ItSpecificDetailSearchProcessor.java index a94a67b3..370a111c 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ItSpecificDetailSearchProcessor.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ItSpecificDetailSearchProcessor.java @@ -1,17 +1,40 @@ +/* + * Copyright 2020 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.handler;  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.RegisterResult;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernb.IErnbClient; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp.IErnpClient;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.zmr.IZmrClient; -import java.util.ArrayList; +import java.util.List; -public class ItSpecificDetailSearchProcessor extends ICountrySpecificDetailSearchProcessor { +public class ItSpecificDetailSearchProcessor extends CountrySpecificDetailSearchProcessor { -  public ItSpecificDetailSearchProcessor(IErnbClient ernbClient, IZmrClient zmrClient) { +  public ItSpecificDetailSearchProcessor(IErnpClient ernbClient, IZmrClient zmrClient) {      super(ernbClient, zmrClient);    } @@ -28,15 +51,8 @@ public class ItSpecificDetailSearchProcessor extends ICountrySpecificDetailSearc    @Override    public MergedRegisterSearchResult search(SimpleEidasData eidData) { -    MergedRegisterSearchResult searchResult = new MergedRegisterSearchResult(); - -    ArrayList<RegisterResult> resultsZmr = -        zmrClient.searchItSpecific(eidData.getTaxNumber()); -    searchResult.setResultsZmr(resultsZmr); - -    ArrayList<RegisterResult> resultsErnb = -        ernbClient.searchItSpecific(eidData.getTaxNumber()); -    searchResult.setResultsErnb(resultsErnb); -    return searchResult; +    List<RegisterResult> resultsZmr = zmrClient.searchItSpecific(eidData.getTaxNumber()); +    List<RegisterResult> resultsErnb = ernbClient.searchItSpecific(eidData.getTaxNumber()); +    return new MergedRegisterSearchResult(resultsZmr, resultsErnb);    }  } 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 0812f55e..ae89a4a0 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 @@ -1,5 +1,5 @@  /* - * Copyright 2018 A-SIT Plus GmbH + * Copyright 2020 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.   * @@ -27,12 +27,11 @@ 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.RegisterResult;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernb.IErnbClient; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp.IErnpClient;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ManualFixNecessaryException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.ICountrySpecificDetailSearchProcessor; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.CountrySpecificDetailSearchProcessor;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.zmr.IZmrClient;  import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; @@ -53,36 +52,37 @@ import org.springframework.stereotype.Component;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList;  import java.util.HashMap;  import java.util.List;  import java.util.Map;  /** - * Task that searches ErnB and ZMR before adding person to SZR. + * Task that searches ErnP and ZMR before adding person to SZR.   * - * @author tlenz + * @author amarsalek   */  @Slf4j  @Component("InitialSearchTask") -// NOTE: General: Please rebase git commit and squash them where useful, i.e. "remove unused import" should -//       not be a separate commit.  public class InitialSearchTask extends AbstractAuthServletTask { -  private List<ICountrySpecificDetailSearchProcessor> handlers = new ArrayList<>(); - -  private IErnbClient ernbClient; -  private IZmrClient zmrClient; +  private final List<CountrySpecificDetailSearchProcessor> handlers; +  private final IErnpClient ernpClient; +  private final IZmrClient zmrClient;    private ExecutionContext executionContext; - -  /* -   * (non-Javadoc) -   * -   * @see at.gv.egovernment.moa.id.process.springweb.MoaIdTask#execute(at.gv. -   * egovernment.moa.id.process.api.ExecutionContext, -   * javax.servlet.http.HttpServletRequest, -   * javax.servlet.http.HttpServletResponse) +  /** +   * Constructor. +   * @param handlers List of countrySpecificSearchProcessors +   * @param ernpClient Ernp client +   * @param zmrClient ZMR client     */ +  public InitialSearchTask(List<CountrySpecificDetailSearchProcessor> handlers, IErnpClient ernpClient, +                           IZmrClient zmrClient) { +    this.ernpClient = ernpClient; +    this.zmrClient = zmrClient; +    this.handlers = handlers; +    log.info("# " + handlers.size() + " country specific detail search services are registered"); +  } +    @Override    public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)        throws TaskExecutionException { @@ -92,7 +92,6 @@ public class InitialSearchTask extends AbstractAuthServletTask {        final ILightResponse eidasResponse = authProcessData            .getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE, ILightResponse.class); -      // post-process eIDAS attributes        final SimpleEidasData eidData = convertSimpleMapToSimpleData(convertEidasAttrToSimpleMap(            eidasResponse.getAttributes().getAttributeMap())); @@ -105,10 +104,11 @@ public class InitialSearchTask extends AbstractAuthServletTask {    }    private String step2RegisterSearchWithPersonidentifier(SimpleEidasData eidData) throws TaskExecutionException { +    log.trace("Starting step2RegisterSearchWithPersonidentifier");      String personIdentifier = eidData.getPseudonym();      MergedRegisterSearchResult result = searchInZmrAndErnp(personIdentifier);      if (result.getResultCount() == 0) { -      return step5CheckCountrySpecificSearchPossible(result, eidData); +      return step5CheckAndPerformCountrySpecificSearchIfPossible(result, eidData);      } else if (result.getResultCount() == 1) {        return step3CheckRegisterUpdateNecessary(result, eidData);      } @@ -116,46 +116,9 @@ public class InitialSearchTask extends AbstractAuthServletTask {          new ManualFixNecessaryException(personIdentifier));    } -  private SimpleEidasData convertSimpleMapToSimpleData(Map<String, Object> eidasAttrMap) -      throws EidasAttributeException, EidPostProcessingException { -    SimpleEidasData simpleEidasData = new SimpleEidasData(); - -    final Object eIdentifierObj = eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER); -    final Triple<String, String, String> eIdentifier = -        EidasResponseUtils.parseEidasPersonalIdentifier((String) eIdentifierObj); -    simpleEidasData.setCitizenCountryCode(eIdentifier.getFirst()); - -    // MDS attributes -    simpleEidasData.setPseudonym(EidasResponseUtils.processPseudonym( -        eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER))); -    simpleEidasData.setFamilyName(EidasResponseUtils.processFamilyName( -        eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTFAMILYNAME))); -    simpleEidasData.setGivenName(EidasResponseUtils.processGivenName( -        eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTGIVENNAME))); -    simpleEidasData.setDateOfBirth(EidasResponseUtils.processDateOfBirthToString( -        eidasAttrMap.get(Constants.eIDAS_ATTR_DATEOFBIRTH))); - -    // additional attributes -    simpleEidasData.setPlaceOfBirth(EidasResponseUtils.processPlaceOfBirth( -        eidasAttrMap.get(Constants.eIDAS_ATTR_PLACEOFBIRTH))); -    simpleEidasData.setBirthName(EidasResponseUtils.processBirthName( -        eidasAttrMap.get(Constants.eIDAS_ATTR_BIRTHNAME))); -    simpleEidasData.setAddress(EidasResponseUtils.processAddress( -        eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTADDRESS))); - -    if (eidasAttrMap.containsKey(Constants.eIDAS_ATTR_TAXREFERENCE)) { -      simpleEidasData.setTaxNumber(EidasResponseUtils.processTaxReference( -          eidasAttrMap.get(Constants.eIDAS_ATTR_TAXREFERENCE))); -    } - -    //TODO other additional attributes -    return simpleEidasData; -  } -    private String step3CheckRegisterUpdateNecessary(MergedRegisterSearchResult result, SimpleEidasData eidData)        throws TaskExecutionException { -    //check if data from eidas authentication matches with data from register -    log.debug("Compare " + result + " with " + eidData); +    log.trace("Starting step3CheckRegisterUpdateNecessary");      try {        if (eidData.equalsRegisterData(result)) {          //No update necessary, just return bpk @@ -170,18 +133,19 @@ public class InitialSearchTask extends AbstractAuthServletTask {    private String step4UpdateRegisterData(MergedRegisterSearchResult result,                                           SimpleEidasData eidData) throws WorkflowException { +    log.trace("Starting step4UpdateRegisterData");      log.debug("Update " + result + " with " + eidData);      //TODO wann rechtlich möglich?      return result.getBpk();    } -  private String step5CheckCountrySpecificSearchPossible(MergedRegisterSearchResult result, SimpleEidasData eidData) -      throws TaskExecutionException { +  private String step5CheckAndPerformCountrySpecificSearchIfPossible( +      MergedRegisterSearchResult result, SimpleEidasData eidData) throws TaskExecutionException { +    log.trace("Starting step5CheckAndPerformCountrySpecificSearchIfPossible");      String citizenCountry = eidData.getCitizenCountryCode(); -    ICountrySpecificDetailSearchProcessor foundHandler = null; -    for (final ICountrySpecificDetailSearchProcessor el : handlers) { -      //5 check if country specific search is possible +    CountrySpecificDetailSearchProcessor foundHandler = null; +    for (final CountrySpecificDetailSearchProcessor el : handlers) {        if (el.canHandle(citizenCountry, eidData)) {          log.debug("Found suitable country specific search handler for " + citizenCountry              + " by using: " + el.getName()); @@ -190,18 +154,16 @@ public class InitialSearchTask extends AbstractAuthServletTask {        }      }      if (foundHandler == null) { -      //MDS search        return step8RegisterSearchWithMds(result, eidData);      } else { -      //country specific search        return step6CountrySpecificSearch(foundHandler, result, eidData);      }    } -  private String step6CountrySpecificSearch(ICountrySpecificDetailSearchProcessor countrySpecificDetailSearchProcessor, +  private String step6CountrySpecificSearch(CountrySpecificDetailSearchProcessor countrySpecificDetailSearchProcessor,                                              MergedRegisterSearchResult initialSearchResult, SimpleEidasData eidData)        throws TaskExecutionException { -    //6 country specific search +    log.trace("Starting step6CountrySpecificSearch");      MergedRegisterSearchResult countrySpecificDetailSearchResult =          countrySpecificDetailSearchProcessor.search(eidData); @@ -210,7 +172,7 @@ public class InitialSearchTask extends AbstractAuthServletTask {          return step8RegisterSearchWithMds(initialSearchResult, eidData);        case 1:          return step7aKittProcess(initialSearchResult, countrySpecificDetailSearchResult, eidData); -      default://should not happen +      default:          throw new TaskExecutionException(pendingReq, "Detail search - Kitt Process necessary.",              new ManualFixNecessaryException(eidData));      } @@ -219,8 +181,7 @@ public class InitialSearchTask extends AbstractAuthServletTask {    private String step7aKittProcess(MergedRegisterSearchResult initialSearchResult,                                     MergedRegisterSearchResult countrySpecificDetailSearchResult,                                     SimpleEidasData eidData) throws TaskExecutionException { -    //Automerge data -    log.debug("Automerge " + initialSearchResult + " with " + eidData + " " + countrySpecificDetailSearchResult); +    log.trace("Starting step7aKittProcess");      try {        if (initialSearchResult.getResultCount() != 0) {          throw new WorkflowException("initialSearchResult.getResultCount() != 0"); @@ -229,14 +190,11 @@ public class InitialSearchTask extends AbstractAuthServletTask {          throw new WorkflowException("countrySpecificDetailSearchResult.getResultCount() != 1");        }        if (countrySpecificDetailSearchResult.getResultsZmr().size() == 1) { -        //update ZMR          zmrClient.update(countrySpecificDetailSearchResult.getResultsZmr().get(0), eidData);        } -      if (countrySpecificDetailSearchResult.getResultsErnb().size() == 1) { -        //update ErnB -        ernbClient.update(countrySpecificDetailSearchResult.getResultsErnb().get(0), eidData); +      if (countrySpecificDetailSearchResult.getResultsErnp().size() == 1) { +        ernpClient.update(countrySpecificDetailSearchResult.getResultsErnp().get(0), eidData);        } -        String bpK = countrySpecificDetailSearchResult.getBpk();        return bpK;      } catch (WorkflowException e) { @@ -246,16 +204,14 @@ public class InitialSearchTask extends AbstractAuthServletTask {    private String step8RegisterSearchWithMds(MergedRegisterSearchResult initialSearchResult,                                              SimpleEidasData eidData) { -    MergedRegisterSearchResult mdsSearchResult = new MergedRegisterSearchResult(); - -    ArrayList<RegisterResult> resultsZmr = +    log.trace("Starting step8RegisterSearchWithMds"); +    List<RegisterResult> resultsZmr =          zmrClient.searchWithMds(eidData.getGivenName(), eidData.getFamilyName(), eidData.getDateOfBirth()); -    mdsSearchResult.setResultsZmr(resultsZmr); -    ArrayList<RegisterResult> resultsErnb = -        ernbClient.searchWithMds(eidData.getGivenName(), eidData.getFamilyName(), eidData.getDateOfBirth()); -    mdsSearchResult.setResultsErnb(resultsErnb); +    List<RegisterResult> resultsErnp = +        ernpClient.searchWithMds(eidData.getGivenName(), eidData.getFamilyName(), eidData.getDateOfBirth()); +    MergedRegisterSearchResult mdsSearchResult = new MergedRegisterSearchResult(resultsZmr, resultsErnp);      if (mdsSearchResult.getResultCount() == 0) {        executionContext.put("TASK_CreateNewErnpEntryTask", true);      } else { @@ -267,17 +223,48 @@ public class InitialSearchTask extends AbstractAuthServletTask {    }    private MergedRegisterSearchResult searchInZmrAndErnp(String personIdentifier) { -    MergedRegisterSearchResult initialSearchResult = new MergedRegisterSearchResult(); +    List<RegisterResult> resultsZmr = zmrClient.searchWithPersonIdentifier(personIdentifier); +    List<RegisterResult> resultsErnp = ernpClient.searchWithPersonIdentifier(personIdentifier); +    return new MergedRegisterSearchResult(resultsZmr, resultsErnp); +  } + +  private SimpleEidasData convertSimpleMapToSimpleData(Map<String, Object> eidasAttrMap) +      throws EidasAttributeException { +    SimpleEidasData simpleEidasData = new SimpleEidasData(); + +    final Object eIdentifierObj = eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER); +    final Triple<String, String, String> eIdentifier = +        EidasResponseUtils.parseEidasPersonalIdentifier((String) eIdentifierObj); +    if (eIdentifier == null) { +      throw new EidasAttributeException("Error processing eIdentifier"); +    } +    simpleEidasData.setCitizenCountryCode(eIdentifier.getFirst()); + +    // MDS attributes +    simpleEidasData.setPseudonym(EidasResponseUtils.processPseudonym( +        eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER))); +    simpleEidasData.setFamilyName(EidasResponseUtils.processFamilyName( +        eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTFAMILYNAME))); +    simpleEidasData.setGivenName(EidasResponseUtils.processGivenName( +        eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTGIVENNAME))); +    simpleEidasData.setDateOfBirth(EidasResponseUtils.processDateOfBirthToString( +        eidasAttrMap.get(Constants.eIDAS_ATTR_DATEOFBIRTH))); -    ArrayList<RegisterResult> resultsZmr = -        zmrClient.searchWithPersonIdentifer(personIdentifier); -    initialSearchResult.setResultsZmr(resultsZmr); +    // additional attributes +    simpleEidasData.setPlaceOfBirth(EidasResponseUtils.processPlaceOfBirth( +        eidasAttrMap.get(Constants.eIDAS_ATTR_PLACEOFBIRTH))); +    simpleEidasData.setBirthName(EidasResponseUtils.processBirthName( +        eidasAttrMap.get(Constants.eIDAS_ATTR_BIRTHNAME))); +    simpleEidasData.setAddress(EidasResponseUtils.processAddress( +        eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTADDRESS))); -    ArrayList<RegisterResult> resultsErnb = -        ernbClient.searchWithPersonIdentifer(personIdentifier); -    initialSearchResult.setResultsErnb(resultsErnb); +    if (eidasAttrMap.containsKey(Constants.eIDAS_ATTR_TAXREFERENCE)) { +      simpleEidasData.setTaxNumber(EidasResponseUtils.processTaxReference( +          eidasAttrMap.get(Constants.eIDAS_ATTR_TAXREFERENCE))); +    } -    return initialSearchResult; +    //TODO other additional attributes +    return simpleEidasData;    }    private Map<String, Object> convertEidasAttrToSimpleMap( @@ -296,7 +283,6 @@ public class InitialSearchTask extends AbstractAuthServletTask {          } else {            log.info("Ignore empty 'DateTime' attribute");          } -        } else if (PostalAddress.class.equals(parameterizedType)) {          final PostalAddress addressAttribute = EidasResponseUtils              .translateAddressAttribute(el, attributeMap.get(el).asList()); @@ -307,7 +293,6 @@ public class InitialSearchTask extends AbstractAuthServletTask {          } else {            log.info("Ignore empty 'PostalAddress' attribute");          } -        } else {          final List<String> natPersonIdObj = EidasResponseUtils              .translateStringListAttribute(el, attributeMap.get(el).asList()); @@ -315,7 +300,6 @@ public class InitialSearchTask extends AbstractAuthServletTask {          if (StringUtils.isNotEmpty(stringAttr)) {            result.put(el.getFriendlyName(), stringAttr);            log.trace("Find attr '" + el.getFriendlyName() + "' with value: " + stringAttr); -          } else {            log.info("Ignore empty 'String' attribute");          } @@ -324,18 +308,4 @@ public class InitialSearchTask extends AbstractAuthServletTask {      log.debug("Receive #" + result.size() + " attributes with names: " + result.keySet().toString());      return result;    } - -  /** -   * Constructor. -   * @param handlers List of countrySpecificSearchProcessors -   * @param ernbClient Ernb client -   * @param zmrClient ZMR client -   */ -  public InitialSearchTask(List<ICountrySpecificDetailSearchProcessor> handlers, IErnbClient ernbClient, -                           IZmrClient zmrClient) { -    this.ernbClient = ernbClient; -    this.zmrClient = zmrClient; -    this.handlers = handlers; -    log.info("# " + handlers.size() + " country specific detail search services are registered"); -  }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java index 684546f7..0f733e8d 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java @@ -94,7 +94,7 @@ public class ReceiveAuthnResponseTask extends AbstractAuthServletTask {            attrRegistry);        // ********************************************************** -      // ******* Store resonse infos into session object ********** +      // ******* Store response infos into session object **********        // **********************************************************        // update MOA-Session data with received information 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 55c1c31a..aafcd8b9 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 @@ -23,32 +23,28 @@  package at.asitplus.eidas.specific.modules.auth.eidas.v2.utils; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.annotation.Nullable; - -import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;  import at.gv.e_government.reference.namespace.persondata._20020228.PostalAddressType; -import org.apache.commons.lang3.StringUtils; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.ImmutableList; - -import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.gv.egiz.eaaf.core.impl.data.Triple; +import com.google.common.collect.ImmutableList;  import eu.eidas.auth.commons.attribute.AttributeDefinition;  import eu.eidas.auth.commons.attribute.AttributeValue;  import eu.eidas.auth.commons.attribute.AttributeValueMarshaller;  import eu.eidas.auth.commons.attribute.AttributeValueMarshallingException;  import eu.eidas.auth.commons.attribute.AttributeValueTransliterator;  import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress; +import org.apache.commons.lang3.StringUtils; +import org.joda.time.DateTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nullable; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern;  public class EidasResponseUtils {    private static final Logger log = LoggerFactory.getLogger(EidasResponseUtils.class); @@ -58,7 +54,7 @@ public class EidasResponseUtils {    /**     * Validate a eIDAS PersonalIdentifier attribute value This validation is done     * according to eIDAS SAML Attribute Profile - Section 2.2.3 Unique Identifier -   *  +   *     * @param uniqueID eIDAS attribute value of a unique identifier     * @return true if the uniqueID matches to eIDAS to Unique Identifier     *         specification, otherwise false @@ -74,9 +70,9 @@ public class EidasResponseUtils {     * Parse an eIDAS PersonalIdentifier attribute value into it components. This     * processing is done according to eIDAS SAML Attribute Profile - Section 2.2.3     * Unique Identifier -   *  +   *     * @param uniqueID eIDAS attribute value of a unique identifier -   * @return {@link Trible} that contains: <br> +   * @return {@link Triple} that contains: <br>     *         First : citizen country <br>     *         Second: destination country <br>     *         Third : unique identifier <br> @@ -84,7 +80,7 @@ public class EidasResponseUtils {     */    public static Triple<String, String, String> parseEidasPersonalIdentifier(String uniqueID) {      if (!validateEidasPersonalIdentifier(uniqueID)) { -      log.error("eIDAS attribute value for {} looks wrong formated. Value: {}",  +      log.error("eIDAS attribute value for {} looks wrong formated. Value: {}",            Constants.eIDAS_ATTR_PERSONALIDENTIFIER, uniqueID);        return null; @@ -94,11 +90,11 @@ public class EidasResponseUtils {    }    /** -   * Get eIDAS attribute-values from eIDAS Node attributes.  -   *  +   * Get eIDAS attribute-values from eIDAS Node attributes. +   *     * @param attributeDefinition eIDAS attribute definition     * @param attributeValues Attributes from eIDAS response -   * @return Set of attribute values. If more then one value than the first value contains the 'Latin' value.  +   * @return Set of attribute values. If more then one value than the first value contains the 'Latin' value.     */    // TODO: check possible problem with nonLatinCharacters    public static List<String> translateStringListAttribute(AttributeDefinition<?> attributeDefinition, @@ -113,7 +109,7 @@ public class EidasResponseUtils {          log.trace("Find attr: {} with value: {} nonLatinFlag: {} needTransliteration: {}",              attributeDefinition.getFriendlyName(), attributeValue.toString(), -            attributeValue.isNonLatinScriptAlternateVersion(),  +            attributeValue.isNonLatinScriptAlternateVersion(),              AttributeValueTransliterator.needsTransliteration(valueString));          // if (attributeValue.isNonLatinScriptAlternateVersion()) { @@ -132,7 +128,7 @@ public class EidasResponseUtils {        }      } -    log.trace("Extract values: {} for attr: {}",  +    log.trace("Extract values: {} for attr: {}",          StringUtils.join(stringListAttribute, ","), attributeDefinition.getFriendlyName());      return stringListAttribute; @@ -140,8 +136,8 @@ public class EidasResponseUtils {    }    /** -   * Convert eIDAS DateTime attribute to Java Object.  -   *  +   * Convert eIDAS DateTime attribute to Java Object. +   *     * @param attributeDefinition eIDAS attribute definition.     * @param attributeValues eIDAS attribute value     * @return @@ -160,7 +156,7 @@ public class EidasResponseUtils {    /**     * Concert eIDAS Address attribute to Java object. -   *  +   *     * @param attributeDefinition eIDAS attribute definition     * @param attributeValues eIDAS attribute value     * @return @@ -170,7 +166,6 @@ public class EidasResponseUtils {        ImmutableList<? extends AttributeValue<?>> attributeValues) {      final AttributeValue<?> firstAttributeValue = attributeValues.get(0);      return (PostalAddress) firstAttributeValue.getValue(); -    }    /** @@ -178,34 +173,24 @@ public class EidasResponseUtils {     *     * @param currentAddressObj eIDAS current address information     * @return current address or null if no attribute is available -   * @throws EidPostProcessingException if post-processing fails     * @throws EidasAttributeException    if eIDAS attribute is of a wrong type     */ -  public static PostalAddressType processAddress(Object currentAddressObj) throws EidPostProcessingException, -      EidasAttributeException { - +  public static PostalAddressType processAddress(Object currentAddressObj) throws EidasAttributeException {      if (currentAddressObj != null) {        if (currentAddressObj instanceof PostalAddress) {          final PostalAddressType result = new PostalAddressType();          result.setPostalCode(((PostalAddress) currentAddressObj).getPostCode());          result.setMunicipality(((PostalAddress) currentAddressObj).getPostName()); -          // TODO: add more mappings -          return result; -        } else {          log.warn("eIDAS attr: " + Constants.eIDAS_ATTR_CURRENTADDRESS + " is of WRONG type");          throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTADDRESS); -        } -      } else {        log.debug("NO '" + Constants.eIDAS_ATTR_CURRENTADDRESS + "' attribute. Post-Processing skipped ... ");      } -      return null; -    }    /** @@ -213,27 +198,20 @@ public class EidasResponseUtils {     *     * @param birthNameObj eIDAS birthname information     * @return birthName or null if no attribute is available -   * @throws EidPostProcessingException if post-processing fails     * @throws EidasAttributeException    if eIDAS attribute is of a wrong type     */ -  public static String processBirthName(Object birthNameObj) throws EidPostProcessingException, -      EidasAttributeException { +  public static String processBirthName(Object birthNameObj) throws EidasAttributeException {      if (birthNameObj != null) {        if (birthNameObj instanceof String) {          return (String) birthNameObj; -        } else {          log.warn("eIDAS attr: " + Constants.eIDAS_ATTR_BIRTHNAME + " is of WRONG type");          throw new EidasAttributeException(Constants.eIDAS_ATTR_BIRTHNAME); -        } -      } else {        log.debug("NO '" + Constants.eIDAS_ATTR_BIRTHNAME + "' attribute. Post-Processing skipped ... ");      } -      return null; -    }    /** @@ -241,11 +219,9 @@ public class EidasResponseUtils {     *     * @param placeOfBirthObj eIDAS Place-of-Birth information     * @return place of Birth or null if no attribute is available -   * @throws EidPostProcessingException if post-processing fails     * @throws EidasAttributeException    if eIDAS attribute is of a wrong type     */ -  public static String processPlaceOfBirth(Object placeOfBirthObj) throws EidPostProcessingException, -      EidasAttributeException { +  public static String processPlaceOfBirth(Object placeOfBirthObj) throws EidasAttributeException {      if (placeOfBirthObj != null) {        if (placeOfBirthObj instanceof String) {          return (String) placeOfBirthObj; @@ -259,9 +235,7 @@ public class EidasResponseUtils {      } else {        log.debug("NO '" + Constants.eIDAS_ATTR_PLACEOFBIRTH + "' attribute. Post-Processing skipped ... ");      } -      return null; -    }    /** @@ -270,16 +244,12 @@ public class EidasResponseUtils {     * @param dateOfBirthObj eIDAS date-of-birth attribute information     * @return formated user's date-of-birth     * @throws EidasAttributeException    if NO attribute is available -   * @throws EidPostProcessingException if post-processing fails     */ -  public static DateTime processDateOfBirth(Object dateOfBirthObj) throws EidPostProcessingException, -      EidasAttributeException { -    if (dateOfBirthObj == null || !(dateOfBirthObj instanceof DateTime)) { +  public static DateTime processDateOfBirth(Object dateOfBirthObj) throws EidasAttributeException { +    if (!(dateOfBirthObj instanceof DateTime)) {        throw new EidasAttributeException(Constants.eIDAS_ATTR_DATEOFBIRTH);      } -      return (DateTime) dateOfBirthObj; -    }    /** @@ -288,11 +258,9 @@ public class EidasResponseUtils {     * @param dateOfBirthObj eIDAS date-of-birth attribute information     * @return formated user's date-of-birth as string     * @throws EidasAttributeException    if NO attribute is available -   * @throws EidPostProcessingException if post-processing fails     */ -  public static String processDateOfBirthToString(Object dateOfBirthObj) throws EidPostProcessingException, -      EidasAttributeException { -    if (dateOfBirthObj == null || !(dateOfBirthObj instanceof DateTime)) { +  public static String processDateOfBirthToString(Object dateOfBirthObj) throws EidasAttributeException { +    if (!(dateOfBirthObj instanceof DateTime)) {        throw new EidasAttributeException(Constants.eIDAS_ATTR_DATEOFBIRTH);      }      return new SimpleDateFormat("yyyy-MM-dd").format(((DateTime) dateOfBirthObj).toDate()); @@ -304,16 +272,12 @@ public class EidasResponseUtils {     * @param givenNameObj eIDAS givenName attribute information     * @return formated user's givenname     * @throws EidasAttributeException    if NO attribute is available -   * @throws EidPostProcessingException if post-processing fails     */ -  public static String processGivenName(Object givenNameObj) throws EidPostProcessingException, -      EidasAttributeException { -    if (givenNameObj == null || !(givenNameObj instanceof String)) { +  public static String processGivenName(Object givenNameObj) throws EidasAttributeException { +    if (!(givenNameObj instanceof String)) {        throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTGIVENNAME);      } -      return (String) givenNameObj; -    }    /** @@ -322,16 +286,12 @@ public class EidasResponseUtils {     * @param familyNameObj eIDAS familyName attribute information     * @return formated user's familyname     * @throws EidasAttributeException    if NO attribute is available -   * @throws EidPostProcessingException if post-processing fails     */ -  public static String processFamilyName(Object familyNameObj) throws EidPostProcessingException, -      EidasAttributeException { -    if (familyNameObj == null || !(familyNameObj instanceof String)) { +  public static String processFamilyName(Object familyNameObj) throws EidasAttributeException { +    if (!(familyNameObj instanceof String)) {        throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTFAMILYNAME);      } -      return (String) familyNameObj; -    }    /** @@ -340,17 +300,16 @@ public class EidasResponseUtils {     * @param personalIdObj eIDAS PersonalIdentifierAttribute     * @return Unique personal identifier without country-code information     * @throws EidasAttributeException    if NO attribute is available -   * @throws EidPostProcessingException if post-processing fails     */ -  public static String processPseudonym(Object personalIdObj) throws EidPostProcessingException, -      EidasAttributeException { -    if (personalIdObj == null || !(personalIdObj instanceof String)) { +  public static String processPseudonym(Object personalIdObj) throws EidasAttributeException { +    if (!(personalIdObj instanceof String)) {        throw new EidasAttributeException(Constants.eIDAS_ATTR_PERSONALIDENTIFIER);      } -      final Triple<String, String, String> eIdentifier =          EidasResponseUtils.parseEidasPersonalIdentifier((String) personalIdObj); - +    if (eIdentifier == null || eIdentifier.getThird() == null) { +      throw new EidasAttributeException("Error processing eIdentifier"); +    }      return eIdentifier.getThird();    } @@ -360,15 +319,11 @@ public class EidasResponseUtils {     * @param taxReferenceObj eIDAS TaxReference attribute information     * @return formated user's TaxReference     * @throws EidasAttributeException    if NO attribute is available -   * @throws EidPostProcessingException if post-processing fails     */ -  public static String processTaxReference(Object taxReferenceObj) throws EidPostProcessingException, -      EidasAttributeException { -    if (taxReferenceObj == null || !(taxReferenceObj instanceof String)) { +  public static String processTaxReference(Object taxReferenceObj) throws EidasAttributeException { +    if (!(taxReferenceObj instanceof String)) {        throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTGIVENNAME);      } -      return (String) taxReferenceObj; -    }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/zmr/DummyZmrClient.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/zmr/DummyZmrClient.java index f4d77b03..b12c1bcb 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/zmr/DummyZmrClient.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/zmr/DummyZmrClient.java @@ -1,33 +1,60 @@ +/* + * Copyright 2020 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.zmr;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;  import org.springframework.stereotype.Service; -import java.util.ArrayList; +import java.util.Collections; +import java.util.List;  @Service("ZmrClientForeIDAS")  public class DummyZmrClient implements IZmrClient {    @Override -  public ArrayList<RegisterResult> searchWithPersonIdentifer(String personIdentifer) { -    return resultEmpty(); +  public List<RegisterResult> searchWithPersonIdentifier(String personIdentifier) { +    return Collections.emptyList();    }    @Override -  public ArrayList<RegisterResult> searchWithMds(String givenName, String familyName, String dateOfBirth) { -    return resultEmpty();//TODO will I only receive matches where all three values match perfectly? +  public List<RegisterResult> searchWithMds(String givenName, String familyName, String dateOfBirth) { +    //TODO will I only receive matches where all three values match perfectly? +    return Collections.emptyList();    }    @Override -  public ArrayList<RegisterResult> searchDeSpecific(String givenName, String familyName, String dateOfBirth, +  public List<RegisterResult> searchDeSpecific(String givenName, String familyName, String dateOfBirth,                                                      String birthPlace, String birthName) { -    return resultEmpty();//TODO +    //TODO +    return Collections.emptyList();    }    @Override -  public ArrayList<RegisterResult> searchItSpecific(String txNumber) { -    return resultEmpty();//TODO +  public List<RegisterResult> searchItSpecific(String taxNumber) { +    //TODO +    return Collections.emptyList();    }    @Override @@ -35,8 +62,4 @@ public class DummyZmrClient implements IZmrClient {      //TODO    } -  private ArrayList<RegisterResult> resultEmpty() { -    return new ArrayList<RegisterResult>();//Nobody found -  } -  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/zmr/IZmrClient.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/zmr/IZmrClient.java index 4af7bfe9..5175cd7b 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/zmr/IZmrClient.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/zmr/IZmrClient.java @@ -1,20 +1,43 @@ +/* + * Copyright 2020 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.zmr;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData; -import java.util.ArrayList; +import java.util.List;  public interface IZmrClient { -  ArrayList<RegisterResult> searchWithPersonIdentifer(String personIdentifer); +  List<RegisterResult> searchWithPersonIdentifier(String personIdentifier); -  ArrayList<RegisterResult> searchWithMds(String givenName, String familyName, String dateOfBirth); +  List<RegisterResult> searchWithMds(String givenName, String familyName, String dateOfBirth); -  ArrayList<RegisterResult> searchDeSpecific(String givenName, String familyName, String dateOfBirth, +  List<RegisterResult> searchDeSpecific(String givenName, String familyName, String dateOfBirth,                                               String birthPlace, String birthName); -  ArrayList<RegisterResult> searchItSpecific(String txNumber); +  List<RegisterResult> searchItSpecific(String taxNumber);    void update(RegisterResult registerResult, SimpleEidasData eidData);  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml b/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml index 06269bfc..4c3a47fd 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml @@ -18,7 +18,7 @@      class="at.asitplus.eidas.specific.modules.auth.eidas.v2.szr.SzrClient" />    <bean id="ErnbClientForeIDAS" -        class="at.asitplus.eidas.specific.modules.auth.eidas.v2.ernb.DummyErnbClient" /> +        class="at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp.DummyErnpClient" />    <bean id="ZmrClientForeIDAS"          class="at.asitplus.eidas.specific.modules.auth.eidas.v2.zmr.DummyZmrClient" /> diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskFirstTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskFirstTest.java index f7fc6b06..9f58ba71 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskFirstTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskFirstTest.java @@ -1,11 +1,33 @@ +/* + * Copyright 2020 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.test.tasks;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernb.IErnbClient; +import at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp.IErnpClient;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ManualFixNecessaryException;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.DeSpecificDetailSearchProcessor; -import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.ICountrySpecificDetailSearchProcessor;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.ItSpecificDetailSearchProcessor;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.InitialSearchTask;  import at.asitplus.eidas.specific.modules.auth.eidas.v2.zmr.IZmrClient; @@ -27,10 +49,9 @@ import org.junit.Before;  import org.junit.BeforeClass;  import org.junit.Test;  import org.junit.runner.RunWith; -import org.mockito.InjectMocks;  import org.mockito.Mock;  import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; +import org.mockito.MockitoAnnotations;  import org.springframework.mock.web.MockHttpServletRequest;  import org.springframework.mock.web.MockHttpServletResponse;  import org.springframework.test.annotation.DirtiesContext; @@ -45,29 +66,36 @@ import java.io.IOException;  import java.net.URI;  import java.net.URISyntaxException;  import java.util.ArrayList; -import java.util.List; +import java.util.Collections; +import java.util.Random; -@RunWith(SpringJUnit4ClassRunner.class) +import static org.junit.Assert.assertThrows; +@RunWith(SpringJUnit4ClassRunner.class)  @ContextConfiguration("/SpringTest-context_tasks_test.xml")  @DirtiesContext(classMode = ClassMode.BEFORE_CLASS)  public class InitialSearchTaskFirstTest { -  @Autowired(required = true) -  @Mock -  @InjectMocks -  private InitialSearchTask task; +  private static final String DE_ST = "de/st/"; +  private static final String IT_ST = "it/st/"; +  private InitialSearchTask task; +  @Mock    private IZmrClient zmrClient; -  private IErnbClient ernbClient; +  @Mock +  private IErnpClient ernpClient;    final ExecutionContext executionContext = new ExecutionContextImpl(); -  private MockHttpServletRequest httpReq; -  private MockHttpServletResponse httpResp;    private TestRequestImpl pendingReq; -  private String randomIdentifier = RandomStringUtils.randomNumeric(10); -  private String randomFamilyName = RandomStringUtils.randomNumeric(11); -  private String randomGivenName = RandomStringUtils.randomNumeric(12); +  private final String randomBpk = RandomStringUtils.randomNumeric(6); +  private final String randomIdentifier = RandomStringUtils.randomNumeric(10); +  private final String randomPseudonym = DE_ST + randomIdentifier; +  private final String randomFamilyName = RandomStringUtils.randomAlphabetic(10); +  private final String randomGivenName = RandomStringUtils.randomAlphabetic(10); +  private final String randomPlaceOfBirth = RandomStringUtils.randomAlphabetic(10); +  private final String randomBirthName = RandomStringUtils.randomAlphabetic(10); +  private final String randomDate = "2011-01-" + (10 + new Random().nextInt(18)); +    /**     * jUnit class initializer.     * @@ -85,8 +113,11 @@ public class InitialSearchTaskFirstTest {     */    @Before    public void setUp() throws URISyntaxException, EaafStorageException { -    httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); -    httpResp = new MockHttpServletResponse(); +    MockitoAnnotations.initMocks(this); +    task = new InitialSearchTask(new ArrayList<>(), ernpClient, zmrClient); + +    MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); +    MockHttpServletResponse httpResp = new MockHttpServletResponse();      RequestContextHolder.resetRequestAttributes();      RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp)); @@ -96,446 +127,275 @@ public class InitialSearchTaskFirstTest {          .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);    } -  @Test -  @DirtiesContext    /**     * One match, but register update needed     */ -  // NOTE: Why is the method named "testNode100a"? -  public void testNode100a() throws Exception { - -    //Mock ZMR -    ArrayList<RegisterResult> zmrResult = new ArrayList<>(); -    String randomBpk = RandomStringUtils.randomNumeric(6); -    zmrResult.add(new RegisterResult(randomBpk, "de/st/"+randomIdentifier, "Max_new", randomFamilyName, "2011-01-01")); - -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResult); - -    //Mock ernb -    ArrayList<RegisterResult> ernbResult = new ArrayList<>(); - -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResult); - -    task = new InitialSearchTask(emptyHandlers(), ernbClient, zmrClient); -    try { -      task.execute(pendingReq, executionContext); -      String bPk = (String) -          pendingReq.getSessionData(AuthProcessDataWrapper.class).getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); -      Assert.assertTrue("Wrong bpk", bPk.equals(randomBpk)); - -    } catch (final TaskExecutionException e) { -      // NOTE: assertTrue is probably the wrong method to use ... why catch the exception anyway? -      Assert.assertTrue("Wrong workflow, should not reach this point", false); -    } -  } -    @Test -  // NOTE: Why is @DirtiesContext after each test necessary? What is changed in the context and why?    @DirtiesContext +  public void testNode100_UserIdentifiedUpdateNecessary_a() throws Exception { +    String newFirstName = RandomStringUtils.randomAlphabetic(10); +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.singletonList( +        new RegisterResult(randomBpk, randomPseudonym, newFirstName, randomFamilyName, randomDate))); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); + +    task.execute(pendingReq, executionContext); +    String bPk = (String) +        pendingReq.getSessionData(AuthProcessDataWrapper.class) +            .getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); + +    Assert.assertEquals("Wrong bpk", bPk, randomBpk); +  } +    /**     * One match, but register update needed     */ -  public void testNode100b() throws Exception { - -    //Mock ZMR -    ArrayList<RegisterResult> zmrResult = new ArrayList<>(); - -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResult);//"de/st/max123"??? - -    //Mock ernb -    ArrayList<RegisterResult> ernbResult = new ArrayList<>(); -    String randomBpk = RandomStringUtils.randomNumeric(6); -    ernbResult.add(new RegisterResult(randomBpk, "de/st/"+randomIdentifier, "Max_new", randomFamilyName, "2011-01-01")); - -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResult); - -    task = new InitialSearchTask(emptyHandlers(), ernbClient, zmrClient); -    try { -      task.execute(pendingReq, executionContext); -      String bPk = (String) -          pendingReq.getSessionData(AuthProcessDataWrapper.class).getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); -      Assert.assertTrue("Wrong bpk", bPk.equals(randomBpk)); - -    } catch (final TaskExecutionException e) { -      Assert.assertTrue("Wrong workflow, should not reach this point", false); -    } -  } - -    @Test    @DirtiesContext +  public void testNode100_UserIdentifiedUpdateNecessary_b() throws TaskExecutionException { +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    String newRandomGivenName = RandomStringUtils.randomAlphabetic(10); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.singletonList( +        new RegisterResult(randomBpk, randomPseudonym, newRandomGivenName, randomFamilyName, randomDate))); + +    task.execute(pendingReq, executionContext); +    String bPk = (String) +        pendingReq.getSessionData(AuthProcessDataWrapper.class) +            .getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); + +    Assert.assertEquals("Wrong bpk", bPk, randomBpk); +  } +    /**     * Two matches found in ZMR     */ -  public void testNode101a() throws Exception { - -    //Mock ZMR +  @Test +  @DirtiesContext +  public void testNode101_ManualFixNecessary_a() {      ArrayList<RegisterResult> zmrResult = new ArrayList<>(); -    zmrResult.add(new RegisterResult("bpkMax", "de/st/"+randomIdentifier, randomGivenName, randomFamilyName, "2011-01-01")); -    zmrResult.add(new RegisterResult("bpkMax", "de/st/"+randomIdentifier, "Maximilian", randomFamilyName, "2011-01-01")); -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResult); - -    //Mock ernb -    ArrayList<RegisterResult> ernbResult = new ArrayList<>(); -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResult); - -    task = new InitialSearchTask(emptyHandlers(), ernbClient, zmrClient); -    try { -      task.execute(pendingReq, executionContext); -      Assert.assertTrue("Wrong workflow, should not reach this point/ get a bpk", false); -    } catch (final TaskExecutionException e) { -      Throwable origE = e.getOriginalException(); -      Assert.assertTrue("Wrong exception", (origE.getCause() instanceof ManualFixNecessaryException)); -    } +    zmrResult.add(new RegisterResult(randomBpk, randomPseudonym, randomGivenName, randomFamilyName, randomDate)); +    String newRandomGivenName = randomGivenName + RandomStringUtils.randomAlphabetic(2); +    zmrResult.add(new RegisterResult(randomBpk, randomPseudonym, newRandomGivenName, randomFamilyName, randomDate)); +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(zmrResult); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); + +    TaskExecutionException exception = assertThrows(TaskExecutionException.class, +        () -> task.execute(pendingReq, executionContext)); + +    Throwable origE = exception.getOriginalException(); +    Assert.assertTrue("Wrong exception", (origE.getCause() instanceof ManualFixNecessaryException));    } -  @Test -  @DirtiesContext    /** -   * Two matches found in ErnB +   * Two matches found in ErnP     */ -  public void testNode101b() throws Exception { - -    //Mock ZMR -    ArrayList<RegisterResult> zmrResult = new ArrayList<>(); -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResult); - -    //Mock ernb -    ArrayList<RegisterResult> ernbResult = new ArrayList<>(); -    ernbResult.add(new RegisterResult("bpkMax", "de/st/"+randomIdentifier, randomGivenName, randomFamilyName, "2011-01-01")); -    ernbResult.add(new RegisterResult("bpkMax", "de/st/"+randomIdentifier, "Maximilian", randomFamilyName, "2011-01-01")); - -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResult); - -    task = new InitialSearchTask(emptyHandlers(), ernbClient, zmrClient); -    try { -      task.execute(pendingReq, executionContext); -      Assert.assertTrue("Wrong workflow, should not reach this point/ get a bpk", false); -    } catch (final TaskExecutionException e) { -      Throwable origE = e.getOriginalException(); -      Assert.assertTrue("Wrong exception", (origE.getCause() instanceof ManualFixNecessaryException)); -    } -  } -    @Test    @DirtiesContext +  public void testNode101_ManualFixNecessary_b() { +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    ArrayList<RegisterResult> ernpResult = new ArrayList<>(); +    ernpResult.add(new RegisterResult(randomBpk, randomPseudonym, randomGivenName, randomFamilyName, randomDate)); +    String newRandomGivenName = randomGivenName + RandomStringUtils.randomAlphabetic(2); +    ernpResult.add( +        new RegisterResult(randomBpk, randomPseudonym, newRandomGivenName, randomFamilyName, randomDate)); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(ernpResult); + +    TaskExecutionException exception = assertThrows(TaskExecutionException.class, +        () -> task.execute(pendingReq, executionContext)); + +    Throwable origE = exception.getOriginalException(); +    Assert.assertTrue("Wrong exception", (origE.getCause() instanceof ManualFixNecessaryException)); +  } +    /**     * One match, no register update needed     */ -  public void testNode102a() throws Exception { - -    String randomBpk = RandomStringUtils.randomNumeric(12);; -    //Mock ZMR -    ArrayList<RegisterResult> zmrResult = new ArrayList<>(); -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResult); - -    //Mock ernb -    ArrayList<RegisterResult> ernbResult = new ArrayList<>(); -    ernbResult.add(new RegisterResult(randomBpk, "de/st/"+randomIdentifier, randomGivenName, randomFamilyName, "2011-01-01")); - -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResult); - -    task = new InitialSearchTask(emptyHandlers(), ernbClient, zmrClient); -    try { -      task.execute(pendingReq, executionContext); -      String bPk = (String) -          pendingReq.getSessionData(AuthProcessDataWrapper.class).getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); -      Assert.assertTrue("Wrong bpk", bPk.equals(randomBpk)); -    } catch (final TaskExecutionException e) { -      Assert.assertTrue("Wrong workflow, should not reach this point", false); -    } -  } -    @Test    @DirtiesContext +  public void testNode102_UserIdentified_a() throws Exception { +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.singletonList( +        new RegisterResult(randomBpk, randomPseudonym, randomGivenName, randomFamilyName, randomDate))); + +    task.execute(pendingReq, executionContext); +    String bPk = (String) +        pendingReq.getSessionData(AuthProcessDataWrapper.class) +            .getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); +    Assert.assertEquals("Wrong bpk", bPk, randomBpk); +  } +    /**     * One match, no register update needed     */ -  public void testNode102b() throws Exception { -    String randomBpk = RandomStringUtils.randomNumeric(14); -    //Mock ZMR -    ArrayList<RegisterResult> zmrResult = new ArrayList<>(); -    zmrResult.add(new RegisterResult(randomBpk, "de/st/"+randomIdentifier, randomGivenName, randomFamilyName, "2011-01-01")); - -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResult); - -    //Mock ernb -    ArrayList<RegisterResult> ernbResult = new ArrayList<>(); - -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResult); +  @Test +  @DirtiesContext +  public void testNode102_UserIdentified_b() throws Exception { +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.singletonList( +        new RegisterResult(randomBpk, randomPseudonym, randomGivenName, randomFamilyName, randomDate))); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); -    task = new InitialSearchTask(emptyHandlers(), ernbClient, zmrClient); -    try { -      task.execute(pendingReq, executionContext); -      String bPk = (String) -          pendingReq.getSessionData(AuthProcessDataWrapper.class).getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); -      Assert.assertTrue("Wrong bpk", bPk.equals(randomBpk)); +    task.execute(pendingReq, executionContext); -    } catch (final TaskExecutionException e) { -      Assert.assertTrue("Wrong workflow, should not reach this point", false); -    } +    String bPk = (String) +        pendingReq.getSessionData(AuthProcessDataWrapper.class) +            .getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); +    Assert.assertEquals("Wrong bpk", bPk, randomBpk);    } -  @Test -  @DirtiesContext    /** -   * One match found in ZMR and ErnB with detail search +   * One match found in ZMR and ErnP with detail search     */ -  public void testNode103IT() throws Exception { -    String bpkRegister = RandomStringUtils.randomNumeric(14); +  @Test +  @DirtiesContext +  public void testNode103_UserIdentified_IT() throws Exception {      String taxNumber = RandomStringUtils.randomNumeric(14);      final AuthenticationResponse response = buildDummyAuthResponseRandomPersonIT_Tax(taxNumber);      TestRequestImpl pendingReq1 = new TestRequestImpl();      pendingReq1.getSessionData(AuthProcessDataWrapper.class)          .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response); - -    //Mock ZMR initial search -    ArrayList<RegisterResult> zmrResultInitial = new ArrayList<>(); -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResultInitial); -    ArrayList<RegisterResult> zmrResultSpecific = new ArrayList<>(); -    //String bpk, String pseudonym, String givenName, String familyName, String dateOfBirth, -    //                        String placeOfBirth, String birthName, String taxNumber, PostalAddressType address -    zmrResultSpecific.add(new RegisterResult(bpkRegister, "it/st/"+randomIdentifier+"4", randomGivenName, randomFamilyName, -        "2011-01-01", null, null, taxNumber, null)); - -    Mockito.when(zmrClient.searchItSpecific(taxNumber)).thenReturn(zmrResultSpecific); - -    //Mock ernb initial search -    ArrayList<RegisterResult> ernbResultInitial = new ArrayList<>(); -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResultInitial); - - -    //Mock country specific search -    List<ICountrySpecificDetailSearchProcessor> handlers = new ArrayList<>(); -    ItSpecificDetailSearchProcessor it = new ItSpecificDetailSearchProcessor(ernbClient, zmrClient); -    handlers.add(it); -    task = new InitialSearchTask(handlers, ernbClient, zmrClient); - -    try { -      task.execute(pendingReq1, executionContext); - -      String bPk = (String) -          pendingReq1.getSessionData(AuthProcessDataWrapper.class).getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); -      Assert.assertTrue("Wrong bpk", bPk.equals(bpkRegister)); -    } catch (final TaskExecutionException e) { -      Assert.assertTrue("Wrong workflow, should not reach this point", false); -    } +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    String newRandomPseudonym = IT_ST + randomIdentifier + RandomStringUtils.randomNumeric(2); +    Mockito.when(zmrClient.searchItSpecific(taxNumber)).thenReturn(Collections.singletonList( +        new RegisterResult(randomBpk, newRandomPseudonym, randomGivenName, randomFamilyName, +            randomDate, null, null, taxNumber, null))); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    task = new InitialSearchTask( +        Collections.singletonList(new ItSpecificDetailSearchProcessor(ernpClient, zmrClient)), +        ernpClient, zmrClient); + +    task.execute(pendingReq1, executionContext); + +    String bPk = (String) +        pendingReq1.getSessionData(AuthProcessDataWrapper.class) +            .getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); +    Assert.assertEquals("Wrong bpk", bPk, randomBpk);    } -  @Test -  @DirtiesContext    /** -   * Multiple matches found in ZMR and ErnB with detail search +   * Multiple matches found in ZMR and ErnP with detail search     */ -  public void testNode103DE() throws Exception { -    String givenName = randomGivenName; -    String familyName = randomFamilyName; -    String pseudonym = "de/st/max1234"; -    String bpk = "bpkMax"; -    String dateOfBirth = "2011-01-01"; -    String placeOfBirth = "München"; -    String birthName = "BabyMax"; -    final AuthenticationResponse response = buildDummyAuthResponseDE(givenName, familyName, pseudonym, -        dateOfBirth, placeOfBirth, birthName); +  @Test +  @DirtiesContext +  public void testNode103_UserIdentified_DE() throws Exception { +    final AuthenticationResponse response = buildDummyAuthResponseDE(randomGivenName, randomFamilyName, +        randomPseudonym, +        randomDate, randomPlaceOfBirth, randomBirthName);      TestRequestImpl pendingReq1 = new TestRequestImpl();      pendingReq1.getSessionData(AuthProcessDataWrapper.class)          .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response); - -    //Mock ZMR initial search -    ArrayList<RegisterResult> zmrResultInitial = new ArrayList<>(); -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResultInitial); -    ArrayList<RegisterResult> zmrResultSpecific = new ArrayList<>(); - -    zmrResultSpecific.add(new RegisterResult(bpk, pseudonym, givenName, familyName, dateOfBirth, placeOfBirth, -        birthName, -        null, null)); - -    Mockito.when(zmrClient.searchDeSpecific(givenName, familyName, dateOfBirth, placeOfBirth, birthName)).thenReturn(zmrResultSpecific); - -    //Mock ernb initial search -    ArrayList<RegisterResult> ernbResultInitial = new ArrayList<>(); -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResultInitial); - -    //Mock country specific search -    List<ICountrySpecificDetailSearchProcessor> handlers = new ArrayList<>(); -    DeSpecificDetailSearchProcessor de = new DeSpecificDetailSearchProcessor(ernbClient, zmrClient); -    handlers.add(de); -    task = new InitialSearchTask(handlers, ernbClient, zmrClient); - -    try { -      task.execute(pendingReq1, executionContext); - -      String bPk = (String) -          pendingReq1.getSessionData(AuthProcessDataWrapper.class).getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); -      Assert.assertTrue("Wrong bpk", bPk.equals(bpk)); -    } catch (final TaskExecutionException e) { -      Assert.assertTrue("Wrong workflow, should not reach this point", false); -    } +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    Mockito.when(zmrClient.searchDeSpecific(randomGivenName, randomFamilyName, randomDate, randomPlaceOfBirth, +        randomBirthName)) +        .thenReturn(Collections.singletonList(new RegisterResult(randomBpk, randomPseudonym, randomGivenName, +            randomFamilyName, randomDate, randomPlaceOfBirth, randomBirthName, null, null))); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    task = new InitialSearchTask( +        Collections.singletonList(new DeSpecificDetailSearchProcessor(ernpClient, zmrClient)), +        ernpClient, zmrClient); + +    task.execute(pendingReq1, executionContext); + +    String resultBpk = (String) +        pendingReq1.getSessionData(AuthProcessDataWrapper.class) +            .getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); +    Assert.assertEquals("Wrong bpk", resultBpk, randomBpk);    } -  @Test -  @DirtiesContext    /** -   * Multiple matches found in ZMR and ErnB with detail search +   * Multiple matches found in ZMR and ErnP with detail search     */ -  public void testNode104DE() throws Exception { -    String givenName = randomGivenName; -    String familyName = randomFamilyName; -    String pseudonym1 = "de/st/max1234"; -    String pseudonym2 = "de/st/max12345"; -    String bpk1 = "bpkMax"; -    String bpk2 = "bpkMax1"; -    String dateOfBirth = "2011-01-01"; -    String placeOfBirth = "München"; -    String birthName = "BabyMax"; -    final AuthenticationResponse response = buildDummyAuthResponseDE(givenName, familyName, pseudonym1, -        dateOfBirth, placeOfBirth, birthName); +  @Test +  @DirtiesContext +  public void testNode104_ManualFixNecessary_DE() throws Exception { +    String newRandomPseudonym = randomPseudonym + RandomStringUtils.randomNumeric(2); +    String newRandomBpk = randomBpk + RandomStringUtils.randomNumeric(6); +    final AuthenticationResponse response = buildDummyAuthResponseDE(randomGivenName, randomFamilyName, +        randomPseudonym, +        randomDate, randomPlaceOfBirth, randomBirthName);      TestRequestImpl pendingReq1 = new TestRequestImpl();      pendingReq1.getSessionData(AuthProcessDataWrapper.class)          .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response); - -    //Mock ZMR initial search -    ArrayList<RegisterResult> zmrResultInitial = new ArrayList<>(); -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResultInitial); +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList());      ArrayList<RegisterResult> zmrResultSpecific = new ArrayList<>(); - -    zmrResultSpecific.add(new RegisterResult(bpk1, pseudonym1, givenName, familyName, dateOfBirth, placeOfBirth, -        birthName, -        null, null)); -    zmrResultSpecific.add(new RegisterResult(bpk2, pseudonym2, givenName, familyName, dateOfBirth, placeOfBirth, -        birthName, -        null, null)); -    Mockito.when(zmrClient.searchDeSpecific(givenName, familyName, dateOfBirth, placeOfBirth, birthName)).thenReturn(zmrResultSpecific); - - -    //Mock ernb initial search -    ArrayList<RegisterResult> ernbResultInitial = new ArrayList<>(); -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResultInitial); - -    //Mock country specific search -    List<ICountrySpecificDetailSearchProcessor> handlers = new ArrayList<>(); -    DeSpecificDetailSearchProcessor de = new DeSpecificDetailSearchProcessor(ernbClient, zmrClient); -    handlers.add(de); -    task = new InitialSearchTask(handlers, ernbClient, zmrClient); - -    try { -      task.execute(pendingReq1, executionContext); - -      Assert.assertTrue("Wrong workflow, should not reach this point/ get a bpk", false); - -    } catch (final TaskExecutionException e) { -      Throwable origE = e.getOriginalException(); -      Assert.assertTrue("Wrong exception", (origE.getCause() instanceof ManualFixNecessaryException)); -    } +    zmrResultSpecific.add( +        new RegisterResult(randomBpk, randomPseudonym, randomGivenName, randomFamilyName, randomDate, +            randomPlaceOfBirth, randomBirthName, null, null)); +    zmrResultSpecific.add(new RegisterResult(newRandomBpk, newRandomPseudonym, randomGivenName, randomFamilyName, randomDate, +        randomPlaceOfBirth, randomBirthName, null, null)); +    Mockito.when(zmrClient.searchDeSpecific(randomGivenName, randomFamilyName, randomDate, randomPlaceOfBirth, +        randomBirthName)).thenReturn(zmrResultSpecific); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    task = new InitialSearchTask( +        Collections.singletonList(new DeSpecificDetailSearchProcessor(ernpClient, zmrClient)), +        ernpClient, zmrClient); + +    TaskExecutionException exception = assertThrows(TaskExecutionException.class, +        () -> task.execute(pendingReq1, executionContext)); + +    Throwable origE = exception.getOriginalException(); +    Assert.assertTrue("Wrong exception", (origE.getCause() instanceof ManualFixNecessaryException));    } -  @Test -  @DirtiesContext    /** -   * Multiple matches found in ZMR and ErnB with detail search +   * Multiple matches found in ZMR and ErnP with detail search     */ -  public void testNode104IT() throws Exception { -    String fakeTaxNumber = RandomStringUtils.randomNumeric(14);; -    final AuthenticationResponse response = buildDummyAuthResponseRandomPersonIT_Tax(fakeTaxNumber); +  @Test +  @DirtiesContext +  public void testNode104_ManualFixNecessary_IT() throws Exception { +    String randomTaxNumber = RandomStringUtils.randomNumeric(14); +    final AuthenticationResponse response = buildDummyAuthResponseRandomPersonIT_Tax(randomTaxNumber);      TestRequestImpl pendingReq1 = new TestRequestImpl();      pendingReq1.getSessionData(AuthProcessDataWrapper.class)          .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response); - -    //Mock ZMR initial search -    ArrayList<RegisterResult> zmrResultInitial = new ArrayList<>(); -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResultInitial); +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList());      ArrayList<RegisterResult> zmrResultSpecific = new ArrayList<>(); - -    zmrResultSpecific.add(new RegisterResult("bpkMax", "it/st/"+randomIdentifier+"4", randomGivenName, randomFamilyName, "2011-01-01", null, null, -        fakeTaxNumber, null)); -    zmrResultSpecific.add(new RegisterResult("bpkMax1", "it/st/"+randomIdentifier+"5", randomGivenName, randomFamilyName, "2011-01-01", null, null, -        fakeTaxNumber, null)); -    Mockito.when(zmrClient.searchItSpecific(fakeTaxNumber)).thenReturn(zmrResultSpecific); - -    //Mock ernb initial search -    ArrayList<RegisterResult> ernbResultInitial = new ArrayList<>(); -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResultInitial); - -    //Mock country specific search -    List<ICountrySpecificDetailSearchProcessor> handlers = new ArrayList<>(); -    ItSpecificDetailSearchProcessor it = new ItSpecificDetailSearchProcessor(ernbClient, zmrClient); -    handlers.add(it); -    task = new InitialSearchTask(handlers, ernbClient, zmrClient); - -    try { -      task.execute(pendingReq1, executionContext); - -      Assert.assertTrue("Wrong workflow, should not reach this point/ get a bpk", false); - -    } catch (final TaskExecutionException e) { -      Throwable origE = e.getOriginalException(); -      Assert.assertTrue("Wrong exception", (origE.getCause() instanceof ManualFixNecessaryException)); -    } +    String randomPseudonym = IT_ST + randomIdentifier + "4"; +    zmrResultSpecific.add(new RegisterResult(randomBpk, randomPseudonym, randomGivenName, +        randomFamilyName, randomDate, null, null, randomTaxNumber, null)); +    String newRandomPseudonym = IT_ST + randomIdentifier + "5"; +    String newRandomBpk = RandomStringUtils.randomNumeric(6); +    zmrResultSpecific.add(new RegisterResult(newRandomBpk, newRandomPseudonym, randomGivenName, +        randomFamilyName, randomDate, null, null, randomTaxNumber, null)); +    Mockito.when(zmrClient.searchItSpecific(randomTaxNumber)).thenReturn(zmrResultSpecific); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    task = new InitialSearchTask( +        Collections.singletonList(new ItSpecificDetailSearchProcessor(ernpClient, zmrClient)), +        ernpClient, zmrClient); + +    TaskExecutionException exception = assertThrows(TaskExecutionException.class, +        () -> task.execute(pendingReq1, executionContext)); + +    Throwable origE = exception.getOriginalException(); +    Assert.assertTrue("Wrong exception", (origE.getCause() instanceof ManualFixNecessaryException));    } -  @Test -  @DirtiesContext    /** -   * NO match found in ZMR and ErnB with Initial search +   * NO match found in ZMR and ErnP with Initial search     */ -  public void testNode105() { +  @Test +  @DirtiesContext +  public void testNode105_TemporaryEnd() throws TaskExecutionException { +    Mockito.when(zmrClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); +    Mockito.when(ernpClient.searchWithPersonIdentifier(randomIdentifier)).thenReturn(Collections.emptyList()); -    //Mock ZMR -    ArrayList<RegisterResult> zmrResult = new ArrayList<>(); -    zmrClient = Mockito.mock(IZmrClient.class); -    Mockito.when(zmrClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(zmrResult); - -    //Mock ernb -    ArrayList<RegisterResult> ernbResult = new ArrayList<>(); -    ernbClient = Mockito.mock(IErnbClient.class); -    Mockito.when(ernbClient.searchWithPersonIdentifer(randomIdentifier)).thenReturn(ernbResult); - -    task = new InitialSearchTask(emptyHandlers(), ernbClient, zmrClient); -    try { -      task.execute(pendingReq, executionContext); - -      String bPk = (String) -          pendingReq.getSessionData(AuthProcessDataWrapper.class).getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); -      Assert.assertTrue("Wrong bpk", bPk.equals("TODO-Temporary-Endnode-105")); -    } catch (final TaskExecutionException e) { -      Assert.assertTrue("Wrong workflow, should not reach this point", false); -    } +    task.execute(pendingReq, executionContext); + +    String bPk = (String) +        pendingReq.getSessionData(AuthProcessDataWrapper.class) +            .getGenericDataFromSession(Constants.DATA_RESULT_MATCHING_BPK); +    Assert.assertEquals("Wrong bpk", "TODO-Temporary-Endnode-105", bPk);    }    @NotNull    private AuthenticationResponse buildDummyAuthResponseRandomPerson() throws URISyntaxException { -    // NOTE: Those strings "de/st/max123" seem to be somehow relevant, but where do we need to use that exact string -    // again? -    // NOTE: If not, why not using random strings? -    return buildDummyAuthResponse(randomGivenName, randomFamilyName, -        "de/st/"+randomIdentifier, "2011-01-01"); +    return buildDummyAuthResponse(randomGivenName, randomFamilyName, DE_ST + randomIdentifier, randomDate);    } -  private AuthenticationResponse buildDummyAuthResponseRandomPersonIT_Tax(String taxNumber) throws URISyntaxException { -    return buildDummyAuthResponse(randomGivenName, randomFamilyName, -        "it/st/"+randomIdentifier, "2011-01-01", taxNumber, null, null); +  private AuthenticationResponse buildDummyAuthResponseRandomPersonIT_Tax(String taxNumber) +      throws URISyntaxException { +    return buildDummyAuthResponse(randomGivenName, randomFamilyName, IT_ST + randomIdentifier, randomDate, +        taxNumber, null, null);    }    @NotNull @@ -555,59 +415,46 @@ public class InitialSearchTaskFirstTest {    private AuthenticationResponse buildDummyAuthResponse(String givenName, String familyName, String identifier,                                                          String dateOfBirth, String taxNumber, String placeOfBirth,                                                          String birthName) 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 AttributeDefinition attributeDef5 = AttributeDefinition.builder() -        .friendlyName(Constants.eIDAS_ATTR_TAXREFERENCE).nameUri(new URI("ad", "sd", "ffffff")) -        .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", "afffff")) -        .attributeValueMarshaller("eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller").build(); -    final AttributeDefinition attributeDef6 = AttributeDefinition.builder() -        .friendlyName(Constants.eIDAS_ATTR_PLACEOFBIRTH).nameUri(new URI("ad", "sd", "fffffff")) -        .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", "affffff")) -        .attributeValueMarshaller("eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller").build(); -    final AttributeDefinition attributeDef7 = AttributeDefinition.builder() -        .friendlyName(Constants.eIDAS_ATTR_BIRTHNAME).nameUri(new URI("ad", "sd", "ffffffff")) -        .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", "afffffff")) -        .attributeValueMarshaller("eu.eidas.auth.commons.attribute.impl.LiteralStringAttributeValueMarshaller").build();      ImmutableAttributeMap.Builder builder = ImmutableAttributeMap.builder() -        .put(attributeDef, identifier) -        .put(attributeDef2, familyName) -        .put(attributeDef3, givenName) -        .put(attributeDef4, dateOfBirth); - +        .put(generateStringAttribute(Constants.eIDAS_ATTR_PERSONALIDENTIFIER, "ff", "af"), identifier) +        .put(generateStringAttribute(Constants.eIDAS_ATTR_CURRENTFAMILYNAME, "fff", "aff"), familyName) +        .put(generateStringAttribute(Constants.eIDAS_ATTR_CURRENTGIVENNAME, "ffff", "afff"), givenName) +        .put(generateDateTimeAttribute(Constants.eIDAS_ATTR_DATEOFBIRTH, "fffff", "affff"), dateOfBirth);      if (taxNumber != null) { -      builder.put(attributeDef5, taxNumber); +      builder.put(generateStringAttribute(Constants.eIDAS_ATTR_TAXREFERENCE, "ffffff", "afffff"), taxNumber);      }      if (birthName != null) { -      builder.put(attributeDef7, birthName); +      builder.put(generateStringAttribute(Constants.eIDAS_ATTR_BIRTHNAME, "fffffff", "affffff"), birthName);      }      if (placeOfBirth != null) { -      builder.put(attributeDef6, placeOfBirth); +      builder.put(generateStringAttribute(Constants.eIDAS_ATTR_PLACEOFBIRTH, "ffffffff", "afffffff"), +          placeOfBirth);      }      final ImmutableAttributeMap attributeMap = builder.build();      val b = new AuthenticationResponse.Builder();      return b.id("aasdf").issuer("asd").subject("asf").statusCode("200").inResponseTo("asdf").subjectNameIdFormat( -        "afaf") -        .attributes(attributeMap).build(); +        "afaf").attributes(attributeMap).build(); +  } + +  private AttributeDefinition<Object> generateStringAttribute(String friendlyName, String fragment, String prefix) +      throws URISyntaxException { +    return generateAttribute(friendlyName, fragment, prefix, "eu.eidas.auth.commons.attribute.impl" + +        ".LiteralStringAttributeValueMarshaller"); +  } + +  private AttributeDefinition<Object> generateDateTimeAttribute(String friendlyName, String fragment, String prefix) +      throws URISyntaxException { +    return generateAttribute(friendlyName, fragment, prefix, "eu.eidas.auth.commons.attribute.impl" + +        ".DateTimeAttributeValueMarshaller");    } -  private List<ICountrySpecificDetailSearchProcessor> emptyHandlers() { -    return new ArrayList<>(); +  private AttributeDefinition<Object> generateAttribute(String friendlyName, String fragment, String prefix, +                                                        String marshaller) throws URISyntaxException { +    return AttributeDefinition.builder() +        .friendlyName(friendlyName).nameUri(new URI("ad", "sd", fragment)) +        .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", prefix)) +        .attributeValueMarshaller(marshaller).build();    }  } 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 7d7f2c59..e362fd22 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 @@ -66,7 +66,7 @@          scope="prototype" />    <bean id="ErnbClientForeIDAS" -        class="at.asitplus.eidas.specific.modules.auth.eidas.v2.ernb.DummyErnbClient" /> +        class="at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp.DummyErnpClient" />    <bean id="ZmrClientForeIDAS"          class="at.asitplus.eidas.specific.modules.auth.eidas.v2.zmr.DummyZmrClient" /> | 
