package at.gv.egiz.moazs.backend; import at.gv.egiz.moazs.MoaZSException; import at.gv.egiz.moazs.repository.DeliveryRepository; import at.gv.egiz.moazs.scheme.MsgResponse; import at.gv.egiz.moazs.service.MsgService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.function.Function; import static at.gv.egiz.moazs.MoaZSException.moaZSExceptionBuilder; import static java.lang.String.format; import static java.util.concurrent.CompletableFuture.supplyAsync; @Component public class MsgResponseBackend implements Consumer { private static final Logger log = LoggerFactory.getLogger(MsgService.class); public static final String MOASP_SIGNATURE_INVALID_ERROR_MSG = "Signature of Msg Response " + "with AppDeliveryID=%s is not valid."; private final DeliveryRepository repository; private final Consumer signatureVerifier; private final Function> sink; @Autowired public MsgResponseBackend(DeliveryRepository repository, Consumer signatureVerifier, Function> sink) { this.repository = repository; this.signatureVerifier = signatureVerifier; this.sink = sink; } /** * Performs all {@code MsgResponse}'s Back-End Tasks, such as verifying * its signature and archiving the response. * * @param responseID refers to MsgResponse Object. */ @Override public void accept(String responseID) { supplyAsync(() -> verify(responseID)).thenAcceptAsync(sink::apply); } public MsgResponse verify(String responseID) { var response = repository.retrieveResponse(responseID).get(); var builder = moaZSExceptionBuilder().withAllParametersInAnswer(response.getAnswer()); var binaryResponse = repository.retrieveBinaryResponse(responseID).get(); try { signatureVerifier.accept(binaryResponse); return response; } catch (MoaZSException ex) { log.error(ex.getMessage(), ex); var wrappingEx = builder .withMessage(format(MOASP_SIGNATURE_INVALID_ERROR_MSG, response.getAppDeliveryID())) .withErrorCode(MoaZSException.ERROR_MOASP_SIGNATURE_INVALID) .withCause(ex) .build(); return response.generateError(wrappingEx); } } }