mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Fix for ALF-3017 - NodePathLinkRenderer fails if not the whole node path is visible to the user
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@23130 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -27,16 +27,18 @@ import javax.faces.component.UIComponent;
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.repository.Path;
|
||||
import org.alfresco.service.cmr.security.AccessStatus;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.ui.common.Utils;
|
||||
import org.alfresco.web.ui.common.renderer.BaseRenderer;
|
||||
import org.alfresco.web.ui.repo.component.UINodeDescendants;
|
||||
import org.alfresco.web.ui.repo.component.UINodePath;
|
||||
|
||||
/**
|
||||
@@ -150,12 +152,12 @@ public class NodePathLinkRenderer extends BaseRenderer
|
||||
}
|
||||
catch (InvalidNodeRefException refErr)
|
||||
{
|
||||
// this error simple means we cannot output the path
|
||||
// this error simply means we cannot output the path
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception tex) {}
|
||||
}
|
||||
catch (AccessDeniedException accessErr)
|
||||
{
|
||||
// this error simple means we cannot output the path
|
||||
// this error simply means we cannot output the path
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception tex) {}
|
||||
}
|
||||
catch (Throwable err)
|
||||
@@ -178,6 +180,8 @@ public class NodePathLinkRenderer extends BaseRenderer
|
||||
private String buildPathAsBreadcrumb(FacesContext context, UIComponent component, Path path, boolean showLeaf)
|
||||
{
|
||||
StringBuilder buf = new StringBuilder(1024);
|
||||
NodeService nodeService = getNodeService(context);
|
||||
PermissionService permissionService = getPermissionService(context);
|
||||
|
||||
int size = (showLeaf ? path.size() : path.size() - 1);
|
||||
for (int i=0; i<size; i++)
|
||||
@@ -189,7 +193,18 @@ public class NodePathLinkRenderer extends BaseRenderer
|
||||
ChildAssociationRef elementRef = ((Path.ChildAssocElement)element).getRef();
|
||||
if (elementRef.getParentRef() != null)
|
||||
{
|
||||
String name = Repository.getNameForNode(getNodeService(context), elementRef.getChildRef());
|
||||
String name = null;
|
||||
if (permissionService.hasPermission(
|
||||
elementRef.getChildRef(), PermissionService.READ) == AccessStatus.ALLOWED)
|
||||
{
|
||||
// use the name property if we are allowed access to it
|
||||
name = nodeService.getProperty(elementRef.getChildRef(), ContentModel.PROP_NAME).toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
// revert to using QName if not
|
||||
name = elementRef.getQName().getLocalName();
|
||||
}
|
||||
elementString = renderPathElement(context, component, elementRef.getChildRef(), name);
|
||||
}
|
||||
}
|
||||
@@ -220,6 +235,8 @@ public class NodePathLinkRenderer extends BaseRenderer
|
||||
private String buildPathAsSingular(FacesContext context, UIComponent component, Path path, boolean showLeaf, boolean disabled)
|
||||
{
|
||||
StringBuilder buf = new StringBuilder(512);
|
||||
NodeService nodeService = getNodeService(context);
|
||||
PermissionService permissionService = getPermissionService(context);
|
||||
|
||||
NodeRef lastElementRef = null;
|
||||
int size = (showLeaf ? path.size() : path.size() - 1);
|
||||
@@ -233,7 +250,18 @@ public class NodePathLinkRenderer extends BaseRenderer
|
||||
ChildAssociationRef elementRef = ((Path.ChildAssocElement)element).getRef();
|
||||
if (elementRef.getParentRef() != null)
|
||||
{
|
||||
elementString = Repository.getNameForNode(getNodeService(context), elementRef.getChildRef());
|
||||
String name = null;
|
||||
if (permissionService.hasPermission(
|
||||
elementRef.getChildRef(), PermissionService.READ) == AccessStatus.ALLOWED)
|
||||
{
|
||||
// use the name property if we are allowed access to it
|
||||
elementString = nodeService.getProperty(elementRef.getChildRef(), ContentModel.PROP_NAME).toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
// revert to using QName if not
|
||||
elementString = elementRef.getQName().getLocalName();
|
||||
}
|
||||
}
|
||||
if (i == lastElementPos)
|
||||
{
|
||||
@@ -334,4 +362,15 @@ public class NodePathLinkRenderer extends BaseRenderer
|
||||
|
||||
return service;
|
||||
}
|
||||
|
||||
private static PermissionService getPermissionService(FacesContext context)
|
||||
{
|
||||
PermissionService service = Repository.getServiceRegistry(context).getPermissionService();
|
||||
if (service == null)
|
||||
{
|
||||
throw new IllegalStateException("Unable to obtain PermissionService bean reference.");
|
||||
}
|
||||
|
||||
return service;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user