Author: angela
Date: Wed May 3 13:56:39 2017
New Revision: 1793646
URL: http://svn.apache.org/viewvc?rev=1793646&view=rev
Log:
OAK-5947 : Allowing non-admin user to set repository permissions fails
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermission.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/RepoLevelPolicyTest.java
- copied, changed from r1792701,
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/SetRepoLevelPolicyTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermissionTest.java
Removed:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/SetRepoLevelPolicyTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java?rev=1793646&r1=1793645&r2=1793646&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/CompiledPermissionImpl.java
Wed May 3 13:56:39 2017
@@ -44,6 +44,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.version.ReadOnlyVersionManager;
import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
import org.apache.jackrabbit.oak.spi.security.Context;
+import
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
import
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionConstants;
import
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
import
org.apache.jackrabbit.oak.spi.security.authorization.permission.RepositoryPermission;
@@ -165,6 +166,8 @@ final class CompiledPermissionImpl imple
}
if (parentPermission instanceof VersionTreePermission) {
return ((VersionTreePermission)
parentPermission).createChildPermission(tree);
+ } else if (parentPermission instanceof RepoPolicyTreePermission) {
+ return
((RepoPolicyTreePermission)parentPermission).getChildPermission();
}
switch (type) {
case HIDDEN:
@@ -190,6 +193,12 @@ final class CompiledPermissionImpl imple
return new VersionTreePermission(tree,
buildVersionDelegatee(versionableTree));
}
}
+ case ACCESS_CONTROL:
+ if
(AccessControlConstants.REP_REPO_POLICY.equals(tree.getName())) {
+ return new
RepoPolicyTreePermission(getRepositoryPermission());
+ } else {
+ return new TreePermissionImpl(tree, type,
parentPermission);
+ }
case INTERNAL:
return EMPTY;
default:
@@ -432,6 +441,8 @@ final class CompiledPermissionImpl imple
return TreeType.DEFAULT;
} else if (parentPermission instanceof VersionTreePermission) {
return TreeType.VERSION;
+ } else if (parentPermission instanceof RepoPolicyTreePermission) {
+ return TreeType.ACCESS_CONTROL;
} else {
throw new IllegalArgumentException("Illegal TreePermission
implementation.");
}
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermission.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermission.java?rev=1793646&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermission.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermission.java
Wed May 3 13:56:39 2017
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.security.authorization.permission;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.RepositoryPermission;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+/**
+ * {@code TreePermission} implementation for the access control policy
coverying
+ * repository level permissions. In this implementation these permissions are
+ * managed in the policy tree defined at /rep:repoPolicy, which is considered
+ * protected access control content.
+ *
+ * This implementation relies on the precondition that the subtree defined by
the
+ * /rep:repoPolicy node only consists of trees of type access control.
Consequently,
+ * read access to trees and properties is granted if and only if {@link
Permissions#READ_ACCESS_CONTROL}
+ * is granted at the repo-level.
+ *
+ * For the same reason any other permissions are evaluated by checking the
+ * {@link
org.apache.jackrabbit.oak.spi.security.authorization.permission.RepositoryPermission},
+ * which apply for all items defined by this special subtree.
+ */
+final class RepoPolicyTreePermission implements TreePermission {
+
+ private RepositoryPermission repoPermission;
+ private ReadStatus readStatus;
+
+ RepoPolicyTreePermission(RepositoryPermission repoPermission) {
+ this.repoPermission = repoPermission;
+ }
+
+ TreePermission getChildPermission() {
+ return this;
+ }
+
+ //-----------------------------------------------------< TreePermission
>---
+ @Nonnull
+ @Override
+ public TreePermission getChildPermission(@Nonnull String childName,
@Nonnull NodeState childState) {
+ return getChildPermission();
+ }
+
+ @Override
+ public boolean canRead() {
+ return getReadStatus().allowsThis();
+ }
+
+ @Override
+ public boolean canRead(@Nonnull PropertyState property) {
+ return getReadStatus().allowsThis();
+ }
+
+ @Override
+ public boolean canReadAll() {
+ return getReadStatus().allowsAll();
+ }
+
+ @Override
+ public boolean canReadProperties() {
+ return getReadStatus().allowsProperties();
+ }
+
+ @Override
+ public boolean isGranted(long permissions) {
+ return repoPermission.isGranted(permissions);
+ }
+
+ @Override
+ public boolean isGranted(long permissions, @Nonnull PropertyState
property) {
+ return repoPermission.isGranted(permissions);
+ }
+
+ private ReadStatus getReadStatus() {
+ if (readStatus == null) {
+ boolean canRead =
repoPermission.isGranted(Permissions.READ_ACCESS_CONTROL);
+ readStatus = (canRead) ? ReadStatus.ALLOW_ALL :
ReadStatus.DENY_ALL;
+ }
+ return readStatus;
+ }
+}
Copied:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/RepoLevelPolicyTest.java
(from r1792701,
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/SetRepoLevelPolicyTest.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/RepoLevelPolicyTest.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/RepoLevelPolicyTest.java&p1=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/SetRepoLevelPolicyTest.java&r1=1792701&r2=1793646&rev=1793646&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/SetRepoLevelPolicyTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/RepoLevelPolicyTest.java
Wed May 3 13:56:39 2017
@@ -16,84 +16,112 @@
*/
package org.apache.jackrabbit.oak.security.authorization.evaluation;
+import java.util.Set;
import javax.jcr.AccessDeniedException;
import javax.jcr.PathNotFoundException;
+import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.Privilege;
+import com.google.common.collect.ImmutableSet;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
-import org.junit.Ignore;
import org.junit.Test;
-public class SetRepoLevelPolicyTest extends AbstractOakCoreTest {
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class RepoLevelPolicyTest extends AbstractOakCoreTest implements
PrivilegeConstants {
@Test(expected = PathNotFoundException.class)
public void testGetApplicablePoliciesRootNotReadable() throws Exception {
- setupPermission(null, getTestUser().getPrincipal(), true,
PrivilegeConstants.JCR_READ_ACCESS_CONTROL);
+ setupPermission(null, getTestUser().getPrincipal(), true,
JCR_READ_ACCESS_CONTROL);
getAccessControlManager(getTestRoot()).getApplicablePolicies((String)
null);
}
@Test(expected = PathNotFoundException.class)
public void testGetApplicablePoliciesRootNotReadable2() throws Exception {
- setupPermission(null, getTestUser().getPrincipal(), true,
PrivilegeConstants.JCR_READ, PrivilegeConstants.JCR_READ_ACCESS_CONTROL);
+ setupPermission(null, getTestUser().getPrincipal(), true, JCR_READ,
JCR_READ_ACCESS_CONTROL);
getAccessControlManager(getTestRoot()).getApplicablePolicies((String)
null);
}
@Test(expected = AccessDeniedException.class)
public void testGetApplicablePoliciesMissingAcPermission() throws
Exception {
- setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, PrivilegeConstants.JCR_READ);
+ setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, JCR_READ);
getAccessControlManager(getTestRoot()).getApplicablePolicies((String)
null);
}
@Test(expected = AccessDeniedException.class)
public void testGetApplicablePoliciesMissingAcPermission2() throws
Exception {
- setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, PrivilegeConstants.JCR_READ, PrivilegeConstants.JCR_READ_ACCESS_CONTROL);
+ setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, JCR_READ, JCR_READ_ACCESS_CONTROL);
getAccessControlManager(getTestRoot()).getApplicablePolicies((String)
null);
}
@Test
public void testGetApplicablePolicies() throws Exception {
- setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, PrivilegeConstants.JCR_READ);
- setupPermission(null, getTestUser().getPrincipal(), true,
PrivilegeConstants.JCR_READ_ACCESS_CONTROL);
+ setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, JCR_READ);
+ setupPermission(null, getTestUser().getPrincipal(), true,
JCR_READ_ACCESS_CONTROL);
getAccessControlManager(getTestRoot()).getApplicablePolicies((String)
null);
}
@Test(expected = AccessDeniedException.class)
public void testSetPolicyMissingAcPermission() throws Exception {
- setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, PrivilegeConstants.JCR_READ);
- setupPermission(null, getTestUser().getPrincipal(), true,
PrivilegeConstants.JCR_READ_ACCESS_CONTROL);
+ setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, JCR_READ);
+ setupPermission(null, getTestUser().getPrincipal(), true,
JCR_READ_ACCESS_CONTROL);
- setupPermission(getTestRoot(), null, EveryonePrincipal.getInstance(),
false, PrivilegeConstants.JCR_NAMESPACE_MANAGEMENT);
+ setupPermission(getTestRoot(), null, EveryonePrincipal.getInstance(),
false, JCR_NAMESPACE_MANAGEMENT);
}
@Test(expected = AccessDeniedException.class)
public void testSetPolicyMissingAcPermission2() throws Exception {
- setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, PrivilegeConstants.JCR_READ, PrivilegeConstants.JCR_READ_ACCESS_CONTROL,
PrivilegeConstants.JCR_MODIFY_ACCESS_CONTROL);
- setupPermission(null, getTestUser().getPrincipal(), true,
PrivilegeConstants.JCR_READ_ACCESS_CONTROL);
+ setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, JCR_READ, JCR_READ_ACCESS_CONTROL, JCR_MODIFY_ACCESS_CONTROL);
+ setupPermission(null, getTestUser().getPrincipal(), true,
JCR_READ_ACCESS_CONTROL);
- setupPermission(getTestRoot(), null, EveryonePrincipal.getInstance(),
false, PrivilegeConstants.JCR_NAMESPACE_MANAGEMENT);
+ setupPermission(getTestRoot(), null, EveryonePrincipal.getInstance(),
false, JCR_NAMESPACE_MANAGEMENT);
}
- @Ignore("OAK-5947")
@Test
public void testSetPolicy() throws Exception {
- setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, PrivilegeConstants.JCR_READ);
- setupPermission(null, getTestUser().getPrincipal(), true,
PrivilegeConstants.JCR_READ_ACCESS_CONTROL,
PrivilegeConstants.JCR_MODIFY_ACCESS_CONTROL);
+ setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, JCR_READ);
+ setupPermission(null, getTestUser().getPrincipal(), true,
JCR_READ_ACCESS_CONTROL, JCR_MODIFY_ACCESS_CONTROL);
- setupPermission(getTestRoot(), null, EveryonePrincipal.getInstance(),
false, PrivilegeConstants.JCR_NAMESPACE_MANAGEMENT);
+ setupPermission(getTestRoot(), null, EveryonePrincipal.getInstance(),
false, JCR_NAMESPACE_MANAGEMENT);
}
@Test
public void testSetPolicy2() throws Exception {
// see above: ac-related permissions should not be required on
ROOT_PATH (workaround for OAK-5947)
- setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, PrivilegeConstants.JCR_READ, PrivilegeConstants.JCR_READ_ACCESS_CONTROL,
PrivilegeConstants.JCR_MODIFY_ACCESS_CONTROL);
- setupPermission(null, getTestUser().getPrincipal(), true,
PrivilegeConstants.JCR_READ_ACCESS_CONTROL,
PrivilegeConstants.JCR_MODIFY_ACCESS_CONTROL);
+ setupPermission(PathUtils.ROOT_PATH, getTestUser().getPrincipal(),
true, JCR_READ, JCR_READ_ACCESS_CONTROL, JCR_MODIFY_ACCESS_CONTROL);
+ setupPermission(null, getTestUser().getPrincipal(), true,
JCR_READ_ACCESS_CONTROL, JCR_MODIFY_ACCESS_CONTROL);
+
+ setupPermission(getTestRoot(), null, EveryonePrincipal.getInstance(),
false, JCR_NAMESPACE_MANAGEMENT);
+ }
+
+ @Test
+ public void testHasPrivilege() throws Exception {
+ setupPermission(null, getTestUser().getPrincipal(), true,
JCR_READ_ACCESS_CONTROL, JCR_NAMESPACE_MANAGEMENT);
+
+ AccessControlManager testAcMgr =
getAccessControlManager(getTestRoot());
+ assertTrue(testAcMgr.hasPrivileges(null,
privilegesFromNames(JCR_NAMESPACE_MANAGEMENT)));
+ assertTrue(testAcMgr.hasPrivileges(null,
privilegesFromNames(JCR_READ_ACCESS_CONTROL)));
+ assertTrue(testAcMgr.hasPrivileges(null,
privilegesFromNames(JCR_READ_ACCESS_CONTROL, JCR_NAMESPACE_MANAGEMENT)));
+ assertFalse(testAcMgr.hasPrivileges(null,
privilegesFromNames(JCR_READ_ACCESS_CONTROL, JCR_MODIFY_ACCESS_CONTROL)));
+ assertFalse(testAcMgr.hasPrivileges(null,
privilegesFromNames(JCR_ALL)));
+ }
+
+ @Test
+ public void testGetPrivileges() throws Exception {
+ setupPermission(null, getTestUser().getPrincipal(), true,
JCR_READ_ACCESS_CONTROL, JCR_NAMESPACE_MANAGEMENT);
+
+ Set<Privilege> expected =
ImmutableSet.copyOf(privilegesFromNames(JCR_READ_ACCESS_CONTROL,
JCR_NAMESPACE_MANAGEMENT));
- setupPermission(getTestRoot(), null, EveryonePrincipal.getInstance(),
false, PrivilegeConstants.JCR_NAMESPACE_MANAGEMENT);
+ AccessControlManager testAcMgr =
getAccessControlManager(getTestRoot());
+ assertEquals(expected,
ImmutableSet.copyOf(testAcMgr.getPrivileges(null)));
}
}
\ No newline at end of file
Added:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermissionTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermissionTest.java?rev=1793646&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermissionTest.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/RepoPolicyTreePermissionTest.java
Wed May 3 13:56:39 2017
@@ -0,0 +1,244 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.security.authorization.permission;
+
+import java.security.Principal;
+import java.security.PrivilegedAction;
+import javax.annotation.Nonnull;
+import javax.jcr.security.AccessControlManager;
+import javax.security.auth.Subject;
+
+import com.google.common.collect.ImmutableSet;
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
+import
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.api.ContentSession;
+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.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
+import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+public class RepoPolicyTreePermissionTest extends AbstractSecurityTest
implements AccessControlConstants {
+
+ private static final String REPO_POLICY_PATH = '/' + REP_REPO_POLICY;
+
+ private AuthorizationConfiguration config;
+
+ private ContentSession accessSession;
+ private ContentSession noAccessSession;
+
+ @Override
+ public void before() throws Exception {
+ super.before();
+
+ Principal testPrincipal = getTestUser().getPrincipal();
+
+ AccessControlManager acMgr = getAccessControlManager(root);
+ JackrabbitAccessControlList acl =
AccessControlUtils.getAccessControlList(acMgr, null);
+ if (acl == null) {
+ throw new RuntimeException();
+ }
+
+ acl.addAccessControlEntry(testPrincipal,
privilegesFromNames(PrivilegeConstants.JCR_NAMESPACE_MANAGEMENT,
PrivilegeConstants.JCR_READ_ACCESS_CONTROL));
+ acl.addAccessControlEntry(EveryonePrincipal.getInstance(),
privilegesFromNames(PrivilegeConstants.JCR_READ));
+ acMgr.setPolicy(null, acl);
+ root.commit();
+ config =
getSecurityProvider().getConfiguration(AuthorizationConfiguration.class);
+
+ accessSession = createTestSession();
+
+ Subject notAllowedSubject = new Subject(true,
ImmutableSet.<Principal>of(EveryonePrincipal.getInstance()), ImmutableSet.of(),
ImmutableSet.of());
+ noAccessSession = Subject.doAs(notAllowedSubject,
(PrivilegedAction<ContentSession>) () -> {
+ try {
+ return getContentRepository().login(null, null);
+ } catch (Exception e) {
+ throw new RuntimeException();
+ }
+ });
+ }
+
+ @Override
+ public void after() throws Exception {
+ try {
+ AccessControlManager acMgr = getAccessControlManager(root);
+ JackrabbitAccessControlList acl =
AccessControlUtils.getAccessControlList(acMgr, null);
+ if (acl != null) {
+ acMgr.removePolicy(null, acl);
+ root.commit();
+ }
+ accessSession.close();
+ noAccessSession.close();
+ } finally {
+ super.after();
+ }
+ }
+
+ @Nonnull
+ private TreePermission getTreePermission(@Nonnull ContentSession cs,
@Nonnull String path) throws Exception {
+ Root r = cs.getLatestRoot();
+ PermissionProvider pp = config.getPermissionProvider(r,
cs.getWorkspaceName(), cs.getAuthInfo().getPrincipals());
+
+ Tree t = r.getTree(PathUtils.ROOT_PATH);
+ TreePermission tp = pp.getTreePermission(t, TreePermission.EMPTY);
+ for (String name : PathUtils.elements(path)) {
+ t = t.getChild(name);
+ tp = pp.getTreePermission(t, tp);
+ }
+ return tp;
+ }
+
+ @Test
+ public void testTreePermissionImpl() throws Exception {
+ TreePermission tp = getTreePermission(accessSession, REPO_POLICY_PATH);
+ assertTrue(tp instanceof RepoPolicyTreePermission);
+ }
+
+ @Test
+ public void testGetChildPermission() throws Exception {
+ TreePermission tp = getTreePermission(accessSession, REPO_POLICY_PATH);
+ assertSame(tp, tp.getChildPermission("childName",
EmptyNodeState.EMPTY_NODE));
+ }
+
+ @Test
+ public void testCanRead() throws Exception {
+ TreePermission tp = getTreePermission(accessSession, REPO_POLICY_PATH);
+ assertTrue(tp.canRead());
+ }
+
+ @Test
+ public void testCanRead2() throws Exception {
+ TreePermission tp = getTreePermission(noAccessSession,
REPO_POLICY_PATH);
+ assertFalse(tp.canRead());
+ }
+
+ @Test
+ public void testCanReadAceNode() throws Exception {
+ TreePermission tp = getTreePermission(accessSession,
root.getTree(REPO_POLICY_PATH).getChildren().iterator().next().getPath());
+ assertTrue(tp.canRead());
+ }
+
+ @Test
+ public void testCanReadAceNode2() throws Exception {
+ TreePermission tp = getTreePermission(noAccessSession,
root.getTree(REPO_POLICY_PATH).getChildren().iterator().next().getPath());
+ assertFalse(tp.canRead());
+ }
+
+
+ @Test
+ public void testCanReadProperty() throws Exception {
+ TreePermission tp = getTreePermission(accessSession, REPO_POLICY_PATH);
+
assertTrue(tp.canRead(PropertyStates.createProperty(JcrConstants.JCR_PRIMARYTYPE,
NT_REP_ACL)));
+ }
+
+ @Test
+ public void testCanReadProperty2() throws Exception {
+ TreePermission tp = getTreePermission(noAccessSession,
REPO_POLICY_PATH);
+
assertFalse(tp.canRead(PropertyStates.createProperty(JcrConstants.JCR_PRIMARYTYPE,
NT_REP_ACL)));
+ }
+
+
+ @Test
+ public void testCanReadPropertyAceNode() throws Exception {
+ Tree aceTree =
root.getTree(REPO_POLICY_PATH).getChildren().iterator().next();
+ PropertyState principalProp = aceTree.getProperty(REP_PRINCIPAL_NAME);
+
+ TreePermission tp = getTreePermission(accessSession,
aceTree.getPath());
+ assertTrue(tp.canRead(principalProp));
+ }
+
+ @Test
+ public void testCanReadPropertyAceNode2() throws Exception {
+ Tree aceTree =
root.getTree(REPO_POLICY_PATH).getChildren().iterator().next();
+ PropertyState principalProp = aceTree.getProperty(REP_PRINCIPAL_NAME);
+
+ TreePermission tp = getTreePermission(noAccessSession,
aceTree.getPath());
+ assertFalse(tp.canRead(principalProp));
+ }
+
+ @Test
+ public void testCanReadProperties() throws Exception {
+ TreePermission tp = getTreePermission(accessSession, REPO_POLICY_PATH);
+ assertTrue(tp.canReadProperties());
+ }
+
+ @Test
+ public void testCanReadProperties2() throws Exception {
+ TreePermission tp = getTreePermission(noAccessSession,
REPO_POLICY_PATH);
+ assertFalse(tp.canReadProperties());
+ }
+
+ @Test
+ public void testCanReadAll() throws Exception {
+ TreePermission tp = getTreePermission(accessSession, REPO_POLICY_PATH);
+ assertFalse(tp.canReadAll());
+ }
+
+ @Test
+ public void testCanReadAll2() throws Exception {
+ TreePermission tp = getTreePermission(noAccessSession,
REPO_POLICY_PATH);
+ assertFalse(tp.canReadAll());
+ }
+
+ @Test
+ public void testIsGranted() throws Exception {
+ TreePermission tp = getTreePermission(accessSession, REPO_POLICY_PATH);
+ assertTrue(tp.isGranted(Permissions.NAMESPACE_MANAGEMENT));
+ assertFalse(tp.isGranted(Permissions.WORKSPACE_MANAGEMENT));
+
assertFalse(tp.isGranted(Permissions.NAMESPACE_MANAGEMENT|Permissions.WORKSPACE_MANAGEMENT));
+ }
+
+ @Test
+ public void testIsGranted2() throws Exception {
+ TreePermission tp = getTreePermission(noAccessSession,
REPO_POLICY_PATH);
+ assertFalse(tp.isGranted(Permissions.NAMESPACE_MANAGEMENT));
+ assertFalse(tp.isGranted(Permissions.WORKSPACE_MANAGEMENT));
+
assertFalse(tp.isGranted(Permissions.NAMESPACE_MANAGEMENT|Permissions.WORKSPACE_MANAGEMENT));
+ }
+
+ @Test
+ public void testIsGrantedProperty() throws Exception {
+ PropertyState ps = PropertyStates.createProperty("name", "value");
+ TreePermission tp = getTreePermission(accessSession, REPO_POLICY_PATH);
+ assertTrue(tp.isGranted(Permissions.NAMESPACE_MANAGEMENT, ps));
+ assertFalse(tp.isGranted(Permissions.WORKSPACE_MANAGEMENT, ps));
+
assertFalse(tp.isGranted(Permissions.NAMESPACE_MANAGEMENT|Permissions.WORKSPACE_MANAGEMENT,
ps));
+ }
+
+ @Test
+ public void testIsGrantedProperty2() throws Exception {
+ PropertyState ps = PropertyStates.createProperty("name", "value");
+ TreePermission tp = getTreePermission(noAccessSession,
REPO_POLICY_PATH);
+ assertFalse(tp.isGranted(Permissions.NAMESPACE_MANAGEMENT, ps));
+ assertFalse(tp.isGranted(Permissions.WORKSPACE_MANAGEMENT, ps));
+
assertFalse(tp.isGranted(Permissions.NAMESPACE_MANAGEMENT|Permissions.WORKSPACE_MANAGEMENT,
ps));
+ }
+}
\ No newline at end of file