diff --git a/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceImpl.java b/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceImpl.java index 9ec3b0c89a..ddf62b27ff 100644 --- a/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceImpl.java +++ b/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceImpl.java @@ -54,6 +54,7 @@ import org.alfresco.repo.security.permissions.PermissionEntry; import org.alfresco.repo.security.permissions.PermissionReference; import org.alfresco.repo.security.permissions.PermissionServiceSPI; import org.alfresco.repo.tenant.TenantService; +import org.alfresco.repo.version.VersionModel; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -410,18 +411,16 @@ public class PermissionServiceImpl implements PermissionServiceSPI, Initializing return permissionsDaoComponent.getPermissions(storeRef); } - public AccessStatus hasPermission(final NodeRef nodeRefIn, final PermissionReference permIn) + public AccessStatus hasPermission(NodeRef passedNodeRef, final PermissionReference permIn) { // If the node ref is null there is no sensible test to do - and there // must be no permissions // - so we allow it - if (nodeRefIn == null) + if (passedNodeRef == null) { return AccessStatus.ALLOWED; } - final NodeRef nodeRef = tenantService.getName(nodeRefIn); - // If the permission is null we deny if (permIn == null) { @@ -429,16 +428,30 @@ public class PermissionServiceImpl implements PermissionServiceSPI, Initializing } // AVM nodes - test for existence underneath - if (nodeRef.getStoreRef().getProtocol().equals(StoreRef.PROTOCOL_AVM)) + if (passedNodeRef.getStoreRef().getProtocol().equals(StoreRef.PROTOCOL_AVM)) { - return doAvmCan(nodeRef, permIn); + return doAvmCan(passedNodeRef, permIn); } // Allow permissions for nodes that do not exist - if (!nodeService.exists(nodeRef)) + if (!nodeService.exists(passedNodeRef)) { return AccessStatus.ALLOWED; } + + // Because of VersionedNodeRef has no any inherited from source Frozen NodeRef permissions (it has only default permissions), + // it is necessary to avoid cases when some user without appropriate permissions trying to receive any resource from its any version link etc. + // That could be proceed through receiving Frozen NodeRef instance for this VersionedNodeRef instance. There is appears a possibility to get + // access to specified for Frozen NodeRef instance permissions + + // NOTE: maybe in future there will appear situation when changing Node permissions will be a cause for creating new Node version. In other words, + // VersionedNodeRefs will contain their own permissions (whose, probably, will differ from version to version). In this case you should delete/comment this code!!! + if(isVersionedNodeRefInstance(passedNodeRef)) + { + passedNodeRef = convertVersionedNodeRefToFrozenNodeRef(passedNodeRef); + } + + final NodeRef nodeRef = tenantService.getName(passedNodeRef); final PermissionReference perm; if (permIn.equals(OLD_ALL_PERMISSIONS_REFERENCE)) @@ -1911,4 +1924,31 @@ public class PermissionServiceImpl implements PermissionServiceSPI, Initializing } return answer; } + + /** + * This methods checks weather the specified NodeRef instance is an VersionedNodeRef + * + * @param nodeRef - probably VersionedNodeRef + * @return true if NodeRef if Versioned and false in other case + */ + private boolean isVersionedNodeRefInstance(NodeRef nodeRef) + { + return nodeRef.getStoreRef().getProtocol().equals(VersionModel.STORE_PROTOCOL); + } + + /** + * Converts specified VersionedNodeRef to Frozen NodeRef (from SpacesStore store, accessed by workspace protocol) + * + * @param nodeRef - always VersionedNodeRef + * @return Frozen NodeRef instance (source for this VersionedNodeRef instance) + */ + private NodeRef convertVersionedNodeRefToFrozenNodeRef(NodeRef nodeRef) + { + + Map properties = nodeService.getProperties(nodeRef); + + return new NodeRef((String) properties.get(ContentModel.PROP_STORE_PROTOCOL), + (String) properties.get(ContentModel.PROP_STORE_IDENTIFIER), + (String) properties.get(ContentModel.PROP_NODE_UUID)); + } }