diff --git a/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java index 1c83a9e17b..6841504979 100644 --- a/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java @@ -27,6 +27,7 @@ import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.repo.cache.SimpleCache; import org.alfresco.repo.security.permissions.AccessControlEntry; import org.alfresco.repo.security.permissions.AccessControlList; +import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.util.PropertyCheck; import org.springframework.context.ApplicationEvent; @@ -42,8 +43,12 @@ import org.springframework.context.ApplicationEvent; public class RMPermissionServiceImpl extends PermissionServiceImpl implements ExtendedPermissionService { + /** Writers simple cache */ protected SimpleCache> writersCache; + /** + * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#setAnyDenyDenies(boolean) + */ @Override public void setAnyDenyDenies(boolean anyDenyDenies) { @@ -59,6 +64,9 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl this.writersCache = writersCache; } + /** + * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#onBootstrap(org.springframework.context.ApplicationEvent) + */ @Override protected void onBootstrap(ApplicationEvent event) { @@ -67,11 +75,49 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl } /** - * Builds the set of authorities who can read the given ACL. No caching is done here. - * - * @return an unmodifiable set of authorities + * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#canRead(java.lang.Long) */ - protected Set buildReaders(Long aclId) + @Override + protected AccessStatus canRead(Long aclId) + { + Set authorities = getAuthorisations(); + + // test denied + + if(anyDenyDenies) + { + + Set aclReadersDenied = getReadersDenied(aclId); + + for(String auth : aclReadersDenied) + { + if(authorities.contains(auth)) + { + return AccessStatus.DENIED; + } + } + + } + + // test acl readers + Set aclReaders = getReaders(aclId); + + for(String auth : aclReaders) + { + if(authorities.contains(auth)) + { + return AccessStatus.ALLOWED; + } + } + + return AccessStatus.DENIED; + } + + /** + * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#getReaders(java.lang.Long) + */ + @Override + public Set getReaders(Long aclId) { AccessControlList acl = aclDaoComponent.getAccessControlList(aclId); if (acl == null) @@ -79,6 +125,12 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl return Collections.emptySet(); } + Set aclReaders = readersCache.get((Serializable)acl.getProperties()); + if (aclReaders != null) + { + return aclReaders; + } + HashSet assigned = new HashSet(); HashSet readers = new HashSet(); @@ -96,24 +148,33 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl readers.add(authority); } } - - return Collections.unmodifiableSet(readers); + + aclReaders = Collections.unmodifiableSet(readers); + readersCache.put((Serializable)acl.getProperties(), aclReaders); + return aclReaders; } - + /** + * Override with check for RM read + * * @param aclId - * @return set of authorities with read permission on the ACL + * @return */ - protected Set buildReadersDenied(Long aclId) + private Set getReadersDenied(Long aclId) { - HashSet assigned = new HashSet(); - HashSet denied = new HashSet(); AccessControlList acl = aclDaoComponent.getAccessControlList(aclId); if (acl == null) + { + return Collections.emptySet(); + } + Set denied = readersDeniedCache.get(aclId); + if (denied != null) { return denied; } + denied = new HashSet(); + Set assigned = new HashSet(); for (AccessControlEntry ace : acl.getEntries()) { @@ -129,9 +190,11 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl denied.add(authority); } } + + readersDeniedCache.put((Serializable)acl.getProperties(), denied); return denied; - } + } /** * @see org.alfresco.repo.security.permissions.impl.ExtendedPermissionService#getWriters(java.lang.Long)