Added:
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManagerTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManagerTest.java?rev=1857551&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManagerTest.java
(added)
+++
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManagerTest.java
Mon Apr 15 07:16:49 2019
@@ -0,0 +1,516 @@
+/*
+ * 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.spi.security.authorization.principalbased.impl;
+
+import com.google.common.collect.ImmutableSet;
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlPolicy;
+import org.apache.jackrabbit.api.security.principal.ItemBasedPrincipal;
+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.tree.TreeUtil;
+import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
+import
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.ImmutableACL;
+import
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.FilterProvider;
+import
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.PrincipalPolicy;
+import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.security.AccessControlException;
+import javax.jcr.security.AccessControlPolicy;
+import javax.jcr.security.Privilege;
+import java.security.Principal;
+import java.util.Set;
+
+import static
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl.Constants.MIX_REP_PRINCIPAL_BASED_MIXIN;
+import static
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl.Constants.REP_PRINCIPAL_POLICY;
+import static
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl.MockUtility.mockFilterProvider;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_ADD_CHILD_NODES;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_LOCK_MANAGEMENT;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_NODE_TYPE_MANAGEMENT;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_READ;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_READ_ACCESS_CONTROL;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_REMOVE_CHILD_NODES;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_REMOVE_NODE;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_RETENTION_MANAGEMENT;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_VERSION_MANAGEMENT;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_WORKSPACE_MANAGEMENT;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_READ_NODES;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.REP_WRITE;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public class PrincipalBasedAccessControlManagerTest extends
AbstractPrincipalBasedTest {
+
+ private PrincipalBasedAccessControlManager acMgr;
+ private ItemBasedPrincipal validPrincipal;
+
+ @Before
+ public void testBefore() throws Exception {
+ super.before();
+
+ acMgr = createAccessControlManager(root, getFilterProvider());
+ validPrincipal = (ItemBasedPrincipal)
getTestSystemUser().getPrincipal();
+ }
+
+ private PrincipalBasedAccessControlManager createAccessControlManager(Root
root, @NotNull FilterProvider filterProvider) {
+ return new
PrincipalBasedAccessControlManager(getMgrProvider(this.root), filterProvider);
+ }
+
+ private PrincipalPolicyImpl createValidPolicy() throws RepositoryException
{
+ String oakPath =
getNamePathMapper().getOakPath(validPrincipal.getPath());
+ return new PrincipalPolicyImpl(validPrincipal, oakPath,
getMgrProvider(root));
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testGetApplicablePoliciesNullPrincipal() throws Exception {
+ acMgr.getApplicablePolicies((Principal) null);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testGetApplicablePoliciesEmptyPrincipalName() throws Exception
{
+ acMgr.getApplicablePolicies(new PrincipalImpl(""));
+ }
+
+ @Test
+ public void testGetApplicablePoliciesPrincipalNotHandled() throws
Exception {
+ PrincipalBasedAccessControlManager mgr =
createAccessControlManager(root, mockFilterProvider(false));
+ assertEquals(0, mgr.getApplicablePolicies(validPrincipal).length);
+ }
+
+ @Test
+ public void testGetApplicablePoliciesPrincipalHandled() throws Exception {
+ PrincipalBasedAccessControlManager mgr =
createAccessControlManager(root, mockFilterProvider(true));
+ AccessControlPolicy[] applicable =
mgr.getApplicablePolicies(validPrincipal);
+ assertEquals(1, applicable.length);
+ assertTrue(applicable[0] instanceof PrincipalPolicyImpl);
+ }
+
+ @Test
+ public void testGetSetPolicy() throws Exception {
+ AccessControlPolicy[] applicable =
acMgr.getApplicablePolicies(validPrincipal);
+ assertEquals(1, applicable.length);
+ assertEquals(0, acMgr.getPolicies(validPrincipal).length);
+
+ PrincipalPolicyImpl policy = (PrincipalPolicyImpl) applicable[0];
+ policy.addEntry(testContentJcrPath, privilegesFromNames(JCR_READ));
+
+ acMgr.setPolicy(policy.getPath(), policy);
+ assertEquals(0, acMgr.getApplicablePolicies(validPrincipal).length);
+ assertEquals(1, acMgr.getPolicies(validPrincipal).length);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testGetPoliciesNullPrincipal() throws Exception {
+ acMgr.getPolicies((Principal) null);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testGetPoliciesEmptyPrincipalName() throws Exception {
+ acMgr.getPolicies(new PrincipalImpl(""));
+ }
+
+ @Test
+ public void testGetPoliciesPrincipalNotHandled() throws Exception {
+ PrincipalBasedAccessControlManager mgr =
createAccessControlManager(root, mockFilterProvider(false));
+ assertEquals(0, mgr.getPolicies(validPrincipal).length);
+ }
+
+ @Test
+ public void testGetPoliciesAccessControlledTree() throws Exception {
+ Tree tree =
root.getTree(getNamePathMapper().getOakPath(validPrincipal.getPath()));
+ TreeUtil.addMixin(tree, MIX_REP_PRINCIPAL_BASED_MIXIN,
root.getTree(NodeTypeConstants.NODE_TYPES_PATH), "uid");
+ assertEquals(0, acMgr.getPolicies(validPrincipal).length);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testGetEffectivePoliciesEmptyPrincipalName() throws Exception {
+ acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal, new
PrincipalImpl("")));
+ }
+
+ @Test
+ public void testGetEffectivePoliciesNothingSet() throws Exception {
+ assertEquals(0,
acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal)).length);
+ }
+
+ @Test
+ public void testGetEffectivePolicies() throws Exception {
+ PrincipalPolicyImpl policy = (PrincipalPolicyImpl)
acMgr.getApplicablePolicies(validPrincipal)[0];
+ policy.addEntry(testContentJcrPath,
privilegesFromNames(PrivilegeConstants.JCR_ALL));
+ acMgr.setPolicy(policy.getPath(), policy);
+
+ // transient changes => no effective policy
+ AccessControlPolicy[] effective =
acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal));
+ assertEquals(0, effective.length);
+
+ // after commit => effective policy present
+ root.commit();
+ effective =
acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal));
+ assertEquals(1, effective.length);
+ }
+
+ @Test
+ public void testGetEffectivePoliciesEmptyPolicySet() throws Exception {
+ JackrabbitAccessControlPolicy emptyPolicy =
acMgr.getApplicablePolicies(validPrincipal)[0];
+ acMgr.setPolicy(emptyPolicy.getPath(), emptyPolicy);
+ root.commit();
+ assertEquals(0,
acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal)).length);
+ }
+
+ @Test
+ public void testGetEffectivePoliciesRemovedPrincipal() throws Exception {
+ setupPrincipalBasedAccessControl(validPrincipal, null,
JCR_WORKSPACE_MANAGEMENT);
+ root.commit();
+
+ String id = getTestSystemUser().getID();
+ Root latestRoot = adminSession.getLatestRoot();
+ getUserManager(latestRoot).getAuthorizable(validPrincipal).remove();
+ latestRoot.commit();
+ try {
+ assertEquals(0,
acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal)).length);
+ } finally {
+ root.refresh();
+ getUserManager(root).createSystemUser(id, INTERMEDIATE_PATH);
+ root.commit();
+ }
+ }
+
+ /**
+ * Since principal-based permissions are only evaluated if the complete
set of principals is supported, the same
+ * should apply for {@link AccessControlManager#getEffectivePolicies(Set)}.
+ */
+ @Test
+ public void testGetEffectivePoliciesMixedPrincipalSet() throws Exception {
+ setupPrincipalBasedAccessControl(validPrincipal, testJcrPath,
JCR_READ);
+ root.commit();
+
+ Set<Principal> mixedPrincipalSet = ImmutableSet.of(validPrincipal,
getTestUser().getPrincipal());
+ assertEquals(0, acMgr.getEffectivePolicies(mixedPrincipalSet).length);
+ }
+
+ @Test
+ public void testGetEffectivePoliciesRemovedPolicy() throws Exception {
+ setupPrincipalBasedAccessControl(validPrincipal, null,
JCR_WORKSPACE_MANAGEMENT);
+ root.commit();
+
+ Root latestRoot = adminSession.getLatestRoot();
+
latestRoot.getTree(getNamePathMapper().getOakPath(validPrincipal.getPath())).getChild(REP_PRINCIPAL_POLICY).remove();
+ latestRoot.commit();
+
+ assertEquals(0,
acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal)).length);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testSetInvalidPolicy() throws Exception {
+ PrincipalPolicy policy = mock(PrincipalPolicy.class);
+ acMgr.setPolicy(validPrincipal.getPath(), policy);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testSetEffectivePolicy() throws Exception {
+ setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
REP_WRITE);
+ root.commit();
+
+ ImmutableACL effective = (ImmutableACL)
acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal))[0];
+ acMgr.setPolicy(effective.getPath(), effective);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testSetPolicyPathMismatch() throws Exception {
+ PrincipalPolicyImpl policy = createValidPolicy();
+ acMgr.setPolicy(policy.getOakPath(), policy);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testSetPolicyNullPath() throws Exception {
+ PrincipalPolicy policy = mock(PrincipalPolicy.class);
+ acMgr.setPolicy(null, policy);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testSetPolicyUnsupportedPath() throws Exception {
+ String unsupportedJcrPath =
getNamePathMapper().getJcrPath(PathUtils.getParentPath(SUPPORTED_PATH));
+ acMgr.setPolicy(unsupportedJcrPath, createValidPolicy());
+ }
+
+ @Test
+ public void testSetEmptyPolicy() throws Exception {
+ PrincipalPolicyImpl policy = createValidPolicy();
+ acMgr.setPolicy(policy.getPath(), policy);
+
+ assertEquals(1, acMgr.getPolicies(validPrincipal).length);
+ assertEquals(0, acMgr.getApplicablePolicies(validPrincipal).length);
+
assertTrue(root.getTree(policy.getOakPath()).hasChild(REP_PRINCIPAL_POLICY));
+ }
+
+ @Test
+ public void testSetPolicyNonExistingEffectivePath() throws Exception {
+ PrincipalPolicyImpl policy = getPrincipalPolicyImpl(validPrincipal,
acMgr);
+ policy.addEntry(testJcrPath, privilegesFromNames(JCR_READ));
+ acMgr.setPolicy(policy.getPath(), policy);
+ root.commit();
+ }
+
+ @Test
+ public void testSetPolicyRemovedEffectivePath() throws Exception {
+ setupContentTrees(TEST_OAK_PATH);
+ root.commit();
+
+ PrincipalPolicyImpl policy = getPrincipalPolicyImpl(validPrincipal,
acMgr);
+ policy.addEntry(testJcrPath, privilegesFromNames(JCR_READ));
+
+ root.getTree(TEST_OAK_PATH).remove();
+ root.commit();
+
+ acMgr.setPolicy(policy.getPath(), policy);
+ root.commit();
+ }
+
+ @Test
+ public void testSetPolicy() throws Exception {
+ PrincipalPolicyImpl policy =
setupPrincipalBasedAccessControl(validPrincipal, PathUtils.ROOT_PATH,
JCR_READ_ACCESS_CONTROL);
+ addPrincipalBasedEntry(policy, null, JCR_WORKSPACE_MANAGEMENT);
+
+ Tree policyTree =
root.getTree(policy.getOakPath()).getChild(REP_PRINCIPAL_POLICY);
+ assertTrue(policyTree.exists());
+ assertEquals(2, policyTree.getChildrenCount(10));
+
+ AccessControlPolicy[] policies = acMgr.getPolicies(validPrincipal);
+ assertEquals(1, policies.length);
+ assertEquals(2, ((PrincipalPolicyImpl)policies[0]).size());
+ assertEquals(0, acMgr.getApplicablePolicies(validPrincipal).length);
+ }
+
+ @Test
+ public void testSetPolicyRemovesAllChildNodes() throws Exception {
+ PrincipalPolicyImpl policy =
setupPrincipalBasedAccessControl(validPrincipal, testJcrPath, JCR_READ);
+
+ Tree policyTree =
root.getTree(policy.getOakPath()).getChild(REP_PRINCIPAL_POLICY);
+ TreeUtil.addChild(policyTree, "nonEntryChild",
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+
+ policy.removeAccessControlEntry(policy.getEntries().get(0));
+ policy.addEntry(testJcrPath, privilegesFromNames(REP_READ_NODES));
+ acMgr.setPolicy(policy.getPath(), policy);
+
+ policyTree =
root.getTree(policy.getOakPath()).getChild(REP_PRINCIPAL_POLICY);
+ assertFalse(policyTree.hasChild("nonEntryChild"));
+ policy = (PrincipalPolicyImpl) acMgr.getPolicies(validPrincipal)[0];
+ assertArrayEquals(privilegesFromNames(REP_READ_NODES),
policy.getEntries().get(0).getPrivileges());
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testRemoveInvalidPolicy() throws Exception {
+ PrincipalPolicy policy = mock(PrincipalPolicy.class);
+ acMgr.removePolicy(validPrincipal.getPath(), policy);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testRemoveEffectivePolicy() throws Exception {
+ setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
REP_WRITE);
+ root.commit();
+
+ ImmutableACL effective = (ImmutableACL)
acMgr.getEffectivePolicies(ImmutableSet.of(validPrincipal))[0];
+ acMgr.removePolicy(effective.getPath(), effective);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testRemovePolicyPathMismatch() throws Exception {
+ PrincipalPolicyImpl policy = createValidPolicy();
+ acMgr.removePolicy(PathUtils.getParentPath(policy.getPath()), policy);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testRemovePolicyNullPath() throws Exception {
+ PrincipalPolicy policy = mock(PrincipalPolicy.class);
+ acMgr.removePolicy(null, policy);
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testRemovePolicyUnsupportedPath() throws Exception {
+ String unsupportedJcrPath =
getNamePathMapper().getJcrPath(PathUtils.getParentPath(SUPPORTED_PATH));
+ acMgr.removePolicy(unsupportedJcrPath, createValidPolicy());
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void testRemovePolicyTreeAlreadyRemoved() throws Exception {
+ PrincipalPolicyImpl policy = createValidPolicy();
+ acMgr.setPolicy(policy.getPath(), policy);
+
+ // remove tree => then try to remove the policy
+
root.getTree(policy.getOakPath()).getChild(REP_PRINCIPAL_POLICY).remove();
+ acMgr.removePolicy(policy.getPath(), policy);
+ }
+
+ @Test
+ public void testRemoveEmptyPolicy() throws Exception {
+ PrincipalPolicyImpl policy = createValidPolicy();
+ acMgr.setPolicy(policy.getPath(), policy);
+
+ acMgr.removePolicy(policy.getPath(), policy);
+ assertEquals(0, acMgr.getPolicies(validPrincipal).length);
+ assertEquals(1, acMgr.getApplicablePolicies(validPrincipal).length);
+
assertFalse(root.getTree(policy.getOakPath()).hasChild(REP_PRINCIPAL_POLICY));
+ }
+
+ @Test
+ public void testRemovePolicy() throws Exception {
+ PrincipalPolicyImpl policy =
setupPrincipalBasedAccessControl(validPrincipal,
getNamePathMapper().getJcrPath(UserConstants.DEFAULT_USER_PATH),
PrivilegeConstants.REP_USER_MANAGEMENT);
+ addPrincipalBasedEntry(policy, null,
PrivilegeConstants.REP_PRIVILEGE_MANAGEMENT);
+
+ acMgr.removePolicy(policy.getPath(), policy);
+ assertEquals(0, acMgr.getPolicies(validPrincipal).length);
+ assertEquals(1, acMgr.getApplicablePolicies(validPrincipal).length);
+
assertFalse(root.getTree(policy.getOakPath()).hasChild(REP_PRINCIPAL_POLICY));
+ }
+
+ @Test
+ public void testGetApplicableByPath() throws RepositoryException {
+
assertFalse(acMgr.getApplicablePolicies(validPrincipal.getPath()).hasNext());
+ }
+
+ @Test(expected = PathNotFoundException.class)
+ public void testGetApplicableByNonExistingPath() throws
RepositoryException {
+ acMgr.getApplicablePolicies(testContentJcrPath);
+ }
+
+ @Test
+ public void testGetPoliciesByPath() throws RepositoryException {
+ assertEquals(0, acMgr.getPolicies(validPrincipal.getPath()).length);
+ }
+
+ @Test(expected = PathNotFoundException.class)
+ public void testGetPoliciesByNonExistingPath() throws RepositoryException {
+ acMgr.getPolicies(testContentJcrPath);
+ }
+
+ @Test
+ public void testGetEffectivePoliciesByPathNothingSet() throws Exception {
+ setupContentTrees(TEST_OAK_PATH);
+ assertEquals(0, acMgr.getEffectivePolicies(testContentJcrPath).length);
+ assertEquals(0, acMgr.getEffectivePolicies((String) null).length);
+ }
+
+ @Test
+ public void testGetEffectivePoliciesByPathTransientPolicy() throws
Exception {
+ setupContentTrees(TEST_OAK_PATH);
+ setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
JCR_VERSION_MANAGEMENT);
+
+ assertEquals(0, acMgr.getEffectivePolicies(testContentJcrPath).length);
+ assertEquals(0, acMgr.getEffectivePolicies(testJcrPath).length);
+ }
+
+ @Test(expected = PathNotFoundException.class)
+ public void testGetEffectivePoliciesByNonExistingPath() throws Exception {
+ PrincipalPolicyImpl policy =
setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
JCR_VERSION_MANAGEMENT);
+ addPrincipalBasedEntry(policy, PathUtils.ROOT_PATH, JCR_READ);
+ root.commit();
+
+ acMgr.getEffectivePolicies(testContentJcrPath);
+ }
+
+ @Test
+ public void testGetEffectivePoliciesByPath() throws Exception {
+ setupContentTrees(TEST_OAK_PATH);
+ PrincipalPolicyImpl policy =
setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
JCR_REMOVE_CHILD_NODES);
+ addPrincipalBasedEntry(policy, PathUtils.ROOT_PATH, JCR_READ);
+ root.commit();
+
+ assertEquals(2, acMgr.getEffectivePolicies(testJcrPath).length);
+ assertEquals(2, acMgr.getEffectivePolicies(testContentJcrPath).length);
+ assertEquals(1,
acMgr.getEffectivePolicies(PathUtils.ROOT_PATH).length);
+ }
+
+ @Test
+ public void testGetPolicyWithNonAceChild() throws Exception {
+ setupContentTrees(TEST_OAK_PATH);
+ PrincipalPolicyImpl policy =
setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
JCR_RETENTION_MANAGEMENT);
+ addPrincipalBasedEntry(policy, PathUtils.ROOT_PATH, JCR_READ);
+
+ Tree policyTree =
root.getTree(getNamePathMapper().getOakPath(policy.getPath())).getChild(REP_PRINCIPAL_POLICY);
+ TreeUtil.addChild(policyTree, "nonAceChild",
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+ // don't commit as adding such child without extra mixins was invalid
+
+ // read policy again -> must only contain 2 entries and ignore the
invalid child
+ policy = (PrincipalPolicyImpl) acMgr.getPolicies(validPrincipal)[0];
+ assertEquals(2, policy.size());
+ }
+
+ @Test
+ public void testGetPolicyMissingMixinType() throws Exception {
+ setupContentTrees(TEST_OAK_PATH);
+ PrincipalPolicyImpl policy =
setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
JCR_LOCK_MANAGEMENT);
+ addPrincipalBasedEntry(policy, PathUtils.ROOT_PATH, JCR_READ);
+
+ Tree policyTree =
root.getTree(getNamePathMapper().getOakPath(policy.getPath()));
+ policyTree.removeProperty(JcrConstants.JCR_MIXINTYPES);
+ // don't commit as access controlled node without mixin is invalid
+
+ // read policy again -> princial policy must not be read due to
missing mixin
+ assertEquals(0, acMgr.getPolicies(validPrincipal).length);
+ }
+
+ @Test
+ public void testHasPrivilegesByPrincipals() throws Exception {
+ setupContentTrees(TEST_OAK_PATH);
+ setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
JCR_NODE_TYPE_MANAGEMENT);
+
+ // setup default ac mgt only on subtree (testJcrPath)
+ addDefaultEntry(testJcrPath, validPrincipal, JCR_NODE_TYPE_MANAGEMENT);
+ root.commit();
+
+ // priv is only granted where both models are granting.
+ assertFalse(acMgr.hasPrivileges(testContentJcrPath,
ImmutableSet.of(validPrincipal),
privilegesFromNames(JCR_NODE_TYPE_MANAGEMENT)));
+ assertTrue(acMgr.hasPrivileges(testJcrPath,
ImmutableSet.of(validPrincipal),
privilegesFromNames(JCR_NODE_TYPE_MANAGEMENT)));
+
+ // set of principals not supported by principalbased-authorization =>
only default impl takes effect.
+ assertFalse(acMgr.hasPrivileges(testContentJcrPath,
ImmutableSet.of(validPrincipal, EveryonePrincipal.getInstance()),
privilegesFromNames(JCR_NODE_TYPE_MANAGEMENT)));
+ assertTrue(acMgr.hasPrivileges(testJcrPath,
ImmutableSet.of(validPrincipal, EveryonePrincipal.getInstance()),
privilegesFromNames(JCR_NODE_TYPE_MANAGEMENT)));
+ }
+
+ @Test
+ public void testGetPrivilegesByPrincipals() throws Exception {
+ setupContentTrees(TEST_OAK_PATH);
+ setupPrincipalBasedAccessControl(validPrincipal, testContentJcrPath,
JCR_ADD_CHILD_NODES, JCR_REMOVE_CHILD_NODES, JCR_REMOVE_NODE);
+
+ // grant different set of privs using the default ac mgt
+ addDefaultEntry(testContentJcrPath, validPrincipal, JCR_READ,
JCR_REMOVE_NODE);
+ root.commit();
+
+ // only subset is is granted
+ assertPrivileges(acMgr.getPrivileges(testContentJcrPath,
ImmutableSet.of(validPrincipal)), JCR_REMOVE_NODE);
+ assertPrivileges(acMgr.getPrivileges(testJcrPath,
ImmutableSet.of(validPrincipal)), JCR_REMOVE_NODE);
+
+ // set of principals not supported by principalbased-authorization =>
only default impl takes effect.
+ assertPrivileges(acMgr.getPrivileges(testContentJcrPath,
ImmutableSet.of(validPrincipal, EveryonePrincipal.getInstance())), JCR_READ,
JCR_REMOVE_NODE);
+ assertPrivileges(acMgr.getPrivileges(testJcrPath,
ImmutableSet.of(validPrincipal, EveryonePrincipal.getInstance())), JCR_READ,
JCR_REMOVE_NODE);
+ }
+
+ private void assertPrivileges(@NotNull Privilege[] privs, @NotNull
String... expectedOakPrivNames) throws Exception {
+
assertEquals(ImmutableSet.copyOf(privilegesFromNames(expectedOakPrivNames)),
ImmutableSet.copyOf(privs));
+ }
+}
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManagerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationOsgiTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationOsgiTest.java?rev=1857551&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationOsgiTest.java
(added)
+++
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationOsgiTest.java
Mon Apr 15 07:16:49 2019
@@ -0,0 +1,109 @@
+/*
+ * 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.spi.security.authorization.principalbased.impl;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.jackrabbit.oak.composite.MountInfoProviderService;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.apache.jackrabbit.util.Text;
+import org.apache.sling.testing.mock.osgi.ReferenceViolationException;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Rule;
+import org.junit.Test;
+
+import static
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl.AbstractPrincipalBasedTest.SUPPORTED_PATH;
+import static org.junit.Assert.assertTrue;
+
+public class PrincipalBasedAuthorizationConfigurationOsgiTest {
+
+ @Rule
+ public final OsgiContext context = new OsgiContext();
+
+ private final PrincipalBasedAuthorizationConfiguration pbac = new
PrincipalBasedAuthorizationConfiguration();
+
+ @NotNull
+ protected PrincipalBasedAuthorizationConfiguration
initPrincipalBasedAuthorizationConfiguration() {
+ // create instance without binding mandatory references
+ return new PrincipalBasedAuthorizationConfiguration();
+ }
+
+ @Test(expected = ReferenceViolationException.class)
+ public void testMissingMandatoryReferences() {
+ context.registerInjectActivateService(pbac, ImmutableMap.of());
+ }
+
+ @Test(expected = ReferenceViolationException.class)
+ public void testMissingMountInfoProviderReference() {
+ context.registerInjectActivateService(new FilterProviderImpl(),
ImmutableMap.of("path", SUPPORTED_PATH));
+ context.registerInjectActivateService(pbac);
+ }
+
+ @Test(expected = ReferenceViolationException.class)
+ public void testMissingFilterProviderReference() {
+ context.registerInjectActivateService(new MountInfoProviderService());
+ context.registerInjectActivateService(pbac, ImmutableMap.of());
+ }
+
+ @Test
+ public void testMountCollidingWithFilterRoot() {
+ FilterProviderImpl fp = new FilterProviderImpl();
+ context.registerInjectActivateService(fp, ImmutableMap.of("path",
SUPPORTED_PATH));
+
+ MountInfoProviderService mipService = new MountInfoProviderService();
+ context.registerInjectActivateService(mipService,
ImmutableMap.of("mountedPaths", new String[] {SUPPORTED_PATH + "/some/subtree",
"/etc"}));
+
+ try {
+ context.registerInjectActivateService(pbac, ImmutableMap.of());
+ } catch (RuntimeException e) {
+ assertTrue(e.getCause() instanceof IllegalStateException);
+ }
+ }
+
+ @Test
+ public void testMountMatchingFilterRoot() {
+ FilterProviderImpl fp = new FilterProviderImpl();
+ context.registerInjectActivateService(fp, ImmutableMap.of("path",
SUPPORTED_PATH));
+
+ MountInfoProviderService mipService = new MountInfoProviderService();
+ context.registerInjectActivateService(mipService,
ImmutableMap.of("mountedPaths", new String[] {SUPPORTED_PATH}));
+
+ context.registerInjectActivateService(pbac, ImmutableMap.of());
+ }
+
+ @Test
+ public void testMountAboveFilterRoot() {
+ FilterProviderImpl fp = new FilterProviderImpl();
+ context.registerInjectActivateService(fp, ImmutableMap.of("path",
SUPPORTED_PATH));
+
+ MountInfoProviderService mipService = new MountInfoProviderService();
+ context.registerInjectActivateService(mipService,
ImmutableMap.of("mountedPaths", new String[]
{Text.getRelativeParent(SUPPORTED_PATH, 1)}));
+
+ context.registerInjectActivateService(pbac, ImmutableMap.of());
+ }
+
+ @Test
+ public void testMountsElsewhere() {
+ FilterProviderImpl fp = new FilterProviderImpl();
+ context.registerInjectActivateService(fp, ImmutableMap.of("path",
SUPPORTED_PATH));
+
+ MountInfoProviderService mipService = new MountInfoProviderService();
+ context.registerInjectActivateService(mipService,
ImmutableMap.of("mountedPaths", new String[] {"/etc", "/var/some/mount",
UserConstants.DEFAULT_GROUP_PATH}));
+
+ context.registerInjectActivateService(pbac, ImmutableMap.of());
+ }
+}
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationOsgiTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationTest.java?rev=1857551&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationTest.java
(added)
+++
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationTest.java
Mon Apr 15 07:16:49 2019
@@ -0,0 +1,236 @@
+/*
+ * 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.spi.security.authorization.principalbased.impl;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
+import
org.apache.jackrabbit.oak.security.authorization.restriction.RestrictionProviderImpl;
+import org.apache.jackrabbit.oak.spi.commit.MoveTracker;
+import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
+import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
+import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
+import org.apache.jackrabbit.oak.spi.security.CompositeConfiguration;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.EmptyPermissionProvider;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
+import
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.Filter;
+import
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.FilterProvider;
+import
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionProvider;
+import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.oak.spi.state.ReadOnlyBuilder;
+import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
+import org.junit.Test;
+
+import javax.jcr.nodetype.NodeTypeManager;
+import javax.jcr.security.AccessControlManager;
+import java.lang.reflect.Field;
+import java.security.Principal;
+import java.util.List;
+import java.util.Set;
+
+import static
org.apache.jackrabbit.oak.spi.security.CompositeConfiguration.PARAM_RANKING;
+import static
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl.Constants.NT_REP_PRINCIPAL_ENTRY;
+import static
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl.Constants.NT_REP_PRINCIPAL_POLICY;
+import static
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl.Constants.NT_REP_RESTRICTIONS;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class PrincipalBasedAuthorizationConfigurationTest extends
AbstractPrincipalBasedTest {
+
+ @Test
+ public void testEmptyConstructor() {
+ assertEquals(ConfigurationParameters.EMPTY, new
PrincipalBasedAuthorizationConfiguration().getParameters());
+ }
+
+ @Test
+ public void testGetName() {
+ assertEquals(AuthorizationConfiguration.NAME, new
PrincipalBasedAuthorizationConfiguration().getName());
+ }
+
+ @Test
+ public void testGetCommitHooks() {
+ assertTrue(new
PrincipalBasedAuthorizationConfiguration().getCommitHooks("wspName").isEmpty());
+ }
+
+ @Test
+ public void testGetValidators() {
+ List<? extends ValidatorProvider> l = new
PrincipalBasedAuthorizationConfiguration().getValidators("wspName",
ImmutableSet.of(), new MoveTracker());
+ assertEquals(1, l.size());
+ assertTrue(l.get(0) instanceof PrincipalPolicyValidatorProvider);
+ }
+
+ @Test
+ public void testGetProtectedItemImporters() {
+ List<ProtectedItemImporter> l = new
PrincipalBasedAuthorizationConfiguration().getProtectedItemImporters();
+ assertEquals(1, l.size());
+ assertTrue(l.get(0) instanceof PrincipalPolicyImporter);
+ }
+
+ @Test
+ public void testGetRepositoryInitializer() {
+ RepositoryInitializer ri = new
PrincipalBasedAuthorizationConfiguration().getRepositoryInitializer();
+ assertNotSame(RepositoryInitializer.DEFAULT, ri);
+ }
+
+ @Test
+ public void testInitialized() throws Exception {
+ NodeTypeManager nodeTypeManager =
ReadOnlyNodeTypeManager.getInstance(root, NamePathMapper.DEFAULT);
+ for (String ntName : new String[] {NT_REP_PRINCIPAL_POLICY,
NT_REP_PRINCIPAL_ENTRY, NT_REP_RESTRICTIONS}) {
+ assertTrue(nodeTypeManager.hasNodeType(ntName));
+ }
+ }
+
+ @Test
+ public void testGetRepositoryInitializerInitialized() {
+ Root r = getRootProvider().createReadOnlyRoot(root);
+ CompositeConfiguration<AuthorizationConfiguration> cc =
(CompositeConfiguration)
getSecurityProvider().getConfiguration(AuthorizationConfiguration.class);
+ PrincipalBasedAuthorizationConfiguration pbac = null;
+ for (AuthorizationConfiguration ac : cc.getConfigurations()) {
+ if (ac instanceof PrincipalBasedAuthorizationConfiguration) {
+ pbac = (PrincipalBasedAuthorizationConfiguration) ac;
+ break;
+ }
+ }
+
+ assertNotNull(pbac);
+ RepositoryInitializer ri = pbac.getRepositoryInitializer();
+ ri.initialize(new
ReadOnlyBuilder(getTreeProvider().asNodeState(r.getTree("/"))));
+ }
+
+ @Test
+ public void testGetContext() {
+ assertSame(ContextImpl.INSTANCE, new
PrincipalBasedAuthorizationConfiguration().getContext());
+ }
+
+ @Test
+ public void testGetPermissionProviderUnsupportedPrincipals() throws
Exception {
+ FilterProvider fp =
when(mock(FilterProvider.class).getFilter(any(SecurityProvider.class),
any(Root.class),
any(NamePathMapper.class))).thenReturn(mock(Filter.class)).getMock();
+
+ PrincipalBasedAuthorizationConfiguration pbac = new
PrincipalBasedAuthorizationConfiguration();
+ pbac.bindFilterProvider(fp);
+ pbac.setSecurityProvider(securityProvider);
+ pbac.setRootProvider(getRootProvider());
+
+ Set<Principal> principals =
ImmutableSet.of(EveryonePrincipal.getInstance(), getTestUser().getPrincipal());
+ PermissionProvider pp = pbac.getPermissionProvider(root, "wspName",
principals);
+ assertSame(EmptyPermissionProvider.getInstance(), pp);
+
+ principals = ImmutableSet.of(getTestSystemUser().getPrincipal());
+ pp = pbac.getPermissionProvider(root, "wspName", principals);
+ assertSame(EmptyPermissionProvider.getInstance(), pp);
+ }
+
+ @Test
+ public void testGetPermissionProvider() throws Exception {
+ Filter filter = mock(Filter.class);
+ when(filter.canHandle(any(Set.class))).thenReturn(Boolean.TRUE);
+ when(filter.getOakPath(any(Principal.class))).thenReturn("/some/path");
+ FilterProvider fp =
when(mock(FilterProvider.class).getFilter(any(SecurityProvider.class),
any(Root.class), any(NamePathMapper.class))).thenReturn(filter).getMock();
+
+ PrincipalBasedAuthorizationConfiguration pbac = new
PrincipalBasedAuthorizationConfiguration();
+ pbac.bindFilterProvider(fp);
+ pbac.setSecurityProvider(getSecurityProvider());
+ pbac.setRootProvider(getRootProvider());
+
+ Set<Principal> principals =
ImmutableSet.of(getTestUser().getPrincipal());
+ PermissionProvider pp = pbac.getPermissionProvider(root, "wspName",
principals);
+ assertTrue(pp instanceof PrincipalBasedPermissionProvider);
+ }
+
+ @Test
+ public void testGetAccessControlManager() {
+ PrincipalBasedAuthorizationConfiguration pbac = new
PrincipalBasedAuthorizationConfiguration();
+ pbac.setSecurityProvider(getSecurityProvider());
+ pbac.bindFilterProvider(mock(FilterProvider.class));
+
+ AccessControlManager acMgr = pbac.getAccessControlManager(root,
NamePathMapper.DEFAULT);
+ assertTrue(acMgr instanceof PrincipalBasedAccessControlManager);
+ }
+
+ @Test
+ public void testGetRestrictionProvider() {
+ PrincipalBasedAuthorizationConfiguration pbac = new
PrincipalBasedAuthorizationConfiguration();
+ assertSame(RestrictionProvider.EMPTY, pbac.getRestrictionProvider());
+
+
pbac.setParameters(getSecurityProvider().getParameters(AuthorizationConfiguration.NAME));
+ RestrictionProvider rp = pbac.getRestrictionProvider();
+
+ assert(rp instanceof RestrictionProviderImpl);
+ }
+
+ @Test
+ public void testActivate() {
+ PrincipalBasedAuthorizationConfiguration pbac =
getPrincipalBasedAuthorizationConfiguration();
+
pbac.activate(mock(PrincipalBasedAuthorizationConfiguration.Configuration.class),
ImmutableMap.of(PARAM_RANKING, 50, "invalid", "someValue"));
+
+ ConfigurationParameters params = pbac.getParameters();
+ assertEquals(50, params.get(PARAM_RANKING));
+ assertEquals("someValue", params.get("invalid"));
+ }
+
+ @Test
+ public void testModified() {
+ PrincipalBasedAuthorizationConfiguration pbac =
getPrincipalBasedAuthorizationConfiguration();
+
pbac.activate(mock(PrincipalBasedAuthorizationConfiguration.Configuration.class),
ImmutableMap.of(PARAM_RANKING, 50, "invalid", "someValue"));
+
pbac.modified(mock(PrincipalBasedAuthorizationConfiguration.Configuration.class),
ImmutableMap.of(PARAM_RANKING, 85, "test", "someValue"));
+
+ ConfigurationParameters params = pbac.getParameters();
+ assertEquals(85, params.get(PARAM_RANKING));
+ assertEquals("someValue", params.get("test"));
+ assertNull(params.get("invalid"));
+ }
+
+ @Test
+ public void testBindUnbindFilterProvider() throws Exception {
+ Field fp =
PrincipalBasedAuthorizationConfiguration.class.getDeclaredField("filterProvider");
+ fp.setAccessible(true);
+
+ PrincipalBasedAuthorizationConfiguration pbac = new
PrincipalBasedAuthorizationConfiguration();
+ pbac.bindFilterProvider(mock(FilterProvider.class));
+
+ assertNotNull(fp.get(pbac));
+
+ pbac.unbindFilterProvider(mock(FilterProvider.class));
+ assertNull(fp.get(pbac));
+ }
+
+ @Test
+ public void testBindUnbindMountInfoProvider() throws Exception {
+ Field f =
PrincipalBasedAuthorizationConfiguration.class.getDeclaredField("mountInfoProvider");
+ f.setAccessible(true);
+
+ PrincipalBasedAuthorizationConfiguration pbac = new
PrincipalBasedAuthorizationConfiguration();
+ pbac.bindMountInfoProvider(mock(MountInfoProvider.class));
+
+ assertNotNull(f.get(pbac));
+
+ pbac.unbindMountInfoProvider(mock(MountInfoProvider.class));
+ assertNull(f.get(pbac));
+ }
+}
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAuthorizationConfigurationTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedPermissionProviderTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedPermissionProviderTest.java?rev=1857551&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedPermissionProviderTest.java
(added)
+++
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedPermissionProviderTest.java
Mon Apr 15 07:16:49 2019
@@ -0,0 +1,229 @@
+/*
+ * 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.spi.security.authorization.principalbased.impl;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
+import org.apache.jackrabbit.api.security.principal.ItemBasedPrincipal;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
+import org.apache.jackrabbit.oak.plugins.tree.TreeType;
+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.privilege.PrivilegeBits;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBitsProvider;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.jcr.PropertyType;
+import javax.jcr.Value;
+import java.security.Principal;
+import java.util.Map;
+
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+import static org.apache.jackrabbit.JcrConstants.NT_FOLDER;
+import static
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants.REP_NT_NAMES;
+import static
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl.Constants.REP_PRINCIPAL_POLICY;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_READ;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_REMOVE_CHILD_NODES;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_REMOVE_NODE;
+import static
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_VERSION_MANAGEMENT;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public class PrincipalBasedPermissionProviderTest extends
AbstractPrincipalBasedTest {
+
+ private Principal testPrincipal;
+
+ private PrincipalBasedPermissionProvider permissionProvider;
+
+ private String contentPath;
+ private String childPath;
+
+ @Before
+ public void before() throws Exception {
+ super.before();
+
+ contentPath = PathUtils.getAncestorPath(TEST_OAK_PATH, 3);
+ childPath = PathUtils.getAncestorPath(TEST_OAK_PATH, 2);
+
+ testPrincipal = getTestSystemUser().getPrincipal();
+ setupContentTrees(TEST_OAK_PATH);
+ setupContentTrees(NT_FOLDER, childPath + "/folder", TEST_OAK_PATH +
"/folder");
+
+ // setup permissions on childPath + TEST_OAK_PATH
+ PrincipalPolicyImpl policy =
setupPrincipalBasedAccessControl(testPrincipal,
getNamePathMapper().getJcrPath(childPath), JCR_READ, JCR_REMOVE_CHILD_NODES);
+ addPrincipalBasedEntry(policy,
getNamePathMapper().getJcrPath(TEST_OAK_PATH), JCR_VERSION_MANAGEMENT);
+
+ // add an entry with nt-name restriction at childPath
+ JackrabbitAccessControlManager jacm = getAccessControlManager(root);
+ policy = getPrincipalPolicyImpl(testPrincipal, jacm);
+ Map<String, Value[]> restrictions = ImmutableMap.of(REP_NT_NAMES, new
Value[] {getValueFactory(root).createValue(NT_FOLDER, PropertyType.NAME)});
+ policy.addEntry(childPath, privilegesFromNames(JCR_REMOVE_NODE),
ImmutableMap.of(), restrictions);
+ jacm.setPolicy(policy.getPath(), policy);
+ root.commit();
+
+ permissionProvider = createPermissionProvider(root,
getTestSystemUser().getPrincipal());
+ }
+
+ @Override
+ protected NamePathMapper getNamePathMapper() {
+ return NamePathMapper.DEFAULT;
+ }
+
+ @Test
+ public void testSupportedPrivileges() {
+ for (PrivilegeBits bits : PrivilegeBits.BUILT_IN.values()) {
+ assertEquals(bits, permissionProvider.supportedPrivileges(null,
bits));
+ assertEquals(bits,
permissionProvider.supportedPrivileges(mock(Tree.class), bits));
+ }
+ }
+
+ @Test
+ public void testSupportedPrivilegesAllBits() {
+ PrivilegeBits all = new
PrivilegeBitsProvider(root).getBits(PrivilegeConstants.JCR_ALL);
+ assertEquals(all, permissionProvider.supportedPrivileges(null, all));
+ assertEquals(all,
permissionProvider.supportedPrivileges(mock(Tree.class), all));
+ }
+
+ @Test
+ public void testSupportedPrivilegesNullBits() {
+ PrivilegeBits all = new
PrivilegeBitsProvider(root).getBits(PrivilegeConstants.JCR_ALL);
+ assertEquals(all, permissionProvider.supportedPrivileges(null, null));
+ assertEquals(all,
permissionProvider.supportedPrivileges(mock(Tree.class), null));
+ }
+
+ @Test
+ public void testSupportedPermissions() {
+ Tree tree = mock(Tree.class);
+ PropertyState property = mock(PropertyState.class);
+ for (long permission : Permissions.aggregates(Permissions.ALL)) {
+ assertEquals(permission,
permissionProvider.supportedPermissions(tree, property, permission));
+ assertEquals(permission,
permissionProvider.supportedPermissions(tree, null, permission));
+ }
+ assertEquals(Permissions.ALL,
permissionProvider.supportedPermissions(tree, property, Permissions.ALL));
+ assertEquals(Permissions.ALL,
permissionProvider.supportedPermissions(tree, null, Permissions.ALL));
+ }
+
+ @Test
+ public void testSupportedPermissionsTreeLocation() {
+ TreeLocation location = mock(TreeLocation.class);
+ for (long permission : Permissions.aggregates(Permissions.ALL)) {
+ assertEquals(permission,
permissionProvider.supportedPermissions(location, permission));
+ }
+ assertEquals(Permissions.ALL,
permissionProvider.supportedPermissions(location, Permissions.ALL));
+ }
+
+ @Test
+ public void testSupportedPermissionsTreePermission() {
+ TreePermission tp = mock(TreePermission.class);
+ PropertyState property = mock(PropertyState.class);
+ for (long permission : Permissions.aggregates(Permissions.ALL)) {
+ assertEquals(permission,
permissionProvider.supportedPermissions(tp, property, permission));
+ assertEquals(permission,
permissionProvider.supportedPermissions(tp, null, permission));
+ }
+ assertEquals(Permissions.ALL,
permissionProvider.supportedPermissions(tp, property, Permissions.ALL));
+ assertEquals(Permissions.ALL,
permissionProvider.supportedPermissions(tp, null, Permissions.ALL));
+ }
+
+ @Test
+ public void testHasPrivileges() {
+ assertTrue(permissionProvider.hasPrivileges(root.getTree(childPath),
PrivilegeConstants.JCR_READ));
+ assertFalse(permissionProvider.hasPrivileges(root.getTree(childPath),
PrivilegeConstants.JCR_READ, PrivilegeConstants.JCR_REMOVE_NODE));
+ assertTrue(permissionProvider.hasPrivileges(root.getTree(childPath +
"/folder"), PrivilegeConstants.JCR_READ, PrivilegeConstants.JCR_REMOVE_NODE));
+ assertFalse(permissionProvider.hasPrivileges(root.getTree(childPath),
PrivilegeConstants.JCR_READ, PrivilegeConstants.JCR_VERSION_MANAGEMENT));
+
assertTrue(permissionProvider.hasPrivileges(root.getTree(TEST_OAK_PATH),
PrivilegeConstants.JCR_READ, PrivilegeConstants.JCR_VERSION_MANAGEMENT));
+ }
+
+ @Test
+ public void testGetTreePermission() {
+ Tree tree = root.getTree(PathUtils.ROOT_PATH);
+ TreePermission tp = permissionProvider.getTreePermission(tree,
TreePermission.EMPTY);
+ for (String elem : PathUtils.elements(TEST_OAK_PATH)) {
+ tree = tree.getChild(elem);
+ tp = permissionProvider.getTreePermission(tree, tp);
+ assertTrue(tp instanceof AbstractTreePermission);
+ assertSame(TreeType.DEFAULT, ((AbstractTreePermission)
tp).getType());
+ }
+ }
+
+ @Test
+ public void testIsGranted() {
+ Tree t = root.getTree(childPath);
+ assertTrue(permissionProvider.isGranted(t, null,
Permissions.READ_NODE));
+ assertTrue(permissionProvider.isGranted(t,
t.getProperty(JCR_PRIMARYTYPE), Permissions.READ_PROPERTY));
+ assertFalse(permissionProvider.isGranted(t, null,
Permissions.READ_NODE|Permissions.VERSION_MANAGEMENT));
+
+
+ t = root.getTree(TEST_OAK_PATH);
+ assertTrue(permissionProvider.isGranted(t, null,
Permissions.READ_NODE|Permissions.VERSION_MANAGEMENT));
+ assertTrue(permissionProvider.isGranted(t,
t.getProperty(JCR_PRIMARYTYPE),
Permissions.READ_PROPERTY|Permissions.VERSION_MANAGEMENT));
+ }
+
+ @Test
+ public void testIsGrantedNonExistingTree() {
+ Tree nonExisting = root.getTree(TEST_OAK_PATH).getChild("nonExisting");
+
+ assertTrue(permissionProvider.isGranted(nonExisting, null,
Permissions.READ));
+ assertTrue(permissionProvider.isGranted(nonExisting,
PropertyStates.createProperty("propName", "value"), Permissions.READ));
+ }
+
+ @Test
+ public void testIsGrantedWithRestriction() {
+ assertFalse(permissionProvider.isGranted(root.getTree(TEST_OAK_PATH),
null, Permissions.REMOVE_NODE));
+ assertFalse(permissionProvider.isGranted(root.getTree(childPath),
null, Permissions.REMOVE_NODE));
+
+ assertTrue(permissionProvider.isGranted(root.getTree(TEST_OAK_PATH +
"/folder"), null, Permissions.REMOVE_NODE));
+ assertTrue(permissionProvider.isGranted(root.getTree(childPath +
"/folder"), null, Permissions.REMOVE_NODE));
+ }
+
+ @Test
+ public void testIsGrantedTreeLocation() {
+ TreeLocation tl = TreeLocation.create(root, TEST_OAK_PATH);
+ assertFalse(permissionProvider.isGranted(tl,
Permissions.READ|Permissions.REMOVE_NODE));
+ }
+
+ @Test
+ public void testIsGrantedNonExistingTreeLocation() {
+ TreeLocation tl = TreeLocation.create(root, childPath +
"/nonExisting");
+
+ assertTrue(permissionProvider.isGranted(tl, Permissions.READ));
+ assertFalse(permissionProvider.isGranted(tl, Permissions.REMOVE_NODE));
+ }
+
+ @Test
+ public void testIsGrantedNonExistingParentTreeLocation() {
+ TreeLocation tl = TreeLocation.create(root, childPath +
"/nonExistingParent/nonExisting");
+
+ assertTrue(permissionProvider.isGranted(tl, Permissions.READ));
+ assertFalse(permissionProvider.isGranted(tl, Permissions.REMOVE_NODE));
+ }
+
+ @Test
+ public void testIsGrantedAccessControlTreeLocation() throws Exception{
+ TreeLocation tl = TreeLocation.create(root,
PathUtils.concat(getTestSystemUser().getPath(), REP_PRINCIPAL_POLICY));
+ assertFalse(permissionProvider.isGranted(tl, Permissions.READ));
+ }
+}
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedPermissionProviderTest.java
------------------------------------------------------------------------------
svn:eol-style = native