You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2018/05/15 17:06:11 UTC

svn commit: r1831641 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/ oak-core/src/main/java/org/apache/jackrabbit/oak/security/author...

Author: angela
Date: Tue May 15 17:06:11 2018
New Revision: 1831641

URL: http://svn.apache.org/viewvc?rev=1831641&view=rev
Log:
OAK-7488 : VersionablePathHook should be located with authorization code

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java
      - copied, changed from r1831260, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionablePathHook.java
Removed:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionablePathHook.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationConfigurationImpl.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VisibleChangesTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java?rev=1831641&r1=1831640&r2=1831641&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadOnlyVersionManager.java Tue May 15 17:06:11 2018
@@ -253,7 +253,6 @@ public abstract class ReadOnlyVersionMan
      * versionable path property for the specified workspace is missing or if
      * the given tree is not located within the tree structure defined by a version history.
      *
-     * @see VersionablePathHook
      * @see VersionConstants#MIX_REP_VERSIONABLE_PATHS
      */
     @CheckForNull

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationConfigurationImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationConfigurationImpl.java?rev=1831641&r1=1831640&r2=1831641&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationConfigurationImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationConfigurationImpl.java Tue May 15 17:06:11 2018
@@ -26,7 +26,7 @@ import javax.jcr.security.AccessControlM
 import com.google.common.collect.ImmutableList;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
-import org.apache.jackrabbit.oak.plugins.version.VersionablePathHook;
+import org.apache.jackrabbit.oak.security.authorization.permission.VersionablePathHook;
 import org.apache.jackrabbit.oak.security.authorization.accesscontrol.AccessControlImporter;
 import org.apache.jackrabbit.oak.security.authorization.accesscontrol.AccessControlManagerImpl;
 import org.apache.jackrabbit.oak.security.authorization.accesscontrol.AccessControlValidatorProvider;
@@ -157,7 +157,7 @@ public class AuthorizationConfigurationI
     @Override
     public List<? extends CommitHook> getCommitHooks(@Nonnull String workspaceName) {
         return ImmutableList.of(
-                new VersionablePathHook(workspaceName),
+                new VersionablePathHook(workspaceName, this),
                 new PermissionHook(workspaceName, getRestrictionProvider(), mountInfoProvider, getRootProvider(), getTreeProvider()));
     }
 
@@ -197,7 +197,7 @@ public class AuthorizationConfigurationI
     @Nonnull
     @Override
     public PermissionProvider getPermissionProvider(@Nonnull Root root, @Nonnull String workspaceName,
-            @Nonnull Set<Principal> principals) {
+                                                    @Nonnull Set<Principal> principals) {
         Context ctx = getSecurityProvider().getConfiguration(AuthorizationConfiguration.class).getContext();
 
         if (mountInfoProvider.hasNonDefaultMounts()) {

Copied: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java (from r1831260, jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionablePathHook.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionablePathHook.java&r1=1831260&r2=1831641&rev=1831641&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionablePathHook.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java Tue May 15 17:06:11 2018
@@ -14,26 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.oak.plugins.version;
+package org.apache.jackrabbit.oak.security.authorization.permission;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-
 import javax.annotation.Nonnull;
 
 import com.google.common.collect.ImmutableSet;
-
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
-import org.apache.jackrabbit.oak.plugins.tree.impl.ImmutableTree;
-import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
+import org.apache.jackrabbit.oak.plugins.version.ReadWriteVersionManager;
+import org.apache.jackrabbit.oak.security.authorization.ProviderCtx;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -51,9 +52,11 @@ import static org.apache.jackrabbit.oak.
 public class VersionablePathHook implements CommitHook {
 
     private final String workspaceName;
+    private final ProviderCtx providerCtx;
 
-    public VersionablePathHook(String workspaceName) {
+    public VersionablePathHook(@Nonnull String workspaceName, @Nonnull ProviderCtx providerCtx) {
         this.workspaceName = workspaceName;
+        this.providerCtx = providerCtx;
     }
 
     @Nonnull
@@ -63,10 +66,13 @@ public class VersionablePathHook impleme
             throws CommitFailedException {
         NodeBuilder rootBuilder = after.builder();
         NodeBuilder vsRoot = rootBuilder.child(NodeTypeConstants.JCR_SYSTEM).child(NodeTypeConstants.JCR_VERSIONSTORAGE);
+
         ReadWriteVersionManager vMgr = new ReadWriteVersionManager(vsRoot, rootBuilder);
+        ReadOnlyNodeTypeManager ntMgr = ReadOnlyNodeTypeManager.getInstance(providerCtx.getRootProvider().createReadOnlyRoot(rootBuilder.getNodeState()), NamePathMapper.DEFAULT);
+
         List<CommitFailedException> exceptions = new ArrayList<CommitFailedException>();
         after.compareAgainstBaseState(before,
-                new Diff(vMgr, new Node(rootBuilder), exceptions));
+                new Diff(vMgr, ntMgr, new Node(rootBuilder), exceptions));
         if (!exceptions.isEmpty()) {
             throw exceptions.get(0);
         }
@@ -81,13 +87,16 @@ public class VersionablePathHook impleme
     private final class Diff extends DefaultNodeStateDiff implements VersionConstants {
 
         private final ReadWriteVersionManager versionManager;
+        private final ReadOnlyNodeTypeManager ntMgr;
         private final Node nodeAfter;
         private final List<CommitFailedException> exceptions;
 
         private Diff(@Nonnull ReadWriteVersionManager versionManager,
+                     @Nonnull ReadOnlyNodeTypeManager ntMgr,
                      @Nonnull Node node,
                      @Nonnull List<CommitFailedException> exceptions) {
             this.versionManager = versionManager;
+            this.ntMgr = ntMgr;
             this.nodeAfter = node;
             this.exceptions = exceptions;
         }
@@ -116,11 +125,11 @@ public class VersionablePathHook impleme
             }
             Node node = new Node(nodeAfter, name);
             return after.compareAgainstBaseState(
-                    before, new Diff(versionManager, node, exceptions));
+                    before, new Diff(versionManager, ntMgr, node, exceptions));
         }
 
         private boolean setVersionablePath(PropertyState after) {
-            if (JcrConstants.JCR_VERSIONHISTORY.equals(after.getName()) && nodeAfter.isVersionable(versionManager)) {
+            if (JcrConstants.JCR_VERSIONHISTORY.equals(after.getName()) && nodeAfter.isVersionable(ntMgr)) {
                 NodeBuilder vhBuilder;
                 try {
                     vhBuilder = versionManager.getOrCreateVersionHistory(
@@ -145,7 +154,7 @@ public class VersionablePathHook impleme
         }
     }
 
-    private static final class Node {
+    private final class Node {
 
         private final String path;
         private final NodeBuilder builder;
@@ -160,9 +169,12 @@ public class VersionablePathHook impleme
             this.path = PathUtils.concat(parent.path, name);
         }
 
-        private boolean isVersionable(ReadWriteVersionManager versionManager) {
-            Tree tree = new ImmutableTree(ImmutableTree.ParentProvider.UNSUPPORTED, PathUtils.getName(path), builder.getNodeState());
-            return versionManager.isVersionable(tree);
+        private boolean isVersionable(ReadOnlyNodeTypeManager ntMgr) {
+            // this is not 100% correct, because t.getPath() will
+            // not return the correct path for node after, but is
+            // sufficient to check if it is versionable
+            Tree tree = providerCtx.getTreeProvider().createReadOnlyTree(builder.getNodeState());
+            return ntMgr.isNodeType(tree, VersionConstants.MIX_VERSIONABLE);
         }
     }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VisibleChangesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VisibleChangesTest.java?rev=1831641&r1=1831640&r2=1831641&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VisibleChangesTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VisibleChangesTest.java Tue May 15 17:06:11 2018
@@ -18,16 +18,21 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.util.List;
 import java.util.Set;
-
 import javax.annotation.Nonnull;
 
 import com.google.common.collect.Sets;
-
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
-import org.apache.jackrabbit.oak.plugins.version.VersionablePathHook;
+import org.apache.jackrabbit.oak.plugins.tree.RootProvider;
+import org.apache.jackrabbit.oak.plugins.tree.TreeProvider;
+import org.apache.jackrabbit.oak.plugins.tree.impl.RootProviderService;
+import org.apache.jackrabbit.oak.plugins.tree.impl.TreeProviderService;
+import org.apache.jackrabbit.oak.security.authorization.ProviderCtx;
+import org.apache.jackrabbit.oak.security.authorization.permission.VersionablePathHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.junit.Test;
 
@@ -66,7 +71,31 @@ public class VisibleChangesTest {
         }
 
         store.paths.clear();
-        VersionablePathHook hook = new VersionablePathHook("default");
+        VersionablePathHook hook = new VersionablePathHook("default", new ProviderCtx() {
+            @Nonnull
+            @Override
+            public SecurityProvider getSecurityProvider() {
+                throw new UnsupportedOperationException();
+            }
+
+            @Nonnull
+            @Override
+            public TreeProvider getTreeProvider() {
+                return new TreeProviderService();
+            }
+
+            @Nonnull
+            @Override
+            public RootProvider getRootProvider() {
+                return new RootProviderService();
+            }
+
+            @Nonnull
+            @Override
+            public MountInfoProvider getMountInfoProvider() {
+                throw new UnsupportedOperationException();
+            }
+        });
         hook.processCommit(ns.getRoot(), builder.getNodeState(), CommitInfo.EMPTY);
         assertEquals("Must not query for hidden paths: " + store.paths.toString(),
                 0, store.paths.size());