You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by as...@apache.org on 2016/04/19 08:03:08 UTC

svn commit: r1739843 - /sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java

Author: asanso
Date: Tue Apr 19 06:03:08 2016
New Revision: 1739843

URL: http://svn.apache.org/viewvc?rev=1739843&view=rev
Log:
SLING-5638 - Sling:alias property not working if user does not have read access to the root node

Modified:
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java?rev=1739843&r1=1739842&r2=1739843&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java Tue Apr 19 06:03:08 2016
@@ -916,11 +916,23 @@ public class ResourceResolverImpl extend
 
         } else {
 
+            String tokenizedPath = absPath;
+            
             // no direct resource found, so we have to drill down into the
             // resource tree to find a match
             resource = getAbsoluteResourceInternal(null, "/", parameters, true);
+            
+            //no read access on / drilling further down
+            //SLING-5638
+            if (resource == null) {
+                resource = getAbsoluteResourceInternal(absPath, parameters, true);
+                if (resource != null) {
+                    tokenizedPath = tokenizedPath.substring(resource.getPath().length());
+                }
+            }
+            
             final StringBuilder resolutionPath = new StringBuilder();
-            final StringTokenizer tokener = new StringTokenizer(absPath, "/");
+            final StringTokenizer tokener = new StringTokenizer(tokenizedPath, "/");
             while (resource != null && tokener.hasMoreTokens()) {
                 final String childNameRaw = tokener.nextToken();
 
@@ -929,7 +941,7 @@ public class ResourceResolverImpl extend
 
                     resource = nextResource;
                     resolutionPath.append("/").append(childNameRaw);
-
+                    
                 } else {
 
                     String childName = null;
@@ -1062,6 +1074,32 @@ public class ResourceResolverImpl extend
         logger.debug("getResourceInternal: Cannot resolve path '{}' to a resource", path);
         return null;
     }
+    
+    /**
+     * Creates a resource, traversing bottom up, to the highest readable resource.
+     * 
+     */
+    private Resource getAbsoluteResourceInternal(String absPath, final Map<String, String> parameters, final boolean isResolved) {
+         
+        if (!absPath.contains("/") || "/".equals(absPath)) {
+            return null;
+        }
+        
+        absPath = absPath.substring(absPath.indexOf("/"));
+        Resource resource = getAbsoluteResourceInternal(null, absPath, parameters, isResolved);
+        
+        absPath = absPath.substring(0, absPath.lastIndexOf("/"));
+
+        while (!absPath.equals("")) {
+            Resource r = getAbsoluteResourceInternal(null, absPath, parameters, true);
+            
+            if (r != null) {
+                resource = r;
+            }            
+            absPath = absPath.substring(0, absPath.lastIndexOf("/"));
+        }        
+        return resource;
+    }
 
     /**
      * Returns the <code>path</code> as an absolute path. If the path is already