diff --git a/src/main/java/org/apache/commons/xml/SaxonProvider.java b/src/main/java/org/apache/commons/xml/SaxonProvider.java index 23c1c2b3..2b600ba6 100644 --- a/src/main/java/org/apache/commons/xml/SaxonProvider.java +++ b/src/main/java/org/apache/commons/xml/SaxonProvider.java @@ -43,6 +43,18 @@ */ final class SaxonProvider { + /** + * Tells whether the factory class is Saxon's, by package prefix, so public subclasses such as {@code net.sf.saxon.BasicTransformerFactory} route to the + * same locked-down {@link Configuration} as the factory registered for JAXP lookup. + * + * @param factoryClass The factory implementation class. + * @return Whether the class lives in Saxon's open-source or commercial packages. + */ + static boolean isSaxon(final Class factoryClass) { + final String name = factoryClass.getName(); + return name.startsWith("net.sf.saxon.") || name.startsWith("com.saxonica."); + } + /** * A Saxon {@link Configuration} carrying the vendor-specific restrictions that the standard JAXP knobs cannot express. * @@ -123,6 +135,9 @@ static Supplier emptySourceSupplier() { static TransformerFactory configure(final TransformerFactory factory) { try { return SaxonProviderConfigurer.configure(factory); + } catch (final ClassCastException e) { + // A Saxon-package factory the configurer cannot lock down; refuse it rather than returning it unhardened. + throw new HardeningException("Unsupported Saxon TransformerFactory " + factory.getClass().getName(), e); } catch (final LinkageError e) { // Unlikely, but protects method execution from missing optional dependency throw new IllegalStateException(e); @@ -132,6 +147,9 @@ static TransformerFactory configure(final TransformerFactory factory) { static XPathFactory configure(final XPathFactory factory) { try { return SaxonProviderConfigurer.configure(factory); + } catch (final ClassCastException e) { + // A Saxon-package factory the configurer cannot lock down; refuse it rather than returning it unhardened. + throw new HardeningException("Unsupported Saxon XPathFactory " + factory.getClass().getName(), e); } catch (final LinkageError e) { // Unlikely, but protects method execution from missing optional dependency throw new IllegalStateException(e); diff --git a/src/main/java/org/apache/commons/xml/TransformerHardener.java b/src/main/java/org/apache/commons/xml/TransformerHardener.java index d71585a4..6dbb6233 100644 --- a/src/main/java/org/apache/commons/xml/TransformerHardener.java +++ b/src/main/java/org/apache/commons/xml/TransformerHardener.java @@ -17,11 +17,6 @@ package org.apache.commons.xml; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - import javax.xml.XMLConstants; import javax.xml.transform.Source; import javax.xml.transform.Transformer; @@ -34,7 +29,7 @@ * *

Rather than branching on the implementation class, {@link #harden(TransformerFactory)} probes what the factory supports and adapts:

*