Author: angela
Date: Thu Nov 12 13:55:18 2015
New Revision: 1714047

URL: http://svn.apache.org/viewvc?rev=1714047&view=rev
Log:
OAK-1268 : Add support for composite authorization setup (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/AbstractCugTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermissionTest.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=1714047&r1=1714046&r2=1714047&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
 Thu Nov 12 13:55:18 2015
@@ -254,7 +254,7 @@ class CugPermissionProvider implements A
         TreePermission tp;
         boolean parentIsCugPermission = (parentPermission instanceof 
CugTreePermission);
         if (TreeType.VERSION == type) {
-            tp = createVersionStorePermission(immutableTree, type, 
parentPermission, parentIsCugPermission);
+            tp = createVersionPermission(immutableTree, type, 
parentPermission, parentIsCugPermission);
         } else {
             if (parentIsCugPermission) {
                 tp = new CugTreePermission(immutableTree, type, 
parentPermission, this);
@@ -369,7 +369,7 @@ class CugPermissionProvider implements A
     }
 
     @Nonnull
-    private TreePermission createVersionStorePermission(@Nonnull Tree tree, 
@Nonnull TreeType type, @Nonnull TreePermission parent, boolean 
parentIsCugPermission) {
+    private TreePermission createVersionPermission(@Nonnull Tree tree, 
@Nonnull TreeType type, @Nonnull TreePermission parent, boolean 
parentIsCugPermission) {
         if (ReadOnlyVersionManager.isVersionStoreTree(tree)) {
             if (parentIsCugPermission) {
                 return new CugTreePermission(tree, type, parent, this);
@@ -381,29 +381,37 @@ class CugPermissionProvider implements A
             if (versionableTree == null) {
                 return TreePermission.NO_RECOURSE;
             }
+            TreeType versionableType = typeProvider.getType(versionableTree);
+            if (!isSupportedType(versionableType)) {
+                return TreePermission.NO_RECOURSE;
+            }
 
-            TreePermission tp;
             String path = versionableTree.getPath();
+            boolean isSupportedPath = false;
+
+            // test if the versionable node holds a cug
+            Tree cug = null;
             if (parentIsCugPermission) {
-                CugTreePermission delegatee;
-                if (CugUtil.hasCug(versionableTree)) {
-                    delegatee = new CugTreePermission(versionableTree, type, 
parent, this);
-                } else {
-                    delegatee = (CugTreePermission) parent;
-                };
-                tp = new CugTreePermission(tree, type, parent, this, 
delegatee.isInCug(), delegatee.isAllow());
+                cug = CugUtil.getCug(versionableTree);
             } 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 CugTreePermission(tree, type, parent, this, 
false, false);
-                } else {
-                    // retrieve read-access from the cug and apply it to the
-                    // tree permissions of the target tree located in the 
version storage
-                    CugTreePermission delegatee = new 
CugTreePermission(cugRoot, type, parent, this);
-                    tp = new CugTreePermission(tree, type, parent, this, 
delegatee.isInCug(), delegatee.isAllow());
+                isSupportedPath = true;
+                // the versionable tree might be included in a cug defined by
+                // a parent node -> need to search for inherited cugs as well.
+                Tree cugRoot = getCugRoot(versionableTree, versionableType);
+                if (cugRoot != null) {
+                    cug = CugUtil.getCug(cugRoot);
                 }
+            }
+
+            TreePermission tp;
+            if (cug != null) {
+                // backing versionable tree holds a cug
+                tp = new CugTreePermission(tree, type, parent, this, true, 
isAllow(cug));
+            } else if (parentIsCugPermission) {
+                CugTreePermission ctp = (CugTreePermission) parent;
+                tp = new CugTreePermission(tree, type, parent, this, 
ctp.isInCug(), ctp.isAllow());
+            } else if (isSupportedPath) {
+                tp = new CugTreePermission(tree, type, parent, this, false, 
false);
             } else  if (supportedPaths.mayContainCug(path)) {
                 tp = new EmptyCugTreePermission(tree, type, this);
             } else {

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.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/AbstractCugTest.java?rev=1714047&r1=1714046&r2=1714047&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
 Thu Nov 12 13:55:18 2015
@@ -35,11 +35,15 @@ import org.apache.jackrabbit.api.securit
 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.Root;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 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.cug.CugPolicy;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
 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;
@@ -192,4 +196,16 @@ public class AbstractCugTest extends Abs
             assertTrue(tp instanceof EmptyCugTreePermission);
         }
     }
+
+    static TreePermission getTreePermission(@Nonnull Root root,
+                                            @Nonnull String path,
+                                            @Nonnull PermissionProvider pp) {
+        Tree t = root.getTree("/");
+        TreePermission tp = pp.getTreePermission(t, TreePermission.EMPTY);
+        for (String segm : PathUtils.elements(path)) {
+            t = t.getChild(segm);
+            tp = pp.getTreePermission(t, tp);
+        }
+        return tp;
+    }
 }
\ 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/CugTreePermissionTest.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/CugTreePermissionTest.java?rev=1714047&r1=1714046&r2=1714047&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermissionTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermissionTest.java
 Thu Nov 12 13:55:18 2015
@@ -21,7 +21,6 @@ import javax.annotation.Nonnull;
 
 import com.google.common.collect.ImmutableSet;
 import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.plugins.tree.impl.AbstractTree;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
@@ -51,9 +50,12 @@ public class CugTreePermissionTest exten
     }
 
     private CugTreePermission getCugTreePermission(@Nonnull Principal... 
principals) {
+        return getCugTreePermission(SUPPORTED_PATH, principals);
+    }
+
+    private CugTreePermission getCugTreePermission(@Nonnull String path, 
@Nonnull Principal... principals) {
         CugPermissionProvider pp = 
createCugPermissionProvider(ImmutableSet.of(SUPPORTED_PATH, SUPPORTED_PATH2), 
principals);
-        TreePermission rootTp = pp.getTreePermission(root.getTree("/"), 
TreePermission.EMPTY);
-        TreePermission targetTp = 
pp.getTreePermission(root.getTree(SUPPORTED_PATH), rootTp);
+        TreePermission targetTp = getTreePermission(root, path, pp);
         assertTrue(targetTp instanceof CugTreePermission);
         return (CugTreePermission) targetTp;
     }
@@ -73,6 +75,26 @@ public class CugTreePermissionTest exten
     }
 
     @Test
+    public void testIsAllow() throws Exception {
+        assertTrue(allowedTp.isAllow());
+        assertFalse(deniedTp.isAllow());
+
+        CugTreePermission tp = getCugTreePermission(SUPPORTED_PATH2);
+        assertFalse(tp.isAllow());
+        tp = getCugTreePermission(SUPPORTED_PATH2, 
getTestUser().getPrincipal(), EveryonePrincipal.getInstance());
+        assertFalse(tp.isAllow());
+    }
+
+    @Test
+    public void testIsInCug() {
+        assertTrue(allowedTp.isInCug());
+        assertTrue(deniedTp.isInCug());
+
+        CugTreePermission tp = getCugTreePermission(SUPPORTED_PATH2);
+        assertFalse(tp.isInCug());
+    }
+
+    @Test
     public void testCanRead() {
         assertTrue(allowedTp.canRead());
         assertFalse(deniedTp.canRead());

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=1714047&r1=1714046&r2=1714047&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
 Thu Nov 12 13:55:18 2015
@@ -33,6 +33,7 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
+import org.apache.jackrabbit.oak.plugins.tree.TreeType;
 import org.apache.jackrabbit.oak.plugins.version.ReadOnlyVersionManager;
 import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
@@ -335,13 +336,7 @@ public class VersionTest extends Abstrac
         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);
-        }
+        TreePermission tp = getTreePermission(root, vh.getPath(), pp);
         assertTrue(tp instanceof EmptyCugTreePermission);
     }
 
@@ -365,7 +360,6 @@ public class VersionTest extends Abstrac
             for (String segm : PathUtils.elements(vhPath)) {
                 t = t.getChild(segm);
                 tp = pp.getTreePermission(t, tp);
-
                 assertTrue(tp instanceof CugTreePermission);
             }
         } finally {
@@ -377,4 +371,39 @@ public class VersionTest extends Abstrac
             root.commit();
         }
     }
+
+    @Test
+    public void testVersionableWithUnsupportedType() throws Exception {
+        Tree versionable = root.getTree("/content");
+        Tree vh = checkNotNull(versionManager.getVersionHistory(versionable));
+        Tree frozen = 
vh.getChild("1.0").getChild(JCR_FROZENNODE).getChild("a").getChild("b").getChild("c");
+
+        Tree invalidFrozen = frozen.addChild(REP_CUG_POLICY);
+        invalidFrozen.setProperty(JCR_PRIMARYTYPE, NT_REP_CUG_POLICY);
+
+        CugPermissionProvider pp = 
createCugPermissionProvider(ImmutableSet.of(SUPPORTED_PATH, SUPPORTED_PATH2));
+        TreePermission tp = getTreePermission(root, 
PathUtils.concat(vh.getPath(), "1.0", JCR_FROZENNODE, "a/b/c"), pp);
+
+        TreePermission tpForUnsupportedType = 
pp.getTreePermission(invalidFrozen, TreeType.VERSION, tp);
+        assertEquals(TreePermission.NO_RECOURSE, tpForUnsupportedType);
+    }
+
+    @Test
+    public void testVersionableWithCugParent() throws Exception {
+        addVersionContent("/content/aa/bb/cc");
+
+        Tree cc = root.getTree("/content/aa/bb/cc");
+        assertFalse(CugUtil.hasCug(cc));
+
+        Tree vh = checkNotNull(versionManager.getVersionHistory(cc));
+        Tree t = root.getTree("/");
+        CugPermissionProvider pp = createCugPermissionProvider(
+                ImmutableSet.of(SUPPORTED_PATH, SUPPORTED_PATH2), 
getTestGroupPrincipal());
+
+        TreePermission tp = getTreePermission(root, vh.getPath(), pp);
+
+        assertTrue(tp instanceof CugTreePermission);
+        assertTrue(((CugTreePermission) tp).isInCug());
+        assertTrue(((CugTreePermission) tp).isAllow());
+    }
 }
\ No newline at end of file


Reply via email to