aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java
diff options
context:
space:
mode:
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.java75
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);
+ }
+
+ }
+
+}