This is an automated email from the ASF dual-hosted git repository. daim pushed a commit to branch OAK-10199 in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit 9ba789dd1c998609c1318380dec328567897c29d Author: Julian Reschke <[email protected]> AuthorDate: Thu Jun 22 09:26:03 2023 +0200 OAK-10304: log registration of invalid namespace names (#1000) * OAK-10304: work in progress * OAK-10304: work in progress * OAK-10304: add the log check * OAK-10304: improve imports, make utility method static --- .../plugins/name/ReadWriteNamespaceRegistry.java | 16 ++++++++ .../name/ReadWriteNamespaceRegistryTest.java | 48 +++++++++++++++++----- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistry.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistry.java index 186b10356c..adea1bbad6 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistry.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistry.java @@ -25,6 +25,9 @@ import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.api.Root; import org.apache.jackrabbit.oak.api.Tree; +import org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** @@ -33,6 +36,8 @@ import org.apache.jackrabbit.oak.api.Tree; public abstract class ReadWriteNamespaceRegistry extends ReadOnlyNamespaceRegistry { + private static final Logger LOG = LoggerFactory.getLogger(ReadWriteNamespaceRegistry.class); + public ReadWriteNamespaceRegistry(Root root) { super(root); } @@ -63,6 +68,17 @@ public abstract class ReadWriteNamespaceRegistry @Override public void registerNamespace(String prefix, String uri) throws RepositoryException { + + // sanity check for legal namespace names (excluding the "internal" + // namespace, see OAK-74) + if (!NamespaceConstants.NAMESPACE_REP.equals(uri)) { + if (!uri.contains(":")) { + LOG.error("Registering invalid namespace name '" + uri + "' for prefix '" + prefix + + "', please see https://developer.adobe.com/experience-manager/reference-materials/spec/jcr/2.0/3_Repository_Model.html#3.2.1%20Namespaces", + new Exception("call stack")); + } + } + if (prefix.isEmpty() && uri.isEmpty()) { return; // the default empty namespace is always registered } else if (prefix.isEmpty() || uri.isEmpty()) { diff --git a/oak-it/src/test/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistryTest.java b/oak-it/src/test/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistryTest.java index 9764a12c09..b8195be804 100644 --- a/oak-it/src/test/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistryTest.java +++ b/oak-it/src/test/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistryTest.java @@ -21,6 +21,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.util.List; + import javax.jcr.NamespaceException; import javax.jcr.NamespaceRegistry; @@ -29,9 +31,11 @@ import org.apache.jackrabbit.oak.Oak; import org.apache.jackrabbit.oak.OakBaseTest; import org.apache.jackrabbit.oak.api.ContentSession; import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.commons.junit.LogCustomizer; import org.apache.jackrabbit.oak.fixture.NodeStoreFixture; import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider; import org.junit.Test; +import org.slf4j.event.Level; public class ReadWriteNamespaceRegistryTest extends OakBaseTest { @@ -50,16 +54,7 @@ public class ReadWriteNamespaceRegistryTest extends OakBaseTest { public void testMappings() throws Exception { final ContentSession session = createContentSession(); final Root root = session.getLatestRoot(); - NamespaceRegistry r = new ReadWriteNamespaceRegistry(root) { - @Override - protected Root getWriteRoot() { - return session.getLatestRoot(); - } - @Override - protected void refresh() { - root.refresh(); - } - }; + NamespaceRegistry r = getNamespaceRegistry(session, root); assertEquals("", r.getURI("")); assertEquals("http://www.jcp.org/jcr/1.0", r.getURI("jcr")); @@ -90,4 +85,37 @@ public class ReadWriteNamespaceRegistryTest extends OakBaseTest { // expected } } + + @Test + public void testInvalidNamespace() throws Exception { + final ContentSession session = createContentSession(); + final Root root = session.getLatestRoot(); + NamespaceRegistry r = getNamespaceRegistry(session, root); + + LogCustomizer customLogs = LogCustomizer.forLogger("org.apache.jackrabbit.oak.plugins.name.ReadWriteNamespaceRegistry").enable(Level.ERROR).create(); + try { + customLogs.starting(); + r.registerNamespace("foo", "example.com"); + r.unregisterNamespace("foo"); + List<String> myLogs = customLogs.getLogs(); + assertEquals(1, myLogs.size()); + assertTrue(myLogs.get(0).contains("Registering invalid namespace name 'example.com' for prefix 'foo', please see")); + } + finally { + customLogs.finished(); + } + } + + private static NamespaceRegistry getNamespaceRegistry(ContentSession session, Root root) { + return new ReadWriteNamespaceRegistry(root) { + @Override + protected Root getWriteRoot() { + return session.getLatestRoot(); + } + @Override + protected void refresh() { + root.refresh(); + } + }; + } }
