This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git
The following commit(s) were added to refs/heads/master by this push:
new c1271ce SLING-9957, SLING-9975 (#57)
c1271ce is described below
commit c1271cea922190ff0be4198625f8c2b9137bff4a
Author: anchela <[email protected]>
AuthorDate: Wed Jan 20 15:54:23 2021 +0100
SLING-9957, SLING-9975 (#57)
* SLING-9975 : RepPolicyEntryHandler ignores restrictions defined in
jackrabbit2 format
* SLING-9957 : Hardcoded list of restriction names in
RepPolicyEntryHandler.RepPolicyParser
* SLING-10078 : DefaultAclManager does not handle multiple restrictions
correctly.
Co-authored-by: angela <[email protected]>
Co-authored-by: Karl Pauls <[email protected]>
---
.../accesscontrol/DefaultAclManager.java | 5 +--
.../cpconverter/handlers/AbstractPolicyParser.java | 22 ++++++----
.../handlers/RepPolicyEntryHandler.java | 8 ++--
.../handlers/RepPrincipalPolicyEntryHandler.java | 16 +++++---
.../handlers/RepPolicyEntryHandlerTest.java | 48 +++++++++++++++-------
.../RepPrincipalPolicyEntryHandlerTest.java | 2 +-
.../jr2restrictions/.content.xml} | 14 +------
.../jr2restrictions/_rep_policy.xml} | 17 ++++----
.../services/random2/_rep_principalPolicy.xml | 5 ++-
9 files changed, 78 insertions(+), 59 deletions(-)
diff --git
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/DefaultAclManager.java
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/DefaultAclManager.java
index e898d13..1508a78 100644
---
a/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/DefaultAclManager.java
+++
b/src/main/java/org/apache/sling/feature/cpconverter/accesscontrol/DefaultAclManager.java
@@ -265,9 +265,8 @@ public class DefaultAclManager implements AclManager {
entry.getPrivileges(),
path);
- if (!entry.getRestrictions().isEmpty()) {
- formatter.format(" restriction(%s)",
- String.join(",", entry.getRestrictions()));
+ for (String restriction : entry.getRestrictions()) {
+ formatter.format(" restriction(%s)", restriction);
}
formatter.format("%n");
diff --git
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractPolicyParser.java
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractPolicyParser.java
index 31cd85e..109a3bb 100644
---
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractPolicyParser.java
+++
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/AbstractPolicyParser.java
@@ -34,9 +34,7 @@ abstract class AbstractPolicyParser extends
AbstractJcrNodeParser<Boolean> {
static final String REP_RESTRICTIONS = "rep:Restrictions";
static final String REP_PRINCIPAL_NAME = "rep:principalName";
-
- private static final String REP_PRIVILEGES = "rep:privileges";
- private static final String[] RESTRICTIONS = new String[] { "rep:glob",
"rep:ntNames", "rep:prefixes", "rep:itemNames" };
+ static final String REP_PRIVILEGES = "rep:privileges";
private static final Pattern typeIndicatorPattern =
Pattern.compile("\\{[^\\}]+\\}\\[(.+)\\]");
@@ -69,16 +67,22 @@ abstract class AbstractPolicyParser extends
AbstractJcrNodeParser<Boolean> {
return expression;
}
- static void addRestrictions(@NotNull AccessControlEntry ace, @NotNull
Attributes attributes) {
- for (String restriction : RESTRICTIONS) {
- String v = extractValue(attributes.getValue(restriction));
-
- if (v != null && !v.isEmpty()) {
- ace.addRestriction(restriction + ',' + v);
+ void addRestrictions(@NotNull AccessControlEntry ace, @NotNull Attributes
attributes) {
+ for (int i = 0; i < attributes.getLength(); i++) {
+ String name = attributes.getQName(i);
+ if (isRestriction(name)) {
+ String v = extractValue(attributes.getValue(name));
+ if (v != null && !v.isEmpty()) {
+ ace.addRestriction(name + ',' + v);
+ }
}
}
}
+ boolean isRestriction(@NotNull String attributeName) {
+ return !(REP_PRINCIPAL_NAME.equals(attributeName) ||
REP_PRIVILEGES.equals(attributeName) || attributeName.startsWith("jcr:"));
+ }
+
AccessControlEntry createEntry(boolean isAllow, @NotNull Attributes
attributes) {
return new AccessControlEntry(isAllow,
Objects.requireNonNull(extractValue(attributes.getValue(REP_PRIVILEGES))),
repositoryPath);
}
diff --git
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
index fb5cea6..c87b65e 100644
---
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
+++
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandler.java
@@ -72,11 +72,13 @@ public class RepPolicyEntryHandler extends
AbstractPolicyEntryHandler {
String primaryType = attributes.getValue(JCR_PRIMARYTYPE);
if (REP_GRANT_ACE.equals(primaryType) ||
REP_DENY_ACE.equals(primaryType)) {
String principalName =
attributes.getValue(REP_PRINCIPAL_NAME);
- AccessControlEntry acl =
createEntry(operations.get(primaryType), attributes);
+ AccessControlEntry ace =
createEntry(operations.get(primaryType), attributes);
+ // handle restrictions added in jr2 format (i.e. not
located below rep:restrictions node)
+ addRestrictions(ace, attributes);
- processCurrentAcl = aclManager.addAcl(principalName, acl);
+ processCurrentAcl = aclManager.addAcl(principalName, ace);
if (processCurrentAcl) {
- acls.add(acl);
+ acls.add(ace);
} else {
hasRejectedNodes = true;
}
diff --git
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPrincipalPolicyEntryHandler.java
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPrincipalPolicyEntryHandler.java
index 1872c56..73fe351 100644
---
a/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPrincipalPolicyEntryHandler.java
+++
b/src/main/java/org/apache/sling/feature/cpconverter/handlers/RepPrincipalPolicyEntryHandler.java
@@ -45,10 +45,6 @@ public final class RepPrincipalPolicyEntryHandler extends
AbstractPolicyEntryHan
private static final String REP_RESTRICTIONS = "rep:Restrictions";
- private static final String REP_PRINCIPAL_NAME = "rep:principalName";
-
- private static final String REP_PRIVILEGES = "rep:privileges";
-
private static final String REP_PRINCIPAL_POLICY =
"rep:PrincipalPolicy";
private static final String REP_PRINCIPAL_ENTRY = "rep:PrincipalEntry";
@@ -84,7 +80,8 @@ public final class RepPrincipalPolicyEntryHandler extends
AbstractPolicyEntryHan
RepoPath effectivePath = new
RepoPath(attributes.getValue(REP_EFFECTIVE_PATH));
AccessControlEntry ace = new AccessControlEntry(true,
privileges, effectivePath, true);
-
+ // NOTE: nt-definition doesn't allow for jr2-stype
restrictions defined right below the entry.
+ // instead always requires rep:restrictions child node
processCurrentAcl = aclManager.addAcl(principalName, ace);
if (processCurrentAcl) {
aces.add(ace);
@@ -115,5 +112,14 @@ public final class RepPrincipalPolicyEntryHandler extends
AbstractPolicyEntryHan
handler.endElement(uri, localName, qName);
}
}
+
+ @Override
+ boolean isRestriction(@NotNull String attributeName) {
+ if ((REP_EFFECTIVE_PATH.equals(attributeName))) {
+ return false;
+ } else {
+ return super.isRestriction(attributeName);
+ }
+ }
}
}
diff --git
a/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandlerTest.java
b/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandlerTest.java
index 421f627..cfca3de 100644
---
a/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandlerTest.java
+++
b/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPolicyEntryHandlerTest.java
@@ -32,7 +32,9 @@ import org.junit.Before;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
import java.io.StringReader;
+import java.security.acl.Acl;
import java.util.List;
import static org.junit.Assert.assertEquals;
@@ -43,15 +45,18 @@ import static org.junit.Assert.assertTrue;
public final class RepPolicyEntryHandlerTest {
private RepPolicyEntryHandler handler;
+ private AclManager aclManager;
@Before
public void setUp() {
handler = new RepPolicyEntryHandler();
+ aclManager = new DefaultAclManager();
}
@After
public void tearDown() {
handler = null;
+ aclManager = null;
}
@Test
@@ -198,18 +203,16 @@ public final class RepPolicyEntryHandlerTest {
@Test
public void parseEmptyAcl() throws Exception {
- Extension extension = TestUtils.createRepoInitExtension(handler, new
DefaultAclManager(), "/jcr_root/home/users/system/asd/_rep_policy.xml",
getClass().getResourceAsStream("/jcr_root/home/users/system/asd/_rep_policy.xml".substring(1)),
new ByteArrayOutputStream());
+ Extension extension = TestUtils.createRepoInitExtension(handler,
aclManager, "/jcr_root/home/users/system/asd/_rep_policy.xml",
getClass().getResourceAsStream("/jcr_root/home/users/system/asd/_rep_policy.xml".substring(1)),
new ByteArrayOutputStream());
assertNull(extension);
}
@Test
public void policyAtAuthorizableFolder() throws Exception {
SystemUser s1 = new SystemUser("service1", new
RepoPath("/home/users/system/services/random1"), new
RepoPath("/home/users/system/services"));
-
- AclManager aclManager = new DefaultAclManager();
aclManager.addSystemUser(s1);
- ParseResult result =
parseAndSetRepoInit("/jcr_root/home/groups/g/_rep_policy.xml", aclManager);
+ ParseResult result =
parseAndSetRepoinit("/jcr_root/home/groups/g/_rep_policy.xml", aclManager);
Extension repoinitExtension = result.getRepoinitExtension();
String expected =
@@ -225,12 +228,10 @@ public final class RepPolicyEntryHandlerTest {
public void policyAtGroupNode() throws Exception {
SystemUser s1 = new SystemUser("service1", new
RepoPath("/home/users/system/services/random1"), new
RepoPath("/home/users/system/services"));
Group gr = new Group("testgroup", new
RepoPath("/home/groups/g/HjDnfdMCjekaF4jhhUvO"), new
RepoPath("/home/groups/g"));
-
- AclManager aclManager = new DefaultAclManager();
aclManager.addSystemUser(s1);
aclManager.addGroup(gr);
-
parseAndSetRepoInit("/jcr_root/home/groups/g/HjDnfdMCjekaF4jhhUvO/_rep_policy.xml",
aclManager);
+
parseAndSetRepoinit("/jcr_root/home/groups/g/HjDnfdMCjekaF4jhhUvO/_rep_policy.xml",
aclManager);
}
@Test(expected = IllegalStateException.class)
@@ -238,11 +239,10 @@ public final class RepPolicyEntryHandlerTest {
SystemUser s1 = new SystemUser("service1", new
RepoPath("/home/users/system/services/random1"), new
RepoPath("/home/users/system/services"));
Group gr = new Group("testgroup3", new
RepoPath("/home/groups/g/ouStmkrzT9wCEhtMD9sT"), new
RepoPath("/home/groups/g"));
- AclManager aclManager = new DefaultAclManager();
aclManager.addSystemUser(s1);
aclManager.addGroup(gr);
-
parseAndSetRepoInit("/jcr_root/home/groups/g/ouStmkrzT9wCEhtMD9sT/profile/_rep_policy.xml",
aclManager);
+
parseAndSetRepoinit("/jcr_root/home/groups/g/ouStmkrzT9wCEhtMD9sT/profile/_rep_policy.xml",
aclManager);
}
@Test(expected = IllegalStateException.class)
@@ -250,11 +250,32 @@ public final class RepPolicyEntryHandlerTest {
SystemUser s1 = new SystemUser("service1", new
RepoPath("/home/users/system/services/random1"), new
RepoPath("/home/users/system/services"));
User user = new User("author", new RepoPath("/home/users/a/author"),
new RepoPath("/home/users/a"));
- AclManager aclManager = new DefaultAclManager();
aclManager.addSystemUser(s1);
aclManager.addUser(user);
- parseAndSetRepoInit("/jcr_root/home/users/a/author/_rep_policy.xml",
aclManager);
+ parseAndSetRepoinit("/jcr_root/home/users/a/author/_rep_policy.xml",
aclManager);
+ }
+
+ @Test
+ public void parseJackrabbit2Restrictions() throws Exception {
+ RepoPath repoPath = new
RepoPath("/home/users/system/services/random1");
+ SystemUser systemUser = new SystemUser("service1", repoPath, new
RepoPath("/home/users/system/services"));
+ aclManager.addSystemUser(systemUser);
+
+ String path = "/jcr_root/asd/jr2restrictions/_rep_policy.xml";
+ Extension repoinitExtension = parseAndSetRepoinit(path,
aclManager).getRepoinitExtension();
+ String expected =
+ "create service user service1 with path
/home/users/system/services" + System.lineSeparator() +
+ "set ACL for service1\n" +
+ "allow jcr:read on /asd/jr2restrictions
restriction(rep:glob,*/subtree/*)
restriction(sling:customRestriction,sling:value1,sling:value2)\n" +
+ "end\n";
+
+ String actual = repoinitExtension.getText();
+ assertEquals(expected, actual);
+
+ RepoInitParser repoInitParser = new RepoInitParserService();
+ List<Operation> operations = repoInitParser.parse(new
StringReader(actual));
+ assertFalse(operations.isEmpty());
}
private ParseResult parseAndSetRepoinit(String...systemUsersNames) throws
Exception {
@@ -271,15 +292,14 @@ public final class RepPolicyEntryHandlerTest {
private ParseResult parseAndSetRepoinit(@NotNull SystemUser...systemUsers)
throws Exception {
String path = "/jcr_root/home/users/system/asd/_rep_policy.xml";
- AclManager aclManager = new DefaultAclManager();
for (SystemUser systemUser : systemUsers) {
aclManager.addSystemUser(systemUser);
}
- return parseAndSetRepoInit(path, aclManager);
+ return parseAndSetRepoinit(path, aclManager);
}
@NotNull
- private ParseResult parseAndSetRepoInit(@NotNull String path, @NotNull
AclManager aclManager) throws Exception {
+ private ParseResult parseAndSetRepoinit(@NotNull String path, @NotNull
AclManager aclManager) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
return new ParseResult(TestUtils.createRepoInitExtension(handler,
aclManager, path, getClass().getResourceAsStream(path.substring(1)), baos), new
String(baos.toByteArray()));
}
diff --git
a/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPrincipalPolicyEntryHandlerTest.java
b/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPrincipalPolicyEntryHandlerTest.java
index fa4e04e..04af9d7 100644
---
a/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPrincipalPolicyEntryHandlerTest.java
+++
b/src/test/java/org/apache/sling/feature/cpconverter/handlers/RepPrincipalPolicyEntryHandlerTest.java
@@ -87,7 +87,7 @@ public final class RepPrincipalPolicyEntryHandlerTest {
String expected =
"create service user service2 with path
/home/users/system/services" + System.lineSeparator() +
"set principal ACL for service2\n" +
- "allow jcr:read on /asd/public
restriction(rep:ntNames,nt:folder,sling:Folder)\n" +
+ "allow jcr:read on /asd/public
restriction(rep:ntNames,nt:folder,sling:Folder)
restriction(sling:customRestriction,customRestrictionValue)\n" +
"end\n";
String actual = repoinitExtension.getText();
diff --git
a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/asd/jr2restrictions/.content.xml
similarity index 62%
copy from
src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
copy to
src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/asd/jr2restrictions/.content.xml
index 38f5335..0589bcb 100644
---
a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
+++
b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/asd/jr2restrictions/.content.xml
@@ -15,15 +15,5 @@
License for the specific language governing permissions and limitations under
the License.
-->
-<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal"
- jcr:primaryType="rep:PrincipalPolicy"
- rep:principalName="service2">
- <entry0
- jcr:primaryType="rep:PrincipalEntry"
- rep:privileges="{Name}[jcr:read]"
- rep:effectivePath="/asd/public">
- <rep:restrictions
- jcr:primaryType="rep:Restrictions"
- rep:ntNames="{Name}[nt:folder,sling:Folder]"/>
- </entry0>
-</jcr:root>
+<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
xmlns:jcr="http://www.jcp.org/jcr/1.0"
+ jcr:primaryType="sling:Folder"/>
diff --git
a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/asd/jr2restrictions/_rep_policy.xml
similarity index 72%
copy from
src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
copy to
src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/asd/jr2restrictions/_rep_policy.xml
index 38f5335..852cb01 100644
---
a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
+++
b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/asd/jr2restrictions/_rep_policy.xml
@@ -15,15 +15,12 @@
License for the specific language governing permissions and limitations under
the License.
-->
-<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal"
- jcr:primaryType="rep:PrincipalPolicy"
- rep:principalName="service2">
- <entry0
- jcr:primaryType="rep:PrincipalEntry"
+<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal"
xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
+ jcr:primaryType="rep:ACL">
+ <allow0
+ jcr:primaryType="rep:GrantACE"
+ rep:principalName="service1"
rep:privileges="{Name}[jcr:read]"
- rep:effectivePath="/asd/public">
- <rep:restrictions
- jcr:primaryType="rep:Restrictions"
- rep:ntNames="{Name}[nt:folder,sling:Folder]"/>
- </entry0>
+ rep:glob="{Name}[*/subtree/*]"
+ sling:customRestriction="{Name}[sling:value1,sling:value2]"/>
</jcr:root>
diff --git
a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
index 38f5335..d2da38d 100644
---
a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
+++
b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/jcr_root/home/users/system/services/random2/_rep_principalPolicy.xml
@@ -15,7 +15,7 @@
License for the specific language governing permissions and limitations under
the License.
-->
-<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal"
+<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal"
xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
jcr:primaryType="rep:PrincipalPolicy"
rep:principalName="service2">
<entry0
@@ -24,6 +24,7 @@
rep:effectivePath="/asd/public">
<rep:restrictions
jcr:primaryType="rep:Restrictions"
- rep:ntNames="{Name}[nt:folder,sling:Folder]"/>
+ rep:ntNames="{Name}[nt:folder,sling:Folder]"
+ sling:customRestriction="customRestrictionValue"/>
</entry0>
</jcr:root>