This is an automated email from the ASF dual-hosted git repository.
reschke pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
The following commit(s) were added to refs/heads/trunk by this push:
new 601352d820 OAK-10304: log registration of invalid namespace names
(#1000)
601352d820 is described below
commit 601352d820d320c040c9ce16c818f26f447a6840
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();
+ }
+ };
+ }
}