Author: jukka
Date: Fri Nov 22 20:57:13 2013
New Revision: 1544674

URL: http://svn.apache.org/r1544674
Log:
OAK-928: Read access is enforced on NEW items

Add NodeBuilder.isReplaced() and use it to detect cases where a read-protected 
base state has been replaced with a fresh new one

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/ReadOnlyBuilder.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/ShadowInvisibleContentTest.java
    jackrabbit/oak/trunk/oak-jcr/pom.xml
    
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/core/SecureNodeBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java?rev=1544674&r1=1544673&r2=1544674&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
 Fri Nov 22 20:57:13 2013
@@ -126,12 +126,14 @@ class SecureNodeBuilder implements NodeB
 
     @Override
     public boolean exists() {
-        return getTreePermission().canRead() && builder.exists(); // TODO: 
isNew()?
+        return builder.exists()
+                && (builder.isReplaced() || getTreePermission().canRead());
     }
 
     @Override
     public boolean isNew() {
-        return builder.isNew(); // TODO: might disclose hidden content
+        return builder.isNew()
+                || (builder.isReplaced() && !getTreePermission().canRead());
     }
 
     @Override
@@ -139,6 +141,11 @@ class SecureNodeBuilder implements NodeB
         return builder.isModified();
     }
 
+    @Override
+    public boolean isReplaced() {
+        return builder.isReplaced() && !isNew();
+    }
+
     public void baseChanged() {
         checkState(parent == null);
         treePermission = null; // trigger re-evaluation of the context
@@ -165,7 +172,8 @@ class SecureNodeBuilder implements NodeB
     @Override @CheckForNull
     public PropertyState getProperty(String name) {
         PropertyState property = builder.getProperty(name);
-        if (property != null && getTreePermission().canRead(property)) {
+        if (property != null
+                && (getTreePermission().canRead(property) || isNew())) {
             return property;
         } else {
             return null;
@@ -179,7 +187,7 @@ class SecureNodeBuilder implements NodeB
 
     @Override
     public synchronized long getPropertyCount() {
-        if (getTreePermission().canReadProperties()) {
+        if (getTreePermission().canReadProperties() || isNew()) {
             return builder.getPropertyCount();
         } else {
             return size(filter(
@@ -190,7 +198,7 @@ class SecureNodeBuilder implements NodeB
 
     @Override @Nonnull
     public Iterable<? extends PropertyState> getProperties() {
-        if (getTreePermission().canReadProperties()) {
+        if (getTreePermission().canReadProperties() || isNew()) {
             return builder.getProperties();
         } else {
             return filter(

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java?rev=1544674&r1=1544673&r2=1544674&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeBuilder.java
 Fri Nov 22 20:57:13 2013
@@ -269,6 +269,11 @@ public class MemoryNodeBuilder implement
     }
 
     @Override
+    public boolean isReplaced() {
+        return head().isReplaced();
+    }
+
+    @Override
     public long getChildNodeCount(long max) {
         return head().getCurrentNodeState().getChildNodeCount(max);
     }
@@ -534,6 +539,15 @@ public class MemoryNodeBuilder implement
          */
         public abstract boolean isModified();
 
+        /**
+         * Check whether the associated builder represents a node that
+         * used to exist but was replaced with other content.
+         *
+         * @return  {@code true} for a replaced node
+         */
+        public abstract boolean isReplaced();
+
+
     }
 
     private class UnconnectedHead extends Head {
@@ -585,6 +599,11 @@ public class MemoryNodeBuilder implement
         }
 
         @Override
+        public boolean isReplaced() {
+            return false;
+        }
+
+        @Override
         public String toString() {
             return toStringHelper(this).add("path", getPath()).toString();
         }
@@ -633,6 +652,11 @@ public class MemoryNodeBuilder implement
         }
 
         @Override
+        public boolean isReplaced() {
+            return state.isReplaced(base());
+        }
+
+        @Override
         public String toString() {
             return toStringHelper(this).add("path", getPath()).toString();
         }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java?rev=1544674&r1=1544673&r2=1544674&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java
 Fri Nov 22 20:57:13 2013
@@ -140,7 +140,10 @@ class MutableNodeState extends AbstractN
         }
 
         return false;
+    }
 
+    boolean isReplaced(NodeState before) {
+        return base != before;
     }
 
     /**

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeBuilder.java?rev=1544674&r1=1544673&r2=1544674&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeBuilder.java
 Fri Nov 22 20:57:13 2013
@@ -114,6 +114,15 @@ public interface NodeBuilder {
     boolean isModified();
 
     /**
+     * Check whether this builder represents a node that used to exist but
+     * was then replaced with other content, for example as a result of
+     * a {@link #setChildNode(String)} call.
+     *
+     * @return {@code true} for a replaced node
+     */
+    boolean isReplaced();
+
+    /**
      * Returns the current number of child nodes.
      * <p>
      * If an implementation does know the exact value, it returns it (even if

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/ReadOnlyBuilder.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/ReadOnlyBuilder.java?rev=1544674&r1=1544673&r2=1544674&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/ReadOnlyBuilder.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/ReadOnlyBuilder.java
 Fri Nov 22 20:57:13 2013
@@ -60,6 +60,11 @@ public class ReadOnlyBuilder implements 
         return false;
     }
 
+    @Override
+    public boolean isReplaced() {
+        return false;
+    }
+
     @Override @Nonnull
     public NodeState getNodeState() {
         return state;

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/ShadowInvisibleContentTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/ShadowInvisibleContentTest.java?rev=1544674&r1=1544673&r2=1544674&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/ShadowInvisibleContentTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/evaluation/ShadowInvisibleContentTest.java
 Fri Nov 22 20:57:13 2013
@@ -36,7 +36,6 @@ import static org.junit.Assert.fail;
 public class ShadowInvisibleContentTest extends AbstractOakCoreTest {
      
     @Test
-    @Ignore // FIXME OAK-709 - see TODO in SecureNodeBuilder.exists()
     public void testShadowInvisibleNode() throws Exception {
         setupPermission("/a", testPrincipal, true, PrivilegeConstants.JCR_ALL);
         setupPermission("/a/b", testPrincipal, false, 
PrivilegeConstants.JCR_ALL);

Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1544674&r1=1544673&r2=1544674&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-jcr/pom.xml Fri Nov 22 20:57:13 2013
@@ -103,7 +103,6 @@
       org.apache.jackrabbit.test.api.version.MergeSubNodeTest
 
       <!-- Permission Evaluation -->
-      
org.apache.jackrabbit.oak.jcr.security.authorization.WriteTest#testWriteOnParentWithNoReadePriv<!--
 OAK-869 -->
       
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 -->

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=1544674&r1=1544673&r2=1544674&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
 Fri Nov 22 20:57:13 2013
@@ -423,7 +423,6 @@ public class WriteTest extends AbstractE
     }
 
     @Test
-    @Ignore("OAK-869") // FIXME: OAK-869
     public void testWriteOnParentWithNoReadePriv() throws Exception {
         Node a = superuser.getNode(path).addNode("a");
         allow(path, testUser.getPrincipal(), readWritePrivileges);


Reply via email to