Author: mreutegg
Date: Wed Oct 15 08:26:48 2014
New Revision: 1631971

URL: http://svn.apache.org/r1631971
Log:
OAK-2188: Add/remove version label fails with restricted access on /jcr:system

Added:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
   (with props)
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/plugins/version/ReadWriteVersionManager.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
    
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
    
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
    
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java
    
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
    
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.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=1631971&r1=1631970&r2=1631971&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
 Wed Oct 15 08:26:48 2014
@@ -112,6 +112,17 @@ public abstract class ReadOnlyVersionMan
     }
 
     /**
+     * Returns the version tree with the given uuid.
+     *
+     * @param uuid the uuid of the version tree.
+     * @return the version tree or {@code null} if there is none.
+     */
+    @CheckForNull
+    public Tree getVersion(@Nonnull String uuid) {
+        return getIdentifierManager().getTree(uuid);
+    }
+
+    /**
      * Returns the path of the version history for the given {@code uuid}.
      * The returned path is relative to the version storage tree as returned
      * by {@link #getVersionStorage()}.

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
 Wed Oct 15 08:26:48 2014
@@ -71,7 +71,8 @@ import static org.apache.jackrabbit.oak.
 import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_PATH;
 
 /**
- * TODO document
+ * Extends the {@link ReadOnlyVersionManager} with methods to modify the
+ * version store.
  */
 class ReadWriteVersionManager extends ReadOnlyVersionManager {
 
@@ -214,8 +215,7 @@ class ReadWriteVersionManager extends Re
     public void checkout(NodeBuilder versionable) {
         versionable.setProperty(JCR_ISCHECKEDOUT, true, Type.BOOLEAN);
         PropertyState baseVersion = versionable.getProperty(JCR_BASEVERSION);
-        List<String> predecessors = Collections.singletonList(
-                baseVersion.getValue(Type.REFERENCE));
+        List<String> predecessors = 
Collections.singletonList(baseVersion.getValue(Type.REFERENCE));
         versionable.setProperty(JCR_PREDECESSORS, predecessors, 
Type.REFERENCES);
     }
 
@@ -282,39 +282,6 @@ class ReadWriteVersionManager extends Re
     }
 
     /**
-     * Adds a version label to the jcr:versionLabels node of the referenced
-     * version history.
-     *
-     * @param historyRelPath relative path from the jcr:versionStorage node to
-     *                       the version history node.
-     * @param label          the version label.
-     * @param versionName    the name of the version.
-     * @throws CommitFailedException if there is no such version history or if
-     * there is already a label with the given name or if the given version 
name
-     * is invalid.
-     */
-    public void addVersionLabel(@Nonnull String historyRelPath,
-                                @Nonnull String label,
-                                @Nonnull String versionName)
-           throws CommitFailedException {
-        NodeBuilder labels = getVersionLabelsFor(checkNotNull(historyRelPath));
-        if (labels.hasProperty(checkNotNull(label))) {
-            throw new CommitFailedException(CommitFailedException.LABEL_EXISTS,
-                    VersionExceptionCode.LABEL_EXISTS.ordinal(),
-                    "Version label " + label + " already exists on this 
version history");
-        }
-        NodeBuilder history = resolve(versionStorageNode, historyRelPath);
-        if (checkNotNull(versionName).equals(JCR_ROOTVERSION)
-                || !history.hasChildNode(checkNotNull(versionName))) {
-            throw new CommitFailedException(CommitFailedException.VERSION,
-                    VersionExceptionCode.NO_SUCH_VERSION.ordinal(),
-                    "Not a valid version on this history: " + versionName);
-        }
-        String uuid = uuidFromNode(history.getChildNode(versionName));
-        labels.setProperty(label, uuid, Type.REFERENCE);
-    }
-
-    /**
      * Removes a version label from the jcr:versionLabels node of the 
referenced
      * version history.
      *

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/Utils.java
 Wed Oct 15 08:26:48 2014
@@ -21,11 +21,14 @@ package org.apache.jackrabbit.oak.plugin
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import static org.apache.jackrabbit.JcrConstants.JCR_UUID;
+import static org.apache.jackrabbit.oak.api.CommitFailedException.CONSTRAINT;
 
 import javax.annotation.Nonnull;
 
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 
 /**
@@ -70,4 +73,9 @@ public final class Utils {
         }
         return primaryType;
     }
+
+    static <T> T throwProtected(String path) throws CommitFailedException {
+        throw new CommitFailedException(CONSTRAINT, 100,
+                "Item is protected: " + path);
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionConstants.java
 Wed Oct 15 08:26:48 2014
@@ -58,21 +58,6 @@ public interface VersionConstants extend
     String MIX_REP_VERSIONABLE_PATHS = "rep:VersionablePaths";
 
     /**
-     * Version operation property name to add version labels.
-     */
-    String REP_ADD_VERSION_LABELS = "rep:addVersionLabels";
-
-    /**
-     * Version operation property name to remove version labels.
-     */
-    String REP_REMOVE_VERSION_LABELS = "rep:removeVersionLabels";
-
-    /**
-     * Version operation property name to remove version(s).
-     */
-    String REP_REMOVE_VERSION = "rep:removeVersion";
-
-    /**
      * Prefix of the jcr:baseVersion value for a restore.
      */
     String RESTORE_PREFIX = "restore-";

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditorProvider.java
 Wed Oct 15 08:26:48 2014
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.commit.CompositeEditor;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.commit.EditorProvider;
+import org.apache.jackrabbit.oak.spi.commit.SubtreeEditor;
 import org.apache.jackrabbit.oak.spi.commit.VisibleEditor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -47,7 +48,9 @@ public class VersionEditorProvider imple
         NodeBuilder versionStorage = system.child(JCR_VERSIONSTORAGE);
         return new VisibleEditor(new CompositeEditor(
                 new VersionEditor(versionStorage, builder, info),
-                new VersionStorageEditor(versionStorage, builder)));
+                new SubtreeEditor(
+                        new VersionStorageEditor(versionStorage, builder),
+                            JCR_SYSTEM, JCR_VERSIONSTORAGE)));
     }
 
 }

Added: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java?rev=1631971&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
 Wed Oct 15 08:26:48 2014
@@ -0,0 +1,97 @@
+/*
+ * 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.plugins.version;
+
+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.spi.commit.DefaultEditor;
+import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+import static org.apache.jackrabbit.JcrConstants.JCR_ROOTVERSION;
+import static org.apache.jackrabbit.oak.api.CommitFailedException.CONSTRAINT;
+import static org.apache.jackrabbit.oak.plugins.version.Utils.throwProtected;
+
+/**
+ * Validates changes on jcr:versionLabels nodes in the version storage.
+ */
+class VersionLabelsEditor extends DefaultEditor {
+
+    private final String path;
+    private final ReadWriteVersionManager vMgr;
+
+    VersionLabelsEditor(String labelsPath,
+                        ReadWriteVersionManager versionManager) {
+        this.path = labelsPath;
+        this.vMgr = versionManager;
+    }
+
+    @Override
+    public void propertyAdded(PropertyState after)
+            throws CommitFailedException {
+        validateLabel(after);
+    }
+
+    @Override
+    public void propertyChanged(PropertyState before, PropertyState after)
+            throws CommitFailedException {
+        validateLabel(after);
+    }
+
+    @Override
+    public Editor childNodeAdded(String name, NodeState after)
+            throws CommitFailedException {
+        return throwProtected(PathUtils.concat(path, name));
+    }
+
+    @Override
+    public Editor childNodeChanged(String name,
+                                   NodeState before,
+                                   NodeState after)
+            throws CommitFailedException {
+        return throwProtected(PathUtils.concat(path, name));
+    }
+
+    @Override
+    public Editor childNodeDeleted(String name, NodeState before)
+            throws CommitFailedException {
+        return throwProtected(PathUtils.concat(path, name));
+    }
+
+    //-----------------------< internal 
>---------------------------------------
+
+    private void validateLabel(PropertyState label)
+            throws CommitFailedException {
+        String identifier = label.getValue(Type.REFERENCE);
+        Tree version = vMgr.getVersion(identifier);
+        if (version == null) {
+            throw new CommitFailedException(CONSTRAINT, 0,
+                    "Version label references unknown node");
+        }
+        String parent = PathUtils.getAncestorPath(path, 1);
+        String versionName = version.getName();
+        if (versionName.equals(JCR_ROOTVERSION)
+                || !PathUtils.isAncestor(parent, version.getPath())) {
+            throw new CommitFailedException(CommitFailedException.VERSION,
+                    VersionExceptionCode.NO_SUCH_VERSION.ordinal(),
+                    "Not a valid version on this history: " + versionName);
+        }
+    }
+}

Propchange: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionLabelsEditor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
 Wed Oct 15 08:26:48 2014
@@ -16,89 +16,52 @@
  */
 package org.apache.jackrabbit.oak.plugins.version;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.SortedMap;
-
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.spi.commit.DefaultEditor;
 import org.apache.jackrabbit.oak.spi.commit.Editor;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONLABELS;
-import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONSTORAGE;
-import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_ADD_VERSION_LABELS;
-import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_REMOVE_VERSION;
-import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_REMOVE_VERSION_LABELS;
+import static org.apache.jackrabbit.oak.commons.PathUtils.concat;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getDepth;
+import static org.apache.jackrabbit.oak.commons.PathUtils.relativize;
+import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_NODE_TYPE_NAMES;
+import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_NT_NAMES;
+import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_PATH;
 
 /**
- * Implements an editor watching for well known properties on the
- * /jcr:system/jcr:versionStorage node to trigger version operations (like
- * adding/removing labels or removing versions) on the protected version 
storage
- * tree.
- * <p>
- * This editor supports the following operations:
- * <ul>
- * <li>{@link VersionConstants#REP_ADD_VERSION_LABELS}: adds version labels to
- * existing version histories. The property is multi-valued and each value is a
- * PATH, which looks like this:
- * {@code 
&lt;version-history-path>/jcr:versionLabels/&lt;version-label>/&lt;version-name>}.
- * The {@code version-history-path} is a relative path to the version
- * history node starting at the /jcr:system/jcr:versionStorage node.
- * An attempt to add a version label that already exists will result in a
- * {@link CommitFailedException}. </li>
- * <li>{@link VersionConstants#REP_REMOVE_VERSION_LABELS}: removes version 
labels from
- * existing version histories. The property is multi-valued and each value is a
- * PATH, which looks like this:
- * {@code 
&lt;version-history-path>/jcr:versionLabels/&lt;version-label>/&lt;version-name>}.
- * The {@code version-history-path} is a relative path to the version
- * history node starting at the /jcr:system/jcr:versionStorage node. The
- * {@code &lt;version-name>} part is ignored when labels are removed and
- * can be anything, though it must be a valid JCR/Oak name.
- * An attempt to remove a version label, which does not exist, will result in a
- * {@link CommitFailedException}. </li>
- * <li>{@link VersionConstants#REP_REMOVE_VERSION}: : removes a version from
- * existing version histories, the associated labels and fixes the version 
tree.
- * The property is multi-valued and each value is a
- * PATH, which looks like this:
- * {@code &lt;version-history-path>/&lt;version-name>}.
- * The {@code version-history-path} is a relative path to the version
- * history node starting at the /jcr:system/jcr:versionStorage node.</li>
- * </ul>
+ * Validates changes on the version store.
  */
 class VersionStorageEditor extends DefaultEditor {
 
+    private static final int VERSION_HISTORY_DEPTH = 6;
+
     private final NodeBuilder versionStorageNode;
     private final NodeBuilder workspaceRoot;
+    private final NodeBuilder builder;
+    private final String path;
     private ReadWriteVersionManager vMgr;
-    private final List<String> pathRemainder;
-
-    private final SortedMap<Integer, Operation> operations = Maps.newTreeMap();
 
     VersionStorageEditor(@Nonnull NodeBuilder versionStorageNode,
                          @Nonnull NodeBuilder workspaceRoot) {
-        this(versionStorageNode, workspaceRoot,
-                Arrays.asList(JCR_SYSTEM, JCR_VERSIONSTORAGE));
+        this(versionStorageNode, workspaceRoot, versionStorageNode,
+                VERSION_STORE_PATH);
     }
 
     private VersionStorageEditor(@Nonnull NodeBuilder versionStorageNode,
-                         @Nonnull NodeBuilder workspaceRoot,
-                         @Nonnull List<String> pathRemainder) {
-        this.versionStorageNode = versionStorageNode;
-        this.workspaceRoot = workspaceRoot;
-        this.pathRemainder = checkNotNull(pathRemainder);
+                                 @Nonnull NodeBuilder workspaceRoot,
+                                 @Nonnull NodeBuilder builder,
+                                 @Nonnull String path) {
+        this.versionStorageNode = checkNotNull(versionStorageNode);
+        this.workspaceRoot = checkNotNull(workspaceRoot);
+        this.builder = checkNotNull(builder);
+        this.path = checkNotNull(path);
     }
 
     @Override
@@ -106,144 +69,92 @@ class VersionStorageEditor extends Defau
                                    NodeState before,
                                    NodeState after)
             throws CommitFailedException {
-        if (pathRemainder.isEmpty()) {
-            return null;
+        int d = getDepth(path);
+        String p = concat(path, name);
+        if (d == VERSION_HISTORY_DEPTH
+                && name.equals(JCR_VERSIONLABELS)) {
+            return new VersionLabelsEditor(p, getVersionManager());
         }
-        if (pathRemainder.get(0).equals(name)) {
-            return new VersionStorageEditor(versionStorageNode, workspaceRoot,
-                    pathRemainder.subList(1, pathRemainder.size()));
-        } else {
+        if (d < VERSION_HISTORY_DEPTH && !isVersionStorageNode(after)) {
             return null;
         }
+        return new VersionStorageEditor(versionStorageNode, workspaceRoot,
+                builder.child(name), p);
     }
 
     @Override
-    public void propertyAdded(PropertyState after)
+    public Editor childNodeAdded(String name, NodeState after)
             throws CommitFailedException {
-        String name = after.getName();
-        if (REP_REMOVE_VERSION_LABELS.equals(name)) {
-            operations.put(1, new 
RemoveVersionLabels(after.getValue(Type.PATHS)));
-            versionStorageNode.removeProperty(name);
-        } else if (REP_ADD_VERSION_LABELS.equals(name)) {
-            operations.put(2, new 
AddVersionLabels(after.getValue(Type.PATHS)));
-            versionStorageNode.removeProperty(name);
-        } else if (REP_REMOVE_VERSION.equals(name)) {
-            operations.put(3, new RemoveVersion(after.getValue(Type.PATHS)));
-            versionStorageNode.removeProperty(name);
+        int d = getDepth(path);
+        // allow child nodes under version storage node, unless an attempt
+        // is made to create rep:versionStorage nodes manually.
+        if (d == getDepth(VERSION_STORE_PATH) &&
+                !isVersionStorageNode(after)) {
+            return null;
         }
+        return throwProtected(name);
     }
 
     @Override
-    public void leave(NodeState before, NodeState after)
+    public Editor childNodeDeleted(String name, NodeState before)
             throws CommitFailedException {
-        for (Operation op : operations.values()) {
-            op.perform();
+        int d = getDepth(path);
+        if (d == VERSION_HISTORY_DEPTH) {
+            // restore version on builder
+            builder.setChildNode(name, before);
+            String relPath = relativize(VERSION_STORE_PATH, concat(path, 
name));
+            // let version manager remove it properly
+            getVersionManager().removeVersion(relPath);
+            return null;
+        } else if (isVersionStorageNode(before) || d > VERSION_HISTORY_DEPTH) {
+            throwProtected(name);
         }
+        return null;
     }
 
-    //-------------------------< internal 
>-------------------------------------
-
-    private ReadWriteVersionManager getVersionManager() {
-        if (vMgr == null) {
-            vMgr = new ReadWriteVersionManager(versionStorageNode, 
workspaceRoot);
+    @Override
+    public void propertyAdded(PropertyState after)
+            throws CommitFailedException {
+        if (getDepth(path) < VERSION_HISTORY_DEPTH) {
+            return;
         }
-        return vMgr;
+        throwProtected(after.getName());
     }
 
-    interface Operation {
-
-        void perform() throws CommitFailedException;
-    }
-
-    private class AddVersionLabels implements Operation {
-
-        private Iterable<String> labelPaths;
-
-        public AddVersionLabels(Iterable<String> labelPaths) {
-            this.labelPaths = labelPaths;
-        }
-
-        @Override
-        public void perform() throws CommitFailedException {
-            for (String s : labelPaths) {
-                VersionLabel label = new VersionLabel(s);
-                getVersionManager().addVersionLabel(label.versionHistoryPath, 
label.label, label.versionName);
-            }
+    @Override
+    public void propertyChanged(PropertyState before, PropertyState after)
+            throws CommitFailedException {
+        if (getDepth(path) < VERSION_HISTORY_DEPTH) {
+            return;
         }
+        throwProtected(before.getName());
     }
 
-    private class RemoveVersionLabels implements Operation {
-
-        private Iterable<String> labelPaths;
-
-        public RemoveVersionLabels(Iterable<String> labelPaths) {
-            this.labelPaths = labelPaths;
-        }
-
-        @Override
-        public void perform() throws CommitFailedException {
-            for (String s : labelPaths) {
-                VersionLabel label = new VersionLabel(s);
-                
getVersionManager().removeVersionLabel(label.versionHistoryPath, label.label);
-            }
+    @Override
+    public void propertyDeleted(PropertyState before)
+            throws CommitFailedException {
+        if (getDepth(path) < VERSION_HISTORY_DEPTH) {
+            return;
         }
+        throwProtected(before.getName());
     }
 
-    private class RemoveVersion implements Operation {
-
-        private final Iterable<String> versionPaths;
+    //-------------------------< internal 
>-------------------------------------
 
-        private RemoveVersion(@Nonnull Iterable<String> versionPaths) {
-            this.versionPaths = versionPaths;
-        }
+    private static boolean isVersionStorageNode(NodeState state) {
+        String ntName = state.getName(JCR_PRIMARYTYPE);
+        return VERSION_STORE_NT_NAMES.contains(ntName)
+                || VERSION_NODE_TYPE_NAMES.contains(ntName);
+    }
 
-        @Override
-        public void perform() throws CommitFailedException {
-            for (String path : versionPaths) {
-                getVersionManager().removeVersion(path);
-            }
+    private ReadWriteVersionManager getVersionManager() {
+        if (vMgr == null) {
+            vMgr = new ReadWriteVersionManager(versionStorageNode, 
workspaceRoot);
         }
+        return vMgr;
     }
 
-    private static class VersionLabel {
-
-        private final String versionHistoryPath;
-
-        private final String label;
-
-        private final String versionName;
-
-        /**
-         * @param path a label path as defined in the constructor of
-         * {@link VersionStorageEditor}.
-         * @throws IllegalArgumentException if the path is malformed
-         */
-        VersionLabel(@Nonnull String path) throws IllegalArgumentException {
-            checkArgument(!PathUtils.isAbsolute(checkNotNull(path)),
-                    "Version label path must be relative");
-            List<String> elements = 
Lists.newArrayList(PathUtils.elements(path));
-            // length of the path must be 7:
-            // intermediate versionstorage nodes : 3
-            // version history node : 1
-            // jcr:versionLabels : 1
-            // version label : 1
-            // version name : 1
-            if (elements.size() != 7) {
-                throw new IllegalArgumentException(
-                        "Invalid version label path: " + path);
-            }
-            StringBuilder builder = new StringBuilder();
-            String slash = "";
-            for (String element : elements.subList(0, 4)) {
-                builder.append(slash);
-                builder.append(element);
-                slash = "/";
-            }
-            versionHistoryPath = builder.toString();
-            checkArgument(elements.get(4).equals(JCR_VERSIONLABELS),
-                    "Invalid version label path: " + path);
-            label = elements.get(5);
-            versionName = elements.get(6);
-        }
+    private Editor throwProtected(String name) throws CommitFailedException {
+        return Utils.throwProtected(concat(path, name));
     }
 }

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
 Wed Oct 15 08:26:48 2014
@@ -181,7 +181,8 @@ public class VersionManagerDelegate {
         String vhRelPath = 
PathUtils.relativize(VersionStorage.VERSION_STORAGE_PATH,
                 checkNotNull(versionHistory).getPath());
         versionManager.addVersionLabel(storage, vhRelPath,
-                checkNotNull(version).getName(), checkNotNull(oakVersionLabel),
+                checkNotNull(version).getIdentifier(),
+                checkNotNull(oakVersionLabel),
                 moveLabel);
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
 Wed Oct 15 08:26:48 2014
@@ -16,8 +16,6 @@
  */
 package org.apache.jackrabbit.oak.jcr.version;
 
-import java.util.Collections;
-
 import javax.annotation.Nonnull;
 import javax.jcr.InvalidItemStateException;
 import javax.jcr.RepositoryException;
@@ -44,9 +42,6 @@ import static com.google.common.base.Pre
 import static org.apache.jackrabbit.JcrConstants.JCR_CREATED;
 import static org.apache.jackrabbit.JcrConstants.JCR_ISCHECKEDOUT;
 import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONLABELS;
-import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_ADD_VERSION_LABELS;
-import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_REMOVE_VERSION_LABELS;
-import static 
org.apache.jackrabbit.oak.plugins.version.VersionConstants.REP_REMOVE_VERSION;
 
 /**
  * {@code ReadWriteVersionManager}...
@@ -182,27 +177,22 @@ public class ReadWriteVersionManager ext
 
     public void addVersionLabel(@Nonnull VersionStorage versionStorage,
                                 @Nonnull String versionHistoryOakRelPath,
-                                @Nonnull String versionOakName,
+                                @Nonnull String versionIdentifier,
                                 @Nonnull String oakVersionLabel,
                                 boolean moveLabel) throws RepositoryException {
         Tree versionHistory = 
TreeUtil.getTree(checkNotNull(versionStorage.getTree()),
                 checkNotNull(versionHistoryOakRelPath));
         Tree labels = checkNotNull(versionHistory).getChild(JCR_VERSIONLABELS);
-        if (labels.hasProperty(checkNotNull(oakVersionLabel))) {
+        PropertyState existing = 
labels.getProperty(checkNotNull(oakVersionLabel));
+        if (existing != null) {
             if (moveLabel) {
-                String labelPath = PathUtils.concat(versionHistoryOakRelPath,
-                        JCR_VERSIONLABELS, oakVersionLabel, "dummy");
-                versionStorage.getTree().setProperty(REP_REMOVE_VERSION_LABELS,
-                        Collections.singleton(labelPath), Type.PATHS);
+                labels.removeProperty(existing.getName());
             } else {
                 throw new LabelExistsVersionException("Version label '"
                         + oakVersionLabel + "' already exists on this version 
history");
             }
         }
-        String labelPath = PathUtils.concat(versionHistoryOakRelPath,
-                JCR_VERSIONLABELS, oakVersionLabel, 
checkNotNull(versionOakName));
-        versionStorage.getTree().setProperty(REP_ADD_VERSION_LABELS,
-                Collections.singleton(labelPath), Type.PATHS);
+        labels.setProperty(oakVersionLabel, versionIdentifier, Type.REFERENCE);
         try {
             sessionDelegate.commit(versionStorage.getRoot());
             refresh();
@@ -223,10 +213,7 @@ public class ReadWriteVersionManager ext
             throw new VersionException("Version label " + oakVersionLabel +
                     " does not exist on this version history");
         }
-        String labelPath = PathUtils.concat(versionHistoryOakRelPath,
-                JCR_VERSIONLABELS, oakVersionLabel, "dummy");
-        versionStorage.getTree().setProperty(REP_REMOVE_VERSION_LABELS,
-                Collections.singleton(labelPath), Type.PATHS);
+        labels.removeProperty(oakVersionLabel);
         try {
             sessionDelegate.commit(versionStorage.getRoot());
             refresh();
@@ -248,8 +235,7 @@ public class ReadWriteVersionManager ext
         if (!version.exists()) {
             throw new VersionException("Version " + oakVersionName + " does 
not exist on this version history");
         }
-        String versionPath = PathUtils.concat(versionHistoryOakRelPath, 
oakVersionName);
-        versionStorage.getTree().setProperty(REP_REMOVE_VERSION, 
Collections.singleton(versionPath), Type.PATHS);
+        version.remove();
         try {
             sessionDelegate.commit(versionStorage.getRoot());
             refresh();

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/TestContentLoader.java
 Wed Oct 15 08:26:48 2014
@@ -69,6 +69,7 @@ public class TestContentLoader {
         }
 
         AccessControlUtils.addAccessControlEntry(session, "/", 
EveryonePrincipal.getInstance(), new String[]{Privilege.JCR_READ}, true);
+        AccessControlUtils.addAccessControlEntry(session, "/jcr:system", 
EveryonePrincipal.getInstance(), new String[]{Privilege.JCR_READ}, false);
         session.save();
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/AbstractEvaluationTest.java
 Wed Oct 15 08:26:48 2014
@@ -18,7 +18,7 @@ package org.apache.jackrabbit.oak.jcr.se
 
 import java.security.Principal;
 import java.util.Collections;
-import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
@@ -32,8 +32,9 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
 import javax.jcr.Value;
+import javax.jcr.security.AccessControlEntry;
+import javax.jcr.security.AccessControlList;
 import javax.jcr.security.AccessControlManager;
-import javax.jcr.security.AccessControlPolicy;
 import javax.jcr.security.Privilege;
 
 import org.apache.jackrabbit.api.JackrabbitSession;
@@ -42,12 +43,14 @@ import org.apache.jackrabbit.api.securit
 import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import 
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
-import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.test.NotExecutableException;
 import org.apache.jackrabbit.test.api.security.AbstractAccessControlTest;
 import org.junit.After;
 import org.junit.Before;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
 import static org.junit.Assert.assertArrayEquals;
 
 /**
@@ -78,7 +81,7 @@ public abstract class AbstractEvaluation
     protected Session testSession;
     protected AccessControlManager testAcMgr;
 
-    private Set<String> toClear = new HashSet<String>();
+    private List<ACL> toRestore = Lists.newArrayList();
 
     @Override
     @Before
@@ -116,8 +119,6 @@ public abstract class AbstractEvaluation
         childchildPPath = ccp1.getPath();
         siblingPath = n2.getPath();
 
-        // setup default permissions
-        AccessControlUtils.addAccessControlEntry(superuser, "/", 
EveryonePrincipal.getInstance(), privilegesFromName(Privilege.JCR_READ), true);
         superuser.save();
 
         testSession = createTestSession();
@@ -139,14 +140,13 @@ public abstract class AbstractEvaluation
                 testSession.logout();
             }
             superuser.refresh(false);
-            for (String path : toClear) {
-                if (path != null && superuser.nodeExists(path)) {
-                    AccessControlPolicy[] policies = acMgr.getPolicies(path);
-                    for (AccessControlPolicy policy : policies) {
-                        acMgr.removePolicy(path, policy);
-                    }
+            // restore in reverse order
+            for (ACL acl : Lists.reverse(toRestore)) {
+                if (acl.path == null || superuser.nodeExists(acl.path)) {
+                    restoreAces(acl);
                 }
             }
+            toRestore.clear();
             if (testGroup != null) {
                 testGroup.remove();
             }
@@ -225,6 +225,9 @@ public abstract class AbstractEvaluation
     }
 
     protected JackrabbitAccessControlList modify(String path, Principal 
principal, Privilege[] privileges, boolean isAllow, Map<String, Value> 
restrictions) throws Exception {
+        // remember for restore during tearDown
+        toRestore.add(getACL(path));
+
         JackrabbitAccessControlList tmpl = 
AccessControlUtils.getAccessControlList(acMgr, path);
         tmpl.addEntry(principal, privileges, isAllow, restrictions);
 
@@ -232,8 +235,6 @@ public abstract class AbstractEvaluation
         superuser.save();
         testSession.refresh(false);
 
-        // remember for clean up during tearDown
-        toClear.add(tmpl.getPath());
         return tmpl;
     }
 
@@ -270,4 +271,36 @@ public abstract class AbstractEvaluation
             throws Exception {
         return modify(nPath, principal, privileges, false, EMPTY_RESTRICTIONS);
     }
+
+    private ACL getACL(String path) throws RepositoryException {
+        return new ACL(path, 
AccessControlUtils.getAccessControlList(superuser, path));
+    }
+
+    private void restoreAces(ACL restore) throws RepositoryException {
+        AccessControlList acl = 
AccessControlUtils.getAccessControlList(superuser, path);
+        if (acl != null) {
+            for (AccessControlEntry ace : acl.getAccessControlEntries()) {
+                acl.removeAccessControlEntry(ace);
+            }
+            for (AccessControlEntry ace : restore.entries) {
+                acl.addAccessControlEntry(ace.getPrincipal(), 
ace.getPrivileges());
+            }
+            acMgr.setPolicy(path, acl);
+            superuser.save();
+        }
+    }
+
+    private static final class ACL {
+
+        private final String path;
+        private final Set<AccessControlEntry> entries = Sets.newHashSet();
+
+        ACL(String path, AccessControlList list)
+                throws RepositoryException {
+            this.path = path;
+            if (list != null) {
+                Collections.addAll(entries, list.getAccessControlEntries());
+            }
+        }
+    }
 }
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/ReadTest.java
 Wed Oct 15 08:26:48 2014
@@ -17,7 +17,6 @@
 package org.apache.jackrabbit.oak.jcr.security.authorization;
 
 import java.security.Principal;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import javax.jcr.Node;
@@ -26,11 +25,9 @@ import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.security.AccessControlEntry;
-import javax.jcr.security.AccessControlList;
 import javax.jcr.security.Privilege;
 import javax.jcr.util.TraversingItemVisitor;
 
-import com.google.common.collect.Sets;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
 import org.apache.jackrabbit.api.security.user.Group;
 import 
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
@@ -144,37 +141,12 @@ public class ReadTest extends AbstractEv
 
     @Test
     public void testDenyRoot() throws Exception {
-        Set<AccessControlEntry> acesBefore = getACEs("/");
         try {
             deny("/", readPrivileges);
             testSession.getRootNode();
             fail("root should not be accessible");
         } catch (Exception e) {
             // expected exception
-        } finally {
-            restoreAces("/", acesBefore);
-        }
-    }
-
-    private Set<AccessControlEntry> getACEs(String path) throws 
RepositoryException {
-        AccessControlList acl = 
AccessControlUtils.getAccessControlList(superuser, path);
-        Set<AccessControlEntry> acesBefore = Sets.newHashSet();
-        if (acl != null) {
-            Collections.addAll(acesBefore, acl.getAccessControlEntries());
-        }
-        return acesBefore;
-    }
-
-    private void restoreAces(String path, Set<AccessControlEntry> acesToKeep) 
throws RepositoryException {
-        AccessControlList acl = 
AccessControlUtils.getAccessControlList(superuser, path);
-        if (acl != null) {
-            for (AccessControlEntry ace : acl.getAccessControlEntries()) {
-                if (!acesToKeep.contains(ace)) {
-                    acl.removeAccessControlEntry(ace);
-                }
-            }
-            acMgr.setPolicy("/", acl);
-            superuser.save();
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/UserManagementTest.java
 Wed Oct 15 08:26:48 2014
@@ -24,7 +24,6 @@ import javax.jcr.AccessDeniedException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.query.Query;
-import javax.jcr.security.AccessControlEntry;
 import javax.jcr.security.Privilege;
 
 import com.google.common.collect.Lists;
@@ -35,6 +34,7 @@ import org.apache.jackrabbit.api.securit
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.commons.JcrUtils;
 import 
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
@@ -57,6 +57,16 @@ public class UserManagementTest extends 
     private List<String> authorizablesToRemove = Lists.newArrayList(userId, 
groupId);
 
     @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // setup default permissions
+        String authPath = "/rep:security/rep:authorizables";
+        AccessControlUtils.addAccessControlEntry(superuser, authPath, 
EveryonePrincipal.getInstance(), privilegesFromName(Privilege.JCR_READ), true);
+        superuser.save();
+    }
+
+    @Override
     @Before
     public void tearDown() throws Exception {
         try {
@@ -71,20 +81,6 @@ public class UserManagementTest extends 
                 }
             }
 
-            JackrabbitAccessControlList acl = 
AccessControlUtils.getAccessControlList(acMgr, "/");
-            if (acl != null) {
-                boolean modified = false;
-                for (AccessControlEntry entry : acl.getAccessControlEntries()) 
{
-                    if (testUser.getPrincipal().equals(entry.getPrincipal())) {
-                        acl.removeAccessControlEntry(entry);
-                        modified = true;
-                    }
-                }
-                if (modified) {
-                    acMgr.setPolicy("/", acl);
-                }
-            }
-
             superuser.save();
         } finally {
             super.tearDown();

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java?rev=1631971&r1=1631970&r2=1631971&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/authorization/VersionManagementTest.java
 Wed Oct 15 08:26:48 2014
@@ -48,7 +48,9 @@ public class VersionManagementTest exten
         super.setUp();
 
         versionPrivileges = 
privilegesFromName(Privilege.JCR_VERSION_MANAGEMENT);
-        assertFalse(testAcMgr.hasPrivileges(VERSIONSTORE, versionPrivileges));
+        // must not see version storage or must not have version privilege
+        assertTrue(!testSession.nodeExists(VERSIONSTORE)
+                || !testAcMgr.hasPrivileges(VERSIONSTORE, versionPrivileges));
     }
 
     private Node createVersionableNode(Node parent) throws Exception {
@@ -321,6 +323,30 @@ public class VersionManagementTest exten
      * @since oak
      */
     @Test
+    public void testRemoveVersionLabel() throws Exception {
+        Node n = createVersionableNode(superuser.getNode(path));
+        allow(n.getPath(), versionPrivileges);
+
+        Node testNode = testSession.getNode(n.getPath());
+        Version v = testNode.checkin();
+        testNode.checkout();
+        Version v2 = testNode.checkin();
+        testNode.checkout();
+
+        // -> VersionHistory.addVersionLabel must be allowed
+        VersionHistory history = testNode.getVersionHistory();
+        history.addVersionLabel(v.getName(), "testLabel", false);
+        history.addVersionLabel(v2.getName(), "testLabel", true);
+
+        VersionManager vMgr = testSession.getWorkspace().getVersionManager();
+        history = vMgr.getVersionHistory(testNode.getPath());
+        history.removeVersionLabel("testLabel");
+    }
+
+    /**
+     * @since oak
+     */
+    @Test
     public void testVersionablePath() throws Exception {
         Node n = createVersionableNode(superuser.getNode(path));
 


Reply via email to