Author: angela
Date: Mon Nov 25 16:43:05 2013
New Revision: 1545340
URL: http://svn.apache.org/r1545340
Log:
OAK-710 : PermissionValidator: Proper permission evaluation for moving/renaming
nodes (WIP)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/MoveAwarePermissionValidator.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidator.java
jackrabbit/oak/trunk/oak-jcr/pom.xml
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/SessionMoveTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WorkspaceMoveTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WriteTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/MoveAwarePermissionValidator.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/MoveAwarePermissionValidator.java?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/MoveAwarePermissionValidator.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/MoveAwarePermissionValidator.java
Mon Nov 25 16:43:05 2013
@@ -16,8 +16,6 @@
*/
package org.apache.jackrabbit.oak.security.authorization.permission;
-import java.util.HashSet;
-import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -33,6 +31,7 @@ import org.apache.jackrabbit.oak.spi.sec
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.state.NodeState;
+import org.apache.jackrabbit.util.Text;
/**
* MoveAwarePermissionValidator... TODO
@@ -50,9 +49,9 @@ public class MoveAwarePermissionValidato
moveCtx = new MoveContext(moveTracker, rootTreeBefore, rootTreeAfter);
}
- MoveAwarePermissionValidator(@Nullable Tree parentBefore,
- @Nullable Tree parentAfter,
- @Nullable TreePermission parentPermission,
+ MoveAwarePermissionValidator(@Nullable ImmutableTree parentBefore,
+ @Nullable ImmutableTree parentAfter,
+ @Nonnull TreePermission parentPermission,
@Nonnull PermissionValidator parentValidator)
{
super(parentBefore, parentAfter, parentPermission, parentValidator);
@@ -61,7 +60,10 @@ public class MoveAwarePermissionValidato
}
@Override
- PermissionValidator createValidator(@Nullable Tree parentBefore, @Nullable
Tree parentAfter, @Nullable TreePermission parentPermission, @Nonnull
PermissionValidator parentValidator) {
+ PermissionValidator createValidator(@Nullable ImmutableTree parentBefore,
+ @Nullable ImmutableTree parentAfter,
+ @Nonnull TreePermission
parentPermission,
+ @Nonnull PermissionValidator
parentValidator) {
if (moveCtx.containsMove(parentBefore, parentAfter)) {
return new MoveAwarePermissionValidator(parentBefore, parentAfter,
parentPermission, parentValidator);
} else {
@@ -69,9 +71,15 @@ public class MoveAwarePermissionValidato
}
}
- private Validator visibleValidator(ImmutableTree source, ImmutableTree
dest) {
- TreePermission tp =
getParentPermission().getChildPermission(source.getName(), source.unwrap());
- Validator validator = super.createValidator(source, dest, tp, this);
+ private Validator visibleValidator(@Nonnull ImmutableTree source,
+ @Nonnull ImmutableTree dest) {
+ // TODO improve: avoid calculating the 'before' permissions in case
the current parent permissions already point to the correct tree.
+ ImmutableTree parent = moveCtx.rootBefore.getTree("/");
+ TreePermission tp = getPermissionProvider().getTreePermission(parent,
TreePermission.EMPTY);
+ for (String n : source.getPath().split("/")) {
+ tp = tp.getChildPermission(n, parent.getChild(n).unwrap());
+ }
+ Validator validator = createValidator(source, dest, tp, this);
return new VisibleValidator(validator, true, false);
}
@@ -95,15 +103,13 @@ public class MoveAwarePermissionValidato
}
//--------------------------------------------------------------------------
- private static final class MoveContext {
+ private final class MoveContext {
private final MoveTracker moveTracker;
private final ImmutableRoot rootBefore;
private final ImmutableRoot rootAfter;
- private final Set<ImmutableTree> processed = new
HashSet<ImmutableTree>();
-
private MoveContext(@Nonnull MoveTracker moveTracker,
@Nonnull ImmutableTree treeBefore,
@Nonnull ImmutableTree treeAfter) {
@@ -120,52 +126,46 @@ public class MoveAwarePermissionValidato
// check permissions for adding the moved node at the target
location.
validator.checkPermissions(child, false, Permissions.ADD_NODE |
Permissions.NODE_TYPE_MANAGEMENT);
- if (processed.contains(child)) {
- return true;
- } else {
- // FIXME: respect and properly handle move-operations in the
subtree
- String sourcePath =
moveTracker.getOriginalSourcePath(child.getPath());
- if (sourcePath != null) {
- ImmutableTree source = rootBefore.getTree(sourcePath);
- if (source.exists()) {
- return diff(source, child, validator);
- } // FIXME: else...
- }
- return false;
+ // FIXME: respect and properly handle move-operations in the
subtree
+ String sourcePath =
moveTracker.getOriginalSourcePath(child.getPath());
+ if (sourcePath != null) {
+ ImmutableTree source = rootBefore.getTree(sourcePath);
+ if (source.exists()) {
+ ImmutableTree rootTree = rootBefore.getTree("/");
+ TreePermission tp =
getPermissionProvider().getTreePermission(rootTree, TreePermission.EMPTY);
+ for (String seg : Text.explode(sourcePath, '/')) {
+ tp = tp.getChildPermission(seg,
rootTree.getChild(seg).unwrap());
+ }
+ return diff(source, child, validator);
+ } // FIXME: else...
}
+ return false;
}
private boolean processDelete(ImmutableTree child,
MoveAwarePermissionValidator validator) throws CommitFailedException {
// check permissions for removing that node.
validator.checkPermissions(child, true, Permissions.REMOVE_NODE);
- if (processed.contains(child)) {
- return true;
- } else {
- // FIXME: respect and properly handle move-operations in the
subtree
- String destPath = moveTracker.getDestPath(child.getPath());
- if (destPath != null) {
- ImmutableTree dest = rootAfter.getTree(destPath);
- if (dest.exists()) {
- return diff(child, dest, validator);
- } // FIXME: else...
- }
-
- return false;
+ // FIXME: respect and properly handle move-operations in the
subtree
+ String destPath = moveTracker.getDestPath(child.getPath());
+ if (destPath != null) {
+ ImmutableTree dest = rootAfter.getTree(destPath);
+ if (dest.exists()) {
+ return diff(child, dest, validator);
+ } // FIXME: else...
}
+
+ return false;
}
private boolean diff(ImmutableTree source, ImmutableTree dest,
MoveAwarePermissionValidator validator) throws
CommitFailedException {
Validator nextValidator = validator.visibleValidator(source, dest);
CommitFailedException e = EditorDiff.process(nextValidator ,
source.unwrap(), dest.unwrap());
- if (e == null) {
- processed.add(source);
- processed.add(dest);
- return true;
- } else {
+ if (e != null) {
throw e;
}
+ return true;
}
}
}
\ No newline at end of file
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidator.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidator.java?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidator.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionValidator.java
Mon Nov 25 16:43:05 2013
@@ -25,6 +25,7 @@ import org.apache.jackrabbit.oak.api.Com
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.core.AbstractTree;
+import org.apache.jackrabbit.oak.core.ImmutableTree;
import org.apache.jackrabbit.oak.plugins.lock.LockConstants;
import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
import org.apache.jackrabbit.oak.spi.commit.DefaultValidator;
@@ -47,15 +48,16 @@ import static org.apache.jackrabbit.oak.
*/
class PermissionValidator extends DefaultValidator {
- private final Tree parentBefore;
- private final Tree parentAfter;
+ private final ImmutableTree parentBefore;
+ private final ImmutableTree parentAfter;
private final TreePermission parentPermission;
private final PermissionProvider permissionProvider;
private final PermissionValidatorProvider provider;
private final long permission;
- PermissionValidator(@Nonnull Tree rootTreeBefore, @Nonnull Tree
rootTreeAfter,
+ PermissionValidator(@Nonnull ImmutableTree rootTreeBefore,
+ @Nonnull ImmutableTree rootTreeAfter,
@Nonnull PermissionProvider permissionProvider,
@Nonnull PermissionValidatorProvider provider) {
this.parentBefore = rootTreeBefore;
@@ -68,7 +70,8 @@ class PermissionValidator extends Defaul
permission =
Permissions.getPermission(PermissionUtil.getPath(parentBefore, parentAfter),
Permissions.NO_PERMISSION);
}
- PermissionValidator(@Nullable Tree parentBefore, @Nullable Tree
parentAfter,
+ PermissionValidator(@Nullable ImmutableTree parentBefore,
+ @Nullable ImmutableTree parentAfter,
@Nullable TreePermission parentPermission,
@Nonnull PermissionValidator parentValidator) {
this.parentBefore = parentBefore;
@@ -100,7 +103,6 @@ class PermissionValidator extends Defaul
if (AbstractTree.OAK_CHILD_ORDER.equals(name)) {
String childName = ChildOrderDiff.firstReordered(before, after);
if (childName != null) {
- Tree child = parentAfter.getChild(childName);
checkPermissions(parentAfter, false,
Permissions.MODIFY_CHILD_NODE_COLLECTION);
} // else: no re-order but only internal update
} else if (isImmutableProperty(name)) {
@@ -120,7 +122,7 @@ class PermissionValidator extends Defaul
@Override
public Validator childNodeAdded(String name, NodeState after) throws
CommitFailedException {
- Tree child = checkNotNull(parentAfter.getChild(name));
+ ImmutableTree child = checkNotNull(parentAfter.getChild(name));
if (isVersionstorageTree(child)) {
child = getVersionHistoryTree(child);
if (child == null) {
@@ -134,14 +136,14 @@ class PermissionValidator extends Defaul
@Override
public Validator childNodeChanged(String name, NodeState before, NodeState
after) throws CommitFailedException {
- Tree childBefore = parentBefore.getChild(name);
- Tree childAfter = parentAfter.getChild(name);
- return nextValidator(childBefore, childAfter,
permissionProvider.getTreePermission(childBefore, parentPermission));
+ ImmutableTree childBefore = parentBefore.getChild(name);
+ ImmutableTree childAfter = parentAfter.getChild(name);
+ return nextValidator(childBefore, childAfter,
parentPermission.getChildPermission(name, before));
}
@Override
public Validator childNodeDeleted(String name, NodeState before) throws
CommitFailedException {
- Tree child = checkNotNull(parentBefore.getChild(name));
+ ImmutableTree child = parentBefore.getChild(name);
if (isVersionstorageTree(child)) {
throw new CommitFailedException(
ACCESS, 22, "Attempt to remove versionstorage node: Fail
to verify delete permission.");
@@ -151,8 +153,9 @@ class PermissionValidator extends Defaul
//-------------------------------------------------< internal / private
>---
@Nonnull
- PermissionValidator createValidator(@Nullable Tree parentBefore, @Nullable
Tree parentAfter,
- @Nullable TreePermission
parentPermission,
+ PermissionValidator createValidator(@Nullable ImmutableTree parentBefore,
+ @Nullable ImmutableTree parentAfter,
+ @Nonnull TreePermission
parentPermission,
@Nonnull PermissionValidator
parentValidator) {
return new PermissionValidator(parentBefore, parentAfter,
parentPermission, parentValidator);
}
@@ -168,11 +171,12 @@ class PermissionValidator extends Defaul
}
@Nonnull
- TreePermission getParentPermission() {
- return parentPermission;
+ PermissionProvider getPermissionProvider() {
+ return permissionProvider;
}
- Validator checkPermissions(@Nonnull Tree tree, boolean isBefore,
+ @CheckForNull
+ Validator checkPermissions(@Nonnull ImmutableTree tree, boolean isBefore,
long defaultPermission) throws
CommitFailedException {
long toTest = getPermission(tree, defaultPermission);
if (Permissions.isRepositoryPermission(toTest)) {
@@ -181,7 +185,7 @@ class PermissionValidator extends Defaul
}
return null; // no need for further validation down the subtree
} else {
- TreePermission tp = permissionProvider.getTreePermission(tree,
parentPermission);
+ TreePermission tp =
parentPermission.getChildPermission(tree.getName(), tree.unwrap());
if (!tp.isGranted(toTest)) {
throw new CommitFailedException(ACCESS, 0, "Access denied");
}
@@ -195,7 +199,8 @@ class PermissionValidator extends Defaul
}
}
- private void checkPermissions(@Nonnull Tree parent, @Nonnull PropertyState
property,
+ private void checkPermissions(@Nonnull ImmutableTree parent,
+ @Nonnull PropertyState property,
long defaultPermission) throws
CommitFailedException {
if (NodeStateUtils.isHidden(property.getName())) {
// ignore any hidden properties (except for OAK_CHILD_ORDER which
has
@@ -215,7 +220,10 @@ class PermissionValidator extends Defaul
}
}
- private Validator nextValidator(@Nullable Tree parentBefore, @Nullable
Tree parentAfter, @Nonnull TreePermission treePermission) {
+ @Nonnull
+ private Validator nextValidator(@Nullable ImmutableTree parentBefore,
+ @Nullable ImmutableTree parentAfter,
+ @Nonnull TreePermission treePermission) {
Validator validator = createValidator(parentBefore, parentAfter,
treePermission, this);
return new VisibleValidator(validator, true, false);
}
@@ -313,7 +321,8 @@ class PermissionValidator extends Defaul
VersionConstants.REP_VERSIONSTORAGE.equals(TreeUtil.getPrimaryTypeName(tree));
}
- private Tree getVersionHistoryTree(Tree versionstorageTree) throws
CommitFailedException {
+ @CheckForNull
+ private ImmutableTree getVersionHistoryTree(Tree versionstorageTree)
throws CommitFailedException {
Tree versionHistory = null;
for (Tree child : versionstorageTree.getChildren()) {
if
(VersionConstants.NT_VERSIONHISTORY.equals(TreeUtil.getPrimaryTypeName(child)))
{
@@ -324,6 +333,6 @@ class PermissionValidator extends Defaul
throw new CommitFailedException("Misc", 0, "unexpected node");
}
}
- return versionHistory;
+ return (ImmutableTree) versionHistory;
}
}
Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-jcr/pom.xml Mon Nov 25 16:43:05 2013
@@ -103,7 +103,6 @@
org.apache.jackrabbit.test.api.version.MergeSubNodeTest
<!-- Permission Evaluation -->
-
org.apache.jackrabbit.oak.jcr.security.authorization.WriteTest#testMoveRemoveSubTree
<!-- OAK-1115 blocked by OAK-783 -->
org.apache.jackrabbit.oak.jcr.security.authorization.VersionManagementTest#testRemoveVersion
<!-- OAK-168 -->
org.apache.jackrabbit.oak.jcr.security.authorization.VersionManagementTest#testRemoveVersion2
<!-- OAK-168 -->
@@ -113,6 +112,8 @@
org.apache.jackrabbit.oak.jcr.security.authorization.CopyTest#testCopyInvisibleProperty
<!-- OAK-920 -->
org.apache.jackrabbit.oak.jcr.security.authorization.CopyTest#testCopyInvisibleAcContent
<!-- OAK-920 -->
+
org.apache.jackrabbit.oak.jcr.security.authorization.SessionMoveTest#testMoveAddSubTreeWithRestriction
<!-- OAK-1223 -->
+
<!-- User Management -->
org.apache.jackrabbit.oak.jcr.security.user.RefreshTest#testAuthorizableGetProperty
<!-- OAK-1124 -->
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
Mon Nov 25 16:43:05 2013
@@ -16,14 +16,8 @@
*/
package org.apache.jackrabbit.oak.jcr.delegate;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Lists.newArrayList;
-import static org.apache.jackrabbit.oak.commons.PathUtils.denotesRoot;
-import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
-
import java.io.IOException;
import java.util.List;
-
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.jcr.ItemExistsException;
@@ -39,7 +33,6 @@ import org.apache.jackrabbit.oak.api.Que
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.jcr.security.AccessManager;
import org.apache.jackrabbit.oak.jcr.session.RefreshStrategy;
import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
@@ -50,7 +43,6 @@ import org.apache.jackrabbit.oak.spi.com
import org.apache.jackrabbit.oak.spi.commit.FailingValidator;
import org.apache.jackrabbit.oak.spi.commit.SubtreeExcludingValidator;
import org.apache.jackrabbit.oak.spi.commit.Validator;
-import
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.slf4j.Logger;
@@ -58,6 +50,11 @@ import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Lists.newArrayList;
+import static org.apache.jackrabbit.oak.commons.PathUtils.denotesRoot;
+import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
+
/**
* TODO document
*/
@@ -379,12 +376,13 @@ public class SessionDelegate {
/**
* Move a node
+ *
* @param srcPath oak path to the source node to copy
* @param destPath oak path to the destination
* @param transientOp whether or not to perform the move in transient
space
* @throws RepositoryException
*/
- public void move(String srcPath, String destPath, boolean transientOp,
AccessManager accessManager)
+ public void move(String srcPath, String destPath, boolean transientOp)
throws RepositoryException {
Root moveRoot = transientOp ? root : contentSession.getLatestRoot();
@@ -408,8 +406,6 @@ public class SessionDelegate {
throw new PathNotFoundException(srcPath);
}
- accessManager.checkPermissions(destPath,
Permissions.getString(Permissions.NODE_TYPE_MANAGEMENT));
-
try {
if (!moveRoot.move(srcPath, destPath)) {
throw new RepositoryException("Cannot move node at " + srcPath
+ " to " + destPath);
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
Mon Nov 25 16:43:05 2013
@@ -16,16 +16,12 @@
*/
package org.apache.jackrabbit.oak.jcr.session;
-import static com.google.common.collect.Sets.newTreeSet;
-import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.AccessControlException;
import java.util.Collections;
import java.util.Set;
-
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.jcr.AccessDeniedException;
@@ -60,8 +56,8 @@ import org.apache.jackrabbit.oak.jcr.del
import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.PropertyDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate;
-import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
import org.apache.jackrabbit.oak.jcr.security.AccessManager;
+import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
import org.apache.jackrabbit.oak.jcr.xml.ImportHandler;
import
org.apache.jackrabbit.oak.spi.security.authentication.ImpersonationCredentials;
import
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
@@ -70,6 +66,9 @@ import org.slf4j.LoggerFactory;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
+import static com.google.common.collect.Sets.newTreeSet;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
+
/**
* TODO document
*/
@@ -362,8 +361,7 @@ public class SessionImpl implements Jack
@Override
public Void perform() throws RepositoryException {
- sd.move(srcOakPath, destOakPath, true,
- sessionContext.getAccessManager());
+ sd.move(srcOakPath, destOakPath, true);
return null;
}
});
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java
Mon Nov 25 16:43:05 2013
@@ -16,12 +16,8 @@
*/
package org.apache.jackrabbit.oak.jcr.session;
-import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
-import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
-
import java.io.IOException;
import java.io.InputStream;
-
import javax.annotation.Nonnull;
import javax.jcr.InvalidSerializedDataException;
import javax.jcr.NamespaceRegistry;
@@ -56,6 +52,9 @@ import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
+import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
+
/**
* TODO document
*/
@@ -186,8 +185,7 @@ public class WorkspaceImpl implements Ja
SessionImpl.checkIndexOnName(sessionContext, destAbsPath);
- sessionDelegate.move(
- srcOakPath, destOakPath, false,
sessionContext.getAccessManager());
+ sessionDelegate.move(srcOakPath, destOakPath, false);
}
@Override
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/SessionMoveTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/SessionMoveTest.java?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/SessionMoveTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/SessionMoveTest.java
Mon Nov 25 16:43:05 2013
@@ -23,6 +23,7 @@ import javax.jcr.Session;
import javax.jcr.security.Privilege;
import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.junit.Ignore;
import org.junit.Test;
/**
@@ -43,7 +44,7 @@ public class SessionMoveTest extends Abs
@Test
public void testMoveAndRemoveSubTree() throws Exception {
allow(path, privilegesFromName(Privilege.JCR_REMOVE_CHILD_NODES));
- allow(siblingPath, privilegesFromNames(new String[] {
+ allow(siblingPath, privilegesFromNames(new String[]{
Privilege.JCR_ADD_CHILD_NODES,
Privilege.JCR_NODE_TYPE_MANAGEMENT}));
@@ -67,7 +68,7 @@ public class SessionMoveTest extends Abs
allow(path, privilegesFromNames(new String[] {
Privilege.JCR_REMOVE_CHILD_NODES,
Privilege.JCR_REMOVE_NODE}));
- allow(siblingPath, privilegesFromNames(new String[] {
+ allow(siblingPath, privilegesFromNames(new String[]{
Privilege.JCR_ADD_CHILD_NODES,
Privilege.JCR_NODE_TYPE_MANAGEMENT}));
deny(testSession.getNode(nodePath3).getPath(),
privilegesFromName(Privilege.JCR_REMOVE_NODE));
@@ -90,7 +91,9 @@ public class SessionMoveTest extends Abs
public void testMoveAndRemoveSubTree3() throws Exception {
allow(path, privilegesFromName(Privilege.JCR_REMOVE_CHILD_NODES));
allow(childNPath, privilegesFromName(Privilege.JCR_REMOVE_NODE));
- allow(siblingPath, privilegesFromName(PrivilegeConstants.REP_WRITE));
+ allow(siblingPath, privilegesFromNames(new String[] {
+ PrivilegeConstants.JCR_ADD_CHILD_NODES,
PrivilegeConstants.JCR_NODE_TYPE_MANAGEMENT
+ }));
testSession.move(childNPath, siblingDestPath);
@@ -102,17 +105,114 @@ public class SessionMoveTest extends Abs
}
@Test
- public void testMoveAndRemoveProperty() throws Exception {
- // TODO
+ public void testMoveRemoveSubTreeWithRestriction() throws Exception {
+ /* allow READ/WRITE privilege for testUser at 'path' */
+ allow(path, testUser.getPrincipal(), readWritePrivileges);
+ /* deny REMOVE_NODE privileges at subtree. */
+ deny(path, privilegesFromName(PrivilegeConstants.JCR_REMOVE_NODE),
createGlobRestriction("*/"+nodeName3));
+
+ assertTrue(testSession.nodeExists(childNPath));
+ assertTrue(testSession.hasPermission(childNPath,
Session.ACTION_REMOVE));
+ assertTrue(testSession.hasPermission(childNPath2,
Session.ACTION_ADD_NODE));
+
+ testSession.move(childNPath, childNPath2 + "/dest");
+ Node dest = testSession.getNode(childNPath2 + "/dest");
+ dest.getNode(nodeName3).remove();
+
+ try {
+ testSession.save();
+ fail("Removing child node must be denied.");
+ } catch (AccessDeniedException e) {
+ // success
+ }
}
@Test
- public void testMoveAndAddReplacementAtSource() throws Exception {
+ public void testMoveAndAddSubTree() throws Exception {
+ allow(path, privilegesFromName(Privilege.JCR_REMOVE_CHILD_NODES));
+ allow(childNPath, privilegesFromName(Privilege.JCR_REMOVE_NODE));
+ allow(siblingPath, privilegesFromNames(new String[] {
+ PrivilegeConstants.JCR_ADD_CHILD_NODES,
PrivilegeConstants.JCR_NODE_TYPE_MANAGEMENT
+ }));
+
+ testSession.move(childNPath, siblingDestPath);
+
+ Node moved = testSession.getNode(siblingDestPath);
+ Node child = moved.getNode(nodeName3);
+ child.addNode(nodeName4);
+
+ try {
+ testSession.save();
+ fail("Adding child node at moved node must be denied: no
add_child_node privilege at original location.");
+ } catch (AccessDeniedException e) {
+ // success
+ }
+ }
+
+ @Test
+ public void testMoveAndAddSubTree2() throws Exception {
+ allow(path, privilegesFromName(Privilege.JCR_REMOVE_CHILD_NODES));
+ allow(childNPath, privilegesFromName(Privilege.JCR_REMOVE_NODE));
+ allow(siblingPath, privilegesFromNames(new String[] {
+ PrivilegeConstants.JCR_ADD_CHILD_NODES,
PrivilegeConstants.JCR_NODE_TYPE_MANAGEMENT
+ }));
+ allow(nodePath3, privilegesFromName(Privilege.JCR_ADD_CHILD_NODES));
+
+ testSession.move(childNPath, siblingDestPath);
+
+ Node moved = testSession.getNode(siblingDestPath);
+ Node child = moved.getNode(nodeName3);
+ child.addNode(nodeName4);
+
+ testSession.save();
+ }
+
+ @Test
+ public void testMoveAndAddSubTree3() throws Exception {
+ allow(path, privilegesFromName(Privilege.JCR_REMOVE_CHILD_NODES));
+ allow(childNPath, privilegesFromNames(new String[] {
+ Privilege.JCR_REMOVE_NODE, Privilege.JCR_ADD_CHILD_NODES
+ }));
+ allow(siblingPath, privilegesFromNames(new String[] {
+ PrivilegeConstants.JCR_ADD_CHILD_NODES,
PrivilegeConstants.JCR_NODE_TYPE_MANAGEMENT
+ }));
+
+ testSession.move(childNPath, siblingDestPath);
+
+ Node moved = testSession.getNode(siblingDestPath);
+ Node child = moved.getNode(nodeName3);
+ child.addNode(nodeName4);
+
+ testSession.save();
+ }
+
+ @Ignore("OAK-1223") // FIXME: OAK-1223
+ @Test
+ public void testMoveAddSubTreeWithRestriction() throws Exception {
+ /* allow READ/WRITE privilege for testUser at 'path' */
+ allow(path, testUser.getPrincipal(), readWritePrivileges);
+ /* deny ADD_CHILD_NODES privileges at subtree. */
+ deny(path, privilegesFromName(PrivilegeConstants.JCR_ADD_CHILD_NODES),
createGlobRestriction("*/"+nodeName3));
+
+ testSession.move(childNPath, childNPath2 + "/dest");
+ Node dest = testSession.getNode(childNPath2 + "/dest");
+ dest.getNode(nodeName3).addNode(nodeName4);
+
+ try {
+ testSession.save();
+ fail("Adding child node must be denied.");
+ } catch (AccessDeniedException e) {
+ // success
+ }
+ }
+
+ @Test
+ public void testMoveAndRemoveProperty() throws Exception {
// TODO
}
@Test
- public void testMoveAndAddSubTree() throws Exception {
+ public void testMoveAndAddReplacementAtSource() throws Exception {
// TODO
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WorkspaceMoveTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WorkspaceMoveTest.java?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WorkspaceMoveTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WorkspaceMoveTest.java
Mon Nov 25 16:43:05 2013
@@ -19,12 +19,9 @@ package org.apache.jackrabbit.oak.jcr.se
import javax.jcr.RepositoryException;
import javax.jcr.Session;
-import org.junit.Ignore;
-
/**
* Permission evaluation tests for move operations.
*/
-@Ignore("OAK-710 : permission validator doesn't detect move")
public class WorkspaceMoveTest extends AbstractMoveTest {
@Override
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WriteTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WriteTest.java?rev=1545340&r1=1545339&r2=1545340&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WriteTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/WriteTest.java
Mon Nov 25 16:43:05 2013
@@ -836,33 +836,4 @@ public class WriteTest extends AbstractE
superuser.save();
}
}
-
- @Ignore("OAK-1115")
- @Test
- public void testMoveRemoveSubTree() throws Exception {
- Node subtree = superuser.getNode(childNPath).addNode(nodeName3);
- superuser.save();
-
- String subtreePath = subtree.getPath();
-
- /* allow READ/WRITE privilege for testUser at 'path' */
- allow(path, testUser.getPrincipal(), readWritePrivileges);
- /* deny READ/REMOVE property privileges at subtree. */
- deny(path, privilegesFromNames(new String[]
{PrivilegeConstants.JCR_REMOVE_NODE}), createGlobRestriction("*/"+nodeName3));
-
- assertTrue(testSession.nodeExists(childNPath));
- assertTrue(testSession.hasPermission(childNPath,
Session.ACTION_REMOVE));
- assertTrue(testSession.hasPermission(childNPath2,
Session.ACTION_ADD_NODE));
-
- testSession.move(childNPath, childNPath2 + "/dest");
- Node dest = testSession.getNode(childNPath2 + "/dest");
- dest.getNode(nodeName3).remove();
-
- try {
- testSession.save();
- fail("Removing child node must be denied.");
- } catch (AccessDeniedException e) {
- // success
- }
- }
}
\ No newline at end of file