Author: enorman
Date: Wed Aug 14 05:28:14 2013
New Revision: 1513729

URL: http://svn.apache.org/r1513729
Log:
SLING-3010 integrate patch from Anjan. Added integration tests to guard against 
future regressions.

Modified:
    
sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java
    
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java

Modified: 
sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java?rev=1513729&r1=1513728&r2=1513729&view=diff
==============================================================================
--- 
sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java
 (original)
+++ 
sling/trunk/bundles/jcr/base/src/main/java/org/apache/sling/jcr/base/util/AccessControlUtil.java
 Wed Aug 14 05:28:14 2013
@@ -484,6 +484,9 @@ public class AccessControlUtil {
                if (privilege.isAggregate()) {
                        Privilege[] privileges = 
privilege.getAggregatePrivileges();
                        for (Privilege disaggregate : privileges) {
+                               if (disaggregate.isAggregate()) {
+                                       continue; //nested aggregate, so skip 
it since the privileges are already included.
+                               }
                                
disaggregatedPrivilegeNames.add(disaggregate.getName());
                        }
                } else {

Modified: 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java?rev=1513729&r1=1513728&r2=1513729&view=diff
==============================================================================
--- 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
 (original)
+++ 
sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/accessManager/ModifyAceTest.java
 Wed Aug 14 05:28:14 2013
@@ -855,4 +855,140 @@ public class ModifyAceTest extends Abstr
         JSONObject jsonObject = new JSONObject(json);
                assertNotNull(jsonObject);
        }
+       
+       
+       /**
+        * Test for SLING-3010
+        */
+       public void 
testMergeAceForUserGrantNestedAggregatePrivilegeAfterDenySuperAggregatePrivilege()
 throws IOException, JSONException {
+               testUserId = createTestUser();
+               
+               testFolderUrl = createTestFolder();
+               
+        String postUrl = testFolderUrl + ".modifyAce.json";
+
+        //1. setup an initial set of denied privileges for the test user
+        List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+               postParams.add(new NameValuePair("principalId", testUserId));
+               postParams.add(new 
NameValuePair("privilege@jcr:versionManagement", "denied"));
+               postParams.add(new NameValuePair("privilege@jcr:read", 
"denied"));
+               postParams.add(new 
NameValuePair("privilege@jcr:modifyAccessControl", "denied")); 
+               postParams.add(new NameValuePair("privilege@rep:write", 
"denied")); 
+               
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               /*String json = */getAuthenticatedPostContent(creds, postUrl, 
CONTENT_TYPE_JSON, postParams, HttpServletResponse.SC_OK);
+
+               
+        //2. now grant the jcr:write subset from the rep:write aggregate 
privilege
+               postParams = new ArrayList<NameValuePair>();
+               postParams.add(new NameValuePair("principalId", testUserId));
+               postParams.add(new 
NameValuePair("privilege@jcr:versionManagement", "granted"));
+               postParams.add(new NameValuePair("privilege@jcr:read", 
"granted"));
+               postParams.add(new 
NameValuePair("privilege@jcr:modifyAccessControl", "granted")); 
+               postParams.add(new NameValuePair("privilege@jcr:write", 
"granted")); //sub-aggregate of rep:write  
+               
+               /*String json = */getAuthenticatedPostContent(creds, postUrl, 
CONTENT_TYPE_JSON, postParams, HttpServletResponse.SC_OK);
+               
+               //3. verify that the acl has the correct values
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+               
+               JSONObject jsonObject = new JSONObject(json);
+               assertEquals(1, jsonObject.length());
+               
+               JSONObject aceObject = jsonObject.optJSONObject(testUserId);
+               assertNotNull(aceObject);
+               
+               assertEquals(testUserId, aceObject.optString("principal"));
+               
+               JSONArray grantedArray = aceObject.getJSONArray("granted");
+               assertNotNull(grantedArray);
+               assertEquals(4, grantedArray.length());
+               Set<String> grantedPrivilegeNames = new HashSet<String>();
+               for (int i=0; i < grantedArray.length(); i++) {
+                       grantedPrivilegeNames.add(grantedArray.getString(i));
+               }
+               
assertTrue(grantedPrivilegeNames.contains("jcr:versionManagement"));
+               assertTrue(grantedPrivilegeNames.contains("jcr:read"));
+               
assertTrue(grantedPrivilegeNames.contains("jcr:modifyAccessControl"));
+               assertTrue(grantedPrivilegeNames.contains("jcr:write"));
+
+               JSONArray deniedArray = aceObject.getJSONArray("denied");
+               assertNotNull(deniedArray);
+               assertEquals(1, deniedArray.length());
+               Set<String> deniedPrivilegeNames = new HashSet<String>();
+               for (int i=0; i < deniedArray.length(); i++) {
+                       deniedPrivilegeNames.add(deniedArray.getString(i));
+               }
+               //the leftovers from the denied rep:write that were not granted 
with jcr:write
+               
assertTrue(deniedPrivilegeNames.contains("jcr:nodeTypeManagement")); 
+       }
+
+       /**
+        * Test for SLING-3010
+        */
+       public void 
testMergeAceForUserGrantAggregatePrivilegePartsAfterDenyAggregatePrivilege() 
throws IOException, JSONException {
+               testUserId = createTestUser();
+               
+               testFolderUrl = createTestFolder();
+               
+        String postUrl = testFolderUrl + ".modifyAce.json";
+
+        //1. setup an initial set of denied privileges for the test user
+        List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+               postParams.add(new NameValuePair("principalId", testUserId));
+               postParams.add(new 
NameValuePair("privilege@jcr:versionManagement", "denied"));
+               postParams.add(new NameValuePair("privilege@jcr:read", 
"denied"));
+               postParams.add(new 
NameValuePair("privilege@jcr:modifyAccessControl", "denied")); 
+               postParams.add(new NameValuePair("privilege@rep:write", 
"denied")); 
+               
+               Credentials creds = new UsernamePasswordCredentials("admin", 
"admin");
+               /*String json = */getAuthenticatedPostContent(creds, postUrl, 
CONTENT_TYPE_JSON, postParams, HttpServletResponse.SC_OK);
+
+        //2. now grant the all the privileges contained in the rep:write 
privilege
+               postParams = new ArrayList<NameValuePair>();
+               postParams.add(new NameValuePair("principalId", testUserId));
+               postParams.add(new 
NameValuePair("privilege@jcr:versionManagement", "granted"));
+               postParams.add(new NameValuePair("privilege@jcr:read", 
"granted"));
+               postParams.add(new 
NameValuePair("privilege@jcr:modifyAccessControl", "granted")); 
+               postParams.add(new 
NameValuePair("privilege@jcr:nodeTypeManagement", "granted")); //sub-privilege 
of rep:write  
+               postParams.add(new NameValuePair("privilege@jcr:write", 
"granted")); //sub-aggregate of rep:write  
+               
+               /*String json = */getAuthenticatedPostContent(creds, postUrl, 
CONTENT_TYPE_JSON, postParams, HttpServletResponse.SC_OK);
+               
+               //3. verify that the acl has the correct values
+               //fetch the JSON for the acl to verify the settings.
+               String getUrl = testFolderUrl + ".acl.json";
+
+               String json = getAuthenticatedContent(creds, getUrl, 
CONTENT_TYPE_JSON, null, HttpServletResponse.SC_OK);
+               assertNotNull(json);
+               
+               JSONObject jsonObject = new JSONObject(json);
+               assertEquals(1, jsonObject.length());
+               
+               JSONObject aceObject = jsonObject.optJSONObject(testUserId);
+               assertNotNull(aceObject);
+               
+               assertEquals(testUserId, aceObject.optString("principal"));
+               
+               JSONArray grantedArray = aceObject.getJSONArray("granted");
+               assertNotNull(grantedArray);
+               assertEquals(4, grantedArray.length());
+               Set<String> grantedPrivilegeNames = new HashSet<String>();
+               for (int i=0; i < grantedArray.length(); i++) {
+                       grantedPrivilegeNames.add(grantedArray.getString(i));
+               }
+               
assertTrue(grantedPrivilegeNames.contains("jcr:versionManagement"));
+               assertTrue(grantedPrivilegeNames.contains("jcr:read"));
+               
assertTrue(grantedPrivilegeNames.contains("jcr:modifyAccessControl"));
+               assertTrue(grantedPrivilegeNames.contains("rep:write")); 
//jcr:nodeTypeManagement + jcr:write
+
+               //should be nothing left in the denied set.
+               JSONArray deniedArray = aceObject.optJSONArray("denied");
+               assertNull(deniedArray);
+       }
+       
 }


Reply via email to