diff options
Diffstat (limited to 'eidas_modules')
6 files changed, 386 insertions, 37 deletions
| 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 5ad92507..e76768b6 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 @@ -23,10 +23,11 @@  package at.asitplus.eidas.specific.modules.auth.eidas.v2.dao; +import org.apache.commons.lang3.builder.EqualsBuilder; +  import at.gv.e_government.reference.namespace.persondata._20020228.PostalAddressType;  import lombok.Builder;  import lombok.Data; -import org.apache.commons.lang3.builder.EqualsBuilder;  @Data  @Builder @@ -68,8 +69,11 @@ public class SimpleEidasData {          .append(result.getGivenName(), givenName)          .append(result.getFamilyName(), familyName)          .append(result.getDateOfBirth(), dateOfBirth) -        .isEquals() -        && result.getPseudonym().stream().anyMatch(el -> el.equals(pseudonym)); +        .appendSuper(result.getPseudonym().stream().anyMatch(el -> el.equals(pseudonym))) +        .appendSuper(checkOptionalAttributes(result.getPlaceOfBirth(), placeOfBirth)) +        .appendSuper(checkOptionalAttributes(result.getBirthName(), birthName)) +        .isEquals(); +            }    /** @@ -84,5 +88,17 @@ public class SimpleEidasData {          .isEquals();    } +  /** +   * Check if eIDAS attribute is available. +   *  +   * @param registerData Attribute value from register +   * @param eidasData Attribute value from eIDAS +   * @return <code>true</code> if eidasData is <code>null</code> or eidasData does not match to register value,  +   *     otherwise <code>false</code>  +   */ +  private static boolean checkOptionalAttributes(String registerData, String eidasData) { +    return eidasData == null || eidasData.equals(registerData); +     +  }  } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java index 488b571b..85ea942c 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java @@ -7,6 +7,7 @@ import java.util.List;  import javax.annotation.Nonnull;  import org.jetbrains.annotations.Nullable; +import org.springframework.lang.NonNull;  import org.springframework.stereotype.Service;  import com.google.common.collect.Streams; @@ -186,34 +187,49 @@ public class RegisterSearchService {     * @param initialEidasData Received eidas data from initial authn     * @return     */ +  @NonNull    public RegisterStatusResults step7aKittProcess(RegisterStatusResults registerResult,                                                   SimpleEidasData initialEidasData) throws WorkflowException {      log.trace("Starting step7aKittProcess"); -    // TODO verify with which data this method gets called +     +    // check if only one single result was found      if (registerResult.getResultCount() != 1) {        throw new WorkflowException("step7aKittProcess", "getResultCount() != 1"); +            } +     +    // perform updated operation in respect to register results      try {        if (registerResult.getResultsZmr().size() == 1) {          RegisterResult entryZmr = registerResult.getResultsZmr().get(0);          ZmrRegisterResult updateZmr = zmrClient              .update(registerResult.getOperationStatus().getZmrProcessId(), entryZmr, initialEidasData);          return RegisterStatusResults.fromZmr(updateZmr); +                } else {          RegisterResult entryErnp = registerResult.getResultsErnp().get(0);          ErnpRegisterResult updateErnp = ernpClient.update(entryErnp, initialEidasData);          return RegisterStatusResults.fromErnp(registerResult.operationStatus, updateErnp); +                }      } catch (final EidasSAuthenticationException e) {        throw new WorkflowException("kittMatchedIdentitiess", e.getMessage(),            !(e instanceof ZmrCommunicationException), e); +            }    } -  //TODO: check this method, because it's different to 'step7aKittProcess'???    /**     * Automatic process to fix the register entries.     * Called when the alternative eIDAS authn leads to a match in a register. +   *  +   * <p>This method perform two additional operations: +   * <ul> +   *  <li>Use bPK to check if <i>altSearchResult</i> is part of <i>initialSearchResult</i>.</li> +   *  <li>Update register entry twice, be using information from alternative authentication <i>altEidasData</i> +   *      and from initial authentication <i>initialEidasData</i>.</li> +   * </ul> +   * </p>     *     * @param initialSearchResult Register results from initial authentication     * @param initialEidasData    Received eIDAS data from initial authentication @@ -273,7 +289,7 @@ public class RegisterSearchService {          // update ZMR entry by using eIDAS information from alternative authentication          ErnpRegisterResult updateAlt = ernpClient.update(entryErnp, altEidasData); -        return RegisterStatusResults.fromErnp(altSearchResult.operationStatus, updateAlt); +        return RegisterStatusResults.fromErnp(altSearchResult.getOperationStatus(), updateAlt);        }      } catch (final EidasSAuthenticationException e) {        throw new WorkflowException("kittMatchedIdentitiess", e.getMessage(), 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 c720cb7f..9564a8fc 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 @@ -122,8 +122,9 @@ public class InitialSearchTask extends AbstractAuthServletTask {        if (resultCount == 0) {          step6CountrySpecificSearch(executionContext, searchResult.getOperationStatus(), eidasData); -      } else if (resultCount == 1) { -        foundMatchFinalizeTask(searchResult, eidasData); +      } else if (resultCount == 1) {         +        RegisterResult updatedResult = step3CheckRegisterUpdateNecessary(searchResult, eidasData);         +        foundMatchFinalizeTask(updatedResult, eidasData);        } else {          throw new WorkflowException("step2RegisterSearchWithPersonIdentifier", @@ -146,10 +147,12 @@ public class InitialSearchTask extends AbstractAuthServletTask {      if (searchResult.getResultCount() == 0) {        log.trace("'step6CountrySpecificSearch' ends with no result. Forward to next matching step ... ");        step8RegisterSearchWithMds(executionContext, searchResult.getOperationStatus(), eidasData); +            } else if (searchResult.getResultCount() == 1) {        log.trace("'step6CountrySpecificSearch' finds a person. Forward to 'step7aKittProcess' step ... "); -      registerSearchService.step7aKittProcess(searchResult, eidasData); -      foundMatchFinalizeTask(searchResult, eidasData); +      RegisterStatusResults updatedResult = registerSearchService.step7aKittProcess(searchResult, eidasData); +      foundMatchFinalizeTask(updatedResult.getResult(), eidasData); +            } else {        throw new WorkflowException("step6CountrySpecificSearch",            "More than one entry with unique country-specific information", true); @@ -172,29 +175,26 @@ public class InitialSearchTask extends AbstractAuthServletTask {      }    } -  private void foundMatchFinalizeTask(RegisterStatusResults searchResult, SimpleEidasData eidasData) -      throws WorkflowException, EaafStorageException { -    RegisterResult updatedResult = step3CheckRegisterUpdateNecessary(searchResult.getResult(), eidasData); -    MatchedPersonResult result = MatchedPersonResult.generateFormMatchingResult( -        updatedResult, eidasData.getCitizenCountryCode()); -    MatchingTaskUtils.storeFinalMatchingResult(pendingReq, result); -  } - -  private RegisterResult step3CheckRegisterUpdateNecessary(RegisterResult searchResult, -                                                           SimpleEidasData eidasData) { +  private RegisterResult step3CheckRegisterUpdateNecessary( +      RegisterStatusResults searchResult, SimpleEidasData eidasData) throws WorkflowException {      log.trace("Starting step3CheckRegisterUpdateNecessary"); -    if (!eidasData.equalsRegisterData(searchResult)) { -      log.info("Skipping update-register-information step, because it's not supported yet"); -       -      //TODO: update of ERnP information are allowed. Add ERnP update-step. Maybe we can use regular KITT steps -             +    if (!eidasData.equalsRegisterData(searchResult.getResult())) { +      log.debug("PersonalIdentifier match but MDS or other information changed. Starting update process ... ");         +      return registerSearchService.step7aKittProcess(searchResult, eidasData).getResult(); -      return searchResult;      } else {        log.debug("Register information match to eIDAS information. No update required"); -      return searchResult; +      return searchResult.getResult();      }    } +   +  private void foundMatchFinalizeTask(RegisterResult updatedResult, SimpleEidasData eidasData) +      throws WorkflowException, EaafStorageException { +    MatchedPersonResult result =  +        MatchedPersonResult.generateFormMatchingResult(updatedResult, eidasData.getCitizenCountryCode()); +    MatchingTaskUtils.storeFinalMatchingResult(pendingReq, result); +     +  }    @NotNull    private SimpleEidasData convertEidasAttrToSimpleData() diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java index b3ba8a9d..74ac065e 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java @@ -48,7 +48,6 @@ import org.apache.commons.lang3.RandomStringUtils;  import org.jetbrains.annotations.NotNull;  import org.junit.Assert;  import org.junit.Before; -import org.junit.Ignore;  import org.junit.Test;  import org.junit.runner.RunWith;  import org.mockito.Mock; @@ -181,15 +180,17 @@ public class InitialSearchTaskTest {    @DirtiesContext    public void singlePersonalIdMatchUpdateNecessary_Zmr() throws Exception {      String oldGivenName = randomAlphabetic(10); +    String placeOfBirth = randomAlphabetic(10); +    RegisterResult firstZmrResult = randomRegisterResult(oldGivenName, randomBpk, placeOfBirth);          Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE)) -        .thenReturn(zmrRegisterResult(randomRegisterResult(oldGivenName, randomBpk))); +        .thenReturn(zmrRegisterResult(firstZmrResult));      Mockito.when(zmrClient.searchCountrySpecific(any(), any(), any()))          .thenThrow(new IllegalStateException("CountrySpecific search search should not be neccessary"));      Mockito.when(zmrClient.searchWithMds(any(), any(), any(), any(), any()))          .thenThrow(new IllegalStateException("MDS search should not be neccessary"));      Mockito.when(zmrClient.update(any(), any(), any())) -        .thenThrow(new IllegalStateException("ZMR update should not be neccessary")); +        .thenReturn(zmrRegisterResult(firstZmrResult));      Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))          .thenReturn(emptyErnpRegisterResult()); @@ -213,17 +214,33 @@ public class InitialSearchTaskTest {     *     * @throws EidasSAuthenticationException     */ -  @Ignore    @Test    @DirtiesContext    public void singlePersonalIdMatchUpdateNecessary_Ernp() throws TaskExecutionException, EidasSAuthenticationException {      Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))          .thenReturn(emptyZmrRegisterResult()); - +    Mockito.when(zmrClient.searchCountrySpecific(any(), any(), any())) +        .thenThrow(new IllegalStateException("CountrySpecific search search should not be neccessary")); +    Mockito.when(zmrClient.searchWithMds(any(), any(), any(), any(), any())) +        .thenThrow(new IllegalStateException("MDS search should not be neccessary")); +    Mockito.when(zmrClient.update(any(), any(), any())) +        .thenThrow(new IllegalStateException("ZMR update should not be neccessary")); +          String oldRandomGivenName = randomAlphabetic(10);      Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))          .thenReturn(ernpRegisterResult(randomRegisterResult(oldRandomGivenName, randomBpk))); - +    Mockito.when(ernpClient.searchCountrySpecific(any(), any())) +        .thenThrow(new IllegalStateException("CountrySpecific search search should not be neccessary")); +    Mockito.when(ernpClient.searchWithMds(any(), any(), any(), any())) +        .thenThrow(new IllegalStateException("MDS search should not be neccessary")); +    Mockito.when(ernpClient.update(any(), any())) +        .thenReturn(ernpRegisterResult(RegisterResult.builder() +            .bpk(randomBpk) +            .dateOfBirth(randomBirthDate) +            .givenName(randomGivenName) +            .familyName(randomFamilyName) +            .build())); +          // execute test      task.execute(pendingReq, executionContext); @@ -799,6 +816,18 @@ public class InitialSearchTaskTest {    }    @NotNull +  private RegisterResult randomRegisterResult(String randomGivenName, String randomBpk, String placeOfBirth) { +    return RegisterResult.builder() +        .bpk(randomBpk) +        .pseudonym(Collections.singletonList(randomPseudonym)) +        .givenName(randomGivenName) +        .familyName(randomFamilyName) +        .dateOfBirth(randomBirthDate) +        .placeOfBirth(placeOfBirth) +        .build(); +  } +   +  @NotNull    private AuthenticationResponse buildDummyAuthResponseRandomPerson() throws URISyntaxException {      return buildDummyAuthResponse(randomGivenName, randomFamilyName, DE_ST + randomPseudonym, randomBirthDate);    } diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java index 0e95f718..7f27a17c 100644 --- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java @@ -190,10 +190,13 @@ public class InitialSearchTaskWithRegistersTest {    /**     * One match, but register update needed +   * <p> +   * <b>Check if ZMR update request is NOT executed in case of MDS change!</b> +   * </p>     */    @Test    @DirtiesContext -  public void singlePersonalIdMatchUpdateNecessary_Zmr() throws Exception { +  public void singlePersonalIdMatchUpdateNecessary_ZmrNotDone() throws Exception {      String oldGivenName = "XXXClaus - Maria"; @@ -208,7 +211,12 @@ public class InitialSearchTaskWithRegistersTest {      // inject response      when(zmrMock.service(zmrReq.capture(), any()))          .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml")) -        .thenThrow(new RuntimeException("This request is not needed any more")); +         +        //perform prepair-update request   +        .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml"))          + +        //do not make an update because, MDS update is not allowed and no other data has been changed +        .thenThrow(new RuntimeException("This request is not needed any more"));                             // execute test @@ -220,13 +228,72 @@ public class InitialSearchTaskWithRegistersTest {          oldGivenName, "1994-12-31", DE);      // validate request -    assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size()); +    assertEquals("wrong number of req.", 2, zmrReq.getAllValues().size());      assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest()); -    checkBasicRequestParameters(zmrReq.getValue(), ZmrClientTest.PROCESS_TASK_SEARCH, null, "jUnit123456"); +    checkBasicRequestParameters(zmrReq.getValue(), ZmrClientTest.PROCESS_TASK_SEARCH,  +        new BigInteger("367100000000079"), "jUnit123456");    } +  /** +   * One match, but register update needed +   * <p> +   * <b>Check if ZMR update request is executed in case of other data than MDS change!</b> +   * </p> +   */ +  @Test +  @DirtiesContext +  public void singlePersonalIdMatchUpdateNecessary_ZmrDone() throws Exception { + +    String oldGivenName = "XXXClaus - Maria"; +    String placeOfBirth = RandomStringUtils.randomAlphabetic(5); +     +    //inject eIDAS data +    pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession( +        Constants.DATA_FULL_EIDAS_RESPONSE, +        buildDummyAuthResponse(oldGivenName, "XXXvon Brandenburg", +            "DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31", null, placeOfBirth, null)); + +    final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class); + +    // inject response +    when(zmrMock.service(zmrReq.capture(), any())) +        .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml")) +         +        //perform prepair-update request   +        .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml"))          + +        //do make an update because, MDS DOES NOT change, but additional attribute was available +        .thenReturn(loadResponseFromFile("/data/zmr/seq_3-6_kitt_update_resp.xml"));     + + +    // execute test +    task.execute(pendingReq, executionContext); + +    // validate state +    //INFO: has to be the old givenName because ZMR allows no update of MDS information +    checkMatchingSuccessState(pendingReq, "UgeknNsc26lVuB7U/uYGVmWtnnA=", "XXXvon Brandenburg", +        oldGivenName, "1994-12-31", DE); + +    // validate request +    assertEquals("wrong number of req.", 3, zmrReq.getAllValues().size()); +    assertNotNull("Personensuche req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest()); +    checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH, null, "jUnit123456"); +    assertNotNull("Personenupdate req.", zmrReq.getAllValues().get(2).getPersonAendernRequest()); +    checkBasicRequestParameters(zmrReq.getAllValues().get(2), ZmrClientTest.PROCESS_TASK_UPDATE,  +        new BigInteger("367100000000079"), "jUnit123456"); +    assertEquals("eIDAS attribute to add", 1,  +       zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().size()); +    assertEquals("eIDAS attribute to add - Type", "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",  +        zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().get(0).getEidasArt()); +    assertEquals("eIDAS attribute to add - Value", placeOfBirth,  +        zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().get(0).getEidasWert());     +    assertNull("ZMR update MDS", zmrReq.getAllValues().get(2).getPersonAendernRequest().getPersonAenderung()); +         +  } +   +      /**     * Two matches by PersonalId found in ZMR     * diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml new file mode 100644 index 00000000..6551cdd3 --- /dev/null +++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml @@ -0,0 +1,221 @@ +<?xml version="1.0" encoding="UTF-8"?> +    <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#"> +      <base:WorkflowInfoServer> +        <base:ProzessName>GP_EIDAS</base:ProzessName> +        <base:ProzessInstanzID>367100000000079</base:ProzessInstanzID> +        <base:SequenzID>0</base:SequenzID> +      </base:WorkflowInfoServer> +      <base:ServerInfo> +        <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon> +        <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm> +        <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr> +      </base:ServerInfo> +      <zmr:PersonSuchenResponse> +        <zmr:PersonensucheAnfrage> +          <zmr:PersonensucheInfo> +            <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld> +            <zmr:Suchkriterien> +              <base:InclusivHistorie>true</base:InclusivHistorie> +              <base:Formalisiert>false</base:Formalisiert> +            </zmr:Suchkriterien> +            <zmr:Ergebniskriterien> +              <base:InclusivHistorie>false</base:InclusivHistorie> +            </zmr:Ergebniskriterien> +            <base:AnzahlSaetze>10</base:AnzahlSaetze> +          </zmr:PersonensucheInfo> +          <NatuerlichePerson/> +        </zmr:PersonensucheAnfrage> +        <base:Message> +          <base:Number>5020</base:Number> +          <base:Text>Person gefunden.</base:Text> +        </base:Message> +        <zmr:Personensuchergebnis> +          <base:GefundeneSaetze>1</base:GefundeneSaetze> +          <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP> +          <base:SaetzeVon>0</base:SaetzeVon> +          <base:SaetzeBis>1</base:SaetzeBis> +          <zmr:PersonErgebnisSatz> +            <zmr:Personendaten> +              <zmr:PersonErgebnis> +                <base:ErgebnissatzInfo> +                  <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung> +                </base:ErgebnissatzInfo> +                <base:EntityErgebnisReferenz> +                  <base:Technisch> +                    <base:EntityID>44453600000000697</base:EntityID> +                    <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung> +                  </base:Technisch> +                  <base:Von>2020-02-05T13:07:06.311</base:Von> +                  <base:BeginnCode>SONSTIGES</base:BeginnCode> +                  <base:BeginnText>Sonstiges</base:BeginnText> +                  <base:BeginnFreitext>Testerperson</base:BeginnFreitext> +                  <base:DurchgefuehrtVon> +                    <base:Organisation> +                      <base:Behoerdenschluessel>109091</base:Behoerdenschluessel> +                    </base:Organisation> +                  </base:DurchgefuehrtVon> +                </base:EntityErgebnisReferenz> +                <base:ZMRZahl>000430320173</base:ZMRZahl> +                <zmr:NatuerlichePerson> +                  <Identification> +                    <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value> +                    <Type>urn:publicid:gv.at:cdid+ZP</Type> +                  </Identification> +                  <zmr:PersonenName> +                    <Vorname>XXXClaus - Maria</Vorname> +                    <Familienname>XXXvon Brandenburg</Familienname> +                  </zmr:PersonenName> +                  <Familienstand>unbekannt</Familienstand> +                  <Geschlecht>männlich</Geschlecht> +                  <Geburtsdatum>1994-12-31</Geburtsdatum> +                  <Geburtsort>Wien</Geburtsort> +                  <Geburtsbundesland>Wien</Geburtsbundesland> +                  <Geburtsstaat>Österreich</Geburtsstaat> +                  <zmr:Staatsangehoerigkeit> +                    <ISOCode3>AUT</ISOCode3> +                    <StaatsnameDE>Österreich</StaatsnameDE> +                    <base:EntityErgebnisReferenz> +                      <base:Technisch> +                        <base:EntityID>44453600000000727</base:EntityID> +                        <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung> +                      </base:Technisch> +                      <base:Von>2020-02-05T13:07:06.311</base:Von> +                      <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode> +                      <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText> +                      <base:BeginnFreitext>Testerperson</base:BeginnFreitext> +                      <base:DurchgefuehrtVon> +                        <base:Organisation> +                          <base:Behoerdenschluessel>109091</base:Behoerdenschluessel> +                        </base:Organisation> +                      </base:DurchgefuehrtVon> +                    </base:EntityErgebnisReferenz> +                  </zmr:Staatsangehoerigkeit> +                </zmr:NatuerlichePerson> +                <zmr:EidasIdentitaet> +                  <base:EntityErgebnisReferenz> +                    <base:Technisch> +                      <base:EntityID>1879000000000001</base:EntityID> +                      <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung> +                    </base:Technisch> +                    <base:Von>2021-11-12T08:24:39.695</base:Von> +                    <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode> +                    <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext> +                    <base:DurchgefuehrtVon> +                      <base:Organisation> +                        <base:Behoerdenschluessel>101179</base:Behoerdenschluessel> +                      </base:Organisation> +                      <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer> +                    </base:DurchgefuehrtVon> +                  </base:EntityErgebnisReferenz> +                  <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt> +                  <zmr:Staatscode2>DE</zmr:Staatscode2> +                  <base:AusstellBehoerde/> +                  <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert> +                  <base:AusstellDatum>9999-12-31</base:AusstellDatum> +                  <base:AblaufDatum>9999-12-31</base:AblaufDatum> +                </zmr:EidasIdentitaet> +                <zmr:EidasIdentitaet> +                  <base:EntityErgebnisReferenz> +                    <base:Technisch> +                      <base:EntityID>1879000000000005</base:EntityID> +                      <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung> +                    </base:Technisch> +                    <base:Von>2021-11-12T08:24:39.695</base:Von> +                    <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode> +                    <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext> +                    <base:DurchgefuehrtVon> +                      <base:Organisation> +                        <base:Behoerdenschluessel>101179</base:Behoerdenschluessel> +                      </base:Organisation> +                      <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer> +                    </base:DurchgefuehrtVon> +                  </base:EntityErgebnisReferenz> +                  <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt> +                  <zmr:Staatscode2>DE</zmr:Staatscode2> +                  <base:AusstellBehoerde/> +                  <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert> +                  <base:AusstellDatum>9999-12-31</base:AusstellDatum> +                  <base:AblaufDatum>9999-12-31</base:AblaufDatum> +                </zmr:EidasIdentitaet> +              </zmr:PersonErgebnis> +            </zmr:Personendaten> +            <zmr:Meldedaten> +              <zmr:MeldungErgebnis> +                <base:ErgebnissatzInfo> +                  <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung> +                </base:ErgebnissatzInfo> +                <base:EntityErgebnisReferenz> +                  <base:Technisch> +                    <base:EntityID>44453500000005242</base:EntityID> +                    <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung> +                  </base:Technisch> +                  <base:Von>2020-02-05T13:07:06.311</base:Von> +                  <base:BeginnCode>WSANM</base:BeginnCode> +                  <base:BeginnText>Wohnsitz anmelden</base:BeginnText> +                  <base:DurchgefuehrtVon> +                    <base:Organisation> +                      <base:Behoerdenschluessel>109091</base:Behoerdenschluessel> +                    </base:Organisation> +                  </base:DurchgefuehrtVon> +                </base:EntityErgebnisReferenz> +                <zmr:Wohnsitz> +                  <zmr:PostAdresse> +                    <Postleitzahl>0088</Postleitzahl> +                    <Gemeinde>Testgemeinde</Gemeinde> +                    <Gemeindekennziffer>09988</Gemeindekennziffer> +                    <Ortschaft>Testort A</Ortschaft> +                    <zmr:Zustelladresse> +                      <Strassenname>Testgasse</Strassenname> +                      <Orientierungsnummer>1a-2b</Orientierungsnummer> +                      <Gebaeude>Stg. 3c-4d</Gebaeude> +                      <Nutzungseinheit>5</Nutzungseinheit> +                      <Wohnsitzqualitaet>H</Wohnsitzqualitaet> +                      <Abgabestelle>false</Abgabestelle> +                      <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer> +                      <zmr:AdressRegisterEintrag> +                        <Adresscode>T800001</Adresscode> +                        <Subcode>001</Subcode> +                        <Objektnummer>T800001</Objektnummer> +                      </zmr:AdressRegisterEintrag> +                    </zmr:Zustelladresse> +                  </zmr:PostAdresse> +                  <base:Adressstatus>HST111WWW</base:Adressstatus> +                  <base:Adressschluessel> +                    <base:OKZ>T8001</base:OKZ> +                    <base:SKZ>T80001</base:SKZ> +                    <base:ADRRefkey>T80000000001</base:ADRRefkey> +                    <base:GBRRefkey>T80000000002</base:GBRRefkey> +                  </base:Adressschluessel> +                  <base:HauptIdent>H</base:HauptIdent> +                  <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet> +                </zmr:Wohnsitz> +                <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon> +                <base:PeriodeCode>WSANM</base:PeriodeCode> +                <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText> +                <zmr:Auskunftssperre> +                  <base:EntityErgebnisReferenz> +                    <base:Technisch> +                      <base:EntityID>44453500000005262</base:EntityID> +                      <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung> +                    </base:Technisch> +                    <base:Von>2020-02-05T13:07:06.311</base:Von> +                    <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode> +                    <base:BeginnText>Auskunftssperre setzen</base:BeginnText> +                    <base:DurchgefuehrtVon> +                      <base:Organisation> +                        <base:Behoerdenschluessel>109091</base:Behoerdenschluessel> +                      </base:Organisation> +                    </base:DurchgefuehrtVon> +                  </base:EntityErgebnisReferenz> +                  <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon> +                  <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis> +                  <zmr:SperrCode>ASMG</zmr:SperrCode> +                  <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText> +                  <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext> +                </zmr:Auskunftssperre> +              </zmr:MeldungErgebnis> +            </zmr:Meldedaten> +          </zmr:PersonErgebnisSatz> +        </zmr:Personensuchergebnis> +      </zmr:PersonSuchenResponse> +    </base:Response> | 
