Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/authorization/AccessControlEntryImpl.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/authorization/AccessControlEntryImpl.java (revision 1896980) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/authorization/AccessControlEntryImpl.java (date 1642062851040) @@ -17,13 +17,13 @@ package org.apache.jackrabbit.core.security.authorization; import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry; +import org.apache.jackrabbit.api.security.authorization.PrivilegeCollection; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.commons.conversion.NameResolver; import org.apache.jackrabbit.value.ValueHelper; import javax.jcr.NamespaceException; import javax.jcr.RepositoryException; -import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.Value; import javax.jcr.ValueFactory; import javax.jcr.security.AccessControlException; @@ -31,6 +31,7 @@ import java.security.Principal; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -307,6 +308,34 @@ return new Value[] {getRestriction(restrictionName)}; } + @Override + public PrivilegeCollection getPrivilegeCollection() { + return new PrivilegeCollection() { + @Override + public Privilege[] getPrivileges() { + return AccessControlEntryImpl.this.getPrivileges(); + } + + @Override + public boolean includes(String... privilegeNames) throws RepositoryException { + if (privilegeNames.length == 0) { + return true; + } + PrivilegeBits pb = AccessControlEntryImpl.this.getPrivilegeBits(); + if (pb.isEmpty()) { + return false; + } + Set privileges = new HashSet<>(privilegeNames.length); + PrivilegeManagerImpl privilegeMgr = getPrivilegeManager(); + for (String pName : privilegeNames) { + privileges.add(privilegeMgr.getPrivilege(pName)); + } + PrivilegeBits toTest = privilegeMgr.getBits(privileges.toArray(new Privilege[0])); + return pb.includes(toTest); + } + }; + } + //-------------------------------------------------------------< Object >--- /** * @see Object#hashCode() Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractACLTemplateTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractACLTemplateTest.java (revision 1896980) +++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractACLTemplateTest.java (date 1642063186482) @@ -20,6 +20,7 @@ import java.util.Collections; import javax.jcr.RepositoryException; +import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.Value; import javax.jcr.security.AccessControlEntry; import javax.jcr.security.AccessControlException; @@ -29,6 +30,7 @@ import org.apache.jackrabbit.api.JackrabbitWorkspace; import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry; import org.apache.jackrabbit.api.security.JackrabbitAccessControlList; +import org.apache.jackrabbit.api.security.authorization.PrivilegeCollection; import org.apache.jackrabbit.api.security.principal.PrincipalIterator; import org.apache.jackrabbit.api.security.principal.PrincipalManager; import org.apache.jackrabbit.core.security.TestPrincipal; @@ -130,6 +132,11 @@ return null; } + @Override + public PrivilegeCollection getPrivilegeCollection() throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + public Principal getPrincipal() { return testPrincipal; } @@ -169,6 +176,11 @@ return null; } + @Override + public PrivilegeCollection getPrivilegeCollection() throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + public Principal getPrincipal() { return testPrincipal; } Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractEntryTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractEntryTest.java (revision 1896980) +++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/authorization/AbstractEntryTest.java (date 1642063624038) @@ -24,16 +24,20 @@ import java.util.Map; import javax.jcr.RepositoryException; +import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.Value; import javax.jcr.security.AccessControlEntry; import javax.jcr.security.AccessControlException; import javax.jcr.security.Privilege; import org.apache.jackrabbit.api.JackrabbitWorkspace; +import org.apache.jackrabbit.api.security.authorization.PrivilegeCollection; import org.apache.jackrabbit.test.NotExecutableException; import org.apache.jackrabbit.test.api.security.AbstractAccessControlTest; import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry; +import static org.junit.Assert.assertArrayEquals; + /** * AbstractEntryTest... */ @@ -125,6 +129,22 @@ assertEquals(privMgr.getBits(privs), privMgr.getBits(entry.getPrivileges())); } + public void testGetPrivilegeCollection() throws RepositoryException, NotExecutableException { + JackrabbitAccessControlEntry entry = createEntry(new String[] {Privilege.JCR_READ, Privilege.JCR_WRITE}, true); + + PrivilegeCollection pc = entry.getPrivilegeCollection(); + assertArrayEquals(entry.getPrivileges(), pc.getPrivileges()); + + assertTrue(pc.includes(Privilege.JCR_READ)); + assertTrue(pc.includes(Privilege.JCR_WRITE)); + assertTrue(pc.includes(Privilege.JCR_READ, Privilege.JCR_WRITE)); + assertTrue(pc.includes(Privilege.JCR_READ, Privilege.JCR_MODIFY_PROPERTIES, Privilege.JCR_REMOVE_CHILD_NODES)); + + assertFalse(pc.includes(Privilege.JCR_READ, Privilege.JCR_LIFECYCLE_MANAGEMENT)); + assertFalse(pc.includes(Privilege.JCR_VERSION_MANAGEMENT)); + assertFalse(pc.includes(Privilege.JCR_ALL)); + } + public void testEquals() throws RepositoryException, NotExecutableException { Map equalAces = new HashMap(); @@ -210,6 +230,11 @@ return null; } + @Override + public PrivilegeCollection getPrivilegeCollection() throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + public Principal getPrincipal() { return testPrincipal; } @@ -298,6 +323,11 @@ return null; } + @Override + public PrivilegeCollection getPrivilegeCollection() throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + public Principal getPrincipal() { return testPrincipal; } Index: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/authorization/jackrabbit/acl/AccessControlEntryImpl.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/authorization/jackrabbit/acl/AccessControlEntryImpl.java (revision 1896980) +++ jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/security/authorization/jackrabbit/acl/AccessControlEntryImpl.java (date 1642064275112) @@ -25,12 +25,14 @@ import java.util.Map; import java.util.Set; import javax.jcr.RepositoryException; +import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.Value; import javax.jcr.ValueFormatException; import javax.jcr.security.AccessControlException; import javax.jcr.security.Privilege; import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry; +import org.apache.jackrabbit.api.security.authorization.PrivilegeCollection; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.QValue; import org.apache.jackrabbit.spi.QValueFactory; @@ -152,6 +154,11 @@ return new Value[] {getRestriction(restrictionName)}; } + @Override + public PrivilegeCollection getPrivilegeCollection() throws RepositoryException { + throw new UnsupportedRepositoryOperationException(); + } + //-------------------------------------------------------------< Object >--- @Override public int hashCode() { Index: jackrabbit-parent/pom.xml IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- jackrabbit-parent/pom.xml (revision 1896980) +++ jackrabbit-parent/pom.xml (date 1642061892102) @@ -46,7 +46,7 @@ -Xmx256m ${test.opts.modules} ${test.opts.coverage} ${test.opts.memory} -enableassertions - 1.40.0 + 1.42.0 9.2.30.v20200428 2.2.1 ${project.build.sourceEncoding}