From a6c7e0f95862bd6671bbc00a87b5ac685b3ab4a7 Mon Sep 17 00:00:00 2001 From: Neha Farheen Date: Mon, 22 Jan 2024 19:42:53 +0530 Subject: [PATCH] MOSIP-30287-clone-1201-validation-required-before-persist-extracted-template-data-in-min-io Signed-off-by: Neha Farheen --- .../core/constant/IdRepoErrorConstants.java | 2 ++ .../impl/BiometricExtractionServiceImpl.java | 31 +++++++++++++++++-- .../service/impl/IdRepoProxyServiceImpl.java | 5 +++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/id-repository/id-repository-core/src/main/java/io/mosip/idrepository/core/constant/IdRepoErrorConstants.java b/id-repository/id-repository-core/src/main/java/io/mosip/idrepository/core/constant/IdRepoErrorConstants.java index 1ac120332..c35824c25 100644 --- a/id-repository/id-repository-core/src/main/java/io/mosip/idrepository/core/constant/IdRepoErrorConstants.java +++ b/id-repository/id-repository-core/src/main/java/io/mosip/idrepository/core/constant/IdRepoErrorConstants.java @@ -89,6 +89,8 @@ public enum IdRepoErrorConstants { UIN_GENERATION_FAILED("IDR-IDS-011","Failed to generate UIN"), + INVALID_BIOMETRIC("IDR-IDS-012", "Failed to extract the valid biometric data"), + // VID Service /** The invalid vid. */ diff --git a/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/BiometricExtractionServiceImpl.java b/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/BiometricExtractionServiceImpl.java index 9a58a865d..8ab194850 100644 --- a/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/BiometricExtractionServiceImpl.java +++ b/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/BiometricExtractionServiceImpl.java @@ -4,6 +4,7 @@ import static io.mosip.idrepository.core.constant.IdRepoConstants.EXTRACTION_FORMAT_QUERY_PARAM_SUFFIX; import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.BIO_EXTRACTION_ERROR; import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.UNKNOWN_ERROR; +import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.INVALID_BIOMETRIC; import java.util.List; import java.util.Map; @@ -72,12 +73,27 @@ public CompletableFuture> extractTemplate(String uinHash, String fileN String extractionType, String extractionFormat, List birsForModality) throws IdRepoAppException { try { String extractionFileName = fileName.split("\\.")[0] + DOT + getModalityForFormat(extractionType) + DOT + extractionFormat; + Map formatFlag = Map.of(getFormatFlag(extractionType), extractionFormat); try { if (objectStoreHelper.biometricObjectExists(uinHash, extractionFileName)) { mosipLogger.info(IdRepoSecurityManager.getUser(), this.getClass().getSimpleName(), EXTRACT_TEMPLATE, "RETURNING EXISTING EXTRACTED BIOMETRICS FOR FORMAT: " + extractionType +" : "+ extractionFormat); byte[] xmlBytes = objectStoreHelper.getBiometricObject(uinHash, extractionFileName); - List existingBirs = cbeffUtil.getBIRDataFromXML(xmlBytes); + List existingBirs; + try { + existingBirs = cbeffUtil.getBIRDataFromXML(xmlBytes); + } catch (Exception e) { + existingBirs = List.of(); + mosipLogger.error(IdRepoSecurityManager.getUser(), this.getClass().getSimpleName(), + EXTRACT_TEMPLATE, e.getMessage()); + } + if (!validateCbeff(existingBirs)) { + List extractedBiometrics = extractBiometricTemplate(formatFlag, birsForModality); + objectStoreHelper.putBiometricObject(uinHash, extractionFileName, + cbeffUtil.createXML(extractedBiometrics)); + return CompletableFuture.completedFuture(extractedBiometrics); + } + return CompletableFuture.completedFuture(existingBirs); } } catch (ObjectStoreAdapterException e) { @@ -87,13 +103,16 @@ public CompletableFuture> extractTemplate(String uinHash, String fileN mosipLogger.info(IdRepoSecurityManager.getUser(), this.getClass().getSimpleName(), EXTRACT_TEMPLATE, "EXTRATCING BIOMETRICS FOR FORMAT: " + extractionType +" : "+ extractionFormat); - Map formatFlag = Map.of(getFormatFlag(extractionType), extractionFormat); + List extractedBiometrics = extractBiometricTemplate(formatFlag, birsForModality); if (!extractedBiometrics.isEmpty()) { objectStoreHelper.putBiometricObject(uinHash, extractionFileName, cbeffUtil.createXML(extractedBiometrics)); } return CompletableFuture.completedFuture(extractedBiometrics); } catch (BiometricExtractionException e) { + if(e.getErrorCode().equalsIgnoreCase(INVALID_BIOMETRIC.getErrorCode())) { + throw e; + } mosipLogger.error(IdRepoSecurityManager.getUser(), this.getClass().getSimpleName(), EXTRACT_TEMPLATE, e.getMessage()); throw new IdRepoAppException(BIO_EXTRACTION_ERROR, e); } catch (Exception e) { @@ -140,6 +159,10 @@ private List extractBiometricTemplate(Map extractionFormats bioExtractReq.setExtractionFormats(extractionFormats); BioExtractResponseDTO bioExtractResponseDTO = extractBiometrics(bioExtractReq); + if (!validateCbeff(bioExtractResponseDTO.getExtractedBiometrics())) { + throw new BiometricExtractionException(INVALID_BIOMETRIC.getErrorCode(), + String.format(INVALID_BIOMETRIC.getErrorMessage())); + } return bioExtractResponseDTO.getExtractedBiometrics(); } @@ -171,5 +194,9 @@ private List doBioExtraction(List birs, Map extraction throws BiometricExtractionException { return bioExractionHelper.extractTemplates(birs, extractionFormats); } + + private boolean validateCbeff(List birs) { + return birs.size() > 0 && birs.stream().allMatch(cbeff -> cbeff.getBdb() != null && cbeff.getBdb().length > 0); + } } diff --git a/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/IdRepoProxyServiceImpl.java b/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/IdRepoProxyServiceImpl.java index 93e95e8df..66b67d3a8 100644 --- a/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/IdRepoProxyServiceImpl.java +++ b/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/IdRepoProxyServiceImpl.java @@ -7,6 +7,7 @@ import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.ID_OBJECT_PROCESSING_FAILED; import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.NO_RECORD_FOUND; import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.RECORD_EXISTS; +import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.INVALID_BIOMETRIC; import java.io.IOException; import java.util.*; @@ -453,6 +454,10 @@ protected byte[] getBiometricsForRequestedFormats(String uinHash, String fileNam mosipLogger.error(IdRepoSecurityManager.getUser(), ID_REPO_SERVICE_IMPL, "extractTemplate", e.getMessage()); throw new IdRepoAppException(BIO_EXTRACTION_ERROR, e); } catch (Exception e) { + ExceptionUtils.getStackTrace(e); + if(e.getMessage().contains(INVALID_BIOMETRIC.getErrorCode())) { + throw new IdRepoAppException(INVALID_BIOMETRIC, e); + } mosipLogger.error(IdRepoSecurityManager.getUser(), ID_REPO_SERVICE_IMPL, "extractTemplate", e.getMessage()); throw new IdRepoAppException(BIO_EXTRACTION_ERROR, e); }