From c67be19a1e8ba39f88015e564f6a3c990204a428 Mon Sep 17 00:00:00 2001 From: Vijay Kumar S <94220135+vijay151096@users.noreply.github.com> Date: Tue, 30 Jul 2024 10:26:02 +0530 Subject: [PATCH] [INJIWEB-665] : Error Handling in OVP Sharing (#363) * [INJIWEB-665] : Handling Errors for OVP Data Sharing Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : enable cross origin for presentation controller Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : enable cross origin for presentation controller Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : enable cross origin for presentation controller Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : handle the errors in mimoto through redirect Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : handle the errors in mimoto through redirect (#345) Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : handle the errors in mimoto through redirect Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : fixing the failed test Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : fixing the failed test Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : update injiweb url redirection Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : add missing tests for datashare impl Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : handle mosip vc long redirect uri error handling. Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : handle mosip vc long redirect uri error handling. Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : fix instance creation in datashare object Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : apply server properties to bootstrap Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> * [INJIWEB-665] : fix pr review comments. Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> --------- Signed-off-by: Vijay <94220135+vijay151096@users.noreply.github.com> --- .../controller/CredentialsController.java | 5 + .../controller/PresentationController.java | 37 +++++-- .../java/io/mosip/mimoto/dto/ErrorDTO.java | 4 +- .../datashare/DataShareResponseDTO.java | 6 ++ .../DataShareResponseWrapperDTO.java | 9 +- .../mimoto/exception/ErrorConstants.java | 24 +++++ .../InvalidCredentialResourceException.java | 2 +- .../exception/PlatformErrorMessages.java | 3 +- .../exception/VPNotCreatedException.java | 2 +- ...fiersService.java => VerifierService.java} | 5 +- .../service/impl/CredentialServiceImpl.java | 14 +-- .../service/impl/DataShareServiceImpl.java | 63 +++++++++-- .../service/impl/PresentationServiceImpl.java | 63 ++++++----- ...viceImpl.java => VerifierServiceImpl.java} | 28 +++-- .../resources/application-local.properties | 19 +++- src/main/resources/bootstrap.properties | 1 + .../mimoto/service/DataShareServiceTest.java | 100 ++++++++++++++++++ .../service/PresentationServiceTest.java | 23 ++-- .../mimoto/service/VerifierServiceTest.java | 8 +- .../io/mosip/mimoto/util/TestUtilities.java | 20 ++++ .../resources/application-test.properties | 18 +++- 21 files changed, 364 insertions(+), 90 deletions(-) create mode 100644 src/main/java/io/mosip/mimoto/exception/ErrorConstants.java rename src/main/java/io/mosip/mimoto/service/{VerifiersService.java => VerifierService.java} (66%) rename src/main/java/io/mosip/mimoto/service/impl/{VerifiersServiceImpl.java => VerifierServiceImpl.java} (56%) create mode 100644 src/test/java/io/mosip/mimoto/service/DataShareServiceTest.java diff --git a/src/main/java/io/mosip/mimoto/controller/CredentialsController.java b/src/main/java/io/mosip/mimoto/controller/CredentialsController.java index d038503d..5a4dbead 100644 --- a/src/main/java/io/mosip/mimoto/controller/CredentialsController.java +++ b/src/main/java/io/mosip/mimoto/controller/CredentialsController.java @@ -4,6 +4,7 @@ import io.mosip.mimoto.dto.ErrorDTO; import io.mosip.mimoto.dto.idp.TokenResponseDTO; import io.mosip.mimoto.exception.ApiNotAccessibleException; +import io.mosip.mimoto.exception.InvalidCredentialResourceException; import io.mosip.mimoto.service.CredentialService; import io.mosip.mimoto.service.IdpService; import io.mosip.mimoto.service.IssuersService; @@ -67,6 +68,10 @@ public ResponseEntity downloadCredentialAsPDF( logger.error("Exception occurred while fetching credential types ", exception); responseWrapper.setErrors(List.of(new ErrorDTO(API_NOT_ACCESSIBLE_EXCEPTION.getCode(), API_NOT_ACCESSIBLE_EXCEPTION.getMessage()))); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(responseWrapper); + } catch (InvalidCredentialResourceException invalidCredentialResourceException) { + logger.error("Exception occurred while pushing the data to data share ", invalidCredentialResourceException); + responseWrapper.setErrors(List.of(new ErrorDTO(invalidCredentialResourceException.getErrorCode(), invalidCredentialResourceException.getMessage()))); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(responseWrapper); } catch (Exception exception) { logger.error("Exception occurred while generating pdf ", exception); responseWrapper.setErrors(List.of(new ErrorDTO(MIMOTO_PDF_SIGN_EXCEPTION.getCode(), exception.getMessage()))); diff --git a/src/main/java/io/mosip/mimoto/controller/PresentationController.java b/src/main/java/io/mosip/mimoto/controller/PresentationController.java index 3e6332a2..280df3d6 100644 --- a/src/main/java/io/mosip/mimoto/controller/PresentationController.java +++ b/src/main/java/io/mosip/mimoto/controller/PresentationController.java @@ -1,39 +1,60 @@ package io.mosip.mimoto.controller; import io.mosip.mimoto.dto.openid.presentation.PresentationRequestDTO; -import io.mosip.mimoto.exception.ApiNotAccessibleException; +import io.mosip.mimoto.exception.InvalidCredentialResourceException; +import io.mosip.mimoto.exception.InvalidVerifierException; +import io.mosip.mimoto.exception.ErrorConstants; import io.mosip.mimoto.exception.VPNotCreatedException; import io.mosip.mimoto.service.PresentationService; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; @RestController public class PresentationController { @Autowired PresentationService presentationService; - private final Logger logger = LoggerFactory.getLogger(PresentationController.class); + @Value("${mosip.inji.ovp.error.redirect.url}") + String injiOvpErrorRedirectUrl; + + @Value("${mosip.inji.web.redirect.url}") + String injiWebRedirectUrl; + @GetMapping("/authorize") - public void performAuthorization(HttpServletResponse response, @ModelAttribute PresentationRequestDTO presentationRequestDTO) throws IOException, ApiNotAccessibleException { + public void performAuthorization(HttpServletResponse response, @ModelAttribute PresentationRequestDTO presentationRequestDTO) throws IOException { try { logger.info("Started Presentation Authorization in the controller."); String redirectString = presentationService.authorizePresentation(presentationRequestDTO); logger.info("Completed Presentation Authorization in the controller."); response.sendRedirect(redirectString); - } catch (VPNotCreatedException | IOException | ApiNotAccessibleException exception){ - logger.error("Exception Occurred in Authorizing the presentation" + exception); - throw exception; + } catch( InvalidVerifierException exception){ + sendRedirect(response, injiWebRedirectUrl, exception.getErrorCode(), exception.getErrorText()); + } catch(VPNotCreatedException | InvalidCredentialResourceException exception){ + sendRedirect(response, presentationRequestDTO.getRedirect_uri(), exception.getErrorCode(), exception.getErrorText()); + } catch (Exception exception){ + sendRedirect(response, presentationRequestDTO.getRedirect_uri(), ErrorConstants.INTERNAL_SERVER_ERROR.getErrorCode(), ErrorConstants.INTERNAL_SERVER_ERROR.getErrorMessage()); } } - + private void sendRedirect(HttpServletResponse response, String domain, String code, String message) throws IOException { + logger.error("Exception Occurred in Authorizing the presentation"); + String injiVerifyRedirectString = String.format(injiOvpErrorRedirectUrl, + domain, + code, + URLEncoder.encode(message, StandardCharsets.UTF_8)); + response.setStatus(302); + response.sendRedirect(injiVerifyRedirectString); + } } diff --git a/src/main/java/io/mosip/mimoto/dto/ErrorDTO.java b/src/main/java/io/mosip/mimoto/dto/ErrorDTO.java index b10d156e..4d6a3e89 100644 --- a/src/main/java/io/mosip/mimoto/dto/ErrorDTO.java +++ b/src/main/java/io/mosip/mimoto/dto/ErrorDTO.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonAlias; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -13,12 +14,13 @@ * * @param errorcode the errorcode * @param message the message - * + * * @author Rishabh Keshari */ @Data @AllArgsConstructor @NoArgsConstructor +@Builder public class ErrorDTO implements Serializable { private static final long serialVersionUID = 2452990684776944908L; diff --git a/src/main/java/io/mosip/mimoto/dto/openid/datashare/DataShareResponseDTO.java b/src/main/java/io/mosip/mimoto/dto/openid/datashare/DataShareResponseDTO.java index 755b5869..17662916 100644 --- a/src/main/java/io/mosip/mimoto/dto/openid/datashare/DataShareResponseDTO.java +++ b/src/main/java/io/mosip/mimoto/dto/openid/datashare/DataShareResponseDTO.java @@ -1,8 +1,14 @@ package io.mosip.mimoto.dto.openid.datashare; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class DataShareResponseDTO { private String url; private int validForInMinutes; diff --git a/src/main/java/io/mosip/mimoto/dto/openid/datashare/DataShareResponseWrapperDTO.java b/src/main/java/io/mosip/mimoto/dto/openid/datashare/DataShareResponseWrapperDTO.java index b55c50ec..e55c010f 100644 --- a/src/main/java/io/mosip/mimoto/dto/openid/datashare/DataShareResponseWrapperDTO.java +++ b/src/main/java/io/mosip/mimoto/dto/openid/datashare/DataShareResponseWrapperDTO.java @@ -1,18 +1,23 @@ package io.mosip.mimoto.dto.openid.datashare; import io.mosip.mimoto.dto.ErrorDTO; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; + import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.List; @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class DataShareResponseWrapperDTO { private String id; private String version; private String responsetime; - @NotNull private DataShareResponseDTO dataShare; - private List errors = new ArrayList<>(); } diff --git a/src/main/java/io/mosip/mimoto/exception/ErrorConstants.java b/src/main/java/io/mosip/mimoto/exception/ErrorConstants.java new file mode 100644 index 00000000..d9cdd267 --- /dev/null +++ b/src/main/java/io/mosip/mimoto/exception/ErrorConstants.java @@ -0,0 +1,24 @@ +package io.mosip.mimoto.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ErrorConstants { + + INVALID_REQUEST("invalid_request", "Some incorrect parameters in the request"), + UNSUPPORTED_FORMAT("unsupported_format", "No VC of this format is found"), + RESOURCE_NOT_FOUND("resource_not_found", "The requested resource doesn’t exist."), + SERVER_UNAVAILABLE("server_unavailable", "The server is not reachable right now."), + RESOURCE_EXPIRED("resource_expired", "The requested resource expired."), + REQUEST_TIMED_OUT("request_timed_out", "We are unable to process your request right now"), + URI_TOO_LONG("uri_too_long", "Resource URI is too long to be handled"), + INVALID_CLIENT("invalid_client", "The requested client doesn’t match."), + INVALID_REDIRECT_URI("invalid_redirect_uri", "The requested redirect uri doesn’t match."), + INTERNAL_SERVER_ERROR("internal_server_error", "We are unable to process request now"); + + private final String errorCode; + private final String errorMessage; + +} diff --git a/src/main/java/io/mosip/mimoto/exception/InvalidCredentialResourceException.java b/src/main/java/io/mosip/mimoto/exception/InvalidCredentialResourceException.java index 5205a2a4..1efc763b 100644 --- a/src/main/java/io/mosip/mimoto/exception/InvalidCredentialResourceException.java +++ b/src/main/java/io/mosip/mimoto/exception/InvalidCredentialResourceException.java @@ -15,6 +15,6 @@ public InvalidCredentialResourceException(String errorCode, String errorMessage) } public InvalidCredentialResourceException(String errorMessage) { - super(PlatformErrorMessages.MIMOTO_PGS_INVALID_INPUT_PARAMETER.getCode(), errorMessage); + super(ErrorConstants.RESOURCE_NOT_FOUND.getErrorCode(), errorMessage); } } diff --git a/src/main/java/io/mosip/mimoto/exception/PlatformErrorMessages.java b/src/main/java/io/mosip/mimoto/exception/PlatformErrorMessages.java index 67fbb494..38f2d837 100644 --- a/src/main/java/io/mosip/mimoto/exception/PlatformErrorMessages.java +++ b/src/main/java/io/mosip/mimoto/exception/PlatformErrorMessages.java @@ -86,8 +86,7 @@ public enum PlatformErrorMessages { MIMOTO_ISSUER_ONBOARDING_EXCEPTION(PlatformConstants.PREFIX + "037", "Issuers Onboarding exception occurred "), INVALID_VERIFIER_ID_EXCEPTION(PlatformConstants.PREFIX + "038", "Invalid Verifier ClientId"), INVALID_VERIFIER_REDIRECT_URI_EXCEPTION(PlatformConstants.PREFIX + "039", "Invalid Redirect Uri"), - NO_CREDENTIALS_MATCH_VP_DEFINITION_EXCEPTION(PlatformConstants.PREFIX + "040", "VP Request Results Empty Credentials"), - INVALID_CREDENTIAL_RESOURCE_URI_EXCEPTION(PlatformConstants.PREFIX + "041", "The Credential Resource is Invalid"); + INVALID_CREDENTIAL_RESOURCE_URI_EXCEPTION(PlatformConstants.PREFIX + "040", "The Credential Resource is Invalid"); /** The error message. */ private final String errorMessage; diff --git a/src/main/java/io/mosip/mimoto/exception/VPNotCreatedException.java b/src/main/java/io/mosip/mimoto/exception/VPNotCreatedException.java index ac074be4..cc15e954 100644 --- a/src/main/java/io/mosip/mimoto/exception/VPNotCreatedException.java +++ b/src/main/java/io/mosip/mimoto/exception/VPNotCreatedException.java @@ -15,6 +15,6 @@ public VPNotCreatedException(String errorCode, String errorMessage) { } public VPNotCreatedException(String errorMessage) { - super(PlatformErrorMessages.NO_CREDENTIALS_MATCH_VP_DEFINITION_EXCEPTION.getCode(), errorMessage); + super(ErrorConstants.INVALID_REQUEST.getErrorCode(), errorMessage); } } diff --git a/src/main/java/io/mosip/mimoto/service/VerifiersService.java b/src/main/java/io/mosip/mimoto/service/VerifierService.java similarity index 66% rename from src/main/java/io/mosip/mimoto/service/VerifiersService.java rename to src/main/java/io/mosip/mimoto/service/VerifierService.java index 84bd0c77..87f566d9 100644 --- a/src/main/java/io/mosip/mimoto/service/VerifiersService.java +++ b/src/main/java/io/mosip/mimoto/service/VerifierService.java @@ -1,14 +1,13 @@ package io.mosip.mimoto.service; import io.mosip.mimoto.dto.openid.VerifierDTO; -import io.mosip.mimoto.dto.openid.VerifiersDTO; import io.mosip.mimoto.dto.openid.presentation.PresentationRequestDTO; import io.mosip.mimoto.exception.ApiNotAccessibleException; import java.io.IOException; import java.util.Optional; -public interface VerifiersService { - Optional getVerifiersByClientId(String clientId) throws ApiNotAccessibleException, IOException; +public interface VerifierService { + Optional getVerifierByClientId(String clientId) throws ApiNotAccessibleException, IOException; void validateVerifier(PresentationRequestDTO presentationRequestDTO) throws ApiNotAccessibleException, IOException; } diff --git a/src/main/java/io/mosip/mimoto/service/impl/CredentialServiceImpl.java b/src/main/java/io/mosip/mimoto/service/impl/CredentialServiceImpl.java index 557697c1..772d63f2 100644 --- a/src/main/java/io/mosip/mimoto/service/impl/CredentialServiceImpl.java +++ b/src/main/java/io/mosip/mimoto/service/impl/CredentialServiceImpl.java @@ -16,12 +16,11 @@ import io.mosip.mimoto.dto.IssuersDTO; import io.mosip.mimoto.dto.idp.TokenResponseDTO; import io.mosip.mimoto.dto.mimoto.*; -import io.mosip.mimoto.dto.openid.presentation.Format; -import io.mosip.mimoto.dto.openid.presentation.InputDescriptorDTO; -import io.mosip.mimoto.dto.openid.presentation.LDPVc; import io.mosip.mimoto.dto.openid.presentation.PresentationDefinitionDTO; import io.mosip.mimoto.exception.ApiNotAccessibleException; import io.mosip.mimoto.exception.IdpException; +import io.mosip.mimoto.exception.InvalidCredentialResourceException; +import io.mosip.mimoto.exception.ErrorConstants; import io.mosip.mimoto.service.CredentialService; import io.mosip.mimoto.service.IdpService; import io.mosip.mimoto.service.IssuersService; @@ -31,7 +30,6 @@ import io.mosip.mimoto.util.Utilities; import io.mosip.pixelpass.PixelPass; import org.apache.commons.lang.StringUtils; -import org.apache.http.auth.InvalidCredentialsException; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.jetbrains.annotations.NotNull; @@ -54,8 +52,6 @@ import java.util.*; import java.util.stream.Collectors; -import static io.mosip.mimoto.exception.PlatformErrorMessages.INVALID_CREDENTIAL_TYPE_EXCEPTION; - @Service public class CredentialServiceImpl implements CredentialService { @@ -111,7 +107,7 @@ public ByteArrayInputStream downloadCredentialAsPDF(String issuerId, String cred return generatePdfForVerifiableCredentials(vcCredentialResponse, issuerConfig, credentialsSupportedResponseDraft11, dataShareUrl); } - public VCCredentialResponse downloadCredential(String credentialEndpoint, VCCredentialRequest vcCredentialRequest, String accessToken) throws ApiNotAccessibleException, IOException, InvalidCredentialsException { + public VCCredentialResponse downloadCredential(String credentialEndpoint, VCCredentialRequest vcCredentialRequest, String accessToken) throws InvalidCredentialResourceException { VCCredentialResponse vcCredentialResponse = restApiClient.postApi(credentialEndpoint, MediaType.APPLICATION_JSON, vcCredentialRequest, VCCredentialResponse.class, accessToken); logger.debug("VC Credential Response is -> " + vcCredentialResponse); @@ -312,13 +308,13 @@ public CredentialIssuerWellKnownResponseDraft11 getCredentialIssuerWellknown(Str return credentialIssuerWellKnownResponseDraft11; } - public CredentialsSupportedResponseDraft11 getCredentialSupported(CredentialIssuerWellKnownResponseDraft11 credentialIssuerWellKnownResponseDraft11, String credentialType) throws ApiNotAccessibleException, IOException, InvalidCredentialsException { + public CredentialsSupportedResponseDraft11 getCredentialSupported(CredentialIssuerWellKnownResponseDraft11 credentialIssuerWellKnownResponseDraft11, String credentialType) throws InvalidCredentialResourceException { Optional credentialsSupportedResponse = credentialIssuerWellKnownResponseDraft11.getCredentialsSupported().stream() .filter(credentialsSupported -> credentialsSupported.getId().equals(credentialType)) .findFirst(); if (credentialsSupportedResponse.isEmpty()){ logger.error("Invalid credential Type passed - {}", credentialType); - throw new InvalidCredentialsException(INVALID_CREDENTIAL_TYPE_EXCEPTION.getMessage()); + throw new InvalidCredentialResourceException(ErrorConstants.RESOURCE_NOT_FOUND.getErrorMessage()); } return credentialsSupportedResponse.get(); } diff --git a/src/main/java/io/mosip/mimoto/service/impl/DataShareServiceImpl.java b/src/main/java/io/mosip/mimoto/service/impl/DataShareServiceImpl.java index 911e011c..5da1d1c4 100644 --- a/src/main/java/io/mosip/mimoto/service/impl/DataShareServiceImpl.java +++ b/src/main/java/io/mosip/mimoto/service/impl/DataShareServiceImpl.java @@ -1,7 +1,15 @@ package io.mosip.mimoto.service.impl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.mimoto.dto.mimoto.VCCredentialResponse; import io.mosip.mimoto.dto.openid.datashare.DataShareResponseWrapperDTO; +import io.mosip.mimoto.dto.openid.presentation.PresentationRequestDTO; +import io.mosip.mimoto.exception.InvalidCredentialResourceException; +import io.mosip.mimoto.exception.ErrorConstants; import io.mosip.mimoto.util.RestApiClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ByteArrayResource; @@ -19,11 +27,19 @@ public class DataShareServiceImpl { @Autowired RestApiClient restApiClient; - @Value("${public.url}") - String publicHostUrl; + @Value("${mosip.data.share.host}") + String dataShareHostUrl; - @Value("${mosip.data.share.url}") - String dataShareUrl; + @Value("${mosip.data.share.create.url}") + String dataShareCreateUrl; + + @Value("${mosip.data.share.create.retry.count}") + Integer maxRetryCount; + + private final Logger logger = LoggerFactory.getLogger(DataShareServiceImpl.class); + + @Autowired + ObjectMapper objectMapper; public String storeDataInDataShare(String data) throws Exception { ByteArrayResource contentsAsResource = new ByteArrayResource(data.getBytes()) { @@ -38,10 +54,43 @@ public String getFilename() { headers.setContentType(MediaType.MULTIPART_FORM_DATA); HttpEntity> requestEntity = new HttpEntity<>(map, headers); - DataShareResponseWrapperDTO dataShareResponseWrapperDTO = restApiClient.postApi(dataShareUrl, MediaType.MULTIPART_FORM_DATA, requestEntity, DataShareResponseWrapperDTO.class); + DataShareResponseWrapperDTO dataShareResponseWrapperDTO = pushCredentialIntoDataShare(requestEntity); URL dataShareUrl = new URL(dataShareResponseWrapperDTO.getDataShare().getUrl()); -// return publicHostUrl + dataShareUrl.getPath(); - return "https://api-internal.dev.mosip.net" + dataShareUrl.getPath(); + return dataShareHostUrl + dataShareUrl.getPath(); + } + + private DataShareResponseWrapperDTO pushCredentialIntoDataShare(HttpEntity> requestEntity) throws Exception { + int attempt =0 ; + DataShareResponseWrapperDTO dataShareResponseWrapperDTO = null; + while(attempt++ < maxRetryCount ){ + try { + dataShareResponseWrapperDTO = restApiClient.postApi(dataShareCreateUrl, MediaType.MULTIPART_FORM_DATA, requestEntity, DataShareResponseWrapperDTO.class); + } catch (Exception e) { + logger.error(attempt + " attempt to push credential failed"); + } + } + if(dataShareResponseWrapperDTO == null){ + throw new InvalidCredentialResourceException( + ErrorConstants.REQUEST_TIMED_OUT.getErrorCode(), + ErrorConstants.REQUEST_TIMED_OUT.getErrorMessage()); + } + return dataShareResponseWrapperDTO; + } + + public VCCredentialResponse downloadCredentialFromDataShare(PresentationRequestDTO presentationRequestDTO) throws JsonProcessingException { + logger.info("Started the Credential Download From DataShare"); + String credentialsResourceUri = presentationRequestDTO.getResource(); + String vcCredentialResponseString = restApiClient.getApi(credentialsResourceUri, String.class); + if (vcCredentialResponseString == null) { + throw new InvalidCredentialResourceException( + ErrorConstants.SERVER_UNAVAILABLE.getErrorCode(), + ErrorConstants.SERVER_UNAVAILABLE.getErrorMessage()); + } + VCCredentialResponse vcCredentialResponse = objectMapper.readValue(vcCredentialResponseString, VCCredentialResponse.class); + if(vcCredentialResponse.getCredential() == null){ + throw new InvalidCredentialResourceException(ErrorConstants.RESOURCE_EXPIRED.getErrorMessage()); + } + return vcCredentialResponse; } } diff --git a/src/main/java/io/mosip/mimoto/service/impl/PresentationServiceImpl.java b/src/main/java/io/mosip/mimoto/service/impl/PresentationServiceImpl.java index 2da129f8..993f7260 100644 --- a/src/main/java/io/mosip/mimoto/service/impl/PresentationServiceImpl.java +++ b/src/main/java/io/mosip/mimoto/service/impl/PresentationServiceImpl.java @@ -6,11 +6,10 @@ import io.mosip.mimoto.dto.mimoto.VCCredentialResponse; import io.mosip.mimoto.dto.openid.presentation.*; import io.mosip.mimoto.exception.ApiNotAccessibleException; -import io.mosip.mimoto.exception.InvalidCredentialResourceException; -import io.mosip.mimoto.exception.PlatformErrorMessages; +import io.mosip.mimoto.exception.ErrorConstants; import io.mosip.mimoto.exception.VPNotCreatedException; import io.mosip.mimoto.service.PresentationService; -import io.mosip.mimoto.service.VerifiersService; +import io.mosip.mimoto.service.VerifierService; import io.mosip.mimoto.util.RestApiClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,7 +20,10 @@ import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.Base64; +import java.util.Collections; +import java.util.List; +import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -29,7 +31,10 @@ public class PresentationServiceImpl implements PresentationService { @Autowired - VerifiersService verifiersService; + VerifierService verifierService; + + @Autowired + DataShareServiceImpl dataShareService; @Autowired RestApiClient restApiClient; @@ -40,37 +45,39 @@ public class PresentationServiceImpl implements PresentationService { @Value("${mosip.inji.verify.redirect.url}") String injiVerifyRedirectUrl; - @Value("${mosip.data.share.url}") + @Value("${mosip.data.share.host}") String dataShareUrl; + @Value("${server.tomcat.max-http-response-header-size:65536}") + Integer maximumResponseHeaderSize; + private final Logger logger = LoggerFactory.getLogger(PresentationServiceImpl.class); @Override public String authorizePresentation(PresentationRequestDTO presentationRequestDTO) throws ApiNotAccessibleException, IOException { - logger.info("Started the presentation Validation"); - verifiersService.validateVerifier(presentationRequestDTO); - - logger.info("Started the Credential Download From DataShare"); - String credentialsResourceUri = presentationRequestDTO.getResource(); - if(!credentialsResourceUri.contains(dataShareUrl)){ - throw new InvalidCredentialResourceException(PlatformErrorMessages.INVALID_CREDENTIAL_RESOURCE_URI_EXCEPTION.getMessage()); + verifierService.validateVerifier(presentationRequestDTO); + VCCredentialResponse vcCredentialResponse = dataShareService.downloadCredentialFromDataShare(presentationRequestDTO); + + PresentationDefinitionDTO presentationDefinitionDTO; + try { + presentationDefinitionDTO = objectMapper.readValue(presentationRequestDTO.getPresentation_definition(), PresentationDefinitionDTO.class); + if (presentationDefinitionDTO == null) { + throw new VPNotCreatedException(ErrorConstants.INVALID_REQUEST.getErrorMessage()); + } + } catch (IOException ioException) { + throw new VPNotCreatedException(ErrorConstants.INVALID_REQUEST.getErrorMessage()); } - String vcCredentialResponseString = restApiClient.getApi(credentialsResourceUri, String.class); - - logger.info("Started the ObjectMapping"); - VCCredentialResponse vcCredentialResponse = objectMapper.readValue(vcCredentialResponseString, VCCredentialResponse.class); - PresentationDefinitionDTO presentationDefinitionDTO = objectMapper.readValue(presentationRequestDTO.getPresentation_definition(), PresentationDefinitionDTO.class); - - return presentationDefinitionDTO.getInputDescriptors() + logger.info("Started the Constructing VP Token"); + String redirectionString = presentationDefinitionDTO.getInputDescriptors() .stream() .findFirst() - .map( inputDescriptorDTO -> { + .map(inputDescriptorDTO -> { boolean matchingProofTypes = inputDescriptorDTO.getFormat().getLdpVc().getProofTypes() .stream() .anyMatch(proofType -> vcCredentialResponse.getCredential().getProof().getType().equals(proofType)); - if(matchingProofTypes){ + if (matchingProofTypes) { logger.info("Started the Construction of VP token"); try { String vpToken = constructVerifiablePresentationString(vcCredentialResponse.getCredential()); @@ -80,12 +87,18 @@ public String authorizePresentation(PresentationRequestDTO presentationRequestDT Base64.getUrlEncoder().encodeToString(vpToken.getBytes(StandardCharsets.UTF_8)), URLEncoder.encode(presentationSubmission, StandardCharsets.UTF_8)); } catch (JsonProcessingException e) { - throw new RuntimeException(e); + throw new VPNotCreatedException(ErrorConstants.INVALID_REQUEST.getErrorMessage()); } } logger.info("No Credentials Matched the VP request."); - throw new VPNotCreatedException(PlatformErrorMessages.NO_CREDENTIALS_MATCH_VP_DEFINITION_EXCEPTION.getMessage()); - }).orElseThrow(() -> new VPNotCreatedException(PlatformErrorMessages.NO_CREDENTIALS_MATCH_VP_DEFINITION_EXCEPTION.getMessage())); + throw new VPNotCreatedException(ErrorConstants.INVALID_REQUEST.getErrorMessage()); + }).orElseThrow(() -> new VPNotCreatedException(ErrorConstants.INVALID_REQUEST.getErrorMessage())); + if(redirectionString.length() > maximumResponseHeaderSize) { + throw new VPNotCreatedException( + ErrorConstants.URI_TOO_LONG.getErrorCode(), + ErrorConstants.URI_TOO_LONG.getErrorMessage()); + } + return redirectionString; } private String constructVerifiablePresentationString(VCCredentialProperties vcCredentialProperties) throws JsonProcessingException { diff --git a/src/main/java/io/mosip/mimoto/service/impl/VerifiersServiceImpl.java b/src/main/java/io/mosip/mimoto/service/impl/VerifierServiceImpl.java similarity index 56% rename from src/main/java/io/mosip/mimoto/service/impl/VerifiersServiceImpl.java rename to src/main/java/io/mosip/mimoto/service/impl/VerifierServiceImpl.java index 4f6693fc..db1cf0ec 100644 --- a/src/main/java/io/mosip/mimoto/service/impl/VerifiersServiceImpl.java +++ b/src/main/java/io/mosip/mimoto/service/impl/VerifierServiceImpl.java @@ -1,23 +1,25 @@ package io.mosip.mimoto.service.impl; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.mimoto.dto.openid.VerifierDTO; import io.mosip.mimoto.dto.openid.VerifiersDTO; import io.mosip.mimoto.dto.openid.presentation.PresentationRequestDTO; import io.mosip.mimoto.exception.ApiNotAccessibleException; import io.mosip.mimoto.exception.InvalidVerifierException; -import io.mosip.mimoto.exception.PlatformErrorMessages; -import io.mosip.mimoto.service.VerifiersService; +import io.mosip.mimoto.exception.ErrorConstants; +import io.mosip.mimoto.service.VerifierService; import io.mosip.mimoto.util.Utilities; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.io.IOException; import java.util.List; import java.util.Optional; @Service -public class VerifiersServiceImpl implements VerifiersService { +public class VerifierServiceImpl implements VerifierService { @Autowired Utilities utilities; @@ -25,8 +27,9 @@ public class VerifiersServiceImpl implements VerifiersService { @Autowired ObjectMapper objectMapper; - @Override - public Optional getVerifiersByClientId(String clientId) throws ApiNotAccessibleException, IOException { + private final Logger logger = LoggerFactory.getLogger(VerifierServiceImpl.class); + + public Optional getVerifierByClientId(String clientId) throws ApiNotAccessibleException, JsonProcessingException { String trustedVerifiersJsonValue = utilities.getTrustedVerifiersJsonValue(); if (trustedVerifiersJsonValue == null) { throw new ApiNotAccessibleException(); @@ -35,16 +38,21 @@ public Optional getVerifiersByClientId(String clientId) throws ApiN return verifiersDTO.getVerifiers().stream().filter(verifier -> verifier.getClientId().equals(clientId)).findFirst(); } @Override - public void validateVerifier(PresentationRequestDTO presentationRequestDTO) throws ApiNotAccessibleException, IOException { - getVerifiersByClientId(presentationRequestDTO.getClient_id()).ifPresentOrElse( + public void validateVerifier(PresentationRequestDTO presentationRequestDTO) throws ApiNotAccessibleException, JsonProcessingException { + logger.info("Started the presentation Validation"); + getVerifierByClientId(presentationRequestDTO.getClient_id()).ifPresentOrElse( (verifierDTO) -> { List registeredRedirectUri = verifierDTO.getRedirectUri(); if(!registeredRedirectUri.contains(presentationRequestDTO.getRedirect_uri())){ - throw new InvalidVerifierException(PlatformErrorMessages.INVALID_VERIFIER_REDIRECT_URI_EXCEPTION.getMessage()); + throw new InvalidVerifierException( + ErrorConstants.INVALID_REDIRECT_URI.getErrorCode(), + ErrorConstants.INVALID_REDIRECT_URI.getErrorMessage()); } }, () -> { - throw new InvalidVerifierException(PlatformErrorMessages.INVALID_VERIFIER_ID_EXCEPTION.getMessage()); + throw new InvalidVerifierException( + ErrorConstants.INVALID_CLIENT.getErrorCode(), + ErrorConstants.INVALID_CLIENT.getErrorMessage()); } ); } diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 47ee1337..94ff3ed9 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -208,13 +208,24 @@ mosip.oidc.p12.filename=oidckeystore.p12 mosip.oidc.p12.password=password mosip.oidc.p12.path=certs/ -mosip.inji.web.host=http://injiweb.dev1.mosip.net/v1/mimoto -mosip.inji.web.authorize.url=INJI_OVP://payload=${mosip.inji.web.host}/presentation/authorize?response_type=vp_token&resource=%s&presentation_definition=%s + +#OpenId4VP related Configuration START + +#Inji Web Config +mosip.inji.web.host=https://injiweb.dev1.mosip.net +mosip.inji.web.authorize.url=INJI_OVP://payload=${mosip.inji.web.host}/authorize?response_type=vp_token&resource=%s&presentation_definition=%s +mosip.inji.web.redirect.url=${mosip.inji.web.host}/authorize + +#Inji Verify Config mosip.inji.verify.redirect.url=%s#vp_token=%s&presentation_submission=%s -#mosip.data.share.url=${public.internet.url}/v1/datashare/create/static-policyid/static-subscriberid -mosip.data.share.url=https://api-internal.dev.mosip.net/v1/datashare/create/static-policyid/static-subscriberid +mosip.inji.ovp.error.redirect.url=%s?error=%s&error_description=%s +#DataShare Config +mosip.data.share.host=https://datashare-inji.dev1.mosip.net +mosip.data.share.create.url=${mosip.data.share.host}/v1/datashare/create/static-policyid/static-subscriberid +mosip.data.share.create.retry.count=3 +#OpenId4VP related Configuration END diff --git a/src/main/resources/bootstrap.properties b/src/main/resources/bootstrap.properties index 9805fe40..992e2a0b 100644 --- a/src/main/resources/bootstrap.properties +++ b/src/main/resources/bootstrap.properties @@ -9,6 +9,7 @@ management.endpoints.web.exposure.include=info,health,refresh server.port=8088 server.servlet.context-path=/v1/mimoto +server.tomcat.max-http-response-header-size=65536 health.config.enabled=false openapi.info.title=${spring.application.name} diff --git a/src/test/java/io/mosip/mimoto/service/DataShareServiceTest.java b/src/test/java/io/mosip/mimoto/service/DataShareServiceTest.java new file mode 100644 index 00000000..3d844800 --- /dev/null +++ b/src/test/java/io/mosip/mimoto/service/DataShareServiceTest.java @@ -0,0 +1,100 @@ +package io.mosip.mimoto.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.mimoto.dto.mimoto.VCCredentialResponse; +import io.mosip.mimoto.dto.openid.datashare.DataShareResponseWrapperDTO; +import io.mosip.mimoto.dto.openid.presentation.PresentationRequestDTO; +import io.mosip.mimoto.exception.InvalidCredentialResourceException; +import io.mosip.mimoto.service.impl.DataShareServiceImpl; +import io.mosip.mimoto.util.RestApiClient; +import io.mosip.mimoto.util.TestUtilities; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.http.MediaType; +import org.springframework.test.util.ReflectionTestUtils; + +@RunWith(MockitoJUnitRunner.class) + +public class DataShareServiceTest { + + @Mock + RestApiClient restApiClient; + @Mock + ObjectMapper objectMapper; + @InjectMocks + DataShareServiceImpl dataShareService; + + @Before + public void setUp(){ + ReflectionTestUtils.setField(dataShareService, "dataShareHostUrl", "https://test-url"); + ReflectionTestUtils.setField(dataShareService, "dataShareCreateUrl", "https://test-url"); + ReflectionTestUtils.setField(dataShareService, "maxRetryCount", 1); + } + + @Test + public void storeDataInDataShareWhenProperDataIsPassed() throws Exception { + DataShareResponseWrapperDTO dataShareResponseWrapperDTO = TestUtilities.getDataShareResponseWrapperDTO(); + Mockito.when(restApiClient.postApi(Mockito.anyString(), Mockito.eq(MediaType.MULTIPART_FORM_DATA), Mockito.any(), Mockito.eq(DataShareResponseWrapperDTO.class))) + .thenReturn(dataShareResponseWrapperDTO); + String actualDataShareLink = dataShareService.storeDataInDataShare("SampleData"); + String expectedDataShareLink = dataShareResponseWrapperDTO.getDataShare().getUrl(); + Assert.assertEquals(expectedDataShareLink, actualDataShareLink); + } + + @Test(expected = InvalidCredentialResourceException.class) + public void throwRequestTimedOutExceptionWhenMaxCountIsReached() throws Exception { + ReflectionTestUtils.setField(dataShareService, "maxRetryCount", 0); + dataShareService.storeDataInDataShare("SampleData"); + } + + @Test(expected = InvalidCredentialResourceException.class) + public void throwServiceUnavailableExceptionWhenCredentialPushIsNotDone() throws Exception { + ReflectionTestUtils.setField(dataShareService, "maxRetryCount", 1); + Mockito.when(restApiClient.postApi(Mockito.anyString(), Mockito.eq(MediaType.MULTIPART_FORM_DATA), Mockito.any(), Mockito.eq(DataShareResponseWrapperDTO.class))) + .thenThrow(InvalidCredentialResourceException.class); + dataShareService.storeDataInDataShare("SampleData"); + } + + @Test + public void downloadCredentialWhenRequestIsProper() throws Exception { + PresentationRequestDTO presentationRequestDTO = TestUtilities.getPresentationRequestDTO(); + VCCredentialResponse vcCredentialResponseDTO = TestUtilities.getVCCredentialResponseDTO("Ed25519Signature2020"); + String credentialString = TestUtilities.getObjectAsString(vcCredentialResponseDTO); + Mockito.when(restApiClient.getApi(Mockito.eq("test_resource"), Mockito.eq(String.class))) + .thenReturn(credentialString); + Mockito.when(objectMapper.readValue(Mockito.eq(credentialString), Mockito.eq(VCCredentialResponse.class))) + .thenReturn(vcCredentialResponseDTO); + VCCredentialResponse actualVCCredentialResponse = dataShareService.downloadCredentialFromDataShare(presentationRequestDTO); + Assert.assertEquals(vcCredentialResponseDTO, actualVCCredentialResponse); + } + + @Test(expected = InvalidCredentialResourceException.class) + public void throwServiceUnavailableExceptionWhenCredentialIsNotFetched() throws Exception { + PresentationRequestDTO presentationRequestDTO = TestUtilities.getPresentationRequestDTO(); + VCCredentialResponse vcCredentialResponseDTO = TestUtilities.getVCCredentialResponseDTO("Ed25519Signature2020"); + Mockito.when(restApiClient.getApi(Mockito.eq("test_resource"), Mockito.eq(String.class))) + .thenReturn(null); + dataShareService.downloadCredentialFromDataShare(presentationRequestDTO); + } + + @Test(expected = InvalidCredentialResourceException.class) + public void throwResourceExpiredExceptionWhenCredentialIsExpired() throws Exception { + PresentationRequestDTO presentationRequestDTO = TestUtilities.getPresentationRequestDTO(); + VCCredentialResponse vcCredentialResponseDTO = TestUtilities.getVCCredentialResponseDTO("Ed25519Signature2020"); + String credentialString = TestUtilities.getObjectAsString(vcCredentialResponseDTO); + Mockito.when(restApiClient.getApi(Mockito.eq("test_resource"), Mockito.eq(String.class))) + .thenReturn(credentialString); + vcCredentialResponseDTO.setCredential(null); + Mockito.when(objectMapper.readValue(Mockito.eq(credentialString), Mockito.eq(VCCredentialResponse.class))) + .thenReturn(vcCredentialResponseDTO); + dataShareService.downloadCredentialFromDataShare(presentationRequestDTO); + + } + +} diff --git a/src/test/java/io/mosip/mimoto/service/PresentationServiceTest.java b/src/test/java/io/mosip/mimoto/service/PresentationServiceTest.java index a85c0d1f..79e99bfa 100644 --- a/src/test/java/io/mosip/mimoto/service/PresentationServiceTest.java +++ b/src/test/java/io/mosip/mimoto/service/PresentationServiceTest.java @@ -9,8 +9,9 @@ import io.mosip.mimoto.exception.ApiNotAccessibleException; import io.mosip.mimoto.exception.InvalidVerifierException; import io.mosip.mimoto.exception.VPNotCreatedException; +import io.mosip.mimoto.service.impl.DataShareServiceImpl; import io.mosip.mimoto.service.impl.PresentationServiceImpl; -import io.mosip.mimoto.service.impl.VerifiersServiceImpl; +import io.mosip.mimoto.service.impl.VerifierServiceImpl; import io.mosip.mimoto.util.RestApiClient; import io.mosip.mimoto.util.TestUtilities; import org.junit.Before; @@ -31,10 +32,12 @@ @RunWith(MockitoJUnitRunner.class) public class PresentationServiceTest { @Mock - VerifiersService verifiersService = new VerifiersServiceImpl(); + VerifierService verifierService = new VerifierServiceImpl(); @Mock RestApiClient restApiClient; @Mock + DataShareServiceImpl dataShareService; + @Mock ObjectMapper objectMapper; @InjectMocks @@ -45,6 +48,7 @@ public void setup() throws JsonProcessingException { PresentationDefinitionDTO presentationDefinitionDTO = TestUtilities.getPresentationDefinitionDTO(); ReflectionTestUtils.setField(presentationService, "injiVerifyRedirectUrl", "%s#vp_token=%s&presentation_submission=%s"); ReflectionTestUtils.setField(presentationService, "dataShareUrl", "test_resource"); + ReflectionTestUtils.setField(presentationService, "maximumResponseHeaderSize", 65536); when(objectMapper.readValue(eq(TestUtilities.getObjectAsString(presentationDefinitionDTO)), eq(PresentationDefinitionDTO.class))).thenReturn(presentationDefinitionDTO); when(objectMapper.writeValueAsString(any())).thenReturn("test-data"); @@ -52,21 +56,19 @@ public void setup() throws JsonProcessingException { @Test(expected = InvalidVerifierException.class) public void throwInvalidVerifierExceptionWhenClientIdPassedIsIncorrect() throws ApiNotAccessibleException, IOException { PresentationRequestDTO presentationRequestDTO = TestUtilities.getPresentationRequestDTO(); - doThrow(InvalidVerifierException.class).when(verifiersService).validateVerifier(presentationRequestDTO); + doThrow(InvalidVerifierException.class).when(verifierService).validateVerifier(presentationRequestDTO); presentationService.authorizePresentation(TestUtilities.getPresentationRequestDTO()); } @Test public void credentialProofMatchingWithVPRequest() throws Exception { - String mockResponse = TestUtilities.getObjectAsString(TestUtilities.getVCCredentialResponseDTO("Ed25519Signature2020")); VCCredentialResponse vcCredentialResponse = TestUtilities.getVCCredentialResponseDTO("Ed25519Signature2020"); VerifiablePresentationDTO verifiablePresentationDTO = TestUtilities.getVerifiablePresentationDTO(); PresentationRequestDTO presentationRequestDTO = TestUtilities.getPresentationRequestDTO(); - doNothing().when(verifiersService).validateVerifier(eq(presentationRequestDTO)); - when(restApiClient.getApi(eq(presentationRequestDTO.getResource()), eq(String.class))).thenReturn(mockResponse); - when(objectMapper.readValue(eq(TestUtilities.getObjectAsString(vcCredentialResponse)), eq(VCCredentialResponse.class))).thenReturn(vcCredentialResponse); + doNothing().when(verifierService).validateVerifier(eq(presentationRequestDTO)); + when(dataShareService.downloadCredentialFromDataShare(eq(presentationRequestDTO))).thenReturn(vcCredentialResponse); when(objectMapper.readValue(eq("test-data"), eq(VerifiablePresentationDTO.class))).thenReturn(verifiablePresentationDTO); String actualRedirectUrl = presentationService.authorizePresentation(TestUtilities.getPresentationRequestDTO()); @@ -77,14 +79,11 @@ public void credentialProofMatchingWithVPRequest() throws Exception { @Test(expected = VPNotCreatedException.class) public void credentialProofMismatchWithVPRequest() throws ApiNotAccessibleException, IOException { - - String mockResponse = TestUtilities.getObjectAsString(TestUtilities.getVCCredentialResponseDTO("RSASignature2020")); VCCredentialResponse vcCredentialResponse = TestUtilities.getVCCredentialResponseDTO("RSASignature2020"); PresentationRequestDTO presentationRequestDTO = TestUtilities.getPresentationRequestDTO(); - doNothing().when(verifiersService).validateVerifier(eq(presentationRequestDTO)); - when(restApiClient.getApi(eq(presentationRequestDTO.getResource()), eq(String.class))).thenReturn(mockResponse); - when(objectMapper.readValue(eq(TestUtilities.getObjectAsString(vcCredentialResponse)), eq(VCCredentialResponse.class))).thenReturn(vcCredentialResponse); + doNothing().when(verifierService).validateVerifier(eq(presentationRequestDTO)); + when(dataShareService.downloadCredentialFromDataShare(eq(presentationRequestDTO))).thenReturn(vcCredentialResponse); presentationService.authorizePresentation(TestUtilities.getPresentationRequestDTO()); } diff --git a/src/test/java/io/mosip/mimoto/service/VerifierServiceTest.java b/src/test/java/io/mosip/mimoto/service/VerifierServiceTest.java index 059060a2..3f5f008a 100644 --- a/src/test/java/io/mosip/mimoto/service/VerifierServiceTest.java +++ b/src/test/java/io/mosip/mimoto/service/VerifierServiceTest.java @@ -7,7 +7,7 @@ import io.mosip.mimoto.dto.openid.presentation.PresentationRequestDTO; import io.mosip.mimoto.exception.ApiNotAccessibleException; import io.mosip.mimoto.exception.InvalidVerifierException; -import io.mosip.mimoto.service.impl.VerifiersServiceImpl; +import io.mosip.mimoto.service.impl.VerifierServiceImpl; import io.mosip.mimoto.util.TestUtilities; import io.mosip.mimoto.util.Utilities; import org.junit.Before; @@ -32,7 +32,7 @@ public class VerifierServiceTest { @Mock ObjectMapper objectMapper; @InjectMocks - VerifiersServiceImpl verifiersService; + VerifierServiceImpl verifiersService; @Before public void setUp() throws JsonProcessingException { @@ -44,14 +44,14 @@ public void setUp() throws JsonProcessingException { @Test public void getCorrectVerifierWhenCorrectClientIdIsPassed() throws ApiNotAccessibleException, IOException { - Optional verifierDTO = verifiersService.getVerifiersByClientId("test-clientId"); + Optional verifierDTO = verifiersService.getVerifierByClientId("test-clientId"); assertNotNull(verifierDTO.get()); assertEquals(verifierDTO.get().getClientId(), "test-clientId"); } @Test public void getNullWhenInvalidClientIdIsPassed() throws ApiNotAccessibleException, IOException { - Optional verifierDTO = verifiersService.getVerifiersByClientId("test-clientId2"); + Optional verifierDTO = verifiersService.getVerifierByClientId("test-clientId2"); assertTrue(verifierDTO.isEmpty()); } diff --git a/src/test/java/io/mosip/mimoto/util/TestUtilities.java b/src/test/java/io/mosip/mimoto/util/TestUtilities.java index d1c60eb2..064856f3 100644 --- a/src/test/java/io/mosip/mimoto/util/TestUtilities.java +++ b/src/test/java/io/mosip/mimoto/util/TestUtilities.java @@ -3,11 +3,14 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.mimoto.dto.DisplayDTO; +import io.mosip.mimoto.dto.ErrorDTO; import io.mosip.mimoto.dto.IssuerDTO; import io.mosip.mimoto.dto.LogoDTO; import io.mosip.mimoto.dto.mimoto.*; import io.mosip.mimoto.dto.openid.VerifierDTO; import io.mosip.mimoto.dto.openid.VerifiersDTO; +import io.mosip.mimoto.dto.openid.datashare.DataShareResponseDTO; +import io.mosip.mimoto.dto.openid.datashare.DataShareResponseWrapperDTO; import io.mosip.mimoto.dto.openid.presentation.*; import java.util.*; @@ -271,4 +274,21 @@ public static String getObjectAsString(Object object) throws JsonProcessingExcep ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.writeValueAsString(object); } + + public static DataShareResponseWrapperDTO getDataShareResponseWrapperDTO(){ + ErrorDTO errorDTO = ErrorDTO.builder().errorCode("test-errorCode").errorMessage("test-errorMessage").build(); + DataShareResponseDTO dataShareResponseDTO = DataShareResponseDTO.builder() + .url("https://test-url") + .validForInMinutes(1) + .transactionsAllowed(1) + .policyId("static-policyid") + .subscriberId("static-subscriberId").build(); + + return DataShareResponseWrapperDTO.builder() + .id("test-id") + .version("test-version") + .responsetime("test-responsetime") + .dataShare(dataShareResponseDTO) + .errors(Collections.singletonList(errorDTO)).build(); + } } diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties index ce816f04..f56a0d34 100644 --- a/src/test/resources/application-test.properties +++ b/src/test/resources/application-test.properties @@ -20,5 +20,21 @@ mosip.oidc.p12.filename=oidckeystore.p12 mosip.oidc.p12.password=5YBx6QT2wbY8Ls6w mosip.oidc.p12.path=certs/ + +#OpenId4VP related Configuration START + +#Inji Web Config +mosip.inji.web.host=https://injiweb.dev1.mosip.net +mosip.inji.web.authorize.url=INJI_OVP://payload=${mosip.inji.web.host}/authorize?response_type=vp_token&resource=%s&presentation_definition=%s +mosip.inji.web.redirect.url=${mosip.inji.web.host}/authorize + +#Inji Verify Config mosip.inji.verify.redirect.url=%s#vp_token=%s&presentation_submission=%s -mosip.data.share.url=https://api-internal.dev.mosip.net/v1/datashare/create/static-policyid/static-subscriberid +mosip.inji.ovp.error.redirect.url=%s?error=%s&error_description=%s + +#DataShare Config +mosip.data.share.host=https://datashare-inji.dev1.mosip.net +mosip.data.share.create.url=${mosip.data.share.host}/v1/datashare/create/static-policyid/static-subscriberid +mosip.data.share.create.retry.count=3 + +#OpenId4VP related Configuration END