diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index 5989e204a8..88749a35c5 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -483,6 +483,12 @@ + + + + + + diff --git a/source/java/org/alfresco/repo/copy/CopyServiceImpl.java b/source/java/org/alfresco/repo/copy/CopyServiceImpl.java index 02b7581739..352c58cd26 100644 --- a/source/java/org/alfresco/repo/copy/CopyServiceImpl.java +++ b/source/java/org/alfresco/repo/copy/CopyServiceImpl.java @@ -47,6 +47,10 @@ import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.rule.RuleService; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.cmr.security.AccessPermission; +import org.alfresco.service.cmr.security.AccessStatus; +import org.alfresco.service.cmr.security.AuthenticationService; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; @@ -73,6 +77,12 @@ public class CopyServiceImpl implements CopyService /** Rule service */ private RuleService ruleService; + + /** Permission service */ + private PermissionService permissionService; + + /** Authentication service */ + private AuthenticationService authenticationService; /** Policy delegates */ private ClassPolicyDelegate onCopyNodeDelegate; @@ -128,6 +138,26 @@ public class CopyServiceImpl implements CopyService this.ruleService = ruleService; } + /** + * Set the permission service + * + * @param permissionService the permission service + */ + public void setPermissionService(PermissionService permissionService) + { + this.permissionService = permissionService; + } + + /** + * Sets the authentication service + * + * @param authenticationService the authentication service + */ + public void setAuthenticationService(AuthenticationService authenticationService) + { + this.authenticationService = authenticationService; + } + /** * Initialise method */ @@ -395,6 +425,9 @@ public class CopyServiceImpl implements CopyService // Copy the associations copyAssociations(destinationNodeRef, copyDetails, copyChildren, copiedChildren); + + // Copy permissions + copyPermissions(sourceNodeRef, destinationNodeRef); } finally { @@ -404,6 +437,34 @@ public class CopyServiceImpl implements CopyService return destinationNodeRef; } + /** + * Copies the permissions of the source node reference onto the destination node reference + * + * @param sourceNodeRef the source node reference + * @param destinationNodeRef the destination node reference + */ + private void copyPermissions(NodeRef sourceNodeRef, NodeRef destinationNodeRef) + { + // Get the permission details of the source node reference + Set permissions = this.permissionService.getAllSetPermissions(sourceNodeRef); + boolean includeInherited = this.permissionService.getInheritParentPermissions(sourceNodeRef); + + AccessStatus writePermission = permissionService.hasPermission(destinationNodeRef, PermissionService.CHANGE_PERMISSIONS); + if (this.authenticationService.isCurrentUserTheSystemUser() || writePermission.equals(AccessStatus.ALLOWED)) + { + // Set the permission values on the destination node + for (AccessPermission permission : permissions) + { + this.permissionService.setPermission( + destinationNodeRef, + permission.getAuthority(), + permission.getPermission(), + permission.getAccessStatus().equals(AccessStatus.ALLOWED)); + } + this.permissionService.setInheritParentPermissions(destinationNodeRef, includeInherited); + } + } + /** * Gets the copy details. This calls the appropriate policies that have been registered * against the node and aspect types in order to pick-up any type specific copy behaviour. diff --git a/source/java/org/alfresco/repo/jscript/Node.java b/source/java/org/alfresco/repo/jscript/Node.java index 8fe97a8c2b..59987af97c 100644 --- a/source/java/org/alfresco/repo/jscript/Node.java +++ b/source/java/org/alfresco/repo/jscript/Node.java @@ -847,56 +847,68 @@ public final class Node implements Serializable for (String key : this.properties.keySet()) { Serializable value = (Serializable)this.properties.get(key); - if (value instanceof Node) - { - // convert back to NodeRef - value = ((Node)value).getNodeRef(); - } - else if (value instanceof ScriptContentData) - { - // convert back to ContentData - value = ((ScriptContentData)value).contentData; - } - else if (value instanceof Wrapper) - { - // unwrap a Java object from a JavaScript wrapper - value = (Serializable)((Wrapper)value).unwrap(); - } - else if (value instanceof ScriptableObject) - { - // a scriptable object will probably indicate a multi-value property - // set using a JavaScript Array object - ScriptableObject values = (ScriptableObject)value; - - // convert JavaScript array of values to a List of Serializable objects - Object[] propIds = values.getIds(); - List propValues = new ArrayList(propIds.length); - for (int i=0; i propValues = new ArrayList(propIds.length); + for (int i=0; i