This is an automated email from the ASF dual-hosted git repository.
coheigea pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/main by this push:
new b1b8a9c297a Add a boolean to guard against remove schema download for
WS-MEX (#3054)
b1b8a9c297a is described below
commit b1b8a9c297a9e1e152ee5338622a21e643c92a2e
Author: Colm O hEigeartaigh <[email protected]>
AuthorDate: Thu Apr 23 15:49:12 2026 +0100
Add a boolean to guard against remove schema download for WS-MEX (#3054)
---
.../cxf/ws/security/trust/AbstractSTSClient.java | 47 ++++++---
.../ws/security/trust/AbstractSTSClientTest.java | 105 +++++++++++++++++++++
2 files changed, 139 insertions(+), 13 deletions(-)
diff --git
a/rt/ws/security/src/main/java/org/apache/cxf/ws/security/trust/AbstractSTSClient.java
b/rt/ws/security/src/main/java/org/apache/cxf/ws/security/trust/AbstractSTSClient.java
index d95294581ea..8d1b68adc6a 100755
---
a/rt/ws/security/src/main/java/org/apache/cxf/ws/security/trust/AbstractSTSClient.java
+++
b/rt/ws/security/src/main/java/org/apache/cxf/ws/security/trust/AbstractSTSClient.java
@@ -208,6 +208,7 @@ public abstract class AbstractSTSClient implements
Configurable, InterceptorProv
protected List<Feature> features;
protected TLSClientParameters tlsClientParameters;
+ protected boolean allowMexMetadataSchemaLocation;
public AbstractSTSClient(Bus b) {
bus = b;
@@ -249,6 +250,14 @@ public abstract class AbstractSTSClient implements
Configurable, InterceptorProv
this.tlsClientParameters = tlsClientParameters;
}
+ public boolean isAllowMexMetadataSchemaLocation() {
+ return allowMexMetadataSchemaLocation;
+ }
+
+ public void setAllowMexMetadataSchemaLocation(boolean
allowMexMetadataSchemaLocation) {
+ this.allowMexMetadataSchemaLocation = allowMexMetadataSchemaLocation;
+ }
+
/**
* Sets the WS-P policy that is applied to communications between this
client and the remote server
* if no value is supplied for {@link #setWsdlLocation(String)}.
@@ -542,19 +551,16 @@ public abstract class AbstractSTSClient implements
Configurable, InterceptorProv
definition =
bus.getExtension(WSDLManager.class).getDefinition((Element)s.getAny());
} else if
("http://www.w3.org/2001/XMLSchema".equals(s.getDialect())) {
- Element schemaElement = (Element)s.getAny();
- if (schemaElement == null) {
- String schemaLocation = s.getLocation();
- LOG.info("XSD schema location: " + schemaLocation);
- schemaElement = downloadSchema(schemaLocation);
+ Element schemaElement = getSchemaElement(s);
+ if (schemaElement != null) {
+ QName schemaName =
+ new QName(schemaElement.getNamespaceURI(),
schemaElement.getLocalName());
+ WSDLManager wsdlManager =
bus.getExtension(WSDLManager.class);
+ ExtensibilityElement
+ exElement =
wsdlManager.getExtensionRegistry().createExtension(Types.class, schemaName);
+ ((Schema)exElement).setElement(schemaElement);
+ schemas.add((Schema)exElement);
}
- QName schemaName =
- new QName(schemaElement.getNamespaceURI(),
schemaElement.getLocalName());
- WSDLManager wsdlManager =
bus.getExtension(WSDLManager.class);
- ExtensibilityElement
- exElement =
wsdlManager.getExtensionRegistry().createExtension(Types.class, schemaName);
- ((Schema)exElement).setElement(schemaElement);
- schemas.add((Schema)exElement);
}
}
@@ -614,7 +620,22 @@ public abstract class AbstractSTSClient implements
Configurable, InterceptorProv
}
}
- private Element downloadSchema(String schemaLocation) throws Exception {
+ protected Element getSchemaElement(MetadataSection s) throws Exception {
+ Element schemaElement = (Element)s.getAny();
+ if (schemaElement == null) {
+ if (!allowMexMetadataSchemaLocation) {
+ LOG.info("Loading a schema from WS-MEX MetadataSection
Location is disabled by "
+ + " default. Enable allowMexMetadataSchemaLocation to
allow it.");
+ } else {
+ String schemaLocation = s.getLocation();
+ LOG.info("XSD schema location: " + schemaLocation);
+ schemaElement = downloadSchema(schemaLocation);
+ }
+ }
+ return schemaElement;
+ }
+
+ protected Element downloadSchema(String schemaLocation) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
diff --git
a/rt/ws/security/src/test/java/org/apache/cxf/ws/security/trust/AbstractSTSClientTest.java
b/rt/ws/security/src/test/java/org/apache/cxf/ws/security/trust/AbstractSTSClientTest.java
new file mode 100644
index 00000000000..48f43402dfb
--- /dev/null
+++
b/rt/ws/security/src/test/java/org/apache/cxf/ws/security/trust/AbstractSTSClientTest.java
@@ -0,0 +1,105 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.ws.security.trust;
+
+import javax.xml.XMLConstants;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.ws.mex.model._2004_09.MetadataSection;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+public class AbstractSTSClientTest {
+
+ @Test
+ public void testSchemaLocationDownloadDisabledByDefault() throws Exception
{
+ TestableAbstractSTSClient client = new TestableAbstractSTSClient(null);
+ MetadataSection section = new MetadataSection();
+ section.setDialect(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ section.setLocation("http://example.org/schema.xsd");
+
+ assertFalse(client.isAllowMexMetadataSchemaLocation());
+ assertTrue(client.getSchemaElement(section) == null);
+ }
+
+ @Test
+ public void testSchemaLocationDownloadAllowedWhenEnabled() throws
Exception {
+ TestableAbstractSTSClient client = new TestableAbstractSTSClient(null);
+ MetadataSection section = new MetadataSection();
+ section.setDialect(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ section.setLocation("http://example.org/schema.xsd");
+
+ client.setAllowMexMetadataSchemaLocation(true);
+
+ Element schemaElement = client.getSchemaElement(section);
+ assertEquals(1, client.getDownloadSchemaInvocations());
+ assertEquals("http://example.org/schema.xsd",
client.getLastDownloadedLocation());
+ assertEquals(XMLConstants.W3C_XML_SCHEMA_NS_URI,
schemaElement.getNamespaceURI());
+ assertEquals("schema", schemaElement.getLocalName());
+ }
+
+ @Test
+ public void testInlineSchemaElementDoesNotDownload() throws Exception {
+ TestableAbstractSTSClient client = new TestableAbstractSTSClient(null);
+ MetadataSection section = new MetadataSection();
+ section.setDialect(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+
+ Document document = DOMUtils.createDocument();
+ Element inlineSchema =
document.createElementNS(XMLConstants.W3C_XML_SCHEMA_NS_URI, "xsd:schema");
+ section.setAny(inlineSchema);
+
+ Element schemaElement = client.getSchemaElement(section);
+ assertSame(inlineSchema, schemaElement);
+ assertEquals(0, client.getDownloadSchemaInvocations());
+ }
+
+ private static final class TestableAbstractSTSClient extends
AbstractSTSClient {
+ private int downloadSchemaInvocations;
+ private String lastDownloadedLocation;
+
+ TestableAbstractSTSClient(Bus bus) {
+ super(bus);
+ }
+
+ @Override
+ protected Element downloadSchema(String schemaLocation) {
+ downloadSchemaInvocations++;
+ lastDownloadedLocation = schemaLocation;
+ Document document = DOMUtils.createDocument();
+ return
document.createElementNS(XMLConstants.W3C_XML_SCHEMA_NS_URI, "xsd:schema");
+ }
+
+ int getDownloadSchemaInvocations() {
+ return downloadSchemaInvocations;
+ }
+
+ String getLastDownloadedLocation() {
+ return lastDownloadedLocation;
+ }
+ }
+}