diff options
Diffstat (limited to 'pdf-as-moa/src/main/java')
| -rw-r--r-- | pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAConnector.java | 116 | ||||
| -rw-r--r-- | pdf-as-moa/src/main/java/at/gv/egiz/pdfas/moa/MOAVerifier.java | 25 |
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 |
