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();
+            }
+        };
+    }
 }

Reply via email to