From 3fd6c8a1eb6472ad05ace9294366706d87acbd17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Jos=C3=A9=20S=C3=A1nchez=20Pagador?= Date: Sat, 24 Feb 2024 10:59:54 +0100 Subject: [PATCH] Project updated to JDK 17. Included a implementation of the PUT wsman method, digest authentication to authorize requests and created a local copy of the addressing.xsd to avoid 403 forbidden --- api/pom.xml | 67 +- .../org/opennms/core/wsman/WSManClient.java | 17 +- .../org/opennms/core/wsman/WSManEndpoint.java | 20 +- cli/pom.xml | 9 +- .../java/org/opennms/core/wsman/WSManCli.java | 5 + cxf/pom.xml | 8 +- .../core/wsman/cxf/CXFWSManClient.java | 35 +- .../core/wsman/cxf/EnumerationOperations.java | 16 +- .../core/wsman/cxf/IdentifyOperations.java | 14 +- .../core/wsman/cxf/TransferOperations.java | 18 +- .../org/opennms/core/wsman/cxf/TypeUtils.java | 6 +- .../wsman/cxf/WSManHeaderInterceptor.java | 4 +- cxf/src/main/resources/xsds/addressing.xsd | 133 +++ cxf/src/main/resources/xsds/wsman.xsd | 802 +++++++++--------- itests/pom.xml | 112 +-- .../core/wsman/openwsman/OpenWSManClient.java | 12 +- pom.xml | 10 +- 17 files changed, 769 insertions(+), 519 deletions(-) create mode 100644 cxf/src/main/resources/xsds/addressing.xsd diff --git a/api/pom.xml b/api/pom.xml index 9a72170..f19aece 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -1,35 +1,36 @@ - - - org.opennms.core - org.opennms.core.wsman - 1.3.0-SNAPSHOT - - 4.0.0 - org.opennms.core.wsman - org.opennms.core.wsman.api - OpenNMS :: Core :: WS-Man :: API - bundle + + + org.opennms.core + org.opennms.core.wsman + 1.3.0-SNAPSHOT + + 4.0.0 + org.opennms.core.wsman + org.opennms.core.wsman.api + OpenNMS :: Core :: WS-Man :: API + bundle - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${javaVersion} - ${javaVersion} - - - - org.apache.felix - maven-bundle-plugin - true - - - JavaSE-${javaVersion} - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${javaVersion} + ${javaVersion} + + + + org.apache.felix + maven-bundle-plugin + true + + + JavaSE-${javaVersion} + + + + + diff --git a/api/src/main/java/org/opennms/core/wsman/WSManClient.java b/api/src/main/java/org/opennms/core/wsman/WSManClient.java index 5a994ef..15c302c 100644 --- a/api/src/main/java/org/opennms/core/wsman/WSManClient.java +++ b/api/src/main/java/org/opennms/core/wsman/WSManClient.java @@ -15,12 +15,13 @@ */ package org.opennms.core.wsman; -import java.util.List; -import java.util.Map; - import org.opennms.core.wsman.exceptions.WSManException; +import org.w3c.dom.Element; import org.w3c.dom.Node; +import java.util.List; +import java.util.Map; + /** * A WS-Man client implementation that supports the following operations: * * Enumerate and pull (DSP8037) @@ -110,4 +111,14 @@ public interface WSManClient { * @throws WSManException on error */ public String enumerateAndPullUsingFilter(String resourceUri, String dialect, String filter, List nodes, boolean recursive); + + /** + * + * + * @param resourceUri uri + * @param body body with a root XML element + * @param selectors map of selectors + * @throws WSManException on error + */ + public void put(String resourceUri, Element body, Map selectors); } diff --git a/api/src/main/java/org/opennms/core/wsman/WSManEndpoint.java b/api/src/main/java/org/opennms/core/wsman/WSManEndpoint.java index bc40cee..de89b6b 100644 --- a/api/src/main/java/org/opennms/core/wsman/WSManEndpoint.java +++ b/api/src/main/java/org/opennms/core/wsman/WSManEndpoint.java @@ -34,6 +34,8 @@ public class WSManEndpoint { private final String username; private final String password; private final boolean gssAuth; + private final boolean basicAuth; + private final boolean digestAuth; private final boolean strictSSL; private final WSManVersion serverVersion; private final Integer maxElements; @@ -46,6 +48,8 @@ private WSManEndpoint(Builder builder) { username = builder.username; password = builder.password; gssAuth = builder.gssAuth; + basicAuth = builder.basicAuth; + digestAuth = builder.digestAuth; strictSSL = builder.strictSSL; serverVersion = builder.serverVersion; maxElements = builder.maxElements; @@ -60,6 +64,8 @@ public static class Builder { private String username; private String password; private boolean gssAuth = false; + private boolean basicAuth = false; + private boolean digestAuth = false; private WSManVersion serverVersion = WSManVersion.WSMAN_1_2; private Integer maxElements; private Integer maxEnvelopeSize; @@ -75,11 +81,19 @@ public Builder(URL url) { } public Builder withBasicAuth(String username, String password) { + this.basicAuth = true; this.username = Objects.requireNonNull(username, "username cannot be null"); this.password = Objects.requireNonNull(password, "password cannot be null"); return this; } + public Builder withDigestAuth(String username, String password) { + this.digestAuth= true; + this.username = Objects.requireNonNull(username, "username cannot be null"); + this.password = Objects.requireNonNull(password, "password cannot be null"); + return this; + } + public Builder withGSSAuth() { gssAuth = true; return this; @@ -137,7 +151,11 @@ public URL getUrl() { } public boolean isBasicAuth() { - return !isGSSAuth() && username != null; + return !isGSSAuth() && basicAuth && username != null; + } + + public boolean isDigestAuth() { + return !isGSSAuth() && digestAuth && username != null; } public String getUsername() { diff --git a/cli/pom.xml b/cli/pom.xml index 5704fa0..b516b46 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -81,11 +81,18 @@ jakarta.xml.ws-api ${jaxbVersion} - + + + + jakarta.activation + jakarta.activation-api + 2.1.2 + args4j args4j diff --git a/cli/src/main/java/org/opennms/core/wsman/WSManCli.java b/cli/src/main/java/org/opennms/core/wsman/WSManCli.java index bc7e6f2..dc94b0b 100644 --- a/cli/src/main/java/org/opennms/core/wsman/WSManCli.java +++ b/cli/src/main/java/org/opennms/core/wsman/WSManCli.java @@ -65,6 +65,9 @@ public enum WSManOperation { @Option(name="-gssAuth", usage="GSS authentication") private boolean gssAuth = false; + @Option(name="-digestAuth", usage="Digest authentication") + private boolean digestAuth = false; + @Option(name="-o", usage="operation") WSManOperation operation = WSManOperation.ENUM; @@ -126,6 +129,8 @@ public void doMain(String[] args) { builder.withBasicAuth(username, password); } else if (gssAuth) { builder.withGSSAuth(); + } else if (digestAuth) { + builder.withDigestAuth(username, password); } WSManEndpoint endpoint = builder.build(); LOG.info("Using endpoint: {}", endpoint); diff --git a/cxf/pom.xml b/cxf/pom.xml index a430938..9fe5b95 100644 --- a/cxf/pom.xml +++ b/cxf/pom.xml @@ -95,7 +95,7 @@ org.codehaus.mojo jaxb2-maven-plugin - 2.5.0 + 3.1.0 true @@ -164,5 +164,11 @@ ${project.version} test + + jakarta.xml.ws + jakarta.xml.ws-api + 4.0.0 + compile + diff --git a/cxf/src/main/java/org/opennms/core/wsman/cxf/CXFWSManClient.java b/cxf/src/main/java/org/opennms/core/wsman/cxf/CXFWSManClient.java index 8f7b822..f2e8f1c 100644 --- a/cxf/src/main/java/org/opennms/core/wsman/cxf/CXFWSManClient.java +++ b/cxf/src/main/java/org/opennms/core/wsman/cxf/CXFWSManClient.java @@ -24,10 +24,11 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; -import javax.xml.bind.JAXBElement; +import jakarta.xml.bind.JAXBElement; import javax.xml.namespace.QName; -import javax.xml.ws.BindingProvider; +import jakarta.xml.ws.BindingProvider; +import jakarta.xml.ws.Holder; import org.apache.cxf.Bus; import org.apache.cxf.binding.soap.SoapBindingConstants; import org.apache.cxf.bus.extension.ExtensionManagerBus; @@ -42,6 +43,7 @@ import org.apache.cxf.message.Message; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transport.http.auth.DefaultBasicAuthSupplier; +import org.apache.cxf.transport.http.auth.DigestAuthSupplier; import org.apache.cxf.transport.http.auth.HttpAuthHeader; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; import org.apache.cxf.ws.addressing.AddressingProperties; @@ -63,6 +65,8 @@ import org.opennms.core.wsman.exceptions.WSManException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; import org.w3c.dom.Node; import org.xmlsoap.schemas.ws._2004._09.enumeration.Enumerate; import org.xmlsoap.schemas.ws._2004._09.enumeration.EnumerateResponse; @@ -289,6 +293,25 @@ public String enumerateAndPullUsingFilter(String resourceUri, String dialect, St return enumerateAndPull(resourceUri, dialect, filter, nodes, recursive); } + @Override + public void put(String resourceUri, Element body, Map selectors) { + String elementType = TypeUtils.getElementTypeFromResourceUri(resourceUri); + final TransferOperations transferer = getTransferer(resourceUri, elementType, selectors); + try { + TransferElement transferElement = new TransferElement(); + transferElement.getAny().clear(); + // Add the root XML element as a child element of TransferElement + transferElement.getAny().add(body); + + Holder holder = new Holder<>(transferElement); + transferer.put(holder); + } catch (RuntimeException e) { + throw wrapException(e); + } finally { + destroy(transferer); + } + } + @Override public Node get(String resourceUri, Map selectors) { String elementType = TypeUtils.getElementTypeFromResourceUri(resourceUri); @@ -399,6 +422,14 @@ public java.security.cert.X509Certificate[] getAcceptedIssuers() { http.getAuthorization().setUserName(m_endpoint.getUsername()); http.getAuthorization().setPassword(m_endpoint.getPassword()); + requestContext.put(BindingProvider.USERNAME_PROPERTY, m_endpoint.getUsername()); + requestContext.put(BindingProvider.PASSWORD_PROPERTY, m_endpoint.getPassword()); + } else if (m_endpoint.isDigestAuth()) { + LOG.debug("Enabling digest authentication."); + http.setAuthSupplier(new DigestAuthSupplier()); + http.getAuthorization().setUserName(m_endpoint.getUsername()); + http.getAuthorization().setPassword(m_endpoint.getPassword()); + requestContext.put(BindingProvider.USERNAME_PROPERTY, m_endpoint.getUsername()); requestContext.put(BindingProvider.PASSWORD_PROPERTY, m_endpoint.getPassword()); } diff --git a/cxf/src/main/java/org/opennms/core/wsman/cxf/EnumerationOperations.java b/cxf/src/main/java/org/opennms/core/wsman/cxf/EnumerationOperations.java index e722387..4dccc78 100644 --- a/cxf/src/main/java/org/opennms/core/wsman/cxf/EnumerationOperations.java +++ b/cxf/src/main/java/org/opennms/core/wsman/cxf/EnumerationOperations.java @@ -15,14 +15,14 @@ */ package org.opennms.core.wsman.cxf; -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebResult; -import javax.jws.WebService; -import javax.jws.soap.SOAPBinding; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.ws.Action; -import javax.xml.ws.soap.Addressing; +import jakarta.jws.WebMethod; +import jakarta.jws.WebParam; +import jakarta.jws.WebResult; +import jakarta.jws.WebService; +import jakarta.jws.soap.SOAPBinding; +import jakarta.xml.bind.annotation.XmlSeeAlso; +import jakarta.xml.ws.Action; +import jakarta.xml.ws.soap.Addressing; import org.xmlsoap.schemas.ws._2004._09.enumeration.Enumerate; import org.xmlsoap.schemas.ws._2004._09.enumeration.EnumerateResponse; diff --git a/cxf/src/main/java/org/opennms/core/wsman/cxf/IdentifyOperations.java b/cxf/src/main/java/org/opennms/core/wsman/cxf/IdentifyOperations.java index 09872ea..1935859 100644 --- a/cxf/src/main/java/org/opennms/core/wsman/cxf/IdentifyOperations.java +++ b/cxf/src/main/java/org/opennms/core/wsman/cxf/IdentifyOperations.java @@ -15,13 +15,13 @@ */ package org.opennms.core.wsman.cxf; -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebResult; -import javax.jws.WebService; -import javax.jws.soap.SOAPBinding; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.ws.soap.Addressing; +import jakarta.jws.WebMethod; +import jakarta.jws.WebParam; +import jakarta.jws.WebResult; +import jakarta.jws.WebService; +import jakarta.jws.soap.SOAPBinding; +import jakarta.xml.bind.annotation.XmlSeeAlso; +import jakarta.xml.ws.soap.Addressing; import schemas.dmtf.org.wbem.wsman.v1.IdentifyResponseType; import schemas.dmtf.org.wbem.wsman.v1.IdentifyType; diff --git a/cxf/src/main/java/org/opennms/core/wsman/cxf/TransferOperations.java b/cxf/src/main/java/org/opennms/core/wsman/cxf/TransferOperations.java index 5f6997a..9a4925d 100644 --- a/cxf/src/main/java/org/opennms/core/wsman/cxf/TransferOperations.java +++ b/cxf/src/main/java/org/opennms/core/wsman/cxf/TransferOperations.java @@ -15,14 +15,14 @@ */ package org.opennms.core.wsman.cxf; -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebResult; -import javax.jws.WebService; -import javax.jws.soap.SOAPBinding; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.ws.Action; -import javax.xml.ws.soap.Addressing; +import jakarta.jws.WebMethod; +import jakarta.jws.WebParam; +import jakarta.jws.WebResult; +import jakarta.jws.WebService; +import jakarta.jws.soap.SOAPBinding; +import jakarta.xml.bind.annotation.XmlSeeAlso; +import jakarta.xml.ws.Action; +import jakarta.xml.ws.soap.Addressing; import org.xmlsoap.schemas.ws._2004._09.transfer.ObjectFactory; import org.xmlsoap.schemas.ws._2004._09.transfer.TransferElement; @@ -54,7 +54,7 @@ public interface TransferOperations { @Action(input = "http://schemas.xmlsoap.org/ws/2004/09/transfer/Put", output = "http://schemas.xmlsoap.org/ws/2004/09/transfer/PutResponse") public void put( @WebParam(partName = "Body", mode = WebParam.Mode.INOUT, name = "TransferElement", targetNamespace = "http://schemas.xmlsoap.org/ws/2004/09/transfer") - javax.xml.ws.Holder body + jakarta.xml.ws.Holder body ); @WebMethod(operationName = "Delete") diff --git a/cxf/src/main/java/org/opennms/core/wsman/cxf/TypeUtils.java b/cxf/src/main/java/org/opennms/core/wsman/cxf/TypeUtils.java index 4fda580..01c26c6 100644 --- a/cxf/src/main/java/org/opennms/core/wsman/cxf/TypeUtils.java +++ b/cxf/src/main/java/org/opennms/core/wsman/cxf/TypeUtils.java @@ -3,9 +3,9 @@ import java.net.URI; import java.util.List; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.JAXBException; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; diff --git a/cxf/src/main/java/org/opennms/core/wsman/cxf/WSManHeaderInterceptor.java b/cxf/src/main/java/org/opennms/core/wsman/cxf/WSManHeaderInterceptor.java index cb0409c..d958174 100644 --- a/cxf/src/main/java/org/opennms/core/wsman/cxf/WSManHeaderInterceptor.java +++ b/cxf/src/main/java/org/opennms/core/wsman/cxf/WSManHeaderInterceptor.java @@ -21,8 +21,8 @@ import java.util.Map.Entry; import java.util.Objects; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.JAXBException; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; diff --git a/cxf/src/main/resources/xsds/addressing.xsd b/cxf/src/main/resources/xsds/addressing.xsd new file mode 100644 index 0000000..6f66e74 --- /dev/null +++ b/cxf/src/main/resources/xsds/addressing.xsd @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + If "Policy" elements from namespace "http://schemas.xmlsoap.org/ws/2002/12/policy#policy" are used, they must appear first (before any extensibility elements). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cxf/src/main/resources/xsds/wsman.xsd b/cxf/src/main/resources/xsds/wsman.xsd index f826707..be2ee86 100644 --- a/cxf/src/main/resources/xsds/wsman.xsd +++ b/cxf/src/main/resources/xsds/wsman.xsd @@ -15,404 +15,440 @@ Change Requests: None --> - - - - - - - - - - - - - - - - - - Instances of this type can be only simple types or EPRs, not arbitrary mixed data. - - - - + xmlns:wsman="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" + xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" version="1.0.0e"> + + + + + + + + + + + + + + + + + + Instances of this type can be only simple types or EPRs, not arbitrary mixed data. + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/itests/pom.xml b/itests/pom.xml index 765cf1c..1e61ffc 100644 --- a/itests/pom.xml +++ b/itests/pom.xml @@ -1,59 +1,61 @@ - - - org.opennms.core - org.opennms.core.wsman - 1.3.0-SNAPSHOT - - 4.0.0 - org.opennms.core.wsman - org.opennms.core.wsman.itests - OpenNMS :: Core :: WS-Man :: Integration Tests - jar + + + org.opennms.core + org.opennms.core.wsman + 1.3.0-SNAPSHOT + + 4.0.0 + org.opennms.core.wsman + org.opennms.core.wsman.itests + OpenNMS :: Core :: WS-Man :: Integration Tests + jar - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${javaVersion} - ${javaVersion} - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${javaVersion} + ${javaVersion} + + + + - - - org.opennms.core.wsman - org.opennms.core.wsman.api - ${project.version} - + + + org.opennms.core.wsman + org.opennms.core.wsman.api + ${project.version} + - - junit - junit - ${junitVersion} - - - com.mycila - mycila-xmltool - ${xmltoolVersion} - - - org.slf4j - slf4j-simple - ${slf4jVersion} - - - com.google.guava - guava - ${guavaVersion} - - - com.github.tomakehurst - wiremock-jre8-standalone - ${wiremockVersion} - - + + junit + junit + ${junitVersion} + + + com.mycila + mycila-xmltool + ${xmltoolVersion} + + + org.slf4j + slf4j-simple + ${slf4jVersion} + + + com.google.guava + guava + ${guavaVersion} + + + + com.github.tomakehurst + wiremock + ${wiremockVersion} + + diff --git a/openwsman/src/main/java/org/opennms/core/wsman/openwsman/OpenWSManClient.java b/openwsman/src/main/java/org/opennms/core/wsman/openwsman/OpenWSManClient.java index cc5dc4b..ed1b531 100644 --- a/openwsman/src/main/java/org/opennms/core/wsman/openwsman/OpenWSManClient.java +++ b/openwsman/src/main/java/org/opennms/core/wsman/openwsman/OpenWSManClient.java @@ -25,12 +25,12 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.soap.MessageFactory; -import javax.xml.soap.MimeHeaders; -import javax.xml.soap.SOAPBody; -import javax.xml.soap.SOAPConstants; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPMessage; +import jakarta.xml.soap.MessageFactory; +import jakarta.xml.soap.MimeHeaders; +import jakarta.xml.soap.SOAPBody; +import jakarta.xml.soap.SOAPConstants; +import jakarta.xml.soap.SOAPException; +import jakarta.xml.soap.SOAPMessage; import org.opennms.core.wsman.IdentifyResponse; import org.opennms.core.wsman.WSManClient; diff --git a/pom.xml b/pom.xml index d87d0f1..57acf53 100644 --- a/pom.xml +++ b/pom.xml @@ -43,13 +43,13 @@ UTF-8 UTF-8 - 1.8 - 3.4.10 + 17 + 4.0.3 1.7.36 - 25.1-jre + 33.0.0-jre 2.33 4.4.ga - 2.20.0 + 2.22.1 4.13 2.27.2 4.0.0 @@ -81,7 +81,7 @@ org.apache.felix maven-bundle-plugin - 4.2.1 + 5.1.1 org.apache.maven.plugins