This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch coheigea/relative-schema in repository https://gitbox.apache.org/repos/asf/ws-xmlschema.git
commit b2ef1737ed10e247c430552e70d0b7d995357c6e Author: Colm O hEigeartaigh <[email protected]> AuthorDate: Thu Sep 24 10:56:16 2026 +0100 Check that a relative schema location is a regular file --- .../commons/schema/resolver/DefaultURIResolver.java | 8 +++++++- .../src/test/java/tests/DefaultURIResolverTest.java | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java index 4329fc8b..7ad19405 100644 --- a/xmlschema-core/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java +++ b/xmlschema-core/src/main/java/org/apache/ws/commons/schema/resolver/DefaultURIResolver.java @@ -236,6 +236,9 @@ public class DefaultURIResolver implements CollectionURIResolver { + " working directory, which " + ALLOW_FILE_SYSTEM_PROPERTY + " has turned off."); } + // The parser opens this against the working directory, so it is as much a local read + // as a file: URL and needs the same check. + verifyRegularFile(new File(schemaLocation), schemaLocation); return new InputSource(schemaLocation); } return null; @@ -572,7 +575,10 @@ public class DefaultURIResolver implements CollectionURIResolver { * @param schemaLocation the original schema location, for the error message. */ private static void verifyRegularFile(String uri, String schemaLocation) { - final File file = toLocalFile(uri); + verifyRegularFile(toLocalFile(uri), schemaLocation); + } + + private static void verifyRegularFile(File file, String schemaLocation) { if (file != null && file.exists() && !file.isFile()) { throw new XmlSchemaException("The schema location \"" + schemaLocation + "\" is not a regular file. A schema document cannot be" diff --git a/xmlschema-core/src/test/java/tests/DefaultURIResolverTest.java b/xmlschema-core/src/test/java/tests/DefaultURIResolverTest.java index ee150987..0d76ea21 100644 --- a/xmlschema-core/src/test/java/tests/DefaultURIResolverTest.java +++ b/xmlschema-core/src/test/java/tests/DefaultURIResolverTest.java @@ -454,6 +454,26 @@ public class DefaultURIResolverTest extends Assert { assertSchemeRefused("jar:" + asFileUrl + "!/x.xsd", null, "not a regular file"); } + /** + * With no base URI, a relative location is handed to the parser as-is and opened against the + * working directory, so it is a local read like any file: URL and gets the same check. + */ + @Test + public void testARelativeLocationThatIsNotARegularFileIsRefused() { + assertTrue(new File(".").isDirectory()); + assertSchemeRefused(".", null, "not a regular file"); + } + + @Test + public void testARelativeRegularOrMissingFileStillResolves() { + assertTrue(new File("pom.xml").isFile()); + assertEquals("pom.xml", + new DefaultURIResolver().resolveEntity("urn:x", "pom.xml", null).getSystemId()); + assertEquals("no-such-schema.xsd", + new DefaultURIResolver() + .resolveEntity("urn:x", "no-such-schema.xsd", null).getSystemId()); + } + @Test public void testARegularFileStillResolves() throws Exception { File file = File.createTempFile("schema", ".xsd");
