Author: angela
Date: Thu Apr 25 09:22:35 2019
New Revision: 1858099
URL: http://svn.apache.org/viewvc?rev=1858099&view=rev
Log:
OAK-8276 : OR-CompositeTreePermission.grantsPermission should loop over
aggregates of supported permissions
Added:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionOrTest.java
(with props)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java?rev=1858099&r1=1858098&r2=1858099&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermission.java
Thu Apr 25 09:22:35 2019
@@ -218,7 +218,7 @@ final class CompositeTreePermission impl
}
coveredPermissions |= supported;
} else {
- for (long p : Permissions.aggregates(permissions)) {
+ for (long p : Permissions.aggregates(supported)) {
boolean aGrant = (property == null) ? tp.isGranted(p)
: tp.isGranted(p, property);
if (aGrant) {
coveredPermissions |= p;
Added:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionOrTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionOrTest.java?rev=1858099&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionOrTest.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionOrTest.java
Thu Apr 25 09:22:35 2019
@@ -0,0 +1,63 @@
+/*
+ * 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.security.authorization.composite;
+
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.plugins.tree.TreeType;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
+import
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class CompositeTreePermissionOrTest extends CompositeTreePermissionTest
{
+
+ @NotNull
+ @Override
+ CompositeAuthorizationConfiguration.CompositionType getCompositionType() {
+ return CompositeAuthorizationConfiguration.CompositionType.OR;
+ }
+
+ @Test
+ public void testIsGrantedUncoveredPermissions() {
+ TreePermission mockTp =
when(mock(TreePermission.class).isGranted(anyLong())).thenReturn(true).getMock();
+
+ AggregatedPermissionProvider mockPP =
mock(AggregatedPermissionProvider.class);
+ when(mockPP.getTreePermission(any(Tree.class), any(TreeType.class),
any(TreePermission.class))).thenReturn(mockTp);
+ when(mockPP.supportedPermissions(mockTp, null,
Permissions.WRITE)).thenReturn(Permissions.SET_PROPERTY);
+
+ TreePermission rootTp = createRootTreePermission(mockPP, mockPP);
+
+ assertFalse(rootTp.isGranted(Permissions.WRITE));
+
+ verify(mockTp, times(2)).isGranted(Permissions.ADD_PROPERTY);
+ verify(mockTp, times(2)).isGranted(Permissions.MODIFY_PROPERTY);
+ verify(mockTp, times(2)).isGranted(Permissions.REMOVE_PROPERTY);
+ verify(mockTp, never()).isGranted(Permissions.SET_PROPERTY);
+ verify(mockTp, never()).isGranted(Permissions.WRITE);
+ verify(mockPP, times(2)).supportedPermissions(mockTp, null,
Permissions.WRITE);
+ }
+}
\ No newline at end of file
Propchange:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionOrTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionTest.java?rev=1858099&r1=1858098&r2=1858099&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionTest.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/composite/CompositeTreePermissionTest.java
Thu Apr 25 09:22:35 2019
@@ -20,23 +20,34 @@ import java.lang.reflect.Field;
import java.util.Arrays;
import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Root;
import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.plugins.tree.TreeType;
import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
-import
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType;
import org.apache.jackrabbit.oak.spi.security.Context;
import
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider;
+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.jetbrains.annotations.NotNull;
import org.junit.Test;
+import static
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.CompositionType.AND;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
public class CompositeTreePermissionTest extends AbstractSecurityTest {
@@ -70,8 +81,14 @@ public class CompositeTreePermissionTest
}
}
- private TreePermission
createRootTreePermission(AggregatedPermissionProvider... providers) {
- return new CompositePermissionProvider(readOnlyRoot,
Arrays.asList(providers), Context.DEFAULT, CompositionType.AND,
getRootProvider(), getTreeProvider())
+ @NotNull
+ CompositeAuthorizationConfiguration.CompositionType getCompositionType() {
+ return AND;
+ }
+
+ @NotNull
+ TreePermission createRootTreePermission(@NotNull
AggregatedPermissionProvider... providers) {
+ return new CompositePermissionProvider(readOnlyRoot,
Arrays.asList(providers), Context.DEFAULT, getCompositionType(),
getRootProvider(), getTreeProvider())
.getTreePermission(rootTree, TreePermission.EMPTY);
}
@@ -143,6 +160,140 @@ public class CompositeTreePermissionTest
}
@Test
+ public void testCanReadTwiceAllowed() {
+ TreePermission mockTp =
when(mock(TreePermission.class).canRead()).thenReturn(true).getMock();
+ AggregatedPermissionProvider mockPP =
mock(AggregatedPermissionProvider.class);
+ when(mockPP.getTreePermission(any(Tree.class), any(TreeType.class),
any(TreePermission.class))).thenReturn(mockTp);
+ when(mockPP.supportedPermissions(mockTp, null,
Permissions.READ_NODE)).thenReturn(Permissions.ALL);
+
+ TreePermission rootTp = createRootTreePermission(mockPP,
fullScopeProvider);
+
+ rootTp.canRead();
+ rootTp.canRead();
+
+ verify(mockTp, times(1)).canRead();
+ verify(mockTp, never()).canReadProperties();
+ verify(mockTp, never()).canRead(any(PropertyState.class));
+ verify(mockTp, never()).canReadAll();
+
+ verify(mockPP, times(1)).getTreePermission(any(Tree.class),
any(TreeType.class), any(TreePermission.class));
+ verify(mockPP, times(1)).supportedPermissions(mockTp, null,
Permissions.READ_NODE);
+ }
+
+ @Test
+ public void testCanReadTwiceDenied() {
+ TreePermission mockTp =
when(mock(TreePermission.class).canRead()).thenReturn(false).getMock();
+ AggregatedPermissionProvider mockPP =
mock(AggregatedPermissionProvider.class);
+ when(mockPP.getTreePermission(any(Tree.class), any(TreeType.class),
any(TreePermission.class))).thenReturn(mockTp);
+ when(mockPP.supportedPermissions(mockTp, null,
Permissions.READ_NODE)).thenReturn(Permissions.ALL);
+
+ TreePermission rootTp = createRootTreePermission(mockPP,
fullScopeProvider);
+
+ rootTp.canRead();
+ rootTp.canRead();
+
+ verify(mockTp, times(1)).canRead();
+ verify(mockTp, never()).canReadProperties();
+ verify(mockTp, never()).canRead(any(PropertyState.class));
+ verify(mockTp, never()).canReadAll();
+
+ verify(mockPP, times(1)).getTreePermission(any(Tree.class),
any(TreeType.class), any(TreePermission.class));
+ verify(mockPP, times(1)).supportedPermissions(mockTp, null,
Permissions.READ_NODE);
+ }
+
+ @Test
+ public void testCanReadUnsupportedPermission() {
+ TreePermission mockTp =
when(mock(TreePermission.class).canRead()).thenReturn(true).getMock();
+ AggregatedPermissionProvider mockPP =
mock(AggregatedPermissionProvider.class);
+ when(mockPP.getTreePermission(any(Tree.class), any(TreeType.class),
any(TreePermission.class))).thenReturn(mockTp);
+ when(mockPP.supportedPermissions(mockTp, null,
Permissions.READ_NODE)).thenReturn(Permissions.NO_PERMISSION);
+
+ TreePermission rootTp = createRootTreePermission(mockPP, mockPP);
+
+ assertFalse(rootTp.canRead());
+
+ verify(mockTp, never()).canRead();
+ verify(mockPP, times(2)).getTreePermission(any(Tree.class),
any(TreeType.class), any(TreePermission.class));
+ verify(mockPP, times(2)).supportedPermissions(mockTp, null,
Permissions.READ_NODE);
+ }
+
+ @Test
+ public void testCanReadPropertyTwice() {
+ PropertyState ps = PropertyStates.createProperty("propName", "value");
+
+ TreePermission mockTp =
when(mock(TreePermission.class).canReadProperties()).thenReturn(false).getMock();
+ when(mockTp.canRead(ps)).thenReturn(true);
+
+ AggregatedPermissionProvider mockPP =
mock(AggregatedPermissionProvider.class);
+ when(mockPP.getTreePermission(any(Tree.class), any(TreeType.class),
any(TreePermission.class))).thenReturn(mockTp);
+ when(mockPP.supportedPermissions(mockTp, null,
Permissions.READ_PROPERTY)).thenReturn(Permissions.ALL);
+ when(mockPP.supportedPermissions(mockTp, ps,
Permissions.READ_PROPERTY)).thenReturn(Permissions.ALL);
+
+ TreePermission rootTp = createRootTreePermission(mockPP,
fullScopeProvider);
+
+ rootTp.canRead(ps);
+ rootTp.canRead(ps);
+
+ verify(mockTp, never()).canRead();
+ verify(mockTp, times(1)).canReadProperties();
+ verify(mockTp, times(2)).canRead(ps);
+ verify(mockTp, never()).canReadAll();
+ }
+
+ @Test
+ public void testCanReadProperties() {
+ PropertyState ps = PropertyStates.createProperty("propName", "value");
+
+ TreePermission mockTp =
when(mock(TreePermission.class).canReadProperties()).thenReturn(true).getMock();
+ when(mockTp.canRead(ps)).thenReturn(false);
+
+ AggregatedPermissionProvider mockPP =
mock(AggregatedPermissionProvider.class);
+ when(mockPP.getTreePermission(any(Tree.class), any(TreeType.class),
any(TreePermission.class))).thenReturn(mockTp);
+ when(mockPP.supportedPermissions(mockTp, null,
Permissions.READ_PROPERTY)).thenReturn(Permissions.ALL);
+
+ TreePermission rootTp = createRootTreePermission(mockPP,
fullScopeProvider);
+
+ rootTp.canReadProperties();
+ rootTp.canReadProperties();
+ rootTp.canRead(ps);
+
+ verify(mockTp, never()).canRead();
+ verify(mockTp, times(1)).canReadProperties();
+ verify(mockTp, never()).canRead(ps);
+ verify(mockTp, never()).canReadAll();
+ }
+
+ @Test
+ public void testCanReadAll() {
+ TreePermission mockTp =
when(mock(TreePermission.class).canReadAll()).thenReturn(true).getMock();
+ AggregatedPermissionProvider mockPP =
mock(AggregatedPermissionProvider.class);
+ when(mockPP.getTreePermission(any(Tree.class), any(TreeType.class),
any(TreePermission.class))).thenReturn(mockTp);
+ when(mockPP.supportedPermissions(mockTp, null,
Permissions.READ_NODE)).thenReturn(Permissions.ALL);
+
+ TreePermission rootTp = createRootTreePermission(mockPP,
fullScopeProvider);
+
+ assertFalse(rootTp.canReadAll());
+ verify(mockTp, never()).canReadAll();
+ }
+
+ @Test
+ public void testIsGrantedUncoveredPermissions() {
+ TreePermission mockTp =
when(mock(TreePermission.class).isGranted(anyLong())).thenReturn(true).getMock();
+
+ AggregatedPermissionProvider mockPP =
mock(AggregatedPermissionProvider.class);
+ when(mockPP.getTreePermission(any(Tree.class), any(TreeType.class),
any(TreePermission.class))).thenReturn(mockTp);
+ when(mockPP.supportedPermissions(mockTp, null,
Permissions.WRITE)).thenReturn(Permissions.SET_PROPERTY);
+
+ TreePermission rootTp = createRootTreePermission(mockPP, mockPP);
+
+ assertFalse(rootTp.isGranted(Permissions.WRITE));
+
+ verify(mockTp, times(2)).isGranted(Permissions.SET_PROPERTY);
+ verify(mockTp, never()).isGranted(Permissions.WRITE);
+ verify(mockPP, times(2)).supportedPermissions(mockTp, null,
Permissions.WRITE);
+ }
+
+ @Test
public void testParentNoRecourse() throws Exception {
TreePermission rootTp = createRootTreePermission(new
NoScopeProvider(root));
assertSame(TreePermission.NO_RECOURSE, rootTp);