Author: angela
Date: Tue May 19 15:46:41 2015
New Revision: 1680323

URL: http://svn.apache.org/r1680323
Log:
OAK-1268 : Add support for composite authorization setup

Added:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CompositeAuthorizationReadTest.java
Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionProviderImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionUtil.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java?rev=1680323&r1=1680322&r2=1680323&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositePermissionProvider.java
 Tue May 19 15:46:41 2015
@@ -32,6 +32,7 @@ import org.apache.jackrabbit.oak.api.Roo
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
 import org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree;
+import 
org.apache.jackrabbit.oak.security.authorization.permission.PermissionUtil;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
@@ -81,10 +82,11 @@ class CompositePermissionProvider implem
 
     @Nonnull
     @Override
-    public Set<String> getPrivileges(@Nullable final Tree tree) {
+    public Set<String> getPrivileges(@Nullable Tree tree) {
         PrivilegeBits result = null;
-        for (AggregatedPermissionProvider pp : filter(pps, tree)) {
-            PrivilegeBits privs = 
privilegeBitsProvider.getBits(pp.getPrivileges(tree));
+        Tree immutableTree = PermissionUtil.getImmutableTree(tree, 
immutableRoot);
+        for (AggregatedPermissionProvider pp : filter(pps, immutableTree)) {
+            PrivilegeBits privs = 
privilegeBitsProvider.getBits(pp.getPrivileges(immutableTree));
             if (result == null) {
                 result = PrivilegeBits.getInstance();
                 result.add(privs);
@@ -97,17 +99,18 @@ class CompositePermissionProvider implem
     }
 
     @Override
-    public boolean hasPrivileges(@Nullable final Tree tree, @Nonnull String... 
privilegeNames) {
+    public boolean hasPrivileges(@Nullable Tree tree, @Nonnull String... 
privilegeNames) {
+        final Tree immutableTree = PermissionUtil.getImmutableTree(tree, 
immutableRoot);
         for (final String privName : 
privilegeBitsProvider.getAggregatedPrivilegeNames(privilegeNames)) {
             Iterable<AggregatedPermissionProvider> providers = 
Iterables.filter(pps, new Predicate<AggregatedPermissionProvider>() {
                 @Override
                 public boolean apply(AggregatedPermissionProvider pp) {
                     // the permissionprovider is never null
-                    return (tree == null) ? pp.handlesRepositoryPermissions() 
: pp.handles(tree, privilegeBitsProvider.getBits(privName));
+                    return (immutableTree == null) ? 
pp.handlesRepositoryPermissions() : pp.handles(immutableTree, 
privilegeBitsProvider.getBits(privName));
                 }
             });
             for (AggregatedPermissionProvider pp : providers) {
-                if (!pp.hasPrivileges(tree, privName)) {
+                if (!pp.hasPrivileges(immutableTree, privName)) {
                     return false;
                 }
             }
@@ -124,28 +127,29 @@ class CompositePermissionProvider implem
     @Nonnull
     @Override
     public TreePermission getTreePermission(@Nonnull Tree tree, @Nonnull 
TreePermission parentPermission) {
-        ImmutableTree immTree = (tree instanceof ImmutableTree) ? 
(ImmutableTree) tree : (ImmutableTree) immutableRoot.getTree(tree.getPath());
+        ImmutableTree immutableTree = (ImmutableTree) 
PermissionUtil.getImmutableTree(tree, immutableRoot);
         if (tree.isRoot()) {
-            return new CompositeTreePermission(immTree, new 
CompositeTreePermission());
+            return new CompositeTreePermission(immutableTree, new 
CompositeTreePermission());
         } else {
             if (!(parentPermission instanceof CompositeTreePermission)) {
                 throw new IllegalArgumentException("Illegal parent permission 
instance. Expected CompositeTreePermission.");
             }
-            return new CompositeTreePermission(immTree, 
(CompositeTreePermission) parentPermission);
+            return new CompositeTreePermission(immutableTree, 
(CompositeTreePermission) parentPermission);
         }
     }
 
     @Override
     public boolean isGranted(@Nonnull Tree parent, @Nullable PropertyState 
property, long permissions) {
+        Tree immParent = PermissionUtil.getImmutableTree(parent, 
immutableRoot);
         if (Permissions.isAggregate(permissions)) {
             for (final long permission : Permissions.aggregates(permissions)) {
-                if (!grantsPermission(parent, property, permission, 
filter(parent, permission))) {
+                if (!grantsPermission(immParent, property, permission, 
filter(parent, permission))) {
                     return false;
                 }
             }
             return true;
         } else {
-            return grantsPermission(parent, property, permissions, 
filter(parent, permissions));
+            return grantsPermission(immParent, property, permissions, 
filter(immParent, permissions));
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionProviderImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionProviderImpl.java?rev=1680323&r1=1680322&r2=1680323&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionProviderImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionProviderImpl.java
 Tue May 19 15:46:41 2015
@@ -27,7 +27,6 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
-import org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
@@ -78,12 +77,12 @@ public class PermissionProviderImpl impl
     @Nonnull
     @Override
     public Set<String> getPrivileges(@Nullable Tree tree) {
-        return compiledPermissions.getPrivileges(getImmutableTree(tree));
+        return 
compiledPermissions.getPrivileges(PermissionUtil.getImmutableTree(tree, 
immutableRoot));
     }
 
     @Override
     public boolean hasPrivileges(@Nullable Tree tree, @Nonnull String... 
privilegeNames) {
-        return compiledPermissions.hasPrivileges(getImmutableTree(tree), 
privilegeNames);
+        return 
compiledPermissions.hasPrivileges(PermissionUtil.getImmutableTree(tree, 
immutableRoot), privilegeNames);
     }
 
     @Nonnull
@@ -95,12 +94,12 @@ public class PermissionProviderImpl impl
     @Nonnull
     @Override
     public TreePermission getTreePermission(@Nonnull Tree tree, @Nonnull 
TreePermission parentPermission) {
-        return compiledPermissions.getTreePermission(getImmutableTree(tree), 
parentPermission);
+        return 
compiledPermissions.getTreePermission(PermissionUtil.getImmutableTree(tree, 
immutableRoot), parentPermission);
     }
 
     @Override
     public boolean isGranted(@Nonnull Tree tree, @Nullable PropertyState 
property, long permissions) {
-        return compiledPermissions.isGranted(getImmutableTree(tree), property, 
permissions);
+        return 
compiledPermissions.isGranted(PermissionUtil.getImmutableTree(tree, 
immutableRoot), property, permissions);
     }
 
     @Override
@@ -158,14 +157,6 @@ public class PermissionProviderImpl impl
         return false;
     }
 
-    private ImmutableTree getImmutableTree(@Nullable Tree tree) {
-        if (tree instanceof ImmutableTree) {
-            return (ImmutableTree) tree;
-        } else {
-            return (tree == null) ? null : (ImmutableTree) 
immutableRoot.getTree(tree.getPath());
-        }
-    }
-
     private static boolean isVersionStorePath(@Nonnull String oakPath) {
         if (oakPath.indexOf(JcrConstants.JCR_SYSTEM) == 1) {
             for (String p : VersionConstants.SYSTEM_PATHS) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionUtil.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionUtil.java?rev=1680323&r1=1680322&r2=1680323&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionUtil.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionUtil.java
 Tue May 19 15:46:41 2015
@@ -25,6 +25,7 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionConstants;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.util.Text;
@@ -86,4 +87,12 @@ public final class PermissionUtil implem
         }
         return path;
     }
+
+    public static Tree getImmutableTree(@Nullable Tree tree, @Nonnull Root 
immutableRoot) {
+        if (tree instanceof ImmutableTree) {
+            return tree;
+        } else {
+            return (tree == null) ? null : 
immutableRoot.getTree(tree.getPath());
+        }
+    }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1680323&r1=1680322&r2=1680323&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 Tue May 19 15:46:41 2015
@@ -219,6 +219,9 @@ public class BenchmarkRunner {
                     runAsAdmin.value(options),
                     itemsToRead.value(options),
                     report.value(options)),
+            new CompositeAuthorizationReadTest(
+                        runAsAdmin.value(options),
+                        itemsToRead.value(options)), // TODO: is currently the 
no of configurations (hack)
             new ConcurrentReadDeepTreeTest(
                     runAsAdmin.value(options),
                     itemsToRead.value(options),

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CompositeAuthorizationReadTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CompositeAuthorizationReadTest.java?rev=1680323&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CompositeAuthorizationReadTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/CompositeAuthorizationReadTest.java
 Tue May 19 15:46:41 2015
@@ -0,0 +1,275 @@
+/*
+ * 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.benchmark;
+
+import java.security.Principal;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.jcr.Repository;
+import javax.jcr.security.AccessControlManager;
+
+import org.apache.jackrabbit.oak.Oak;
+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.fixture.JcrCreator;
+import org.apache.jackrabbit.oak.fixture.OakRepositoryFixture;
+import org.apache.jackrabbit.oak.fixture.RepositoryFixture;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
+import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
+import 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration;
+import 
org.apache.jackrabbit.oak.security.authorization.permission.PermissionUtil;
+import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+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.lifecycle.WorkspaceInitializer;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.Context;
+import org.apache.jackrabbit.oak.spi.security.SecurityConfiguration;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.OpenPermissionProvider;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
+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.security.authorization.restriction.RestrictionProvider;
+import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
+
+/**
+ * CompositeAuthorizationReadTest... TODO
+ */
+public class CompositeAuthorizationReadTest extends ReadDeepTreeTest {
+
+    private int cnt;
+
+    protected CompositeAuthorizationReadTest(boolean runAsAdmin, int 
cntConfigurations) {
+        super(runAsAdmin, 1000, false);
+        cnt =  cntConfigurations;
+    }
+
+    @Override
+    protected Repository[] createRepository(RepositoryFixture fixture) throws 
Exception {
+        if (fixture instanceof OakRepositoryFixture) {
+            return ((OakRepositoryFixture) fixture).setUpCluster(1, new 
JcrCreator() {
+                @Override
+                public Jcr customize(Oak oak) {
+                    return new Jcr(oak).with(new TmpSecurityProvider(cnt));
+                }
+            });
+        } else {
+            return super.createRepository(fixture);
+        }
+    }
+
+    private static final class TmpSecurityProvider extends 
SecurityProviderImpl {
+
+        private final int cnt;
+
+        private TmpSecurityProvider(int cnt) {
+            this.cnt = cnt;
+        }
+
+        @Nonnull
+        @Override
+        public ConfigurationParameters getParameters(@Nullable String name) {
+            return ConfigurationParameters.EMPTY;
+        }
+
+        @Nonnull
+        @Override
+        public Iterable<? extends SecurityConfiguration> getConfigurations() {
+            Set<SecurityConfiguration> configs = (Set<SecurityConfiguration>) 
super.getConfigurations();
+
+            CompositeAuthorizationConfiguration composite = new 
CompositeAuthorizationConfiguration(this);
+            Iterator<SecurityConfiguration> it = configs.iterator();
+            AuthorizationConfiguration base = null;
+            while (it.hasNext()) {
+                SecurityConfiguration sc = it.next();
+                if (sc instanceof AuthorizationConfiguration) {
+                    base = (AuthorizationConfiguration) sc;
+                    it.remove();
+                    break;
+                }
+            }
+            fillComposite(composite, base, cnt);
+            configs.add(composite);
+
+            return configs;
+        }
+
+        @Nonnull
+        @Override
+        public <T> T getConfiguration(@Nonnull Class<T> configClass) {
+            T c = super.getConfiguration(configClass);
+            if (AuthorizationConfiguration.class == configClass) {
+                CompositeAuthorizationConfiguration composite = new 
CompositeAuthorizationConfiguration(this);
+                fillComposite(composite, (AuthorizationConfiguration) c, cnt);
+                return (T) composite;
+            } else {
+                return c;
+            }
+        }
+
+        private static void fillComposite(CompositeAuthorizationConfiguration 
composite,
+                                          final AuthorizationConfiguration 
base,
+                                          int cnt) {
+            composite.addConfiguration(base);
+            for (int i = 0; i < cnt; i++) {
+                composite.addConfiguration(new AuthorizationConfiguration() {
+
+                    @Nonnull
+                    @Override
+                    public AccessControlManager 
getAccessControlManager(@Nonnull Root root, @Nonnull NamePathMapper 
namePathMapper) {
+                        return base.getAccessControlManager(root, 
namePathMapper);
+                    }
+
+                    @Nonnull
+                    @Override
+                    public RestrictionProvider getRestrictionProvider() {
+                        return base.getRestrictionProvider();
+                    }
+
+                    @Nonnull
+                    @Override
+                    public PermissionProvider getPermissionProvider(@Nonnull 
Root root, @Nonnull String workspaceName, @Nonnull Set<Principal> principals) {
+                        return new TmpPermissionProvider(root);
+                    }
+
+                    @Nonnull
+                    @Override
+                    public String getName() {
+                        return base.getName();
+                    }
+
+                    @Nonnull
+                    @Override
+                    public ConfigurationParameters getParameters() {
+                        return base.getParameters();
+                    }
+
+                    @Nonnull
+                    @Override
+                    public WorkspaceInitializer getWorkspaceInitializer() {
+                        return WorkspaceInitializer.DEFAULT;
+                    }
+
+                    @Nonnull
+                    @Override
+                    public RepositoryInitializer getRepositoryInitializer() {
+                        return RepositoryInitializer.DEFAULT;
+                    }
+
+                    @Nonnull
+                    @Override
+                    public List<? extends CommitHook> getCommitHooks(@Nonnull 
String workspaceName) {
+                        return Collections.EMPTY_LIST;
+                    }
+
+                    @Nonnull
+                    @Override
+                    public List<? extends ValidatorProvider> 
getValidators(@Nonnull String workspaceName, @Nonnull Set<Principal> 
principals, @Nonnull MoveTracker moveTracker) {
+                        return Collections.EMPTY_LIST;
+                    }
+
+                    @Nonnull
+                    @Override
+                    public List<ProtectedItemImporter> 
getProtectedItemImporters() {
+                        return Collections.EMPTY_LIST;
+                    }
+
+                    @Nonnull
+                    @Override
+                    public Context getContext() {
+                        return base.getContext();
+                    }
+                });
+            }
+
+        }
+    }
+
+    private static final class TmpPermissionProvider implements 
PermissionProvider {
+
+        private static final String POLICY_NAME = "customPolicy";
+
+        private Root root;
+        private Root immutableRoot;
+
+        private final PermissionProvider fake = 
OpenPermissionProvider.getInstance();
+
+        private TmpPermissionProvider(Root root) {
+            this.root = root;
+            immutableRoot = RootFactory.createReadOnlyRoot(root);
+        }
+        @Override
+        public void refresh() {
+            root.refresh();
+            immutableRoot = RootFactory.createReadOnlyRoot(root);
+        }
+
+        @Nonnull
+        @Override
+        public Set<String> getPrivileges(@Nullable Tree tree) {
+            performSomeRead(tree);
+            return fake.getPrivileges(tree);
+        }
+
+        @Override
+        public boolean hasPrivileges(@Nullable Tree tree, @Nonnull String... 
privilegeNames) {
+            performSomeRead(tree);
+            return fake.hasPrivileges(tree, privilegeNames);
+        }
+
+        @Nonnull
+        @Override
+        public RepositoryPermission getRepositoryPermission() {
+            return fake.getRepositoryPermission();
+        }
+
+        @Nonnull
+        @Override
+        public TreePermission getTreePermission(@Nonnull Tree tree, @Nonnull 
TreePermission parentPermission) {
+            performSomeRead(tree);
+            return fake.getTreePermission(tree, parentPermission);
+        }
+
+        @Override
+        public boolean isGranted(@Nonnull Tree tree, @Nullable PropertyState 
property, long permissions) {
+            performSomeRead(tree);
+            return fake.isGranted(tree, property, permissions);
+        }
+
+        @Override
+        public boolean isGranted(@Nonnull String oakPath, @Nonnull String 
jcrActions) {
+            performSomeRead(immutableRoot.getTree(oakPath));
+            return fake.isGranted(oakPath, jcrActions);
+        }
+
+        private void performSomeRead(@Nullable Tree tree) {
+            Tree immutableTree = PermissionUtil.getImmutableTree(tree, 
immutableRoot);
+            if (immutableTree != null) {
+                immutableTree.hasChild(POLICY_NAME);
+            }
+        }
+    }
+}
\ No newline at end of file


Reply via email to