diff options
Diffstat (limited to 'modules')
2 files changed, 48 insertions, 5 deletions
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java index e180e87d..b4f4098e 100644 --- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java +++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java @@ -4,6 +4,8 @@ import java.io.Serializable; import java.math.BigInteger; import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.Nonnull; @@ -38,6 +40,9 @@ public class RegisterSearchService { private static final Object ERNP = "ERnP"; private static final String LOG_MSG_RESULTS = "Matching operation: {} results: " + ZMR + ": {} | " + ERNP + ": {}"; + private static final String LOG_MSG_RESULTS_CLEARING = + "Post-processing of register results find duplicated entries. " + + "Remove {} entries from " + ERNP + " result."; private static final String LOG_MSG_KITT = "Matching operation kitts entry on: {}"; @@ -438,9 +443,25 @@ public class RegisterSearchService { result.getPersonResult(), Collections.emptyList()); } - static RegisterStatusResults fromZmrAndErnp(ZmrRegisterResult result, ErnpRegisterResult resultErnp) { + static RegisterStatusResults fromZmrAndErnp(ZmrRegisterResult result, ErnpRegisterResult resultErnp) { + /* + * Post-processing of ERnP entries to remove entities that included twice. + * In case of KITT on register side that KITTS an ERnP to ZMR entry, + * the same entity can part of both responses. + */ + Set<String> existingZmrPersons = result.getPersonResult().stream() + .map(el -> el.getBpk()) + .collect(Collectors.toSet()); + List<RegisterResult> ernpCleared = resultErnp.getPersonResult().stream() + .filter(el -> !existingZmrPersons.contains(el.getBpk())) + .collect(Collectors.toList()); + if (ernpCleared.size() < resultErnp.getPersonResult().size()) { + log.info(LOG_MSG_RESULTS_CLEARING, resultErnp.getPersonResult().size() - ernpCleared.size()); + + } + return new RegisterStatusResults(new RegisterOperationStatus(result.getProcessId()), - result.getPersonResult(), resultErnp.getPersonResult()); + result.getPersonResult(), ernpCleared); } static RegisterStatusResults fromErnp(RegisterOperationStatus status, ErnpRegisterResult updateErnp) { diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java index eef31a02..c9b7b1ac 100644 --- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java +++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java @@ -97,6 +97,7 @@ import eu.eidas.auth.commons.attribute.ImmutableAttributeMap; import eu.eidas.auth.commons.attribute.PersonType; import eu.eidas.auth.commons.light.impl.LightRequest; import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse; +import lombok.SneakyThrows; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { @@ -339,7 +340,7 @@ public class InitialSearchTaskTest { Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE)) .thenReturn(zmrRegisterResult(randomRegisterResult())); Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE)) - .thenReturn(ernpRegisterResult(randomRegisterResult())); + .thenReturn(ernpRegisterResult(randomRegisterResult(RandomStringUtils.randomAlphanumeric(10)))); // execute task TaskExecutionException exception = assertThrows(TaskExecutionException.class, @@ -353,6 +354,27 @@ public class InitialSearchTaskTest { } /** + * Find to matches by PersonalId but they are the same person. + */ + @Test + @DirtiesContext + @SneakyThrows + public void samePersonFromZmrAndErnp() { + RegisterResult registerResult = randomRegisterResult(); + Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE)) + .thenReturn(zmrRegisterResult(registerResult)); + Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE)) + .thenReturn(ernpRegisterResult(registerResult)); + + // execute test + task.execute(pendingReq, executionContext); + + // validate state + checkMatchingSuccessState(pendingReq, randomBpk, randomFamilyName, randomGivenName, randomBirthDate, DE); + + } + + /** * One match by PersonalId, no register update needed */ @Test @@ -545,7 +567,7 @@ public class InitialSearchTaskTest { Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE)) .thenReturn(emptyErnpRegisterResult()); Mockito.when(ernpClient.searchCountrySpecific(any(), eq(DE))) - .thenReturn(ernpRegisterResult(randomRegisterResult())); + .thenReturn(ernpRegisterResult(randomRegisterResult(RandomStringUtils.randomAlphanumeric(10)))); Mockito.when(ernpClient.update(any(), any())) .thenThrow(new IllegalStateException("ERnP update should not be neccessary")); @@ -722,7 +744,7 @@ public class InitialSearchTaskTest { Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE)).thenReturn( emptyErnpRegisterResult()); Mockito.when(ernpClient.searchWithMds(randomGivenName, randomFamilyName, randomBirthDate, DE)) - .thenReturn(ernpRegisterResult(randomRegisterResult())); + .thenReturn(ernpRegisterResult(randomRegisterResult(RandomStringUtils.randomAlphanumeric(10)))); Mockito.when(ernpClient.update(any(), any())) .thenThrow(new IllegalStateException("ERnP update should not be neccessary")); |