diff options
Diffstat (limited to 'src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java')
| -rw-r--r-- | src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java | 75 | 
1 files changed, 75 insertions, 0 deletions
| diff --git a/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java b/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java new file mode 100644 index 0000000..414c2dc --- /dev/null +++ b/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java @@ -0,0 +1,75 @@ +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<String> { + +    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<byte[]> signatureVerifier; +    private final Function<MsgResponse, CompletableFuture<Void>> sink; + +    @Autowired +    public MsgResponseBackend(DeliveryRepository repository, +                              Consumer<byte[]> signatureVerifier, +                              Function<MsgResponse, CompletableFuture<Void>> 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); +        } + +    } + +} | 
