diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index c4e2a44923..417933cd6e 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -135,7 +135,6 @@ - ${server.maxusers} ${server.singleuseronly.name} diff --git a/config/alfresco/linkvalidation-service-context.xml b/config/alfresco/linkvalidation-service-context.xml index 326fd3513f..0a9170759e 100644 --- a/config/alfresco/linkvalidation-service-context.xml +++ b/config/alfresco/linkvalidation-service-context.xml @@ -218,7 +218,8 @@ + lazy-init="true" + init-method="register"> @@ -255,6 +256,9 @@ + + + diff --git a/source/java/org/alfresco/repo/admin/RepoServerMgmt.java b/source/java/org/alfresco/repo/admin/RepoServerMgmt.java index 37ceb19ca8..1b3f59b695 100644 --- a/source/java/org/alfresco/repo/admin/RepoServerMgmt.java +++ b/source/java/org/alfresco/repo/admin/RepoServerMgmt.java @@ -65,7 +65,8 @@ public class RepoServerMgmt implements RepoServerMgmtMBean, ApplicationContextAw this.authenticationService = authenticationService; } - public void setLinkValidationService(LinkValidationService linkValidationService) + // TODO - temporary workaround, can be removed when link validation is part of repo + public void registerLinkValidationService(LinkValidationService linkValidationService) { this.linkValidationService = linkValidationService; } @@ -344,6 +345,12 @@ public class RepoServerMgmt implements RepoServerMgmtMBean, ApplicationContextAw */ public void setLinkValidationDisabled(boolean disable) { + if (linkValidationService == null) + { + log.error("LinkValidationService not registered"); + throw new AlfrescoRuntimeException("LinkValidationService not registered"); + } + linkValidationService.setLinkValidationDisabled(disable); if (disable) { @@ -361,6 +368,12 @@ public class RepoServerMgmt implements RepoServerMgmtMBean, ApplicationContextAw */ public boolean isLinkValidationDisabled() { + if (linkValidationService == null) + { + log.error("LinkValidationService not registered"); + throw new AlfrescoRuntimeException("LinkValidationService not registered"); + } + return linkValidationService.isLinkValidationDisabled(); } } diff --git a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java index 879dc871d9..9cdb7d2305 100644 --- a/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/LayeredDirectoryNodeImpl.java @@ -35,6 +35,7 @@ import org.alfresco.service.cmr.avm.AVMException; import org.alfresco.service.cmr.avm.AVMExistsException; import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.service.cmr.avm.AVMNotFoundException; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.util.Pair; /** @@ -373,27 +374,38 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec public Map getListing(Lookup lPath, boolean includeDeleted) { // Get the base listing from the thing we indirect to. - Map listing = null; - if (fOpacity) - { - listing = new HashMap(); - } - else + Map listing = new HashMap(); + if (!fOpacity) { Lookup lookup = AVMRepository.GetInstance().lookupDirectory(getUnderlyingVersion(lPath), getUnderlying(lPath)); if (lookup != null) { DirectoryNode dir = (DirectoryNode)lookup.getCurrentNode(); - listing = dir.getListing(lookup, includeDeleted); - } - else - { - // It's OK for an indirection to dangle. - listing = new HashMap(); + Map underListing = dir.getListing(lookup, includeDeleted); + for (Map.Entry entry : underListing.entrySet()) + { + if (entry.getValue().getType() == AVMNodeType.LAYERED_DIRECTORY || + entry.getValue().getType() == AVMNodeType.PLAIN_DIRECTORY) + { + if (!AVMRepository.GetInstance().can(entry.getValue(), PermissionService.READ_CHILDREN)) + { + continue; + } + } + listing.put(entry.getKey(), entry.getValue()); + } } } for (ChildEntry entry : AVMDAOs.Instance().fChildEntryDAO.getByParent(this)) { + if (entry.getChild().getType() == AVMNodeType.LAYERED_DIRECTORY || + entry.getChild().getType() == AVMNodeType.PLAIN_DIRECTORY) + { + if (!AVMRepository.GetInstance().can(entry.getChild(), PermissionService.READ_CHILDREN)) + { + continue; + } + } if (!includeDeleted && entry.getChild().getType() == AVMNodeType.DELETED_NODE) { listing.remove(entry.getKey().getName()); @@ -416,6 +428,14 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec Map listing = new HashMap(); for (ChildEntry entry : AVMDAOs.Instance().fChildEntryDAO.getByParent(this)) { + if (entry.getChild().getType() == AVMNodeType.LAYERED_DIRECTORY || + entry.getChild().getType() == AVMNodeType.PLAIN_DIRECTORY) + { + if (!AVMRepository.GetInstance().can(entry.getChild(), PermissionService.READ_CHILDREN)) + { + continue; + } + } if (includeDeleted || entry.getChild().getType() != AVMNodeType.DELETED_NODE) { listing.put(entry.getKey().getName(), entry.getChild()); @@ -438,6 +458,14 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec for (ChildEntry child : children) { AVMNode childNode = child.getChild(); + if (childNode.getType() == AVMNodeType.LAYERED_DIRECTORY || + childNode.getType() == AVMNodeType.PLAIN_DIRECTORY) + { + if (!AVMRepository.GetInstance().can(childNode, PermissionService.READ_CHILDREN)) + { + continue; + } + } if (!includeDeleted && childNode.getType() == AVMNodeType.DELETED_NODE) { continue; @@ -471,18 +499,34 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec { DirectoryNode dirNode = (DirectoryNode)lookup.getCurrentNode(); Map listing = dirNode.getListing(lookup, includeDeleted); - for (String name : listing.keySet()) + for (Map.Entry entry : listing.entrySet()) { - baseListing.put(name, - listing.get(name).getDescriptor(dir.getPath(), name, - lookup.getCurrentIndirection(), - lookup.getCurrentIndirectionVersion())); + if (entry.getValue().getType() == AVMNodeType.LAYERED_DIRECTORY || + entry.getValue().getType() == AVMNodeType.PLAIN_DIRECTORY) + { + if (!AVMRepository.GetInstance().can(entry.getValue(), PermissionService.READ_CHILDREN)) + { + continue; + } + } + baseListing.put(entry.getKey(), + entry.getValue().getDescriptor(dir.getPath(), entry.getKey(), + lookup.getCurrentIndirection(), + lookup.getCurrentIndirectionVersion())); } } } List children = AVMDAOs.Instance().fChildEntryDAO.getByParent(this); for (ChildEntry child : children) { + if (child.getChild().getType() == AVMNodeType.LAYERED_DIRECTORY || + child.getChild().getType() == AVMNodeType.PLAIN_DIRECTORY) + { + if (!AVMRepository.GetInstance().can(child.getChild(), PermissionService.READ_CHILDREN)) + { + continue; + } + } if (!includeDeleted && child.getChild().getType() == AVMNodeType.DELETED_NODE) { baseListing.remove(child.getKey().getName()); diff --git a/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java b/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java index 75adb45c0f..50025827fe 100644 --- a/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/PlainDirectoryNodeImpl.java @@ -34,6 +34,7 @@ import org.alfresco.service.cmr.avm.AVMBadArgumentException; import org.alfresco.service.cmr.avm.AVMExistsException; import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.service.cmr.avm.AVMNotFoundException; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.util.Pair; /** @@ -110,6 +111,14 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory List children = AVMDAOs.Instance().fChildEntryDAO.getByParent(this); for (ChildEntry child : children) { + if (child.getChild().getType() == AVMNodeType.LAYERED_DIRECTORY || + child.getChild().getType() == AVMNodeType.PLAIN_DIRECTORY) + { + if (!AVMRepository.GetInstance().can(child.getChild(), PermissionService.READ_CHILDREN)) + { + continue; + } + } if (!includeDeleted && child.getChild().getType() == AVMNodeType.DELETED_NODE) { continue; @@ -156,6 +165,14 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory List children = AVMDAOs.Instance().fChildEntryDAO.getByParent(this); for (ChildEntry child : children) { + if (child.getChild().getType() == AVMNodeType.LAYERED_DIRECTORY || + child.getChild().getType() == AVMNodeType.PLAIN_DIRECTORY) + { + if (!AVMRepository.GetInstance().can(child.getChild(), PermissionService.READ_CHILDREN)) + { + continue; + } + } if (!includeDeleted && child.getChild().getType() == AVMNodeType.DELETED_NODE) { continue;