diff options
Diffstat (limited to 'modules')
3 files changed, 274 insertions, 259 deletions
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java index 5d3f43e6..ce474793 100644 --- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java +++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java @@ -95,7 +95,8 @@ import lombok.extern.slf4j.Slf4j; public class ErnpRestClient implements IErnpClient { private static final String ERROR_MATCHING_11 = "module.eidasauth.matching.11"; - //private static final String ERROR_MATCHING_12 = "module.eidasauth.matching.12"; + // private static final String ERROR_MATCHING_12 = + // "module.eidasauth.matching.12"; private static final String ERROR_MATCHING_99 = "module.eidasauth.matching.99"; private static final String LOGMSG_MISSING_CONFIG = "Missing configuration with key: {0}"; @@ -104,8 +105,8 @@ public class ErnpRestClient implements IErnpClient { private static final String LOGMSG_ERNP_RESP_PROCESS = "Proces ERnP response during '{}' operation failes with msg: {}"; - //private static final String LOGMSG_ERNP_REST_ERROR = - // "ERnP anwser for transaction: {0} with code: {1} and message: {2}"; + // private static final String LOGMSG_ERNP_REST_ERROR = + // "ERnP anwser for transaction: {0} with code: {1} and message: {2}"; private static final String PROCESS_SEARCH_PERSONAL_IDENTIFIER = "Searching " + EidasConstants.eIDAS_ATTR_PERSONALIDENTIFIER; @@ -116,16 +117,15 @@ public class ErnpRestClient implements IErnpClient { private static final String PROCESS_KITT_IDENITIES_GET = "KITT get-latest-version"; private static final String PROCESS_KITT_IDENITIES_UPDATE = "KITT update dataset"; private static final String PROCESS_ADD_IDENITY = "Add new person"; - + private static final String FRIENDLYNAME_HTTP_CLIENT = "ERnP Client"; - // HTTP header-names from ERnP response + // HTTP header-names from ERnP response private static final String ERNP_RESPONSE_HEADER_SERVER_ID = "Server-Request-Id"; - + // ERnP person type that indicates mark a person as ZMR entry private static final String ERNP_RESPONSE_OPERATION_ZMR_FORWARD = "PersonUebernehmen"; - - + @Autowired IConfiguration basicConfig; @Autowired @@ -165,10 +165,10 @@ public class ErnpRestClient implements IErnpClient { // parse ZMR response return processErnpResponse(resp, citizenCountryCode, true, PROCESS_SEARCH_PERSONAL_IDENTIFIER); - } catch (RestClientException e) { + } catch (final RestClientException e) { log.warn(LOGMSG_ERNP_ERROR, PROCESS_SEARCH_PERSONAL_IDENTIFIER, e.getMessage()); throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e); - + } catch (final EidasSAuthenticationException e) { throw e; @@ -191,10 +191,10 @@ public class ErnpRestClient implements IErnpClient { searchInfos.setFamilienname(familyName); searchInfos.setVorname(givenName); searchInfos.setGeburtsdatum(buildErnpBirthday(dateOfBirth)); - + final PersonSuchen personSuchen = new PersonSuchen(); personSuchen.setSuchoptionen(generateSearchParameters()); - personSuchen.setBegruendung(PROCESS_SEARCH_MDS_ONLY); + personSuchen.setBegruendung(PROCESS_SEARCH_MDS_ONLY); personSuchen.setSuchdaten(searchInfos); // request ERnP @@ -205,10 +205,10 @@ public class ErnpRestClient implements IErnpClient { // parse ZMR response return processErnpResponse(resp, citizenCountryCode, false, PROCESS_SEARCH_MDS_ONLY); - } catch (RestClientException e) { + } catch (final RestClientException e) { log.warn(LOGMSG_ERNP_ERROR, PROCESS_SEARCH_MDS_ONLY, e.getMessage()); throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e); - + } catch (final EidasSAuthenticationException e) { throw e; @@ -217,20 +217,20 @@ public class ErnpRestClient implements IErnpClient { throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e); } } - + @Override public ErnpRegisterResult searchCountrySpecific(PersonSuchenRequest personSearchDao, String citizenCountryCode) throws EidasSAuthenticationException { - String countrySearchMsg = MessageFormat.format(PROCESS_SEARCH_COUNTRY_SPECIFIC, citizenCountryCode); - - try { + final String countrySearchMsg = MessageFormat.format(PROCESS_SEARCH_COUNTRY_SPECIFIC, citizenCountryCode); + + try { // build generic request metadata final GenericRequestParams generic = buildGenericRequestParameters(); - // build search request + // build search request final PersonSuchen personSuchen = new PersonSuchen(); personSuchen.setSuchoptionen(generateSearchParameters()); - personSuchen.setBegruendung(countrySearchMsg); + personSuchen.setBegruendung(countrySearchMsg); personSuchen.setSuchdaten(mapCountrySpecificSearchData(personSearchDao)); // request ERnP @@ -241,17 +241,17 @@ public class ErnpRestClient implements IErnpClient { // parse ZMR response return processErnpResponse(resp, citizenCountryCode, true, countrySearchMsg); - } catch (RestClientException e) { + } catch (final RestClientException e) { log.warn(LOGMSG_ERNP_ERROR, countrySearchMsg, e.getMessage()); throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e); - + } catch (final EidasSAuthenticationException e) { throw e; } catch (final Exception e) { log.warn(LOGMSG_ERNP_RESP_PROCESS, countrySearchMsg, e.getMessage()); throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e); - + } } @@ -259,39 +259,42 @@ public class ErnpRestClient implements IErnpClient { public ErnpRegisterResult update(RegisterResult registerResult, SimpleEidasData eidData) throws EidasSAuthenticationException { try { - //search person with register result, because update needs information from search response - Person ernpPersonToKitt = searchPersonForUpdate(registerResult); - + // search person with register result, because update needs information from + // search response + final Person ernpPersonToKitt = searchPersonForUpdate(registerResult); + // select elements that have to be updated - Collection<? extends Eidas> eidasDocumentToAdd = - selectEidasDocumentsToAdd(ernpPersonToKitt, eidData); - SimpleEidasData mdsToUpdate = selectMdsInformationToUpdate(ernpPersonToKitt, eidData); - + final Collection<? extends Eidas> eidasDocumentToAdd = + selectEidasDocumentsToAdd(ernpPersonToKitt, eidData); + final SimpleEidasData mdsToUpdate = selectMdsInformationToUpdate(ernpPersonToKitt, eidData); + if (eidasDocumentToAdd.isEmpty() && mdsToUpdate == null) { - log.info("Find no eIDAS document or MDS for update during: {}. Nothing todo on ERnP side", + log.info("Find no eIDAS document or MDS for update during: {}. Nothing todo on ERnP side", PROCESS_KITT_GENERAL); return new ErnpRegisterResult(Arrays.asList(new ErnpPersonRegisterResult(registerResult, false))); - + } else { - log.info("Find #{} eIDAS documents for update during: {}", eidasDocumentToAdd.size(), PROCESS_KITT_GENERAL); - - // update entry based on selected update info's and results from search response - return updatePersonInErnp(ernpPersonToKitt, eidasDocumentToAdd, mdsToUpdate, eidData.getCitizenCountryCode()); - + log.info("Find #{} eIDAS documents for update during: {}", eidasDocumentToAdd.size(), + PROCESS_KITT_GENERAL); + + // update entry based on selected update info's and results from search response + return updatePersonInErnp(ernpPersonToKitt, eidasDocumentToAdd, mdsToUpdate, eidData + .getCitizenCountryCode()); + } - } catch (RestClientException e) { + } catch (final RestClientException e) { log.warn(LOGMSG_ERNP_ERROR, PROCESS_KITT_GENERAL, e.getMessage()); throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e); - + } catch (final EidasSAuthenticationException e) { throw e; } catch (final Exception e) { log.warn(LOGMSG_ERNP_RESP_PROCESS, PROCESS_KITT_GENERAL, e.getMessage()); throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e); - - } + + } } @Override @@ -299,48 +302,48 @@ public class ErnpRestClient implements IErnpClient { try { // build generic request metadata final GenericRequestParams generic = buildGenericRequestParameters(); - + // build update request - PersonAnlegen ernpReq = new PersonAnlegen(); + final PersonAnlegen ernpReq = new PersonAnlegen(); ernpReq.setBegruendung(PROCESS_ADD_IDENITY); - + // inject person data - Personendaten person = new Personendaten(); + final Personendaten person = new Personendaten(); person.setFamilienname(eidData.getFamilyName()); person.setVorname(eidData.getGivenName()); - person.setGeburtsdatum(buildErnpBirthday(eidData.getDateOfBirth())); + person.setGeburtsdatum(buildErnpBirthday(eidData.getDateOfBirth())); ernpReq.setPersonendaten(person); - + buildNewEidasDocumens(ernpReq, eidData); - + // request ERnP - log.trace("Requesting ERnP for '{}' operation", PROCESS_ADD_IDENITY); - AnlegenResponse ernpResp = ernpClient.anlegen(generic.getClientBehkz(), generic.clientName, - generic.getClientRequestTime(), generic.getClientRequestId(), ernpReq); + log.trace("Requesting ERnP for '{}' operation", PROCESS_ADD_IDENITY); + final AnlegenResponse ernpResp = ernpClient.anlegen(generic.getClientBehkz(), generic.clientName, + generic.getClientRequestTime(), generic.getClientRequestId(), ernpReq); log.trace("Receive response from ERnP for '{}' operation", PROCESS_ADD_IDENITY); - - return new ErnpRegisterResult(Arrays.asList( - mapErnpResponseToRegisterResult(ernpResp.getPerson(), eidData.getCitizenCountryCode()))); - - } catch (RestClientException e) { + + return new ErnpRegisterResult(Arrays.asList( + mapErnpResponseToRegisterResult(ernpResp.getPerson(), eidData.getCitizenCountryCode()))); + + } catch (final RestClientException e) { log.warn(LOGMSG_ERNP_ERROR, PROCESS_ADD_IDENITY, e.getMessage()); throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e); - + } catch (final Exception e) { log.warn(LOGMSG_ERNP_RESP_PROCESS, PROCESS_ADD_IDENITY, e.getMessage()); throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e); - - } + + } } - + @Override public ErnpRegisterResult searchWithResidenceData(String givenName, String familyName, String dateOfBirth, - String zipcode, String city, String street) { + String zipcode, String city, String street) { log.warn("Matching with residence information is prohibited by design! This requests will be ignored"); return new ErnpRegisterResult(Collections.emptyList()); - + } - + @PostConstruct private void initialize() throws EaafException { // validate additional Ernp communication parameters @@ -406,11 +409,11 @@ public class ErnpRestClient implements IErnpClient { private ErnpRegisterResult processSearchPersonResponse( @Nonnull List<Person> list, @Nonnull String citizenCountryCode) throws EaafAuthenticationException { - List<ErnpPersonRegisterResult> ernpResult = list.stream() + final List<ErnpPersonRegisterResult> ernpResult = list.stream() .map(el -> mapErnpResponseToRegisterResult(el, citizenCountryCode)) .filter(Objects::nonNull) .collect(Collectors.toList()); - log.info("Get #{} ERnP results after post-processing", ernpResult.size()); + log.info("Get #{} ERnP results after post-processing", ernpResult.size()); return new ErnpRegisterResult(ernpResult); } @@ -425,224 +428,230 @@ public class ErnpRestClient implements IErnpClient { "Find more-than-one ERnP entry with search criteria that has to be unique", true); } else { - ErnpPersonRegisterResult activeResult = + final ErnpPersonRegisterResult activeResult = mapErnpResponseToRegisterResult(persons.get(0), citizenCountryCode); if (activeResult == null) { log.error("ERnP entry, which was selected by matching, looks already closed. " + "Automated operations on closed entries not supported my matching"); - throw new WorkflowException(processStepFiendlyname, + throw new WorkflowException(processStepFiendlyname, "ERnP entry, which was selected by matching, is not active any more.", true); - - } - + + } + return new ErnpRegisterResult(Arrays.asList(activeResult)); - + } } /** - * Process a single Person data-set from ERnP. - * - * @param personEl Person data-set from ERnP + * Process a single Person data-set from ERnP. + * + * @param personEl Person data-set from ERnP * @param citizenCountryCode Country-Code of the citizen - * @return {@link Pair} of Simplified register result and 'isZMREntry' flag, - * or <code>null</code> if the person data-set is not active anymore + * @return {@link Pair} of Simplified register result and 'isZMREntry' flag, or + * <code>null</code> if the person data-set is not active anymore * @throws EaafAuthenticationException In case of a validation error */ @Nullable private ErnpPersonRegisterResult mapErnpResponseToRegisterResult(@Nonnull Person person, @Nonnull String citizenCountryCode) { - if (checkIfPersonIsActive(person)) { + if (checkIfPersonIsActive(person)) { // build result return new ErnpPersonRegisterResult( RegisterResult.builder() - .pseudonym(selectAllEidasDocument(person, citizenCountryCode, - EidasConstants.eIDAS_ATTRURN_PERSONALIDENTIFIER)) - .familyName(person.getPersonendaten().getFamilienname()) - .givenName(person.getPersonendaten().getVorname()) - .dateOfBirth(getTextualBirthday(person.getPersonendaten().getGeburtsdatum())) - .bpk(person.getPersonendaten().getBpkZp()) - .placeOfBirth(selectSingleEidasDocument(person, citizenCountryCode, - EidasConstants.eIDAS_ATTRURN_PLACEOFBIRTH)) - .birthName(selectSingleEidasDocument(person, citizenCountryCode, - EidasConstants.eIDAS_ATTRURN_BIRTHNAME)) - .build(), - isPersonMovedToZmr(person)); - + .pseudonym(selectAllEidasDocument(person, citizenCountryCode, + EidasConstants.eIDAS_ATTRURN_PERSONALIDENTIFIER)) + .familyName(person.getPersonendaten().getFamilienname()) + .givenName(person.getPersonendaten().getVorname()) + .dateOfBirth(getTextualBirthday(person.getPersonendaten().getGeburtsdatum())) + .bpk(person.getPersonendaten().getBpkZp()) + .placeOfBirth(selectSingleEidasDocument(person, citizenCountryCode, + EidasConstants.eIDAS_ATTRURN_PLACEOFBIRTH)) + .birthName(selectSingleEidasDocument(person, citizenCountryCode, + EidasConstants.eIDAS_ATTRURN_BIRTHNAME)) + .build(), + isPersonMovedToZmr(person)); + } else { log.debug("Entity is not valid anymore. Skip it ... "); return null; - + } } - private boolean checkIfPersonIsActive(Person person) { + private boolean checkIfPersonIsActive(Person person) { if (person.getGueltigBis() != null) { - LocalDateTime validTo = person.getGueltigBis().toLocalDateTime(); - LocalDateTime now = LocalDateTime.now(); - + final LocalDateTime validTo = person.getGueltigBis().toLocalDateTime(); + final LocalDateTime now = LocalDateTime.now(); + if (isPersonMovedToZmr(person)) { - log.debug("Entity has a 'validTo' element, but it's marked as {}. Use it as a ZMR entry", - ERNP_RESPONSE_OPERATION_ZMR_FORWARD); - - } else if (validTo.isBefore(now)) { + log.debug("Entity has a 'validTo' element, but it's marked as {}. Use it as a ZMR entry", + ERNP_RESPONSE_OPERATION_ZMR_FORWARD); + + } else if (validTo.isBefore(now)) { log.warn("Enity was valid to: {}, but now its: {}. Ignore that entry", validTo, now); return false; - + } else { log.debug("Entity has a 'validTo' element, but it is in the future."); - + } - + } else { log.trace("Entity has no 'validTo' element. Therefore it should be valid"); - + } - + return true; } - - + /** * Check if ERnP person is marked as KITT to ZMR entry. - * - * <p>If person is marked as ZMR person then it has the same quality as a ZMR match.</p> - * + * + * <p> + * If person is marked as ZMR person then it has the same quality as a ZMR + * match. + * </p> + * * @param person ERnP person result - * @return <code>true</code> if the person should be in ERnP, otherwise <code>false</code> + * @return <code>true</code> if the person should be in ERnP, otherwise + * <code>false</code> */ private boolean isPersonMovedToZmr(Person person) { - return person.getLetzteOperation() != null + return person.getLetzteOperation() != null && ERNP_RESPONSE_OPERATION_ZMR_FORWARD.equals(person.getLetzteOperation().getVorgang()); - + } - private Suchdaten mapCountrySpecificSearchData(PersonSuchenRequest personSearchDao) { + private Suchdaten mapCountrySpecificSearchData(PersonSuchenRequest personSearchDao) { final Suchdaten searchInfos = new Suchdaten(); - searchInfos.setFamilienname(personSearchDao.getNatuerlichePerson().getPersonenName().getFamilienname()); + searchInfos.setFamilienname(personSearchDao.getNatuerlichePerson().getPersonenName().getFamilienname()); searchInfos.setVorname(personSearchDao.getNatuerlichePerson().getPersonenName().getVorname()); - searchInfos.setGeburtsdatum(buildErnpBirthday(personSearchDao.getNatuerlichePerson().getGeburtsdatum())); - + searchInfos.setGeburtsdatum(buildErnpBirthday(personSearchDao.getNatuerlichePerson().getGeburtsdatum())); + // map all eIDAS documents into ERnP format searchInfos.setEidas(personSearchDao.getEidasSuchdaten().stream() .map(el -> buildErnpEidasDocument(el)) .collect(Collectors.toList())); - + return searchInfos; - + } - + private ErnpRegisterResult updatePersonInErnp(Person ernpPersonToKitt, - Collection<? extends Eidas> eidasDocumentToAdd, SimpleEidasData mdsToUpdate, String citizenCountryCode) - throws ServiceFault { + Collection<? extends Eidas> eidasDocumentToAdd, SimpleEidasData mdsToUpdate, String citizenCountryCode) + throws ServiceFault { // build generic request metadata final GenericRequestParams generic = buildGenericRequestParameters(); - + // build update request - PersonAendern ernpReq = new PersonAendern(); + final PersonAendern ernpReq = new PersonAendern(); ernpReq.setBegruendung(PROCESS_KITT_IDENITIES_UPDATE); - + // set reference elements for person update ernpReq.setEntityId(ernpPersonToKitt.getEntityId()); - ernpReq.setVersion(ernpPersonToKitt.getVersion()); - + ernpReq.setVersion(ernpPersonToKitt.getVersion()); + // add new eIDAS attributes if (!eidasDocumentToAdd.isEmpty()) { log.debug("Find eIDAS Documents to update. Injection update entries into ERnP request ... "); - ernpReq.setAnlegen(new Anlegen()); + ernpReq.setAnlegen(new Anlegen()); eidasDocumentToAdd.stream().forEach(el -> ernpReq.getAnlegen().addEidasItem(el)); - + } - + // update MDS if required if (mdsToUpdate != null) { log.debug("Find MDS to update. Injection update entries into ERnP request ... "); ernpReq.setAendern(generateMdsChangeRequest(ernpPersonToKitt, mdsToUpdate)); - + } - + // request ERnP - log.trace("Requesting ERnP for '{}' operation", PROCESS_KITT_IDENITIES_UPDATE); - AendernResponse ernpResp = ernpClient.aendern(generic.getClientBehkz(), generic.clientName, - generic.getClientRequestTime(), generic.getClientRequestId(), ernpReq); + log.trace("Requesting ERnP for '{}' operation", PROCESS_KITT_IDENITIES_UPDATE); + final AendernResponse ernpResp = ernpClient.aendern(generic.getClientBehkz(), generic.clientName, + generic.getClientRequestTime(), generic.getClientRequestId(), ernpReq); log.trace("Receive response from ERnP for '{}' operation", PROCESS_KITT_IDENITIES_UPDATE); - + return new ErnpRegisterResult(Collections.singletonList( mapErnpResponseToRegisterResult(ernpResp.getPerson(), citizenCountryCode))); - + } - + private Collection<? extends Eidas> selectEidasDocumentsToAdd( Person ernpPersonToKitt, SimpleEidasData eidData) { - //TODO: maybe we should re-factor SimpleEidasData to a generic data-model to facilitate arbitrary eIDAS attributes - Set<Eidas> result = new HashSet<>(); - addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(), - EidasConstants.eIDAS_ATTRURN_PERSONALIDENTIFIER, eidData.getPseudonym(), true); - addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(), + // TODO: maybe we should re-factor SimpleEidasData to a generic data-model to + // facilitate arbitrary eIDAS attributes + final Set<Eidas> result = new HashSet<>(); + addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(), + EidasConstants.eIDAS_ATTRURN_PERSONALIDENTIFIER, eidData.getPseudonym(), true); + addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(), EidasConstants.eIDAS_ATTRURN_PLACEOFBIRTH, eidData.getPlaceOfBirth(), false); - addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(), + addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(), EidasConstants.eIDAS_ATTRURN_BIRTHNAME, eidData.getBirthName(), false); - + return result; - + } - + private void addEidasDocumentIfNotAvailable(Set<Eidas> result, - Person ernpPersonToKitt, String citizenCountryCode, + Person ernpPersonToKitt, String citizenCountryCode, String attrName, String attrValue, boolean allowMoreThanOneEntry) { if (StringUtils.isEmpty(attrValue)) { log.trace("No eIDAS document: {}. Nothing todo for KITT process ... ", attrName); return; - + } - + // get all eIDAS documents from current ERnP entry or an empty list of no exists - List<Eidas> currentEidasDocs = ernpPersonToKitt.getEidas() != null - ? ernpPersonToKitt.getEidas() : Collections.emptyList(); - - // check if eIDAS attribute is already includes an eIDAS-Document - boolean alreadyExist = currentEidasDocs.stream() - .filter(el -> el.getWert().equals(attrValue) + final List<Eidas> currentEidasDocs = ernpPersonToKitt.getEidas() != null + ? ernpPersonToKitt.getEidas() + : Collections.emptyList(); + + // check if eIDAS attribute is already includes an eIDAS-Document + final boolean alreadyExist = currentEidasDocs.stream() + .filter(el -> el.getWert().equals(attrValue) && el.getArt().equals(attrName) - && el.getStaatscode2().equals(citizenCountryCode)) + && el.getStaatscode2().equals(citizenCountryCode)) .findAny() .isPresent(); - - if (!alreadyExist) { - // check eIDAS documents already contains a document with this pair of country-code and attribute-name - Optional<Eidas> oneDocWithNameExists = currentEidasDocs.stream() - .filter(el -> el.getStaatscode2().equals(citizenCountryCode) + + if (!alreadyExist) { + // check eIDAS documents already contains a document with this pair of + // country-code and attribute-name + final Optional<Eidas> oneDocWithNameExists = currentEidasDocs.stream() + .filter(el -> el.getStaatscode2().equals(citizenCountryCode) && el.getArt().equals(attrName)) .findAny(); - + if (!allowMoreThanOneEntry && oneDocWithNameExists.isPresent() - && !oneDocWithNameExists.get().getWert().equals(attrValue)) { + && !oneDocWithNameExists.get().getWert().equals(attrValue)) { log.warn("eIDAS document: {} already exists for country: {} but attribute-value does not match. " + "Skip update process because no multi-value allowed for this ... ", - attrName, citizenCountryCode); - + attrName, citizenCountryCode); + } else { - - Eidas eidasDocToAdd = new Eidas(); + + final Eidas eidasDocToAdd = new Eidas(); eidasDocToAdd.setStaatscode2(citizenCountryCode); eidasDocToAdd.setArt(attrName); - eidasDocToAdd.setWert(attrValue); + eidasDocToAdd.setWert(attrValue); log.info("Add eIDAS document: {} for country: {} to ERnP person", attrName, citizenCountryCode); result.add(eidasDocToAdd); - + } - + } else { log.debug("eIDAS document: {} already exists for country: {}. Skip update process for this ... ", - attrName, citizenCountryCode); - + attrName, citizenCountryCode); + } } - + private Person searchPersonForUpdate(RegisterResult registerResult) throws WorkflowException { // build generic request metadata final GenericRequestParams generic = buildGenericRequestParameters(); @@ -652,11 +661,11 @@ public class ErnpRestClient implements IErnpClient { searchInfos.setBpkZp(registerResult.getBpk()); searchInfos.setFamilienname(registerResult.getFamilyName()); searchInfos.setVorname(registerResult.getGivenName()); - searchInfos.setGeburtsdatum(buildErnpBirthday(registerResult.getDateOfBirth())); - + searchInfos.setGeburtsdatum(buildErnpBirthday(registerResult.getDateOfBirth())); + final PersonSuchen personSuchen = new PersonSuchen(); personSuchen.setSuchoptionen(generateSearchParameters()); - personSuchen.setBegruendung(PROCESS_KITT_IDENITIES_GET); + personSuchen.setBegruendung(PROCESS_KITT_IDENITIES_GET); personSuchen.setSuchdaten(searchInfos); // request ERnP @@ -667,110 +676,109 @@ public class ErnpRestClient implements IErnpClient { // perform shot validation of ERnP response if (resp.getPerson() == null || resp.getPerson().size() != 1) { log.error("ERnP result contains NO 'Person' or 'Person' is empty"); - throw new WorkflowException(PROCESS_KITT_IDENITIES_GET, + throw new WorkflowException(PROCESS_KITT_IDENITIES_GET, "Find NO data-set with already matchted eID during ERnP KITT process"); - + } else { log.debug("Find person for '{}' operation", PROCESS_KITT_IDENITIES_GET); - return resp.getPerson().get(0); - - } + return resp.getPerson().get(0); + + } } - + private void buildNewEidasDocumens(PersonAnlegen ernpReq, SimpleEidasData eidData) { - ernpReq.addEidasItem(buildNewEidasDocument(eidData.getCitizenCountryCode(), + ernpReq.addEidasItem(buildNewEidasDocument(eidData.getCitizenCountryCode(), EidasConstants.eIDAS_ATTRURN_PERSONALIDENTIFIER, eidData.getPseudonym())); - + if (StringUtils.isNotEmpty(eidData.getPlaceOfBirth())) { ernpReq.addEidasItem(buildNewEidasDocument(eidData.getCitizenCountryCode(), EidasConstants.eIDAS_ATTRURN_PLACEOFBIRTH, eidData.getPlaceOfBirth())); - + } - + if (StringUtils.isNotEmpty(eidData.getBirthName())) { - ernpReq.addEidasItem(buildNewEidasDocument(eidData.getCitizenCountryCode(), + ernpReq.addEidasItem(buildNewEidasDocument(eidData.getCitizenCountryCode(), EidasConstants.eIDAS_ATTRURN_BIRTHNAME, eidData.getBirthName())); - - } + + } } private Eidas buildNewEidasDocument(String citizenCountryCode, String eidasAttrName, String eidasAddrValue) { - Eidas el = new Eidas(); + final Eidas el = new Eidas(); el.setArt(eidasAttrName); el.setWert(eidasAddrValue); el.setStaatscode2(citizenCountryCode); return el; } - - private SimpleEidasData selectMdsInformationToUpdate(Person ernpPersonToKitt, SimpleEidasData eidData) { - PersonendatenErgebnis person = ernpPersonToKitt.getPersonendaten(); - SimpleEidasDataBuilder builder = SimpleEidasData.builder() + + private SimpleEidasData selectMdsInformationToUpdate(Person ernpPersonToKitt, SimpleEidasData eidData) { + final PersonendatenErgebnis person = ernpPersonToKitt.getPersonendaten(); + final SimpleEidasDataBuilder builder = SimpleEidasData.builder() .givenName(eidData.getGivenName()) .familyName(eidData.getFamilyName()) .dateOfBirth(eidData.getDateOfBirth()); - - boolean findMatch = person.getVorname().equals(eidData.getGivenName()) + + final boolean findMatch = person.getVorname().equals(eidData.getGivenName()) && person.getFamilienname().equals(eidData.getFamilyName()) - && getTextualBirthday(person.getGeburtsdatum()).equals(eidData.getDateOfBirth()); + && getTextualBirthday(person.getGeburtsdatum()).equals(eidData.getDateOfBirth()); return findMatch ? null : builder.build(); - + } - + private Aendern generateMdsChangeRequest(Person ernpPersonToKitt, SimpleEidasData mdsToUpdate) { - Aendern el = new Aendern(); - Personendaten person = new Personendaten(); + final Aendern el = new Aendern(); + final Personendaten person = new Personendaten(); person.setEntityId(ernpPersonToKitt.getPersonendaten().getEntityId()); el.setPersonendaten(person); person.setFamilienname(mdsToUpdate.getFamilyName()); person.setVorname(mdsToUpdate.getGivenName()); - person.setGeburtsdatum(buildErnpBirthday(mdsToUpdate.getDateOfBirth())); + person.setGeburtsdatum(buildErnpBirthday(mdsToUpdate.getDateOfBirth())); return el; - + } - + /** * Map an AT specific Date String 'yyyy-MM-dd' to ERnP birthday representation. - * + * * <p> - * <b>Info:</b> {@link LocalDate} can not be used, because '1940-00-00' is also + * <b>Info:</b> {@link LocalDate} can not be used, because '1940-00-00' is also * a valid birthday. * </p> - * + * * @param dateOfBirth in 'yyyy-MM-dd' format * @return ERnP birthday representation */ - private PartialDate buildErnpBirthday(String dateOfBirth) { - String[] elements = dateOfBirth.split("-"); + private PartialDate buildErnpBirthday(String dateOfBirth) { + final String[] elements = dateOfBirth.split("-"); Assert.isTrue(elements.length == 3, "Find invalid dateOfBirth element: " + dateOfBirth); - - PartialDate result = new PartialDate(); + + final PartialDate result = new PartialDate(); result.setJahr(Integer.valueOf(elements[0])); result.setMonat(Integer.valueOf(elements[1])); - result.setTag(Integer.valueOf(elements[2])); + result.setTag(Integer.valueOf(elements[2])); return result; - + } /** * Map eIDAS search-data from ZMR model into ERnP model. - * + * * @param daten eIDAS document as ZMR model * @return the same eIDAS document as an ERnP model */ - private SuchEidas buildErnpEidasDocument(EidasSuchdatenType daten) { + private SuchEidas buildErnpEidasDocument(EidasSuchdatenType daten) { return new SuchEidas() .art(daten.getEidasArt()) .wert(daten.getEidasWert()) - .staatscode2(daten.getStaatscode2()); + .staatscode2(daten.getStaatscode2()); } - - + /** * Build AT specific Date String 'yyyy-MM-dd' from ERnP birthday representation. * * <p> - * <b>Info:</b> {@link LocalDate} can not be used, because '1940-00-00' is also + * <b>Info:</b> {@link LocalDate} can not be used, because '1940-00-00' is also * a valid birthday on ERnP site. * </p> * @@ -785,7 +793,6 @@ public class ErnpRestClient implements IErnpClient { } - /** * Get all eIDAS document with the specified country code and document type. * @@ -845,30 +852,31 @@ public class ErnpRestClient implements IErnpClient { final RestTemplate springClient = new RestTemplate(requestFactory); springClient.setErrorHandler(buildErrorHandler()); springClient.getMessageConverters().add(0, buildCustomJacksonObjectMapper()); - //springClient.getInterceptors().add(buildTransactionIdInterceptor()); + // springClient.getInterceptors().add(buildTransactionIdInterceptor()); return springClient; } - - //private ClientHttpRequestInterceptor buildTransactionIdInterceptor() { - // return new ClientHttpRequestInterceptor() { - // - // @Override - // public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) - // throws IOException { - // request.getHeaders().add("dfafsafafsaf", TransactionIdUtils.getTransactionId()); - // return execution.execute(request, body); - // - // } - // }; - //} + // private ClientHttpRequestInterceptor buildTransactionIdInterceptor() { + // return new ClientHttpRequestInterceptor() { + // + // @Override + // public ClientHttpResponse intercept(HttpRequest request, byte[] body, + // ClientHttpRequestExecution execution) + // throws IOException { + // request.getHeaders().add("dfafsafafsaf", + // TransactionIdUtils.getTransactionId()); + // return execution.execute(request, body); + // + // } + // }; + // } private HttpMessageConverter<?> buildCustomJacksonObjectMapper() { final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON)); converter.getObjectMapper().setSerializationInclusion(Include.NON_NULL); - + converter.getObjectMapper().registerModule(new JavaTimeModule()); converter.getObjectMapper().configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); return converter; @@ -890,12 +898,12 @@ public class ErnpRestClient implements IErnpClient { public void handleError(ClientHttpResponse response) throws IOException { // TODO: opimize errorHandling based on response info's from real ERnP - List<String> serverId = response.getHeaders().getOrEmpty(ERNP_RESPONSE_HEADER_SERVER_ID); + final List<String> serverId = response.getHeaders().getOrEmpty(ERNP_RESPONSE_HEADER_SERVER_ID); log.warn("Receive http-error: {} from ERnP with serverTransactionId {}", response.getRawStatusCode(), serverId.isEmpty() ? "'not set'" : serverId.get(0)); - log.warn(" Full ERnP response-body: {}", IOUtils.toString(response.getBody(), "UTF-8")); + log.warn(" Full ERnP response-body: {}", IOUtils.toString(response.getBody(), "UTF-8")); throw new ErnpRestCommunicationException(response.getRawStatusCode()); - + } }; } @@ -927,61 +935,62 @@ public class ErnpRestClient implements IErnpClient { @Getter public static class ErnpRegisterResult { - private List<ErnpPersonRegisterResult> fullErnpResults; - + private final List<ErnpPersonRegisterResult> fullErnpResults; + /** * Build reduced ERnP register result. - * @param list {@link List} of ERnP entities + * + * @param list {@link List} of ERnP entities */ public ErnpRegisterResult(List<ErnpPersonRegisterResult> list) { fullErnpResults = list; - + } - + /** * Get all active ERnP results. - * + * * @return ERnP entities */ public Stream<ErnpPersonRegisterResult> getPersonResultStream() { - return fullErnpResults.stream() - .filter(el -> !el.isZmrEntryNow()); - + return fullErnpResults.stream() + .filter(el -> !el.isZmrEntryNow()); + } - + /** * Get all active ERnP results. - * + * * @return ERnP entities */ public List<RegisterResult> getPersonResult() { - return getPersonResultStream() - .collect(Collectors.toList()); - + return getPersonResultStream() + .collect(Collectors.toList()); + } /** * Get all ERnP results that are kitted to ZMR entries. - * + * * @return entities that are in ZMR now */ public Stream<ErnpPersonRegisterResult> getZmrPersonResultStream() { return fullErnpResults.stream() .filter(el -> el.isZmrEntryNow()); - + } - + /** * Get all ERnP results that are kitted to ZMR entries. - * + * * @return entities that are in ZMR now */ public List<RegisterResult> getZmrPersonResult() { return getZmrPersonResultStream() .collect(Collectors.toList()); - + } - + } private GenericRequestParams buildGenericRequestParameters() { diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ErnpPersonRegisterResult.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ErnpPersonRegisterResult.java index 1b9454db..9710e31e 100644 --- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ErnpPersonRegisterResult.java +++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ErnpPersonRegisterResult.java @@ -18,6 +18,12 @@ public class ErnpPersonRegisterResult extends RegisterResult { */ private final boolean zmrEntryNow; + /** + * ERnP specific result with basic entity data and ZMR KITT flag. + * + * @param result Basic ERnP register result + * @param isZmrEntryNow <code>true</code> if person should be already in ZMR, otherwise <code>false</code> + */ public ErnpPersonRegisterResult(RegisterResult result, boolean isZmrEntryNow) { super(result.getPseudonym(), result.getGivenName(), result.getFamilyName(), result.getDateOfBirth(), result.getPlaceOfBirth(), result.getBirthName(), result.getTaxNumber(), result.getAddress(), 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 b947fbe3..096c9d5f 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 @@ -478,7 +478,7 @@ public class RegisterSearchService { result.getPersonResult().stream()) .collect(Collectors.toList()); if (zmrCleared.size() < result.getPersonResult().size() + resultErnp.getZmrPersonResult().size()) { - log.info(LOG_MSG_RESULTS_CLEARING, + log.info(LOG_MSG_RESULTS_CLEARING_KITT, result.getPersonResult().size() + resultErnp.getZmrPersonResult().size() - zmrCleared.size()); } |