aboutsummaryrefslogtreecommitdiff
path: root/pdf-as-moa/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'pdf-as-moa/src/main/java')
-rw-r--r--pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAConnector.java116
-rw-r--r--pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAVerifier.java25
2 files changed, 80 insertions, 61 deletions
diff --git a/pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAConnector.java b/pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAConnector.java
index 11d00c75..d92bcc42 100644
--- a/pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAConnector.java
+++ b/pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAConnector.java
@@ -30,11 +30,16 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
+import java.net.http.HttpConnectTimeoutException;
+import java.net.http.HttpTimeoutException;
import java.security.cert.CertificateException;
-import javax.xml.ws.BindingProvider;
-import javax.xml.ws.soap.SOAPBinding;
+import at.gv.egiz.pdfas.common.exceptions.*;
+import jakarta.xml.ws.BindingProvider;
+import jakarta.xml.ws.WebServiceException;
+import jakarta.xml.ws.soap.SOAPBinding;
+import lombok.val;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
@@ -51,13 +56,6 @@ import at.gv.e_government.reference.namespace.moa._20020822_.MOAFault;
import at.gv.e_government.reference.namespace.moa._20020822_.MetaInfoType;
import at.gv.e_government.reference.namespace.moa._20020822_.SignatureCreationPortType;
import at.gv.e_government.reference.namespace.moa._20020822_.SignatureCreationService;
-import at.gv.egiz.pdfas.common.exceptions.ErrorConstants;
-import at.gv.egiz.pdfas.common.exceptions.PDFASError;
-import at.gv.egiz.pdfas.common.exceptions.PdfAsErrorCarrier;
-import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
-import at.gv.egiz.pdfas.common.exceptions.PdfAsMOAException;
-import at.gv.egiz.pdfas.common.exceptions.PdfAsSignatureException;
-import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException;
import at.gv.egiz.pdfas.common.settings.ISettings;
import at.gv.egiz.pdfas.common.utils.SettingsUtils;
import at.gv.egiz.pdfas.common.utils.StreamUtils;
@@ -79,7 +77,8 @@ public class MOAConnector implements ISignatureConnector,
public static final String SIGNATURE_DEVICE = "MOA";
private X509Certificate certificate;
- private String moaEndpoint;
+ private final String moaEndpoint;
+ private final Long moaTimeout;
private String keyIdentifier;
private boolean mtomEnabled;
@@ -87,27 +86,15 @@ public class MOAConnector implements ISignatureConnector,
public MOAConnector(Configuration config,
java.security.cert.Certificate certificate)
throws CertificateException, FileNotFoundException, IOException {
- if(certificate != null) {
- if(certificate instanceof X509Certificate) {
+
+ if (certificate != null) {
+ if (certificate instanceof X509Certificate) {
this.certificate = (X509Certificate)certificate;
} else {
this.certificate = new X509Certificate(certificate.getEncoded());
}
- }
- init(config);
- }
-
- public MOAConnector(Configuration config) throws CertificateException,
- FileNotFoundException, IOException {
- init(config);
- }
-
- private void init(Configuration config) throws CertificateException,
- FileNotFoundException, IOException {
-
- // Load certificate if not set otherwise
- if (this.certificate == null) {
-
+ } else {
+ // Load certificate if not set otherwise
if (config.getValue(MOA_SIGN_CERTIFICATE) == null) {
logger.error(MOA_SIGN_CERTIFICATE
+ " not configured for MOA connector");
@@ -116,36 +103,30 @@ public class MOAConnector implements ISignatureConnector,
+ " to use MOA connector"));
}
- if (!(config instanceof ISettings)) {
+ if (!(config instanceof ISettings settings)) {
logger.error("Configuration is no instance of ISettings");
throw new PdfAsWrappedIOException(new PdfAsException(
"Configuration is no instance of ISettings"));
}
- ISettings settings = (ISettings) config;
-
- String certificateValue = config.getValue(MOA_SIGN_CERTIFICATE);
+ String certificateValue = config.getValue(MOA_SIGN_CERTIFICATE);
if (certificateValue.startsWith("http")) {
logger.debug("Loading certificate from url: " + certificateValue);
- InputStream is = null;
- try {
- URL certificateURL = new URL(certificateValue);
- is = certificateURL.openStream();
+ try (val is = new URL(certificateValue).openStream()) {
this.certificate = new X509Certificate(is);
-
+
} catch (MalformedURLException e) {
- logger.error(certificateValue + " is not a valid url but starts with http!");
- throw new PdfAsWrappedIOException(new PdfAsException(certificateValue + " is not a valid url but!"));
-
- } finally {
- if (is != null) {
- is.close();
-
- }
- }
-
+ logger.error("{} is not a valid url but starts with http!", certificateValue);
+ throw new PdfAsWrappedIOException(new PdfAsException(certificateValue + " is not a valid url but starts with http!"));
+
+ }
+ } else if (certificateValue.startsWith("base64:")) {
+ logger.debug("Loading base64 certificate: {}", certificateValue);
+
+ val cert = java.util.Base64.getDecoder().decode(certificateValue.substring(7));
+ this.certificate = new X509Certificate(cert);
} else {
File certFile = new File(certificateValue);
@@ -155,19 +136,33 @@ public class MOAConnector implements ISignatureConnector,
certFile = new File(certificateValue);
}
- logger.debug("Loading certificate from file: "
- + certificateValue);
+ logger.debug("Loading certificate from file: {}", certificateValue);
- this.certificate = new X509Certificate(new FileInputStream(
- certFile));
+ try (val is = new FileInputStream(certFile)) {
+ this.certificate = new X509Certificate(is);
+ }
}
}
-
+
this.moaEndpoint = config.getValue(MOA_SIGN_URL);
- this.keyIdentifier = config.getValue(MOA_SIGN_KEY_ID);
+ val timeout = config.getValue(MOA_SIGN_TIMEOUT);
+ Long moaTimeout = null;
+ if (timeout != null) {
+ try {
+ moaTimeout = Long.valueOf(timeout);
+ } catch (NumberFormatException e) {
+ logger.warn("Failed to convert MOA signing timeout '{}' to a number", timeout, e);
+ }
+ }
+ this.moaTimeout = moaTimeout;
+ this.keyIdentifier = config.getValue(MOA_SIGN_KEY_ID);
this.mtomEnabled = parseConfigToBoolean(config.getValue(MOA_MTOM_ENABLED), false);
logger.info("MOA client {} SOAP with MTOM", this.mtomEnabled ? "enabled" : "disabled");
-
+ }
+
+ public MOAConnector(Configuration config) throws CertificateException,
+ FileNotFoundException, IOException {
+ this(config, null);
}
public X509Certificate getCertificate(SignParameter parameter)
@@ -190,12 +185,16 @@ public class MOAConnector implements ISignatureConnector,
SignatureCreationPortType creationPort = service.getSignatureCreationPort();
BindingProvider provider = (BindingProvider) creationPort;
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, this.moaEndpoint);
+ if (this.moaTimeout != null) {
+ provider.getRequestContext().put("jakarta.xml.ws.client.connectionTimeout", this.moaTimeout);
+ provider.getRequestContext().put("jakarta.xml.ws.client.receiveTimeout", this.moaTimeout);
+ }
if (this.mtomEnabled) {
- if (provider.getBinding() instanceof SOAPBinding) {
- ((SOAPBinding) provider.getBinding()).setMTOMEnabled(true);
-
- }
+ if (provider.getBinding() instanceof SOAPBinding) {
+ ((SOAPBinding) provider.getBinding()).setMTOMEnabled(true);
+
+ }
}
CreateCMSSignatureRequest request = new CreateCMSSignatureRequest();
@@ -256,6 +255,9 @@ public class MOAConnector implements ISignatureConnector,
throw new PdfAsMOAException("", e.getMessage(), "", "");
}
+ } catch (WebServiceException e) {
+ val cause = (e.getCause() != null) ? e.getCause() : e;
+ throw new SLPdfAsException((int) ErrorConstants.ERROR_SIG_CONNECT_ERROR, cause.getMessage());
}
if (response.getCMSSignatureOrErrorResponse().size() != 1) {
diff --git a/pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAVerifier.java b/pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAVerifier.java
index 40ea4ba5..ba455ae0 100644
--- a/pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAVerifier.java
+++ b/pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAVerifier.java
@@ -5,11 +5,13 @@ import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
-import javax.xml.bind.JAXBElement;
+import at.gv.egiz.pdfas.lib.impl.verify.SignatureInputData;
+import jakarta.xml.bind.JAXBElement;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
-import javax.xml.ws.BindingProvider;
+import jakarta.xml.ws.BindingProvider;
+import lombok.val;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3._2000._09.xmldsig_.KeyInfoType;
@@ -38,13 +40,15 @@ public class MOAVerifier implements IVerifier {
.getLogger(MOAVerifier.class);
private static final String MOA_VERIFY_URL = "moa.verify.url";
+ private static final String MOA_VERIFY_TIMEOUT = "moa.verify.timeout";
private static final String MOA_VERIFY_TRUSTPROFILE = "moa.verify.TrustProfileID";
private String moaEndpoint;
+ private Long moaTimeout;
private String moaTrustProfile;
- public List<VerifyResult> verify(byte[] signature, byte[] signatureContent,
+ public List<VerifyResult> verify(byte[] signature, SignatureInputData signatureContent,
Date verificationTime) throws PdfAsException {
List<VerifyResult> resultList = new ArrayList<VerifyResult>();
try {
@@ -57,6 +61,11 @@ public class MOAVerifier implements IVerifier {
SignatureVerificationPortType verificationPort = service.getSignatureVerificationPort();
BindingProvider provider = (BindingProvider) verificationPort;
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, this.moaEndpoint);
+ if (this.moaTimeout != null) {
+ provider.getRequestContext().put("jakarta.xml.ws.client.connectionTimeout", this.moaTimeout);
+ provider.getRequestContext().put("jakarta.xml.ws.client.receiveTimeout", this.moaTimeout);
+ }
+
VerifyCMSSignatureRequest verifyCMSSignatureRequest = new VerifyCMSSignatureRequest();
verifyCMSSignatureRequest.setTrustProfileID(this.moaTrustProfile);
verifyCMSSignatureRequest.setCMSSignature(signature);
@@ -68,7 +77,7 @@ public class MOAVerifier implements IVerifier {
metaDataType.setMetaInfo(metaInfoType);
CMSContentBaseType contentBase = new CMSContentBaseType();
- contentBase.setBase64Content(signatureContent);
+ contentBase.setBase64Content(signatureContent.getSignatureInputBytes());
metaDataType.setContent(contentBase);
verifyCMSSignatureRequest.setDataObject(metaDataType);
@@ -184,6 +193,14 @@ public class MOAVerifier implements IVerifier {
public void setConfiguration(Configuration config) {
this.moaEndpoint = config.getValue(MOA_VERIFY_URL);
this.moaTrustProfile = config.getValue(MOA_VERIFY_TRUSTPROFILE);
+ val timeout = config.getValue(MOA_VERIFY_TIMEOUT);
+ if (timeout != null) {
+ try {
+ this.moaTimeout = Long.valueOf(timeout);
+ } catch (NumberFormatException e) {
+ logger.warn("Failed to convert MOA verification timeout '{}' to a number", timeout, e);
+ }
+ }
}
@Override