in src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/ModifyAceServlet.java [1117:1167]
protected void modifyAce(
Session jcrSession, String resourcePath, String principalId,
Collection<LocalPrivilege> localPrivileges, String order,
boolean autoSave, List<Modification> changes) throws RepositoryException {
@NotNull
Principal principal = validateArgs(jcrSession, resourcePath, principalId);
// build a list of each of the LocalPrivileges that have the same restrictions
Map<Set<LocalRestriction>, List<LocalPrivilege>> allowRestrictionsToLocalPrivilegesMap = new HashMap<>();
Map<Set<LocalRestriction>, List<LocalPrivilege>> denyRestrictionsToLocalPrivilegesMap = new HashMap<>();
for (LocalPrivilege localPrivilege: localPrivileges) {
if (localPrivilege.isAllow()) {
List<LocalPrivilege> list = allowRestrictionsToLocalPrivilegesMap.computeIfAbsent(localPrivilege.getAllowRestrictions(), key -> new ArrayList<>());
list.add(localPrivilege);
}
if (localPrivilege.isDeny()) {
List<LocalPrivilege> list = denyRestrictionsToLocalPrivilegesMap.computeIfAbsent(localPrivilege.getDenyRestrictions(), key -> new ArrayList<>());
list.add(localPrivilege);
}
}
try {
// Get or create the ACL for the node.
AccessControlManager acm = AccessControlUtil.getAccessControlManager(jcrSession);
JackrabbitAccessControlList acl = getAcl(acm, resourcePath, principal);
// remove all the old aces for the principal
order = removeAces(resourcePath, order, principal, acl);
// now add all the new aces that we have collected
Map<Privilege, Integer> privilegeLongestDepthMap = PrivilegesHelper.buildPrivilegeLongestDepthMap(acm.privilegeFromName(PrivilegeConstants.JCR_ALL));
addAces(resourcePath, principal, denyRestrictionsToLocalPrivilegesMap, false, acl, privilegeLongestDepthMap);
addAces(resourcePath, principal, allowRestrictionsToLocalPrivilegesMap, true, acl, privilegeLongestDepthMap);
// reorder the aces
reorderAccessControlEntries(acl, principal, order);
// Store the actual changes.
acm.setPolicy(acl.getPath(), acl);
if (changes != null) {
changes.add(Modification.onModified(principal.getName()));
}
if (autoSave && jcrSession.hasPendingChanges()) {
jcrSession.save();
}
} catch (RepositoryException re) {
throw new RepositoryException("Failed to create ace.", re);
}
}