From 3f5d52ab59145e7d185e305f461e06ee98155d79 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Tue, 11 Feb 2014 20:05:04 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (4.3/Cloud) to HEAD (4.3/Cloud) 57143: Merged V4.2-BUG-FIX (4.2.1) to HEAD-BUG-FIX (Cloud/4.3) 56926: Merged V4.1-BUG-FIX (4.1.7) to V4.2-BUG-FIX (4.2.1) 56869: MNT-9543: Folder path on IMAP does work when configured with outlook Call isNodeInSitesLibrary() and getPathFromSites() on behalf of SystemUser to avoid AccessDeniedException in case when repository folder from another site was mapped to user's IMAP folder git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@61768 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/imap/AbstractMimeMessage.java | 20 +---- .../org/alfresco/repo/imap/ImapService.java | 6 ++ .../alfresco/repo/imap/ImapServiceImpl.java | 74 +++++++++++++------ 3 files changed, 60 insertions(+), 40 deletions(-) diff --git a/source/java/org/alfresco/repo/imap/AbstractMimeMessage.java b/source/java/org/alfresco/repo/imap/AbstractMimeMessage.java index 0061043aa1..a6ff8488d0 100644 --- a/source/java/org/alfresco/repo/imap/AbstractMimeMessage.java +++ b/source/java/org/alfresco/repo/imap/AbstractMimeMessage.java @@ -31,16 +31,13 @@ import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; -import org.alfresco.model.ContentModel; import org.alfresco.repo.imap.ImapService.EmailBodyFormat; -import org.alfresco.repo.site.SiteModel; import org.alfresco.repo.template.TemplateNode; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -193,7 +190,7 @@ public abstract class AbstractMimeMessage extends MimeMessage model.put("alfTicket", new String(serviceRegistry.getAuthenticationService().getCurrentTicket())); if (isMessageInSitesLibrary) { - String pathFromSites = getPathFromSites(parent); + String pathFromSites = imapService.getPathFromSites(parent); StringBuilder parsedPath = new StringBuilder(); String[] pathParts = pathFromSites.split("/"); if (pathParts.length > 2) @@ -216,21 +213,6 @@ public abstract class AbstractMimeMessage extends MimeMessage return model; } - private String getPathFromSites(NodeRef ref) - { - NodeService nodeService = serviceRegistry.getNodeService(); - String name = ((String) nodeService.getProperty(ref, ContentModel.PROP_NAME)).toLowerCase(); - if (nodeService.getType(ref).equals(SiteModel.TYPE_SITE)) - { - return name; - } - else - { - NodeRef parent = nodeService.getPrimaryParent(ref).getParentRef(); - return getPathFromSites(parent) + "/" + name; - } - } - protected void updateMessageID() throws MessagingException { setHeader("Message-ID", "<" + this.messageFileInfo.getNodeRef().getId() + DEFAULT_SUFFIX + ">"); diff --git a/source/java/org/alfresco/repo/imap/ImapService.java b/source/java/org/alfresco/repo/imap/ImapService.java index b481a657dc..ad58e0fb8f 100644 --- a/source/java/org/alfresco/repo/imap/ImapService.java +++ b/source/java/org/alfresco/repo/imap/ImapService.java @@ -333,4 +333,10 @@ public interface ImapService this.search = search; } } + + /** + * @param nodeRef + * @return path for node relatively to site root + */ + public String getPathFromSites(NodeRef nodeRef); } diff --git a/source/java/org/alfresco/repo/imap/ImapServiceImpl.java b/source/java/org/alfresco/repo/imap/ImapServiceImpl.java index 1a5c0bf58f..41ed28891c 100644 --- a/source/java/org/alfresco/repo/imap/ImapServiceImpl.java +++ b/source/java/org/alfresco/repo/imap/ImapServiceImpl.java @@ -1902,31 +1902,40 @@ public class ImapServiceImpl implements ImapService, OnRestoreNodePolicy, OnCrea /** * Return true if provided nodeRef is in Sites/.../documentlibrary */ - public boolean isNodeInSitesLibrary(NodeRef nodeRef) + public boolean isNodeInSitesLibrary(final NodeRef inputNodeRef) { - boolean isInDocLibrary = false; - NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef(); - while (parent != null && !nodeService.getType(parent).equals(SiteModel.TYPE_SITE)) + return doAsSystem(new RunAsWork() { - String parentName = (String) nodeService.getProperty(parent, ContentModel.PROP_NAME); - if (parentName.equalsIgnoreCase("documentlibrary")) + @Override + public Boolean doWork() throws Exception { - isInDocLibrary = true; + NodeRef nodeRef = inputNodeRef; + boolean isInDocLibrary = false; + NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef(); + while (parent != null && !nodeService.getType(parent).equals(SiteModel.TYPE_SITE)) + { + String parentName = (String) nodeService.getProperty(parent, ContentModel.PROP_NAME); + if (parentName.equalsIgnoreCase("documentlibrary")) + { + isInDocLibrary = true; + } + nodeRef = parent; + if (nodeService.getPrimaryParent(nodeRef) != null) + { + parent = nodeService.getPrimaryParent(nodeRef).getParentRef(); + } + } + if (parent == null) + { + return false; + } + else + { + return nodeService.getType(parent).equals(SiteModel.TYPE_SITE) && isInDocLibrary; + } } - nodeRef = parent; - if (nodeService.getPrimaryParent(nodeRef) != null) - { - parent = nodeService.getPrimaryParent(nodeRef).getParentRef(); - } - } - if (parent == null) - { - return false; - } - else - { - return nodeService.getType(parent).equals(SiteModel.TYPE_SITE) && isInDocLibrary; - } + }); + } public void setNamespaceService(NamespaceService namespaceService) @@ -2008,4 +2017,27 @@ public class ImapServiceImpl implements ImapService, OnRestoreNodePolicy, OnCrea return message; } } + + @Override + public String getPathFromSites(final NodeRef ref) + { + return doAsSystem(new RunAsWork() + { + @Override + public String doWork() throws Exception + { + String name = ((String) nodeService.getProperty(ref, ContentModel.PROP_NAME)).toLowerCase(); + if (nodeService.getType(ref).equals(SiteModel.TYPE_SITE)) + { + return name; + } + else + { + NodeRef parent = nodeService.getPrimaryParent(ref).getParentRef(); + return getPathFromSites(parent) + "/" + name; + } + } + }); + } + } \ No newline at end of file