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..838e3617d 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,11 @@ public enum IdRepoErrorConstants { UIN_GENERATION_FAILED("IDR-IDS-011","Failed to generate UIN"), + /** The authorization failed. */ + AUTHENTICATION_FAILED("IDR-IDS-012", "Authentication Failed"), + + INVALID_BIOMETRIC("IDR-IDS-013", "Failed to extract the valid biometric data"), + // VID Service /** The invalid vid. */ @@ -109,9 +114,6 @@ public enum IdRepoErrorConstants { /** The uin hash mismatch. */ UIN_HASH_MISMATCH("IDR-VID-006", "Uin hash does not match"), - /** The authorization failed. */ - /** The document hash mismatch. */ - AUTHENTICATION_FAILED("IDR-IDS-012", "Authentication Failed"), INVALID_CBEFF("IDR-BIE-001", "Invalid CBEFF"), 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..a8da51cd6 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; @@ -63,21 +64,33 @@ public class BiometricExtractionServiceImpl implements BiometricExtractionServic * @param fileName the file name * @param extractionType the extraction type * @param extractionFormat the extraction format - * @param birsForModality the birs for modality + * @param cbeffBirsForModality the birs for modality * @return the completable future * @throws IdRepoAppException the id repo app exception */ @Async public CompletableFuture> extractTemplate(String uinHash, String fileName, - String extractionType, String extractionFormat, List birsForModality) throws IdRepoAppException { + String extractionType, String extractionFormat, List cbeffBirsForModality) 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, cbeffBirsForModality)) { + return extractBiometricTemplateData(uinHash, extractionFileName, formatFlag, + cbeffBirsForModality); + } return CompletableFuture.completedFuture(existingBirs); } } catch (ObjectStoreAdapterException e) { @@ -87,13 +100,11 @@ 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); + return extractBiometricTemplateData(uinHash, extractionFileName, formatFlag, cbeffBirsForModality); } 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) { @@ -101,6 +112,16 @@ public CompletableFuture> extractTemplate(String uinHash, String fileN throw new IdRepoAppException(UNKNOWN_ERROR, e); } } + + private CompletableFuture> extractBiometricTemplateData(String uinHash, String extractionFileName, + Map formatFlag, List cbeffBirsForModality) + throws BiometricExtractionException, IdRepoAppException, Exception { + List extractedBiometrics = extractBiometricTemplate(formatFlag, cbeffBirsForModality); + if (!extractedBiometrics.isEmpty()) { + objectStoreHelper.putBiometricObject(uinHash, extractionFileName, cbeffUtil.createXML(extractedBiometrics)); + } + return CompletableFuture.completedFuture(extractedBiometrics); + } /** * Gets the format flag. @@ -126,20 +147,24 @@ private String getModalityForFormat(String formatQueryParam) { * Extract biometric template. * * @param extractionFormats the extraction formats - * @param birs the birs + * @param cbeffBirsForModality the birs * @return the list * @throws BiometricExtractionException the biometric extraction exception */ - private List extractBiometricTemplate(Map extractionFormats, List birs) + private List extractBiometricTemplate(Map extractionFormats, List cbeffBirsForModality) throws BiometricExtractionException { mosipLogger.debug(IdRepoSecurityManager.getUser(), this.getClass().getSimpleName(), "extractBiometricTemplate", "INVOKING BIOMETRIC EXTRACTION FOR THE FORMAT: " + extractionFormats); BioExtractRequestDTO bioExtractReq = new BioExtractRequestDTO(); - bioExtractReq.setBiometrics(birs); + bioExtractReq.setBiometrics(cbeffBirsForModality); bioExtractReq.setExtractionFormats(extractionFormats); BioExtractResponseDTO bioExtractResponseDTO = extractBiometrics(bioExtractReq); + if (!validateCbeff(bioExtractResponseDTO.getExtractedBiometrics(), cbeffBirsForModality)) { + throw new BiometricExtractionException(INVALID_BIOMETRIC.getErrorCode(), + String.format(INVALID_BIOMETRIC.getErrorMessage())); + } return bioExtractResponseDTO.getExtractedBiometrics(); } @@ -153,8 +178,7 @@ private List extractBiometricTemplate(Map extractionFormats private BioExtractResponseDTO extractBiometrics(BioExtractRequestDTO bioExtractRequestDTO) throws BiometricExtractionException { BioExtractResponseDTO bioExtractPromiseResponseDTO = new BioExtractResponseDTO(); - List birs = bioExtractRequestDTO.getBiometrics(); - List encodedExtractedBiometrics = doBioExtraction(birs, bioExtractRequestDTO.getExtractionFormats()); + List encodedExtractedBiometrics = doBioExtraction(bioExtractRequestDTO.getBiometrics(), bioExtractRequestDTO.getExtractionFormats()); bioExtractPromiseResponseDTO.setExtractedBiometrics(encodedExtractedBiometrics); return bioExtractPromiseResponseDTO; } @@ -162,14 +186,18 @@ private BioExtractResponseDTO extractBiometrics(BioExtractRequestDTO bioExtractR /** * Do bio extraction. * - * @param birs the birs + * @param cbeffBirsForModality the birs * @param extractionFormats the extraction formats * @return the list * @throws BiometricExtractionException the biometric extraction exception */ - private List doBioExtraction(List birs, Map extractionFormats) + private List doBioExtraction(List cbeffBirsForModality, Map extractionFormats) throws BiometricExtractionException { - return bioExractionHelper.extractTemplates(birs, extractionFormats); + return bioExractionHelper.extractTemplates(cbeffBirsForModality, extractionFormats); } + private boolean validateCbeff(List extractedBirs, List cbeffBirsForModality) { + return extractedBirs != null && cbeffBirsForModality != null + && Integer.valueOf(extractedBirs.size()).equals(Integer.valueOf(cbeffBirsForModality.size())); + } } 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 7885fa959..1ec64980b 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.*; @@ -452,6 +453,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); } diff --git a/id-repository/id-repository-identity-service/src/test/java/io/mosip/idrepository/identity/test/service/impl/BiometricExtractionServiceImplTest.java b/id-repository/id-repository-identity-service/src/test/java/io/mosip/idrepository/identity/test/service/impl/BiometricExtractionServiceImplTest.java index 255fa2ef7..7acee2a1b 100644 --- a/id-repository/id-repository-identity-service/src/test/java/io/mosip/idrepository/identity/test/service/impl/BiometricExtractionServiceImplTest.java +++ b/id-repository/id-repository-identity-service/src/test/java/io/mosip/idrepository/identity/test/service/impl/BiometricExtractionServiceImplTest.java @@ -8,6 +8,7 @@ import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; import org.apache.commons.io.IOUtils; @@ -25,6 +26,7 @@ import io.mosip.commons.khazana.exception.ObjectStoreAdapterException; import io.mosip.idrepository.core.constant.IdRepoErrorConstants; +import io.mosip.idrepository.core.constant.IdType; import io.mosip.idrepository.core.exception.BiometricExtractionException; import io.mosip.idrepository.core.exception.IdRepoAppException; import io.mosip.idrepository.core.util.EnvUtil; @@ -91,8 +93,12 @@ public void testExtractTemplateExtractedBioIsEmpty() throws Exception { when(objectStoreHelper.getBiometricObject(any(), any())).thenReturn(CryptoUtil.decodeURLSafeBase64(cbeff)); when(cbeffUtil.getBIRDataFromXML(any())).thenReturn(birDataFromXMLType); when(bioExractionHelper.extractTemplates(any(), any())).thenReturn(List.of()); - CompletableFuture> extractTemplate = extractionServiceImpl.extractTemplate("", "", "a", "ExtractionFormat", birDataFromXMLType); - assertEquals(0, extractTemplate.join().size()); + try { + extractionServiceImpl.extractTemplate("", "", "a", "ExtractionFormat", birDataFromXMLType); + } catch (BiometricExtractionException e) { + assertEquals(IdRepoErrorConstants.INVALID_BIOMETRIC.getErrorCode(), e.getErrorCode()); + assertEquals(IdRepoErrorConstants.INVALID_BIOMETRIC.getErrorMessage(), e.getErrorText()); + } verify(objectStoreHelper, never()).putBiometricObject(any(), any(), any()); } diff --git a/id-repository/id-repository-identity-service/src/test/java/io/mosip/idrepository/identity/test/service/impl/IdRepoServiceTest.java b/id-repository/id-repository-identity-service/src/test/java/io/mosip/idrepository/identity/test/service/impl/IdRepoServiceTest.java index bf07d5d04..dec42bb5c 100644 --- a/id-repository/id-repository-identity-service/src/test/java/io/mosip/idrepository/identity/test/service/impl/IdRepoServiceTest.java +++ b/id-repository/id-repository-identity-service/src/test/java/io/mosip/idrepository/identity/test/service/impl/IdRepoServiceTest.java @@ -1,5 +1,6 @@ package io.mosip.idrepository.identity.test.service.impl; +import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.INVALID_BIOMETRIC; import static io.mosip.idrepository.core.constant.IdRepoErrorConstants.INVALID_INPUT_PARAMETER; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -65,6 +66,7 @@ import io.mosip.idrepository.core.dto.ResponseDTO; import io.mosip.idrepository.core.dto.RestRequestDTO; import io.mosip.idrepository.core.entity.CredentialRequestStatus; +import io.mosip.idrepository.core.exception.BiometricExtractionException; import io.mosip.idrepository.core.exception.IdRepoAppException; import io.mosip.idrepository.core.exception.IdRepoAppUncheckedException; import io.mosip.idrepository.core.exception.IdRepoDataValidationException; @@ -2027,7 +2029,8 @@ public void testRetrieveIdentityWithBioDocumentsBioExtractionFailed() throws Exc when(cbeffUtil.createXML(any())).thenReturn(cbeffXml); when(objectStoreHelper.getBiometricObject(Mockito.any(), Mockito.any())).thenReturn(cbeffXml); when(biometricExtractionService.extractTemplate(any(), any(), any(), any(), any())) - .thenThrow(new NullPointerException()); + .thenThrow(new BiometricExtractionException(INVALID_BIOMETRIC.getErrorCode(), + String.format(INVALID_BIOMETRIC.getErrorMessage()))); Uin uinObj = new Uin(); uinObj.setUin("1234"); uinObj.setUinRefId("1234"); @@ -2048,8 +2051,8 @@ public void testRetrieveIdentityWithBioDocumentsBioExtractionFailed() throws Exc try { proxyService.retrieveIdentity("1234", IdType.UIN, "bio", Map.of("fingerExtractionFormat", "format")); } catch (IdRepoAppException e) { - assertEquals(IdRepoErrorConstants.BIO_EXTRACTION_ERROR.getErrorCode(), e.getErrorCode()); - assertEquals(IdRepoErrorConstants.BIO_EXTRACTION_ERROR.getErrorMessage(), e.getErrorText()); + assertEquals(IdRepoErrorConstants.INVALID_BIOMETRIC.getErrorCode(), e.getErrorCode()); + assertEquals(IdRepoErrorConstants.INVALID_BIOMETRIC.getErrorMessage(), e.getErrorText()); } }