diff --git a/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/CommonOnboardingService.java b/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/CommonOnboardingService.java index a74fcc6dc..25b4f84cf 100644 --- a/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/CommonOnboardingService.java +++ b/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/CommonOnboardingService.java @@ -55,17 +55,13 @@ public CommonOnboardingService(final OnboardingProcessRepository onboardingProce * @throws OnboardingProcessException Thrown when onboarding process is not found. */ public OnboardingProcessEntity findProcess(String processId) throws OnboardingProcessException { - Optional processOptional = onboardingProcessRepository.findById(processId); - if (processOptional.isEmpty()) { - logger.warn("Onboarding process not found, process ID: {}", processId); - throw new OnboardingProcessException(); - } - return processOptional.get(); + return onboardingProcessRepository.findById(processId).orElseThrow(() -> + new OnboardingProcessException("Onboarding process not found, process ID: " + processId)); } /** * Find an onboarding process. - * @param activationId Acitivation identitfier. + * @param activationId Activation identifier. * @return Onboarding process. * @throws OnboardingProcessException Thrown when onboarding process is not found. */ diff --git a/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/CommonOtpService.java b/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/CommonOtpService.java index ad6eb72cf..33e03e4db 100644 --- a/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/CommonOtpService.java +++ b/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/CommonOtpService.java @@ -86,12 +86,8 @@ public OtpVerifyResponse verifyOtpCode(String processId, OwnerId ownerId, String } OnboardingProcessEntity process = processOptional.get(); - Optional otpOptional = onboardingOtpRepository.findLastOtp(processId, otpType); - if (otpOptional.isEmpty()) { - logger.warn("Onboarding OTP not found, process ID: {}", processId); - throw new OnboardingProcessException(); - } - OnboardingOtpEntity otp = otpOptional.get(); + final OnboardingOtpEntity otp = onboardingOtpRepository.findLastOtp(processId, otpType).orElseThrow(() -> + new OnboardingProcessException("Onboarding OTP not found, process ID: " + processId)); // Verify OTP code final Date now = ownerId.getTimestamp(); @@ -199,12 +195,9 @@ private OnboardingProcessEntity failProcessOrIdentityVerification(OnboardingProc } catch (RemoteCommunicationException | IdentityVerificationException | OnboardingProcessLimitException | OnboardingProcessException ex) { logger.error("Identity verification reset failed, error: {}", ex.getMessage(), ex); // Obtain most current process entity, the process may have failed due to reached limit of identity verification resets - Optional updatedProcessOptional = onboardingProcessRepository.findById(process.getId()); - if (updatedProcessOptional.isEmpty()) { - logger.warn("Onboarding process not found, process ID: {}", process.getId()); - throw new OnboardingProcessException(); - } - process = updatedProcessOptional.get(); + final String processId = process.getId(); + process = onboardingProcessRepository.findById(processId).orElseThrow(() -> + new OnboardingProcessException("Onboarding process not found, process ID: " + processId)); } } else { // Fail onboarding process completely diff --git a/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/IdentityVerificationLimitService.java b/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/IdentityVerificationLimitService.java index 8bbab43ff..5383a8fc9 100644 --- a/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/IdentityVerificationLimitService.java +++ b/enrollment-server-onboarding-common/src/main/java/com/wultra/app/onboardingserver/common/service/IdentityVerificationLimitService.java @@ -96,7 +96,7 @@ public void checkIdentityVerificationLimit(OwnerId ownerId) throws RemoteCommuni && verification.getStatus() != IdentityVerificationStatus.REJECTED) .forEach(verification -> { verification.setStatus(IdentityVerificationStatus.FAILED); - logger.info("Switched to {}/FAILED; process ID: {}", verification.getPhase(), verification.getProcessId()); + logger.info("Switched to {}/FAILED; {}", verification.getPhase(), ownerId); }); identityVerificationRepository.saveAll(identityVerifications); @@ -132,7 +132,7 @@ public void checkDocumentUploadLimit(OwnerId ownerId, IdentityVerificationEntity identityVerification.setTimestampLastUpdated(ownerId.getTimestamp()); identityVerification.setTimestampFailed(ownerId.getTimestamp()); identityVerificationRepository.save(identityVerification); - logger.info("Switched to {}/FAILED; process ID: {}", identityVerification.getPhase(), identityVerification.getProcessId()); + logger.info("Switched to {}/FAILED; {}", identityVerification.getPhase(), ownerId); resetIdentityVerification(ownerId); logger.warn("Max failed attempts reached for document upload, {}.", ownerId); throw new IdentityVerificationLimitException("Max failed attempts reached for document upload"); diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/controller/api/IdentityVerificationController.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/controller/api/IdentityVerificationController.java index 995fe221c..3b89cda12 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/controller/api/IdentityVerificationController.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/controller/api/IdentityVerificationController.java @@ -493,7 +493,7 @@ public ObjectResponse verifyOtp(@EncryptedRequestBody ObjectR try { stateMachineService.processStateMachineEvent(ownerId, processId, OnboardingEvent.EVENT_NEXT_STATE); } catch (IdentityVerificationException e) { - throw new OnboardingProcessException("Unable to move state machine for process ID: " + processId, e); + throw new OnboardingProcessException("Unable to move state machine for " + ownerId, e); } return new ObjectResponse<>(otpVerifyResponse); diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/ClientEvaluationService.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/ClientEvaluationService.java index a6c47943a..7af5789c6 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/ClientEvaluationService.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/ClientEvaluationService.java @@ -26,9 +26,9 @@ import com.wultra.app.onboardingserver.common.database.entity.DocumentVerificationEntity; import com.wultra.app.onboardingserver.common.database.entity.IdentityVerificationEntity; import com.wultra.app.onboardingserver.configuration.IdentityVerificationConfig; +import com.wultra.app.onboardingserver.provider.OnboardingProvider; import com.wultra.app.onboardingserver.provider.model.request.EvaluateClientRequest; import com.wultra.app.onboardingserver.provider.model.response.EvaluateClientResponse; -import com.wultra.app.onboardingserver.provider.OnboardingProvider; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -39,7 +39,6 @@ import java.time.Duration; import java.util.Date; -import java.util.UUID; import java.util.function.Consumer; /** @@ -90,15 +89,16 @@ public void initClientEvaluation(final OwnerId ownerId, final IdentityVerificati idVerification.setPhase(IdentityVerificationPhase.CLIENT_EVALUATION); idVerification.setStatus(IdentityVerificationStatus.IN_PROGRESS); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); - logger.info("Switched to CLIENT_EVALUATION/IN_PROGRESS; process ID: {}, {}", idVerification.getProcessId(), ownerId); + logger.info("Switched to CLIENT_EVALUATION/IN_PROGRESS; {}", ownerId); } /** * Process client evaluation of the given identity verification initialized in {@link #initClientEvaluation(OwnerId, IdentityVerificationEntity)}. * * @param identityVerification identity verification to process + * @param ownerId Owner identification. */ - public void processClientEvaluation(final IdentityVerificationEntity identityVerification) { + public void processClientEvaluation(final IdentityVerificationEntity identityVerification, final OwnerId ownerId) { logger.debug("Evaluating client for {}", identityVerification); final EvaluateClientRequest request = EvaluateClientRequest.builder() @@ -108,8 +108,8 @@ public void processClientEvaluation(final IdentityVerificationEntity identityVer .verificationId(getVerificationId(identityVerification)) .build(); - final Consumer successConsumer = createSuccessConsumer(identityVerification); - final Consumer errorConsumer = createErrorConsumer(identityVerification); + final Consumer successConsumer = createSuccessConsumer(identityVerification, ownerId); + final Consumer errorConsumer = createErrorConsumer(identityVerification, ownerId); final int maxFailedAttempts = config.getClientEvaluationMaxFailedAttempts(); onboardingProvider.evaluateClient(request) .retryWhen(Retry.backoff(maxFailedAttempts, Duration.ofSeconds(2))) @@ -123,7 +123,7 @@ private static String getVerificationId(final IdentityVerificationEntity identit .orElseThrow(() -> new IllegalStateException("No document verification for " + identityVerification)); } - private Consumer createSuccessConsumer(final IdentityVerificationEntity identityVerification) { + private Consumer createSuccessConsumer(final IdentityVerificationEntity identityVerification, final OwnerId ownerId) { return response -> { final Date now = new Date(); identityVerification.setTimestampLastUpdated(now); @@ -131,13 +131,13 @@ private Consumer createSuccessConsumer(final IdentityVer if (response.isAccepted()) { logger.info("Client evaluation accepted for {}", identityVerification); identityVerification.setStatus(IdentityVerificationStatus.ACCEPTED); - logger.info("Switched to {}/ACCEPTED; process ID: {}", identityVerification.getPhase(), identityVerification.getProcessId()); + logger.info("Switched to {}/ACCEPTED; {}", identityVerification.getPhase(), ownerId); } else { logger.info("Client evaluation rejected for {}", identityVerification); identityVerification.setStatus(IdentityVerificationStatus.REJECTED); identityVerification.getDocumentVerifications() .forEach(it -> it.setStatus(DocumentStatus.REJECTED)); - logger.info("Switched to {}/REJECTED; process ID: {}", identityVerification.getPhase(), identityVerification.getProcessId()); + logger.info("Switched to {}/REJECTED; {}", identityVerification.getPhase(), ownerId); identityVerification.setTimestampFailed(now); } if (response.isErrorOccurred()) { @@ -149,7 +149,7 @@ private Consumer createSuccessConsumer(final IdentityVer }; } - private Consumer createErrorConsumer(final IdentityVerificationEntity identityVerification) { + private Consumer createErrorConsumer(final IdentityVerificationEntity identityVerification, final OwnerId ownerId) { return t -> { logger.warn("Client evaluation failed for {} - {}", identityVerification, t.getMessage()); logger.debug("Client evaluation failed for {}", identityVerification, t); @@ -159,7 +159,7 @@ private Consumer createErrorConsumer(final IdentityVerificationEntity final Date now = new Date(); identityVerification.setTimestampLastUpdated(now); identityVerification.setTimestampFailed(now); - logger.info("Switched to {}/FAILED; process ID: {}", identityVerification.getPhase(), identityVerification.getProcessId()); + logger.info("Switched to {}/FAILED; {}", identityVerification.getPhase(), ownerId); saveInTransaction(identityVerification); }; } diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationCreateService.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationCreateService.java index 54bdffca3..7ae36f4ca 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationCreateService.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationCreateService.java @@ -86,7 +86,7 @@ public IdentityVerificationEntity createIdentityVerification(OwnerId ownerId, St entity.setUserId(ownerId.getUserId()); entity.setProcessId(processId); - logger.info("Switched to DOCUMENT_UPLOAD/IN_PROGRESS; process ID: {}", processId); + logger.info("Switched to DOCUMENT_UPLOAD/IN_PROGRESS; {}", ownerId); return identityVerificationRepository.save(entity); } diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationOtpService.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationOtpService.java index 3d72cf541..fba708c4f 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationOtpService.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationOtpService.java @@ -113,14 +113,15 @@ public void resendOtp(IdentityVerificationEntity identityVerification) throws On /** * Sends an OTP code for a process during identity verification. * @param identityVerification Identity verification entity. + * @param ownerId Owner identification. * @throws OnboardingProcessException Thrown when OTP code could not be generated. * @throws OnboardingOtpDeliveryException Thrown when OTP code could not be sent. */ @Transactional - public void sendOtp(IdentityVerificationEntity identityVerification) throws OnboardingProcessException, OnboardingOtpDeliveryException { + public void sendOtp(IdentityVerificationEntity identityVerification, OwnerId ownerId) throws OnboardingProcessException, OnboardingOtpDeliveryException { identityVerification.setPhase(IdentityVerificationPhase.OTP_VERIFICATION); identityVerification.setStatus(IdentityVerificationStatus.VERIFICATION_PENDING); - logger.info("Switched to OTP_VERIFICATION/VERIFICATION_PENDING; process ID: {}", identityVerification.getProcessId()); + logger.info("Switched to OTP_VERIFICATION/VERIFICATION_PENDING; {}", ownerId); sendOtpCode(identityVerification.getProcessId(), false); } @@ -150,7 +151,7 @@ public OtpVerifyResponse verifyOtpCode(String processId, OwnerId ownerId, String logger.info("SCA failed, wrong OTP code, process ID: {}", processId); return response; } - return verifyPresenceCheck(process, response); + return verifyPresenceCheck(process, response, ownerId); } /** @@ -165,7 +166,7 @@ public boolean isUserVerifiedUsingOtp(String processId) { .isPresent(); } - private OtpVerifyResponse verifyPresenceCheck(final OnboardingProcessEntity process, final OtpVerifyResponse response) throws OnboardingProcessException { + private OtpVerifyResponse verifyPresenceCheck(final OnboardingProcessEntity process, final OtpVerifyResponse response, final OwnerId ownerId) throws OnboardingProcessException { final String processId = process.getId(); if (!identityVerificationConfig.isPresenceCheckEnabled()) { logger.debug("Presence check is not enabled, process ID: {}", processId); @@ -181,11 +182,11 @@ private OtpVerifyResponse verifyPresenceCheck(final OnboardingProcessEntity proc final RejectOrigin rejectOrigin = idVerification.getRejectOrigin(); if (errorOrigin == ErrorOrigin.PRESENCE_CHECK || rejectOrigin == RejectOrigin.PRESENCE_CHECK) { - logger.info("SCA failed, identity verification ID: {} of process ID: {} contains errorDetail: {}, rejectReason: {} from previous step", - idVerification.getId(), processId, errorDetail, rejectReason); - return moveToPhasePresenceCheck(process, response, idVerification); + logger.info("SCA failed, identity verification ID: {}, {} contains errorDetail: {}, rejectReason: {} from previous step", + idVerification.getId(), ownerId, errorDetail, rejectReason); + return moveToPhasePresenceCheck(process, response, idVerification, ownerId); } else { - logger.debug("PRESENCE_CHECK without error or reject origin, process ID: {}", idVerification.getProcessId()); + logger.debug("PRESENCE_CHECK without error or reject origin, {}", ownerId); } return response; } @@ -198,7 +199,8 @@ private IdentityVerificationEntity getIdentityVerificationEntity(final Onboardin private OtpVerifyResponse moveToPhasePresenceCheck( final OnboardingProcessEntity process, final OtpVerifyResponse response, - final IdentityVerificationEntity idVerification) throws OnboardingProcessException { + final IdentityVerificationEntity idVerification, + final OwnerId ownerId) throws OnboardingProcessException { idVerification.setPhase(PRESENCE_CHECK); idVerification.setStatus(IdentityVerificationStatus.NOT_INITIALIZED); @@ -209,7 +211,7 @@ private OtpVerifyResponse moveToPhasePresenceCheck( idVerification.setRejectOrigin(null); identityVerificationRepository.save(idVerification); - logger.info("Switched to PRESENCE_CHECK/NOT_INITIALIZED; process ID: {}", idVerification.getProcessId()); + logger.info("Switched to PRESENCE_CHECK/NOT_INITIALIZED; {}", ownerId); markVerificationOtpAsFailed(process.getId()); diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationService.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationService.java index 60a305522..c1afe410e 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationService.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/IdentityVerificationService.java @@ -193,7 +193,7 @@ public void moveToPhaseAndStatus(final IdentityVerificationEntity identityVerifi identityVerification.setStatus(status); identityVerification.setTimestampLastUpdated(ownerId.getTimestamp()); identityVerificationRepository.save(identityVerification); - logger.info("Switched to {}/{}; process ID: {}", phase, status, identityVerification.getProcessId()); + logger.info("Switched to {}/{}; {}", phase, status, ownerId); } /** @@ -331,7 +331,7 @@ public void checkVerificationResult(IdentityVerificationPhase phase, OwnerId own return; } - resolveIdentityVerificationResult(phase, idVerification, allDocVerifications); + resolveIdentityVerificationResult(phase, idVerification, allDocVerifications, ownerId); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); identityVerificationRepository.save(idVerification); @@ -360,7 +360,7 @@ public void processDocumentVerificationResult(OwnerId ownerId, IdentityVerificationPhase phase) { List processedDocVerifications = documentVerificationRepository.findAllDocumentVerifications(idVerification, DOCUMENT_STATUSES_PROCESSED); - resolveIdentityVerificationResult(phase, idVerification, processedDocVerifications); + resolveIdentityVerificationResult(phase, idVerification, processedDocVerifications, ownerId); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); identityVerificationRepository.save(idVerification); } @@ -372,9 +372,10 @@ public void processDocumentVerificationResult(OwnerId ownerId, * @param docVerifications Document verification results. */ private void resolveIdentityVerificationResult( - IdentityVerificationPhase phase, - IdentityVerificationEntity idVerification, - List docVerifications) { + final IdentityVerificationPhase phase, + final IdentityVerificationEntity idVerification, + final List docVerifications, + final OwnerId ownerId) { final Date now = new Date(); if (docVerifications.stream() .allMatch(docVerification -> DocumentStatus.ACCEPTED.equals(docVerification.getStatus()))) { @@ -383,7 +384,7 @@ private void resolveIdentityVerificationResult( idVerification.setTimestampLastUpdated(now); // The timestampFinished parameter is not set yet, there may be other steps ahead idVerification.setTimestampFinished(now); - logger.info("Switched to {}/ACCEPTED; process ID: {}", phase, idVerification.getProcessId()); + logger.info("Switched to {}/ACCEPTED; {}", phase, ownerId); } else { docVerifications.stream() .filter(docVerification -> DocumentStatus.FAILED.equals(docVerification.getStatus())) @@ -395,7 +396,7 @@ private void resolveIdentityVerificationResult( idVerification.setTimestampLastUpdated(now); idVerification.setTimestampFailed(now); idVerification.setErrorOrigin(ErrorOrigin.DOCUMENT_VERIFICATION); - logger.info("Switched to {}/FAILED; process ID: {}", phase, idVerification.getProcessId()); + logger.info("Switched to {}/FAILED; {}", phase, ownerId); }); docVerifications.stream() @@ -408,7 +409,7 @@ private void resolveIdentityVerificationResult( idVerification.setErrorOrigin(ErrorOrigin.DOCUMENT_VERIFICATION); idVerification.setTimestampLastUpdated(now); idVerification.setTimestampFinished(now); - logger.info("Switched to {}/REJECTED; process ID: {}", phase, idVerification.getProcessId()); + logger.info("Switched to {}/REJECTED; {}", phase, ownerId); }); } } @@ -548,12 +549,12 @@ public Stream streamAllIdentityVerificationsToChange } private void moveToDocumentUpload(final OwnerId ownerId, final IdentityVerificationEntity idVerification, final IdentityVerificationStatus status) { - logger.debug("New documents submitted, moving to DOCUMENT_UPLOAD; process ID: {}", idVerification.getProcessId()); + logger.debug("New documents submitted, moving to DOCUMENT_UPLOAD; {}", ownerId); idVerification.setPhase(IdentityVerificationPhase.DOCUMENT_UPLOAD); idVerification.setStatus(status); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); identityVerificationRepository.save(idVerification); - logger.info("Switched DOCUMENT_UPLOAD/{}; process ID: {}", status, idVerification.getProcessId()); + logger.info("Switched DOCUMENT_UPLOAD/{}; {}", status, ownerId); } private List collectRejectionErrors(DocumentVerificationEntity entity) { diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/OnboardingServiceImpl.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/OnboardingServiceImpl.java index 7d70425ef..06671ce51 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/OnboardingServiceImpl.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/OnboardingServiceImpl.java @@ -197,12 +197,8 @@ public Response resendOtp(final OnboardingOtpResendRequest request) throws Onboa @Transactional public OnboardingStatusResponse getStatus(OnboardingStatusRequest request) throws OnboardingProcessException { String processId = request.getProcessId(); - Optional processOptional = onboardingProcessRepository.findById(processId); - if (processOptional.isEmpty()) { - logger.warn("Onboarding process not found, process ID: {}", processId); - throw new OnboardingProcessException(); - } - OnboardingProcessEntity process = processOptional.get(); + final OnboardingProcessEntity process = onboardingProcessRepository.findById(processId).orElseThrow(() -> + new OnboardingProcessException("Onboarding process not found, process ID: " + processId)); OnboardingStatusResponse response = new OnboardingStatusResponse(); response.setProcessId(processId); @@ -225,14 +221,12 @@ public OnboardingStatusResponse getStatus(OnboardingStatusRequest request) throw @Transactional public Response performCleanup(OnboardingCleanupRequest request) throws OnboardingProcessException { String processId = request.getProcessId(); - Optional processOptional = onboardingProcessRepository.findById(processId); - if (processOptional.isEmpty()) { - logger.warn("Onboarding process not found, process ID: {}", processId); - throw new OnboardingProcessException(); - } - otpService.cancelOtp(processOptional.get(), OtpType.ACTIVATION); - otpService.cancelOtp(processOptional.get(), OtpType.USER_VERIFICATION); - OnboardingProcessEntity process = processOptional.get(); + final OnboardingProcessEntity process = onboardingProcessRepository.findById(processId).orElseThrow(() -> + new OnboardingProcessException("Onboarding process not found, process ID: " + processId)); + + otpService.cancelOtp(process, OtpType.ACTIVATION); + otpService.cancelOtp(process, OtpType.USER_VERIFICATION); + process.setStatus(OnboardingStatus.FAILED); process.setErrorDetail(OnboardingProcessEntity.ERROR_PROCESS_CANCELED); process.setErrorOrigin(ErrorOrigin.USER_REQUEST); diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/OtpServiceImpl.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/OtpServiceImpl.java index 775e21031..34ea92cb8 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/OtpServiceImpl.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/OtpServiceImpl.java @@ -106,12 +106,9 @@ public String createOtpCodeForResend(OnboardingProcessEntity process, OtpType ot logger.warn("Resend OTP functionality is not available yet (due to resend period), process ID: {}", processId); throw new OnboardingOtpDeliveryException(); } - final Optional otpOptional = onboardingOtpRepository.findLastOtp(processId, otpType); - if (otpOptional.isEmpty()) { - logger.warn("Onboarding OTP not found, process ID: {}", processId); - throw new OnboardingProcessException(); - } - final OnboardingOtpEntity existingOtp = otpOptional.get(); + final OnboardingOtpEntity existingOtp = onboardingOtpRepository.findLastOtp(processId, otpType).orElseThrow(() -> + new OnboardingProcessException("Onboarding OTP not found, process ID: " + processId)); + if (!OtpStatus.FAILED.equals(existingOtp.getStatus())) { existingOtp.setStatus(OtpStatus.FAILED); existingOtp.setTimestampLastUpdated(new Date()); diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/PresenceCheckLimitService.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/PresenceCheckLimitService.java index 0de00f51a..88869b174 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/PresenceCheckLimitService.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/PresenceCheckLimitService.java @@ -107,7 +107,7 @@ public void checkPresenceCheckMaxAttemptLimit(OwnerId ownerId, String processId) identityVerification.setTimestampLastUpdated(ownerId.getTimestamp()); identityVerification.setTimestampFailed(ownerId.getTimestamp()); identityVerificationRepository.save(identityVerification); - logger.info("Switched to {}/FAILED; process ID: {}", identityVerification.getPhase(), identityVerification.getProcessId()); + logger.info("Switched to {}/FAILED; {}", identityVerification.getPhase(), ownerId); final OnboardingProcessEntity onboardingProcess = onboardingProcessOptional.get(); onboardingProcess.setErrorDetail(IdentityVerificationEntity.ERROR_MAX_FAILED_ATTEMPTS_PRESENCE_CHECK); diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/PresenceCheckService.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/PresenceCheckService.java index a33d2472b..cf92b6185 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/PresenceCheckService.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/impl/service/PresenceCheckService.java @@ -96,7 +96,7 @@ public void prepareNotInitialized(OwnerId ownerId, IdentityVerificationEntity id idVerification.setPhase(IdentityVerificationPhase.PRESENCE_CHECK); idVerification.setStatus(IdentityVerificationStatus.NOT_INITIALIZED); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); - logger.info("Switched to PRESENCE_CHECK/NOT_INITIALIZED; process ID: {}", idVerification.getProcessId()); + logger.info("Switched to PRESENCE_CHECK/NOT_INITIALIZED; {}", ownerId); } /** @@ -151,7 +151,7 @@ public void checkPresenceVerification(OwnerId ownerId, final PresenceCheckResult result = presenceCheckProvider.getResult(ownerId, sessionInfo); if (result.getStatus() != PresenceCheckStatus.ACCEPTED) { - logger.info("Not accepted presence check, status: {}, process ID: {}", result.getStatus(), idVerification.getProcessId()); + logger.info("Not accepted presence check, status: {}, {}", result.getStatus(), ownerId); evaluatePresenceCheckResult(ownerId, idVerification, result); return; } @@ -226,7 +226,7 @@ private SessionInfo startPresenceCheck(OwnerId ownerId, IdentityVerificationEnti idVerification.setStatus(IdentityVerificationStatus.IN_PROGRESS); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); - logger.info("Switched to PRESENCE_CHECK/IN_PROGRESS; process ID: {}", idVerification.getProcessId()); + logger.info("Switched to PRESENCE_CHECK/IN_PROGRESS; {}", ownerId); return sessionInfo; } @@ -270,7 +270,7 @@ private void evaluatePresenceCheckResult(OwnerId ownerId, idVerification.setStatus(IdentityVerificationStatus.ACCEPTED); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); // The timestampFinished parameter is not set yet, there may be other steps ahead - logger.info("Switched to {}/ACCEPTED; process ID: {}", idVerification.getPhase(), idVerification.getProcessId()); + logger.info("Switched to {}/ACCEPTED; {}", idVerification.getPhase(), ownerId); break; case FAILED: idVerification.setErrorDetail(result.getErrorDetail()); @@ -278,7 +278,7 @@ private void evaluatePresenceCheckResult(OwnerId ownerId, idVerification.setStatus(IdentityVerificationStatus.FAILED); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); idVerification.setTimestampFailed(ownerId.getTimestamp()); - logger.info("Switched to {}/FAILED; process ID: {}", idVerification.getPhase(), idVerification.getProcessId()); + logger.info("Switched to {}/FAILED; {}", idVerification.getPhase(), ownerId); logger.warn("Presence check failed, {}, errorDetail: '{}'", ownerId, result.getErrorDetail()); break; case IN_PROGRESS: @@ -290,8 +290,8 @@ private void evaluatePresenceCheckResult(OwnerId ownerId, idVerification.setStatus(IdentityVerificationStatus.REJECTED); idVerification.setTimestampLastUpdated(ownerId.getTimestamp()); idVerification.setTimestampFinished(ownerId.getTimestamp()); - logger.info("Presence check rejected, process ID: {}, rejectReason: '{}'", idVerification.getProcessId(), result.getRejectReason()); - logger.info("Switched to {}/REJECTED; process ID: {}", idVerification.getPhase(), idVerification.getProcessId()); + logger.info("Presence check rejected, {}, rejectReason: '{}'", ownerId, result.getRejectReason()); + logger.info("Switched to {}/REJECTED; {}", idVerification.getPhase(), ownerId); break; default: throw new IllegalStateException("Unexpected presence check result status: " + result.getStatus()); diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/clientevaluation/ClientEvaluationAction.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/clientevaluation/ClientEvaluationAction.java index 9b4ca1a1e..dc46d6c9a 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/clientevaluation/ClientEvaluationAction.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/clientevaluation/ClientEvaluationAction.java @@ -16,8 +16,10 @@ */ package com.wultra.app.onboardingserver.statemachine.action.clientevaluation; +import com.wultra.app.enrollmentserver.model.integration.OwnerId; import com.wultra.app.onboardingserver.common.database.entity.IdentityVerificationEntity; import com.wultra.app.onboardingserver.impl.service.ClientEvaluationService; +import com.wultra.app.onboardingserver.statemachine.consts.EventHeaderName; import com.wultra.app.onboardingserver.statemachine.consts.ExtendedStateVariable; import com.wultra.app.onboardingserver.statemachine.enums.OnboardingEvent; import com.wultra.app.onboardingserver.statemachine.enums.OnboardingState; @@ -43,8 +45,9 @@ public ClientEvaluationAction(ClientEvaluationService clientEvaluationService) { @Override public void execute(final StateContext context) { + final OwnerId ownerId = (OwnerId) context.getMessageHeader(EventHeaderName.OWNER_ID); final IdentityVerificationEntity identityVerification = context.getExtendedState().get(ExtendedStateVariable.IDENTITY_VERIFICATION, IdentityVerificationEntity.class); - clientEvaluationService.processClientEvaluation(identityVerification); + clientEvaluationService.processClientEvaluation(identityVerification, ownerId); } } diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/otp/OtpVerificationSendAction.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/otp/OtpVerificationSendAction.java index 1650c02ed..68079f86c 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/otp/OtpVerificationSendAction.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/otp/OtpVerificationSendAction.java @@ -56,7 +56,7 @@ public void execute(StateContext context) { OwnerId ownerId = (OwnerId) context.getMessageHeader(EventHeaderName.OWNER_ID); IdentityVerificationEntity identityVerification = context.getExtendedState().get(ExtendedStateVariable.IDENTITY_VERIFICATION, IdentityVerificationEntity.class); try { - identityVerificationOtpService.sendOtp(identityVerification); + identityVerificationOtpService.sendOtp(identityVerification, ownerId); } catch (OnboardingProcessException | OnboardingOtpDeliveryException e) { logger.warn("Unable to send OTP, {}", ownerId, e); context.getStateMachine().setStateMachineError(e); diff --git a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/presencecheck/PresenceCheckVerificationAction.java b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/presencecheck/PresenceCheckVerificationAction.java index dfb393d0d..3997322f9 100644 --- a/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/presencecheck/PresenceCheckVerificationAction.java +++ b/enrollment-server-onboarding/src/main/java/com/wultra/app/onboardingserver/statemachine/action/presencecheck/PresenceCheckVerificationAction.java @@ -69,7 +69,7 @@ public void execute(StateContext context) { identityVerification.setStatus(IdentityVerificationStatus.FAILED); identityVerification.setTimestampLastUpdated(ownerId.getTimestamp()); identityVerification.setTimestampFailed(ownerId.getTimestamp()); - logger.info("Switched to {}/FAILED; process ID: {}", identityVerification.getPhase(), identityVerification.getProcessId()); + logger.info("Switched to {}/FAILED; {}", identityVerification.getPhase(), ownerId); } else { try { presenceCheckService.checkPresenceVerification(ownerId, identityVerification, sessionInfo); @@ -80,7 +80,7 @@ public void execute(StateContext context) { identityVerification.setStatus(IdentityVerificationStatus.FAILED); identityVerification.setTimestampLastUpdated(ownerId.getTimestamp()); identityVerification.setTimestampFailed(ownerId.getTimestamp()); - logger.info("Switched to {}/FAILED; process ID: {}", identityVerification.getPhase(), identityVerification.getProcessId()); + logger.info("Switched to {}/FAILED; {}", identityVerification.getPhase(), ownerId); } } } diff --git a/enrollment-server-onboarding/src/test/java/com/wultra/app/onboardingserver/statemachine/ClientEvaluationTransitionsTest.java b/enrollment-server-onboarding/src/test/java/com/wultra/app/onboardingserver/statemachine/ClientEvaluationTransitionsTest.java index e227de7dd..3a9be1920 100644 --- a/enrollment-server-onboarding/src/test/java/com/wultra/app/onboardingserver/statemachine/ClientEvaluationTransitionsTest.java +++ b/enrollment-server-onboarding/src/test/java/com/wultra/app/onboardingserver/statemachine/ClientEvaluationTransitionsTest.java @@ -113,7 +113,7 @@ void testDocumentVerificationTransitionToSendingOtp() throws Exception { idVerification.setPhase(IdentityVerificationPhase.OTP_VERIFICATION); idVerification.setStatus(IdentityVerificationStatus.VERIFICATION_PENDING); return null; - }).when(identityVerificationOtpService).sendOtp(idVerification); + }).when(identityVerificationOtpService).sendOtp(idVerification, OWNER_ID); Message message = stateMachineService.createMessage(OWNER_ID, idVerification.getProcessId(), OnboardingEvent.EVENT_NEXT_STATE); @@ -127,7 +127,7 @@ void testDocumentVerificationTransitionToSendingOtp() throws Exception { assertEquals(IdentityVerificationPhase.OTP_VERIFICATION, idVerification.getPhase()); assertEquals(IdentityVerificationStatus.VERIFICATION_PENDING, idVerification.getStatus()); - verify(identityVerificationOtpService).sendOtp(idVerification); + verify(identityVerificationOtpService).sendOtp(idVerification, OWNER_ID); } @Test @@ -170,7 +170,7 @@ private void testClientVerificationStatus(IdentityVerificationStatus identitySta final IdentityVerificationEntity identityVerification = args.getArgument(0, IdentityVerificationEntity.class); identityVerification.setStatus(identityStatus); return null; - }).when(clientEvaluationService).processClientEvaluation(idVerification); + }).when(clientEvaluationService).processClientEvaluation(idVerification, OWNER_ID); Message message = stateMachineService.createMessage(OWNER_ID, idVerification.getProcessId(), OnboardingEvent.EVENT_NEXT_STATE); diff --git a/enrollment-server-onboarding/src/test/java/com/wultra/app/onboardingserver/statemachine/PresenceCheckTransitionsTest.java b/enrollment-server-onboarding/src/test/java/com/wultra/app/onboardingserver/statemachine/PresenceCheckTransitionsTest.java index bb0486dc9..0537705ce 100644 --- a/enrollment-server-onboarding/src/test/java/com/wultra/app/onboardingserver/statemachine/PresenceCheckTransitionsTest.java +++ b/enrollment-server-onboarding/src/test/java/com/wultra/app/onboardingserver/statemachine/PresenceCheckTransitionsTest.java @@ -156,7 +156,7 @@ void testPresenceCheckAcceptedOtpEnabled() throws Exception { .and() .build() .test(); - verify(identityVerificationOtpService).sendOtp(idVerification); + verify(identityVerificationOtpService).sendOtp(idVerification, OWNER_ID); } @Test