Author: angela
Date: Fri Jul 26 13:46:18 2019
New Revision: 1863813

URL: http://svn.apache.org/viewvc?rev=1863813&view=rev
Log:
OAK-8510 : FilterImpl.isValidPrincipal: add verification to spot moved principal

Added:
    
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/MoveSystemUserTest.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterProviderImpl.java
    
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/AbstractPrincipalBasedTest.java
    
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterImplTest.java

Modified: 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterProviderImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterProviderImpl.java?rev=1863813&r1=1863812&r2=1863813&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterProviderImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterProviderImpl.java
 Fri Jul 26 13:46:18 2019
@@ -169,7 +169,8 @@ public class FilterProviderImpl implemen
             }
 
             String principalName = principal.getName();
-            if (validatedPrincipalNamesPathMap.containsKey(principalName)) {
+            String path = validatedPrincipalNamesPathMap.get(principalName);
+            if (path != null && isValidMapEntry(principal, path)) {
                 return true;
             }
 
@@ -182,6 +183,25 @@ public class FilterProviderImpl implemen
             }
         }
 
+        /**
+         * Besteffort validation if the given entry in 
'validatedPrincipalNamesPathMap' is points to the correct path.
+         * Note, that this will just be performed for instances of {@code 
ItemBasedPrincipal}, where obtaining the path
+         * doesn't require looking up the principal again.
+         *
+         * @param principal The target principal to be validated
+         * @param oakPath The Oak path stored in 
'validatedPrincipalNamesPathMap' for the given principal.
+         * @return {@code true}, if the principal is an instance of {@code 
ItemBasedPrincipal}, whose Oak path is equal
+         * to the given {@code oakPath} and {@code false} if the paths are not 
equal. For any other types of principal
+         * this method will return {@code true} in order to avoid excessive 
principal lookup.
+         */
+        private boolean isValidMapEntry(@NotNull Principal principal, @NotNull 
String oakPath) {
+            if (principal instanceof ItemBasedPrincipal) {
+                return oakPath.equals(getOakPath((ItemBasedPrincipal) 
principal));
+            } else {
+                return true;
+            }
+        }
+
         @Nullable
         private String getPrincipalPath(@NotNull Principal principal) {
             String prinicpalOakPath = null;
@@ -189,8 +209,9 @@ public class FilterProviderImpl implemen
                 prinicpalOakPath = getOakPath((ItemBasedPrincipal) principal);
             }
             if (prinicpalOakPath == null || 
!root.getTree(prinicpalOakPath).exists()) {
-                // given principal is not ItemBasedPrincipal or it has been 
obtained with a different name-path-mapper
-                // making the conversion to oak-path return null -> try 
obtaining principal by name
+                // the given principal is not ItemBasedPrincipal or it has 
been obtained with a different name-path-mapper
+                // (making the conversion to oak-path return null) or it has 
been moved and the path no longer points to
+                // an existing tree -> try looking up principal by name
                 Principal p = 
principalProvider.getPrincipal(principal.getName());
                 if (p instanceof ItemBasedPrincipal) {
                     prinicpalOakPath = getOakPath((ItemBasedPrincipal) p);

Modified: 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/AbstractPrincipalBasedTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/AbstractPrincipalBasedTest.java?rev=1863813&r1=1863812&r2=1863813&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/AbstractPrincipalBasedTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/AbstractPrincipalBasedTest.java
 Fri Jul 26 13:46:18 2019
@@ -90,7 +90,7 @@ public class AbstractPrincipalBasedTest
         try {
             root.refresh();
             if (testSystemUser != null) {
-                testSystemUser.remove();
+                
getUserManager(root).getAuthorizable(testSystemUser.getID()).remove();
                 root.commit();
             }
         } finally {

Modified: 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterImplTest.java?rev=1863813&r1=1863812&r2=1863813&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/FilterImplTest.java
 Fri Jul 26 13:46:18 2019
@@ -126,11 +126,21 @@ public class FilterImplTest extends Abst
         assertFalse(filter.canHandle(Collections.singleton(principal)));
     }
 
-//    @Test
-//    public void testCanHandleItemBasedSystemUserPrincipalSupportedPath() {
-//        Principal principal = new TestPrincipal("name", 
PathUtils.concat(supportedPath, "oak:path/to/oak:principal"));
-//        assertTrue(filter.canHandle(Collections.singleton(principal)));
-//    }
+    @Test
+    public void testCanHandleMovedItemBasedSystemUserPrincipal() throws 
Exception {
+        Principal principal = getTestSystemUser().getPrincipal();
+        assertTrue(filter.canHandle(Collections.singleton(principal)));
+
+        String oakPath = filter.getOakPath(principal);
+        
assertEquals(getNamePathMapper().getOakPath(getTestSystemUser().getPath()), 
oakPath);
+
+        String destPath = oakPath + "_moved";
+        root.move(oakPath, destPath);
+
+        Principal movedPrincipal = new TestPrincipal(principal.getName(), 
destPath);
+        assertTrue(filter.canHandle(Collections.singleton(movedPrincipal)));
+        assertEquals(destPath, filter.getOakPath(movedPrincipal));
+    }
 
     @Test
     public void testCanHandleGetPathThrows() {

Added: 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/MoveSystemUserTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/MoveSystemUserTest.java?rev=1863813&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/MoveSystemUserTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/MoveSystemUserTest.java
 Fri Jul 26 13:46:18 2019
@@ -0,0 +1,64 @@
+/*
+ * 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.spi.security.authorization.principalbased.impl;
+
+import org.apache.jackrabbit.api.security.principal.ItemBasedPrincipal;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.security.Principal;
+
+import static 
org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_READ;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+public class MoveSystemUserTest extends AbstractPrincipalBasedTest {
+
+    private Principal principal;
+
+    @Before
+    public void before() throws Exception {
+        super.before();
+        principal = getTestSystemUser().getPrincipal();
+        setupPrincipalBasedAccessControl(principal, "/content", JCR_READ);
+        root.commit();
+        PrincipalPolicyImpl policy = getPrincipalPolicyImpl(principal, 
getAccessControlManager(root));
+        assertEquals(1, policy.size());
+    }
+
+    @Test
+    public void testMoveUser() throws Exception {
+        String userId = getTestSystemUser().getID();
+        String srcJcrPath = getTestSystemUser().getPath();
+        String name = PathUtils.getName(srcJcrPath);
+        String destJcrPath = 
PathUtils.concat(PathUtils.getParentPath(srcJcrPath), name + "-moved");
+        assertTrue(root.move(getNamePathMapper().getOakPath(srcJcrPath), 
getNamePathMapper().getOakPath(destJcrPath)));
+        root.commit();
+
+        assertNull(getUserManager(root).getAuthorizableByPath(srcJcrPath));
+
+        Principal p = 
getPrincipalManager(root).getPrincipal(principal.getName());
+        assertNotNull(p);
+        assertTrue(p instanceof ItemBasedPrincipal);
+        assertEquals(destJcrPath, ((ItemBasedPrincipal) p).getPath());
+        PrincipalPolicyImpl policy = getPrincipalPolicyImpl(p, 
getAccessControlManager(root));
+        assertEquals(1, policy.size());
+    }
+}
\ No newline at end of file

Propchange: 
jackrabbit/oak/trunk/oak-authorization-principalbased/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/MoveSystemUserTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to