aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/gv/egiz/moazs/backend
diff options
context:
space:
mode:
authorChristof Rabensteiner <christof.rabensteiner@iaik.tugraz.at>2019-07-18 09:23:00 +0200
committerChristof Rabensteiner <christof.rabensteiner@iaik.tugraz.at>2019-07-18 09:23:00 +0200
commit6d30f261c618a3b69a8f1be092056383e6dea424 (patch)
tree86a5674d17a2d11c6ec327d4e36e8f589e2bbf7b /src/main/java/at/gv/egiz/moazs/backend
parentf2e1263702901581512131ea587fad7a2ba45baa (diff)
downloadmoa-zs-6d30f261c618a3b69a8f1be092056383e6dea424.tar.gz
moa-zs-6d30f261c618a3b69a8f1be092056383e6dea424.tar.bz2
moa-zs-6d30f261c618a3b69a8f1be092056383e6dea424.zip
Integrate Mzs Service Timeout and Handle Async Responses
- Service Timeout : Add service timeout to mzs schema (DeliveryRequest / Config), application.yaml, convert service timeout from spring environment to Config, and merge service timeouts in Configs. - Handling of Asynchronous DeliveryRequestStatus: Move "Applying Response Sinks" from backend into dedicated component "MsgResponseSinkHub" and integrate SinkHub into MzsService (apply sinks to asynchronous responses). - Remove line breaks in SignatureVerifier's log statements. - Revise documentation of parameters in application.yaml.
Diffstat (limited to 'src/main/java/at/gv/egiz/moazs/backend')
-rw-r--r--src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java46
-rw-r--r--src/main/java/at/gv/egiz/moazs/backend/MsgResponseSinkHub.java44
-rw-r--r--src/main/java/at/gv/egiz/moazs/backend/SignatureVerifier.java28
3 files changed, 67 insertions, 51 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
index 8649a32..df0f83e 100644
--- a/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java
+++ b/src/main/java/at/gv/egiz/moazs/backend/MsgResponseBackend.java
@@ -4,7 +4,6 @@ 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 at.gv.zustellung.app2mzs.xsd.MsgResponseSinksType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,25 +24,19 @@ public class MsgResponseBackend implements Consumer<String> {
"with AppDeliveryID=%s is not valid.";
public static final String BINARY_RESPONSE_MISSING_ERROR_MSG = "Binary Response is not in repository.";
public static final String RESPONSE_MISSING_ERROR_MSG = "Response with ResponseID=%s is not in repository.";
+ public static final String REQUEST_MISSING_ERROR_MSG = "Request with AppDeliveryID=%s is not in repository.";
private final DeliveryRepository repository;
private final Consumer<byte[]> signatureVerifier;
- private final SaveResponseToFileSink saveResponseSink;
- private final LogResponseSink logResponseSink;
- private final ForwardResponseToServiceSink forwardResponseSink;
+ private final MsgResponseSinkHub hub;
@Autowired
public MsgResponseBackend(DeliveryRepository repository,
Consumer<byte[]> signatureVerifier,
- SaveResponseToFileSink saveResponseToFileSink,
- LogResponseSink logResponseSink,
- ForwardResponseToServiceSink forwardResponseSink) {
+ MsgResponseSinkHub hub) {
this.repository = repository;
this.signatureVerifier = signatureVerifier;
- this.saveResponseSink = saveResponseToFileSink;
- this.logResponseSink = logResponseSink;
- this.forwardResponseSink = forwardResponseSink;
-
+ this.hub = hub;
}
/**
@@ -58,8 +51,7 @@ public class MsgResponseBackend implements Consumer<String> {
*/
@Override
public void accept(String responseID) {
-
- supplyAsync(() -> verify(responseID))
+ supplyAsync(() -> verifySignature(responseID))
.thenAcceptAsync(msgResponse -> applySinks(msgResponse))
.exceptionally(ex -> {
log.error(ex.getMessage(), ex);
@@ -67,7 +59,7 @@ public class MsgResponseBackend implements Consumer<String> {
});
}
- private MsgResponse verify(String responseID) {
+ private MsgResponse verifySignature(String responseID) {
var response = repository.retrieveResponse(responseID).orElseThrow(
()-> moaZSException(format(RESPONSE_MISSING_ERROR_MSG, responseID)));
@@ -87,28 +79,12 @@ public class MsgResponseBackend implements Consumer<String> {
}
private void applySinks(MsgResponse msgResponse) {
-
- var sinkParams = getSinkParams(msgResponse);
-
- if (sinkParams.getSaveResponseToFile().isActive()) {
- supplyAsync(() -> saveResponseSink.save(msgResponse, sinkParams.getSaveResponseToFile().getPath()));
- }
-
- if (sinkParams.isLogResponse()) {
- supplyAsync(() -> logResponseSink.log(msgResponse));
- }
-
- if (sinkParams.getForwardResponseToService().isActive()) {
- supplyAsync(() -> forwardResponseSink.send(
- msgResponse, sinkParams.getForwardResponseToService().getMzsClient()));
- }
-
- }
-
- private MsgResponseSinksType getSinkParams(MsgResponse msgResponse) {
var appDeliveryID = msgResponse.getAppDeliveryID();
- var request = repository.retrieveDeliveryRequest(appDeliveryID).get();
- return request.getConfig().getMsgResponseSinks();
+ var request = repository.retrieveDeliveryRequest(appDeliveryID).orElseThrow(
+ ()-> moaZSException(format(REQUEST_MISSING_ERROR_MSG, appDeliveryID)));
+
+ var sinkParams = request.getConfig().getMsgResponseSinks();
+ hub.applySinks(msgResponse, sinkParams);
}
}
diff --git a/src/main/java/at/gv/egiz/moazs/backend/MsgResponseSinkHub.java b/src/main/java/at/gv/egiz/moazs/backend/MsgResponseSinkHub.java
new file mode 100644
index 0000000..0df5c68
--- /dev/null
+++ b/src/main/java/at/gv/egiz/moazs/backend/MsgResponseSinkHub.java
@@ -0,0 +1,44 @@
+package at.gv.egiz.moazs.backend;
+
+import at.gv.egiz.moazs.scheme.MsgResponse;
+import at.gv.zustellung.app2mzs.xsd.MsgResponseSinksType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import static java.util.concurrent.CompletableFuture.supplyAsync;
+
+@Component
+public class MsgResponseSinkHub {
+
+ private final SaveResponseToFileSink saveResponseSink;
+ private final LogResponseSink logResponseSink;
+ private final ForwardResponseToServiceSink forwardResponseSink;
+
+ @Autowired
+ public MsgResponseSinkHub(SaveResponseToFileSink saveResponseSink, LogResponseSink logResponseSink,
+ ForwardResponseToServiceSink forwardResponseSink) {
+ this.saveResponseSink = saveResponseSink;
+ this.logResponseSink = logResponseSink;
+ this.forwardResponseSink = forwardResponseSink;
+ }
+
+ /**
+ * Apply all sinks that are configured in {@code sinkParams} to {@code msgResponse}.
+ */
+ public void applySinks(MsgResponse msgResponse, MsgResponseSinksType sinkParams) {
+
+ if (sinkParams.getSaveResponseToFile().isActive()) {
+ supplyAsync(() -> saveResponseSink.save(msgResponse, sinkParams.getSaveResponseToFile().getPath()));
+ }
+
+ if (sinkParams.isLogResponse()) {
+ supplyAsync(() -> logResponseSink.log(msgResponse));
+ }
+
+ if (sinkParams.getForwardResponseToService().isActive()) {
+ supplyAsync(() -> forwardResponseSink.send(
+ msgResponse, sinkParams.getForwardResponseToService().getMzsClient()));
+ }
+
+ }
+}
diff --git a/src/main/java/at/gv/egiz/moazs/backend/SignatureVerifier.java b/src/main/java/at/gv/egiz/moazs/backend/SignatureVerifier.java
index 874e4f4..a19c06a 100644
--- a/src/main/java/at/gv/egiz/moazs/backend/SignatureVerifier.java
+++ b/src/main/java/at/gv/egiz/moazs/backend/SignatureVerifier.java
@@ -3,7 +3,6 @@ package at.gv.egiz.moazs.backend;
import at.gv.egiz.eid.authhandler.modules.sigverify.moasig.api.ISignatureVerificationService;
import at.gv.egiz.eid.authhandler.modules.sigverify.moasig.api.data.IXMLSignatureVerificationResponse;
import at.gv.egiz.eid.authhandler.modules.sigverify.moasig.exceptions.MOASigServiceException;
-import at.gv.egiz.moazs.MoaZSException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -21,19 +20,17 @@ public class SignatureVerifier implements Consumer<byte[]> {
private static final String CERT_CODE_ERROR_MSG = "Certificate chain is not valid: Check code was %d. ";
private static final String MANIFEST_CODE_ERROR_MSG = "Signature Manifest is not valid: Check code was %d. ";
private static final String XMLMANIFEST_CODE_ERROR_MSG = "XmlDSIGManifest is not valid: Check code was %d. ";
-
- //TODO: Dont make this multiline!
private static final String XML_SIGNATURE_RESPONSE_TEMPLATE =
- " XmlDsigSubjectName: %s\n" +
- " SignatureManifestCheckCode: %s\n" +
- " XmlDSIGManifestCheckCode: %s\n" +
- " CertificateCheckCode: %s\n" +
- " SignatureCheckCode: %s\n" +
- " SigningDateTime: %s\n" +
- " isXmlDSIGManigest: %s\n" +
- " isPublicAuthority: %s\n" +
- " isQualifiedCertificate: %s\n" +
- " getPublicAuthorityCode: %s\n";
+ "XmlDsigSubjectName: %s; " +
+ "SignatureManifestCheckCode: %s; " +
+ "XmlDSIGManifestCheckCode: %s; " +
+ "CertificateCheckCode: %s; " +
+ "SignatureCheckCode: %s; " +
+ "SigningDateTime: %s; " +
+ "isXmlDSIGManigest: %s; " +
+ "isPublicAuthority: %s; " +
+ "isQualifiedCertificate: %s; " +
+ "getPublicAuthorityCode: %s; ";
private static final String MOASIG_SERVICE_ERROR_MSG = "MOA SPSS could not accept the XML signature. ";
private final ISignatureVerificationService service;
@@ -48,8 +45,7 @@ public class SignatureVerifier implements Consumer<byte[]> {
}
/**
- * Verifies the signature of a signed XML document. Throws a at.gv.egiz.moazs.MoaZSException exception
- * if the validation fails.
+ * Verifies the signature of a signed XML document. If the validation fails, it will throw an exception.
* @param signedXMLdocument
* @throws at.gv.egiz.moazs.MoaZSException
*/
@@ -107,7 +103,7 @@ public class SignatureVerifier implements Consumer<byte[]> {
public static void debug(IXMLSignatureVerificationResponse response) {
if (log.isDebugEnabled()) {
- var builder = new StringBuilder("Response: \n");
+ var builder = new StringBuilder("Response: ");
if (response == null) {
builder.append("null");
} else {