Author: angela
Date: Tue Oct 27 14:37:05 2015
New Revision: 1710829

URL: http://svn.apache.org/viewvc?rev=1710829&view=rev
Log:
OAK-3542 : evaluation for special tree types in aggregation (WIP)

Modified:
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AccessControlTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java?rev=1710829&r1=1710828&r2=1710829&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProvider.java
 Tue Oct 27 14:37:05 2015
@@ -141,30 +141,7 @@ class CugPermissionProvider implements A
         TreePermission tp;
         boolean parentIsCugPermission = (parentPermission instanceof 
CugTreePermission);
         if (TreeType.VERSION == type) {
-            if (ReadOnlyVersionManager.isVersionStoreTree(immutableTree)) {
-                tp = (parentIsCugPermission) ?
-                        createCugPermission(immutableTree, (CugTreePermission) 
parentPermission) :
-                        new EmptyCugTreePermission(immutableTree, this);
-            } else {
-                // TODO
-                Tree versionableTree = 
getVersionManager().getVersionable(immutableTree, workspaceName);
-                if (versionableTree == null) {
-                    tp = TreePermission.NO_RECOURSE;
-                } else if (!parentIsCugPermission &&
-                        !supportedPaths.includes(versionableTree.getPath()) &&
-                        
!supportedPaths.mayContainCug(versionableTree.getPath())){
-                    tp = TreePermission.NO_RECOURSE;
-                } else {
-                    Tree cugRoot = getCugRoot(versionableTree, 
typeProvider.getType(versionableTree));
-                    if (cugRoot == null) {
-                        // there might be a cug in the live correspondent of 
any of the frozen subtrees
-                        tp = new EmptyCugTreePermission(immutableTree, this);
-                    } else {
-                        boolean canRead = createCugPermission(cugRoot, 
null).canRead();
-                        tp = new CugTreePermission(immutableTree, canRead, 
this);
-                    }
-                }
-            }
+            tp = createVersionStorePermission(immutableTree, parentPermission, 
parentIsCugPermission);
         } else {
             if (parentIsCugPermission) {
                 tp = createCugPermission(immutableTree, (CugTreePermission) 
parentPermission);
@@ -377,7 +354,7 @@ class CugPermissionProvider implements A
             boolean allow = princNamesState != null && 
Iterables.any(princNamesState.getValue(Type.STRINGS), new Predicate<String>() {
                 @Override
                 public boolean apply(@Nullable String principalName) {
-                    return (principalName != null) && 
principalNames.contains(principalName);
+                    return principalNames.contains(principalName);
                 }
             });
             tp = new CugTreePermission(tree, allow, this);
@@ -391,6 +368,44 @@ class CugPermissionProvider implements A
     }
 
     @Nonnull
+    private TreePermission createVersionStorePermission(@Nonnull Tree tree, 
@Nonnull TreePermission parent, boolean parentIsCugPermission) {
+        if (ReadOnlyVersionManager.isVersionStoreTree(tree)) {
+            return (parentIsCugPermission) ?
+                    createCugPermission(tree, (CugTreePermission) parent) :
+                    new EmptyCugTreePermission(tree, this);
+        } else {
+            Tree versionableTree = getVersionManager().getVersionable(tree, 
workspaceName);
+            if (versionableTree == null) {
+                return TreePermission.NO_RECOURSE;
+            }
+
+            TreePermission tp;
+            String path = versionableTree.getPath();
+            if (parentIsCugPermission) {
+                boolean canRead = (hasCug(versionableTree)) ? 
createCugPermission(versionableTree, null).canRead() : parent.canRead();
+                tp = new CugTreePermission(tree, canRead, this);
+            } else if (supportedPaths.includes(path)) {
+                // look for cug in the hierarchy
+                Tree cugRoot = getCugRoot(versionableTree, 
typeProvider.getType(versionableTree));
+                if (cugRoot == null) {
+                    // no cug present so far -> continue looking for cugs for 
frozen children
+                    tp = new EmptyCugTreePermission(tree, this);
+                } else {
+                    // retrieve read-access from the cug and apply it to the
+                    // tree permissions of the target tree located in the 
version storage
+                    boolean canRead = createCugPermission(cugRoot, 
null).canRead();
+                    tp = new CugTreePermission(tree, canRead, this);
+                }
+            } else  if (supportedPaths.mayContainCug(path)) {
+                tp = new EmptyCugTreePermission(tree, this);
+            } else {
+                tp = TreePermission.NO_RECOURSE;
+            }
+            return tp;
+        }
+    }
+
+    @Nonnull
     private ReadOnlyVersionManager getVersionManager() {
         if (versionManager == null) {
             versionManager = ReadOnlyVersionManager.getInstance(immutableRoot, 
NamePathMapper.DEFAULT);

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AccessControlTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AccessControlTest.java?rev=1710829&r1=1710828&r2=1710829&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AccessControlTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AccessControlTest.java
 Tue Oct 27 14:37:05 2015
@@ -29,6 +29,7 @@ import org.apache.jackrabbit.oak.api.Tre
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionConstants;
 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;
@@ -58,15 +59,23 @@ public class AccessControlTest extends A
 
         setupCugsAndAcls();
 
-        // cugs at
-        // - /content/a     : allow testGroup, deny everyone
-        // - /content/aa/bb : allow testGroup, deny everyone
-        // - /content/a/b/c : allow everyone,  deny testGroup (isolated)
-        // - /content2      : allow everyone,  deny testGroup (isolated)
-        // regular acl at
-        // - /content
+        /**
+         * regular acl at
+         *   - /content
+         *
+         * permission store (internal content)
+         *   - /jcr:system/rep:permissionStore
+         *
+         * cugs at
+         *   - /content/a     : allow testGroup, deny everyone
+         *   - /content/aa/bb : allow testGroup, deny everyone
+         *   - /content/a/b/c : allow everyone,  deny testGroup (isolated)
+         *   - /content2      : allow everyone,  deny testGroup (isolated)
+         *
+         */
         acPaths = ImmutableList.of(
                 "/content/rep:policy",
+                PermissionConstants.PERMISSIONS_STORE_PATH,
                 "/content/a/rep:cugPolicy",
                 "/content/aa/bb/rep:cugPolicy",
                 "/content/a/b/c/rep:cugPolicy",

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java?rev=1710829&r1=1710828&r2=1710829&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
 Tue Oct 27 14:37:05 2015
@@ -23,11 +23,14 @@ import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.jcr.AccessDeniedException;
+import javax.jcr.GuestCredentials;
 import javax.jcr.Session;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import org.apache.jackrabbit.oak.api.ContentSession;
+import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
@@ -335,6 +338,31 @@ public class CugPermissionProviderTest e
         }
     }
 
+    /**
+     * @see 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider#isGranted(org.apache.jackrabbit.oak.plugins.tree.TreeLocation,
 long)
+     */
+    @Test
+    public void testIsGrantedNonExistingLocation() throws Exception {
+        ContentSession anonymous = login(new GuestCredentials());
+        try {
+            // additionally create a root that doesn't have access to the root 
node
+            Root anonymousRoot = anonymous.getLatestRoot();
+
+            for (Root r : new Root[] {anonymousRoot, root}) {
+                TreeLocation location = TreeLocation.create(r, 
"/path/to/non/existing/tree");
+                assertFalse(cugPermProvider.isGranted(location, 
Permissions.READ));
+                assertFalse(cugPermProvider.isGranted(location, 
Permissions.READ_NODE));
+                assertFalse(cugPermProvider.isGranted(location, 
Permissions.READ_PROPERTY));
+
+                assertFalse(cugPermProvider.isGranted(location, 
Permissions.ALL));
+                assertFalse(cugPermProvider.isGranted(location, 
Permissions.ADD_NODE));
+                assertFalse(cugPermProvider.isGranted(location, 
Permissions.READ_ACCESS_CONTROL));
+            }
+        } finally {
+            anonymous.close();
+        }
+    }
+
     //------------------------------------------------------< getPrivileges 
>---
     /**
      * @see 
PermissionProvider#getPrivileges(org.apache.jackrabbit.oak.api.Tree)
@@ -575,4 +603,17 @@ public class CugPermissionProviderTest e
             assertFalse(cugPermProvider.isGranted(p, Session.ACTION_READ + ',' 
+ Session.ACTION_ADD_NODE));
         }
     }
+
+    /**
+     * @see PermissionProvider#isGranted(String, String)
+     */
+    @Test
+    public void testIsGrantedJcrActionsNonExistingPath() {
+        String p = "/path/to/non/existing/tree";
+        assertFalse(cugPermProvider.isGranted(p, Session.ACTION_READ));
+        assertFalse(cugPermProvider.isGranted(p, 
Permissions.getString(Permissions.READ_NODE)));
+        assertFalse(cugPermProvider.isGranted(p, 
Permissions.getString(Permissions.READ_PROPERTY)));
+        assertFalse(cugPermProvider.isGranted(p, Session.ACTION_ADD_NODE));
+        assertFalse(cugPermProvider.isGranted(p, Session.ACTION_READ + ',' + 
Session.ACTION_ADD_NODE));
+    }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java?rev=1710829&r1=1710828&r2=1710829&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/VersionTest.java
 Tue Oct 27 14:37:05 2015
@@ -38,6 +38,7 @@ import org.apache.jackrabbit.oak.plugins
 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.util.NodeUtil;
 import org.apache.jackrabbit.oak.util.TreeUtil;
 import org.junit.Before;
 import org.junit.Test;
@@ -78,14 +79,12 @@ public class VersionTest extends Abstrac
         readAccess = ImmutableList.of(
                 SUPPORTED_PATH,
                 "/content/subtree",
-                //"/content/a/b/c",
                 "/content/aa");
 
         noReadAccess = ImmutableList.of(
                 UNSUPPORTED_PATH,  /* no access */
                 "/content2",       /* granted by cug only */
                 "/content/a",      /* granted by ace, denied by cug */
-                //"/content/a/b",    /* granted by ace, denied by cug */
                 "/content/aa/bb"   /* granted by ace, denied by cug */
         );
 
@@ -310,7 +309,7 @@ public class VersionTest extends Abstrac
     }
 
     @Test
-    public void testTreePermissionVersionable3() throws Exception {
+    public void testTreePermissionVersionableUnsupportedPath() throws 
Exception {
         Tree versionable = root.getTree(UNSUPPORTED_PATH);
         Tree vh = checkNotNull(versionManager.getVersionHistory(versionable));
 
@@ -330,4 +329,52 @@ public class VersionTest extends Abstrac
             }
         }
     }
+
+    @Test
+    public void testTreePermissionAtVersionableAboveSupported() throws 
Exception {
+        Tree vh = 
checkNotNull(versionManager.getVersionHistory(root.getTree(SUPPORTED_PATH)));
+
+        CugPermissionProvider pp = 
createCugPermissionProvider(ImmutableSet.of(SUPPORTED_PATH + "/a"));
+
+        Tree t = root.getTree("/");
+        TreePermission tp = pp.getTreePermission(t, TreePermission.EMPTY);
+        for (String segm : PathUtils.elements(vh.getPath())) {
+            t = t.getChild(segm);
+            tp = pp.getTreePermission(t, tp);
+        }
+        assertTrue(tp instanceof EmptyCugTreePermission);
+    }
+
+    @Test
+    public void testCugAtRoot() throws Exception {
+        Tree versionable = root.getTree(UNSUPPORTED_PATH);
+        String vhPath = 
checkNotNull(versionManager.getVersionHistory(versionable)).getPath();
+
+        try {
+            NodeUtil rootnode = new NodeUtil(root.getTree("/"));
+            rootnode.setNames(JCR_MIXINTYPES, MIX_REP_CUG_MIXIN);
+            rootnode.addChild(REP_CUG_POLICY, 
NT_REP_CUG_POLICY).setStrings(REP_PRINCIPAL_NAMES, EveryonePrincipal.NAME);
+            root.commit();
+
+            CugPermissionProvider pp = 
createCugPermissionProvider(ImmutableSet.of("/"));
+
+            Tree t = root.getTree("/");
+            TreePermission tp = pp.getTreePermission(t, TreePermission.EMPTY);
+            assertTrue(tp instanceof CugTreePermission);
+
+            for (String segm : PathUtils.elements(vhPath)) {
+                t = t.getChild(segm);
+                tp = pp.getTreePermission(t, tp);
+
+                assertTrue(tp instanceof CugTreePermission);
+            }
+        } finally {
+            root.getTree("/").removeProperty(JCR_MIXINTYPES);
+            Tree cug = root.getTree("/rep:cugPolicy");
+            if (cug.exists()) {
+                cug.remove();
+            }
+            root.commit();
+        }
+    }
 }
\ No newline at end of file


Reply via email to