diff --git a/source/java/org/alfresco/repo/jscript/ScriptNode.java b/source/java/org/alfresco/repo/jscript/ScriptNode.java index ac7216114f..f5b57c7858 100644 --- a/source/java/org/alfresco/repo/jscript/ScriptNode.java +++ b/source/java/org/alfresco/repo/jscript/ScriptNode.java @@ -1261,8 +1261,7 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol private Object[] retrieveAllSetPermissions(boolean direct, boolean full) { Set acls = this.services.getPermissionService().getAllSetPermissions(getNodeRef()); - Object[] permissions = new Object[acls.size()]; - int count = 0; + List permissions = new ArrayList(acls.size()); for (AccessPermission permission : acls) { if (!direct || permission.isSetDirectly()) @@ -1277,10 +1276,20 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol { buf.append(';').append(permission.isSetDirectly() ? "DIRECT" : "INHERITED"); } - permissions[count++] = buf.toString(); + permissions.add(buf.toString()); } } - return permissions; + return (Object[])permissions.toArray(new Object[permissions.size()]); + } + + /** + * @return Array of settable permissions for this Node + */ + public Scriptable getSettablePermissions() + { + Set permissions = this.services.getPermissionService().getSettablePermissions(getNodeRef()); + Object[] result = permissions.toArray(new Object[0]); + return Context.getCurrentContext().newArray(this.scope, result); } /** diff --git a/source/java/org/alfresco/repo/template/BasePermissionsNode.java b/source/java/org/alfresco/repo/template/BasePermissionsNode.java index 2ab93b1e4e..02b9a05301 100644 --- a/source/java/org/alfresco/repo/template/BasePermissionsNode.java +++ b/source/java/org/alfresco/repo/template/BasePermissionsNode.java @@ -40,12 +40,14 @@ import org.alfresco.service.cmr.security.PermissionService; public abstract class BasePermissionsNode extends BaseContentNode implements TemplatePermissions { private List permissions = null; + private List directPermissions = null; + private List fullPermissions = null; // ------------------------------------------------------------------------------ // Security API /** - * @return List of permissions applied to this Node. + * @return List of permissions applied to this Node, including inherited. * Strings returned are of the format [ALLOWED|DENIED];[USERNAME|GROUPNAME];PERMISSION for example * ALLOWED;kevinr;Consumer so can be easily tokenized on the ';' character. */ @@ -53,24 +55,74 @@ public abstract class BasePermissionsNode extends BaseContentNode implements Tem { if (this.permissions == null) { - String userName = this.services.getAuthenticationService().getCurrentUserName(); - this.permissions = new ArrayList(4); - if (hasPermission(PermissionService.READ_PERMISSIONS)) + this.permissions = retrieveAllSetPermissions(false, false); + } + return this.permissions; + } + + /** + * @return List of permissions applied to this Node (does not include inherited). + * Strings returned are of the format [ALLOWED|DENIED];[USERNAME|GROUPNAME];PERMISSION for example + * ALLOWED;kevinr;Consumer so can be easily tokenized on the ';' character. + */ + public List getDirectPermissions() + { + if (this.directPermissions == null) + { + this.directPermissions = retrieveAllSetPermissions(true, false); + } + return this.directPermissions; + } + + /** + * @return List of permissions applied to this Node, including inherited. + * Strings returned are of the format [ALLOWED|DENIED];[USERNAME|GROUPNAME];PERMISSION;[INHERITED|DIRECT] for example + * ALLOWED;kevinr;Consumer so can be easily tokenized on the ';' character. + */ + public List getFullPermissions() + { + if (this.fullPermissions == null) + { + this.fullPermissions = retrieveAllSetPermissions(false, true); + } + return this.fullPermissions; + } + + /** + * Helper to construct the response object for the various getPermissions() calls. + * + * @param direct True to only retrieve direct permissions, false to get inherited also + * @param full True to retrieve full data string with [INHERITED|DIRECT] element + * This exists to maintain backward compatibility with existing permission APIs. + * + * @return List of permissions. + */ + private List retrieveAllSetPermissions(boolean direct, boolean full) + { + String userName = this.services.getAuthenticationService().getCurrentUserName(); + List permissions = new ArrayList(4); + if (hasPermission(PermissionService.READ_PERMISSIONS)) + { + Set acls = this.services.getPermissionService().getAllSetPermissions(getNodeRef()); + for (AccessPermission permission : acls) { - Set acls = this.services.getPermissionService().getAllSetPermissions(getNodeRef()); - for (AccessPermission permission : acls) + if (!direct || permission.isSetDirectly()) { StringBuilder buf = new StringBuilder(64); buf.append(permission.getAccessStatus()) - .append(';') - .append(permission.getAuthority()) - .append(';') - .append(permission.getPermission()); - this.permissions.add(buf.toString()); + .append(';') + .append(permission.getAuthority()) + .append(';') + .append(permission.getPermission()); + if (full) + { + buf.append(';').append(permission.isSetDirectly() ? "DIRECT" : "INHERITED"); + } + permissions.add(buf.toString()); } } } - return this.permissions; + return permissions; } /**