Skip to content

Commit ae48fc1

Browse files
committed
OAK-11450 Correctly detect expanded names using empty namespace or
internal namespace
1 parent ad3254e commit ae48fc1

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapper.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@
1616
*/
1717
package org.apache.jackrabbit.oak.namepath.impl;
1818

19-
import static org.apache.jackrabbit.oak.commons.conditions.Validate.checkArgument;
2019
import static java.util.Collections.emptyList;
2120
import static java.util.Collections.emptyMap;
2221
import static java.util.Objects.requireNonNull;
2322
import static org.apache.jackrabbit.oak.api.Type.STRINGS;
23+
import static org.apache.jackrabbit.oak.commons.conditions.Validate.checkArgument;
2424
import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
25+
import static org.apache.jackrabbit.oak.plugins.name.Namespaces.encodeUri;
26+
import static org.apache.jackrabbit.oak.plugins.tree.TreeUtil.getString;
27+
import static org.apache.jackrabbit.oak.plugins.tree.TreeUtil.getStrings;
28+
import static org.apache.jackrabbit.oak.plugins.tree.factories.RootFactory.createReadOnlyRoot;
29+
import static org.apache.jackrabbit.oak.plugins.tree.factories.TreeFactory.createReadOnlyTree;
2530
import static org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants.NAMESPACES_PATH;
2631
import static org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants.REP_NSDATA;
2732
import static org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants.REP_PREFIXES;
2833
import static org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants.REP_URIS;
29-
import static org.apache.jackrabbit.oak.plugins.name.Namespaces.encodeUri;
30-
import static org.apache.jackrabbit.oak.plugins.tree.factories.RootFactory.createReadOnlyRoot;
31-
import static org.apache.jackrabbit.oak.plugins.tree.factories.TreeFactory.createReadOnlyTree;
32-
import static org.apache.jackrabbit.oak.plugins.tree.TreeUtil.getString;
33-
import static org.apache.jackrabbit.oak.plugins.tree.TreeUtil.getStrings;
3434

3535
import java.util.Map;
3636
import java.util.Map.Entry;
@@ -40,6 +40,7 @@
4040
import org.apache.jackrabbit.oak.api.Root;
4141
import org.apache.jackrabbit.oak.api.Tree;
4242
import org.apache.jackrabbit.oak.namepath.NameMapper;
43+
import org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants;
4344
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
4445
import org.apache.jackrabbit.oak.spi.state.NodeState;
4546
import org.jetbrains.annotations.NotNull;
@@ -67,10 +68,16 @@ protected static boolean isHiddenName(String name) {
6768
protected static boolean isExpandedName(String name) {
6869
if (name.startsWith("{")) {
6970
int brace = name.indexOf('}', 1);
70-
return brace != -1 && name.substring(1, brace).indexOf(':') != -1;
71-
} else {
72-
return false;
71+
if (brace != -1) {
72+
String namespace = name.substring(1, brace);
73+
// the empty namespace and "internal" are valid as well, otherwise it always contains a colon (as it is a URI)
74+
// compare with RFC 3986, Section 3 (https://datatracker.ietf.org/doc/html/rfc3986#section-3)
75+
if (namespace.isEmpty() || namespace.equals(NamespaceConstants.NAMESPACE_REP)|| namespace.indexOf(':') != -1) {
76+
return true;
77+
}
78+
}
7379
}
80+
return false;
7481
}
7582

7683
private final Root root;

oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/impl/GlobalNameMapperTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package org.apache.jackrabbit.oak.namepath.impl;
1818

1919
import static org.junit.Assert.assertEquals;
20+
import static org.junit.Assert.assertFalse;
2021
import static org.junit.Assert.assertNull;
22+
import static org.junit.Assert.assertTrue;
2123
import static org.junit.Assert.fail;
2224

2325
import java.util.ArrayList;
@@ -108,4 +110,14 @@ public void testPrefixedNames() throws RepositoryException {
108110
assertEquals(name, mapper.getJcrName(name));
109111
}
110112
}
113+
114+
@Test
115+
public void testIsExpandedName() {
116+
assertTrue(GlobalNameMapper.isExpandedName("{}something"));
117+
assertTrue(GlobalNameMapper.isExpandedName("{internal}something"));
118+
assertTrue(GlobalNameMapper.isExpandedName("{http://www.jcp.org/jcr/nt/1.0}something"));
119+
assertFalse(GlobalNameMapper.isExpandedName("{something not a namespace}something"));
120+
assertFalse(GlobalNameMapper.isExpandedName("rep:something"));
121+
assertFalse(GlobalNameMapper.isExpandedName("something"));
122+
}
111123
}

0 commit comments

Comments
 (0)