Merged HEAD-BUG-FIX (5.1/Cloud) to HEAD (5.1/Cloud)

100265: Merged 5.0.N (5.0.2) to HEAD-BUG-FIX (5.1/Cloud)
      100257: Reverse Merge 5.0.N (5.0.2)
         << Cause 4 build errors >>
         100165: Merged NESS/5.0.N-2015_03_23 (5.0.2) to 5.0.N (5.0.2)
            99977: MNT-13628 : No matching ACE found to remove" error when removing all the ACLs with removeAcl method and 1.1 Browser implementation
               - Filter inherited permissions before try to remove them
               - Added unit test for case


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@100574 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Alan Davis
2015-03-27 23:16:14 +00:00
parent e19772b892
commit 3054ca3ebc

View File

@@ -2769,11 +2769,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
if (hasRemove)
{
Set<AccessPermission> permissions = permissionService.getAllSetPermissions(nodeRef);
// get only direct ACE since only those can be removed
Acl onlyDirectAcl = excludeInheritedAces(nodeRef, removeAces);
for (Ace ace : onlyDirectAcl.getAces())
for (Ace ace : removeAces.getAces())
{
String principalId = ace.getPrincipalId();
if (CMIS_USER.equals(principalId))
@@ -2815,91 +2811,6 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
}
}
/**
* Converts Acl to map and ignore the indirect ACEs
*
* @param acl
* @return
*/
private Map<String, Set<String>> convertAclToMap(Acl acl)
{
Map<String, Set<String>> result = new HashMap<String, Set<String>>();
if (acl == null || acl.getAces() == null)
{
return result;
}
for (Ace ace : acl.getAces())
{
// don't consider indirect ACEs - we can't change them
if (!ace.isDirect())
{
// ignore
continue;
}
// although a principal must not be null, check it
if (ace.getPrincipal() == null || ace.getPrincipal().getId() == null)
{
// ignore
continue;
}
Set<String> permissions = result.get(ace.getPrincipal().getId());
if (permissions == null)
{
permissions = new HashSet<String>();
result.put(ace.getPrincipal().getId(), permissions);
}
if (ace.getPermissions() != null)
{
permissions.addAll(ace.getPermissions());
}
}
return result;
}
/**
* Filter acl to ignore inherited ACEs
*
* @param nodeRef
* @param acl
* @return
*/
protected Acl excludeInheritedAces(NodeRef nodeRef, Acl acl)
{
List<Ace> newAces = new ArrayList<Ace>();
Acl allACLs = getACL(nodeRef, false);
Map<String, Set<String>> originalsAcls = convertAclToMap(allACLs);
Map<String, Set<String>> newAcls = convertAclToMap(acl);
// iterate through the original ACEs
for (Map.Entry<String, Set<String>> ace : originalsAcls.entrySet())
{
// add permissions
Set<String> addPermissions = newAcls.get(ace.getKey());
if (addPermissions != null)
{
ace.getValue().addAll(addPermissions);
}
// create new ACE
if (!ace.getValue().isEmpty())
{
newAces.add(new AccessControlEntryImpl(new AccessControlPrincipalDataImpl(ace
.getKey()), new ArrayList<String>(ace.getValue())));
}
}
return new AccessControlListImpl(newAces);
}
/**
* Sets the given ACL.
*/