This is an automated email from the ASF dual-hosted git repository. garydgregory pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/commons-secure-xml.git
commit 4e3af7cdd4ea753487dc24d4016aa9d905193ea7 Author: Gary Gregory <[email protected]> AuthorDate: Mon Sep 14 17:04:32 2026 -0700 Javadoc --- src/main/javadoc/overview.html | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/javadoc/overview.html b/src/main/javadoc/overview.html index 73677ed..7c08487 100644 --- a/src/main/javadoc/overview.html +++ b/src/main/javadoc/overview.html @@ -82,7 +82,7 @@ <h1> <p> Defaults are also uneven. The stock JDK SAX and DOM parsers already prevent external entity resolution through <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.xml/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING"><code>FEATURE_SECURE_PROCESSING</code></a>, - and JAXP 1.5 conformant implementations ship reasonable defaults for most attacks. Others, such as standalone Xerces, Woodstox, or Saxon’s TrAX, need + and implementations conforming to JAXP 1.5 ship reasonable defaults for most attacks. Others, such as standalone Xerces, Woodstox, or Saxon’s TrAX, need further configuration before they reach the same baseline. A library author has no control over which implementation is on the classpath at runtime, so the effective security posture of their code depends on a deployment decision made elsewhere. </p> @@ -90,7 +90,7 @@ <h1> This library provides that baseline. Each <code>org.apache.commons.xml.secure</code> factory call returns a new factory secured by an implementation-specific recipe, so the returned object behaves the same way security-wise regardless of - which JAXP implementation resolved. Security becomes a property of the call, not of the classpath, and there is one place to update when a new securing + which JAXP implementation was resolved. Security becomes a property of the call, not of the classpath, and there is one place to update when a new securing setting becomes available or a default changes. </p> </section> @@ -104,7 +104,7 @@ <h1> <p> Every factory method in <code>org.apache.commons.xml.secure</code> - returns a new, secured factory. Pick the one that matches the API you already use; no other configuration is required. On secured factories an external + returns a new, secured factory. Pick the one that matches the API you already use; no other configuration is required. On secured factories, an external resource reference (DTD, entity, schema, stylesheet) is never fetched: it resolves to empty content, so the parse continues without it (see Configuration below). </p> @@ -115,7 +115,7 @@ <h2>Supported Runtimes</h2> The security guarantees are defined only on the OpenJDK family (see the <a href="../threat_model.html">Threat Model</a>). No version of Android supports <code>FEATURE_SECURE_PROCESSING</code> (so states <a href="https://developer.android.com/reference/javax/xml/parsers/DocumentBuilderFactory#setFeature%28java.lang.String,%20boolean%29">Android’s - own documentation</a>), so the library secures the platform’s parsers as best-effort. Android’s + own documentation</a>), so the library secures the platform’s parsers on a best-effort basis. Android’s <code>XmlPullParser</code> API is not supported: it is not a JAXP API. </p> @@ -123,7 +123,7 @@ <h2>Supported Runtimes</h2> <section id="supported-implementations"> <h2>Supported Implementations</h2> <p> - Out of the box the library recognizes the stock JDK JAXP implementations, Apache Xerces 2.x, Woodstox, and Saxon-HE. If a factory resolves to an + Out of the box, the library recognizes the stock JDK JAXP implementations, Apache Xerces 2.x, Woodstox, and Saxon-HE. If a factory resolves to an implementation not covered by any bundled securing recipe, every <code>org.apache.commons.xml.secure</code> factory method throws @@ -252,15 +252,15 @@ <h2>Factory Methods</h2> family (Java 13, <a href="https://bugs.openjdk.org/browse/JDK-8223423">JDK-8223423</a>). </p> <p> - All of these methods work on every supported runtime, including Java 8: - The - <code>newNSInstance</code> - methods enable namespace awareness on their non-NS counterpart, the behavior the JAXP methods are specified to have. - The - <code>newDefaultInstance</code> - methods resolve the platform’s own - <code>newDefaultInstance</code> - at run time and use it wherever the runtime provides one — Java 9 or later, and the Android API levels that ship the method — falling back to - instantiating the JDK’s built-in implementation by class name on Java 8. + All of these methods work on every supported runtime, including Java 8: </p> + <ul> + <li>The <code>newNSInstance</code> methods enable namespace awareness on their non-NS counterparts, + the behavior the JAXP methods are specified to have.</li> + <li>The <code>newDefaultInstance</code> methods resolve the platform’s own <code>newDefaultInstance</code> + at run time and use it wherever the runtime provides one (Java 9 or later, and the Android API levels that ship the method), + falling back to instantiating the JDK’s built-in implementation by class name on Java 8.</li> + </ul> <p> The <code>newDefaultInstance</code> @@ -333,7 +333,7 @@ <h1> configure, so the tightening carries <strong>no security weight</strong> and can be as strict as the application needs: </p> <ul> - <li>Set a stricter feature on the factory, for example <code>http://apache.org/xml/features/disallow-doctype-decl</code> to reject every document + <li>Set a stricter feature on the factory, for example, <code>http://apache.org/xml/features/disallow-doctype-decl</code> to reject every document carrying a DOCTYPE, on implementations that support the feature. </li> <li>Install a resolver that throws. A caller-supplied <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.xml/org/xml/sax/EntityResolver.html"><code>EntityResolver</code></a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.xml/javax/xml/stream/XMLResolver.html"><code>XMLResolver</code></a>, <a href="https://docs.oracle.com/en/java/javase/25/docs/api/java.xml/org/w3c/dom/ls/LSResourceResolver.html"><code>LSResourceResolver</code></a> or <a href="https: [...] @@ -343,7 +343,7 @@ <h1> <section id="resolvers"> <h2>Resolvers</h2> <p> - A resolver here serves the opposite purpose it does on a stock JAXP factory. + A resolver here serves the opposite purpose from the one it serves on a stock JAXP factory. There, returning <code>null</code> hands the reference back to the parser, which fetches it; on a secured factory, returning <code>null</code> leaves the reference unresolved, and the securing floor answers it with empty content. @@ -351,7 +351,7 @@ <h2>Resolvers</h2> </p> <p> A resolver is therefore the way to opt a resource back in, - and returning a non-null result is how you say “this one is allowed”. + and returning a non-null result is how you say “this one is allowed.” Your resolver is consulted before the floor and is never replaced by it, and what it returns is honored even where the JAXP 1.5 external-access properties would deny the fetch, because those properties do not apply to a resolved result. @@ -433,7 +433,7 @@ <h2>Resolvers</h2> so the references inside the resource you allowed face the same floor again. A function that cannot accept an empty document in place of what it asked for, <code>unparsed-text()</code> among them, reports an error when the resolver declines rather than returning empty content; - either way the resource is not fetched. + either way, the resource is not fetched. </p> <div class="sourceCode" id="cb9"> <pre class="sourceCode java"> @@ -516,9 +516,9 @@ <h1> </li> </ul> <p> - The first and third defect fail closed — - a legitimately resolved document is denied, never fetched — - so they break resolver-based applications without weakening the securing; + The first and third defects fail closed: + a legitimately resolved document is denied, never fetched. + They therefore break resolver-based applications without weakening the securing; the second fails open and would leave a real fetch channel unguarded. A resolver floor has neither problem: it covers every channel on every supported implementation,
