From d20db6284cc0f24744a11a4190ff7dc506efa023 Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Thu, 18 Dec 2008 15:08:14 +0000 Subject: [PATCH] Merged V3.0 to HEAD 11982: Fix for ETHREEOH-906 - Writing the TICKET value directly to the page during template processing is a potential XSS security hole. 11983: Added back .html suffix to plain HTML form upload api call - added code comment to explain why it's there. 11984: Added debug/info level logging to Invite process. 11985: ETHREEOH-184: thumbnail assocs do not double up on check-in and thumbnail updates are done in one action 11986: Fix for ETHREEOH-905 - missing url encoding step for user password during webscript based login process. 11995: Unit test fixed up, fallout from runAs merge. 11998: Part of a fix for ETHREEOH-546 - Cannot save document to the any space for Microsoft Office 11999: Merged V2.2 to V3.0 11996: Fix for open Lucene ResultSet memory leaks 12000: ETHREEOH-692 - It is impossible to login to Alfresco from Microsoft Office add-in using NTLM authentication. ETHREEOH-546 - Cannot save document to the any space for Microsoft Office. 12001: Paging enabled by default in all Document Libraries git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12494 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/thumbnail/ThumbnailedAspect.java | 50 ++++++++++++++++-- .../UpdateThumbnailActionExecuter.java | 18 +++++-- .../wcm/webproject/WebProjectServiceImpl.java | 51 ++++++++++++++----- 3 files changed, 98 insertions(+), 21 deletions(-) diff --git a/source/java/org/alfresco/repo/thumbnail/ThumbnailedAspect.java b/source/java/org/alfresco/repo/thumbnail/ThumbnailedAspect.java index c8fcce9e01..bf0578fc35 100644 --- a/source/java/org/alfresco/repo/thumbnail/ThumbnailedAspect.java +++ b/source/java/org/alfresco/repo/thumbnail/ThumbnailedAspect.java @@ -29,21 +29,27 @@ import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; +import org.alfresco.repo.copy.CopyServicePolicies; import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.policy.Behaviour; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.PolicyComponent; +import org.alfresco.repo.policy.PolicyScope; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.action.CompositeAction; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.PropertyDefinition; +import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.thumbnail.ThumbnailService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.EqualsHelper; /** @@ -51,7 +57,8 @@ import org.alfresco.util.EqualsHelper; * * @author Roy Wetherall */ -public class ThumbnailedAspect implements NodeServicePolicies.OnUpdatePropertiesPolicy +public class ThumbnailedAspect implements NodeServicePolicies.OnUpdatePropertiesPolicy, + CopyServicePolicies.OnCopyNodePolicy { /** Services */ private PolicyComponent policyComponent; @@ -119,6 +126,10 @@ public class ThumbnailedAspect implements NodeServicePolicies.OnUpdateProperties QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"), ContentModel.ASPECT_THUMBNAILED, new JavaBehaviour(this, "onUpdateProperties", Behaviour.NotificationFrequency.TRANSACTION_COMMIT)); + this.policyComponent.bindClassBehaviour( + QName.createQName(NamespaceService.ALFRESCO_URI, "onCopyNode"), + ContentModel.ASPECT_THUMBNAILED, + new JavaBehaviour(this, "onCopyNode")); } /** @@ -201,15 +212,48 @@ public class ThumbnailedAspect implements NodeServicePolicies.OnUpdateProperties Boolean automaticUpdate = (Boolean)this.nodeService.getProperty(nodeRef, ContentModel.PROP_AUTOMATIC_UPDATE); if (automaticUpdate != null && automaticUpdate.booleanValue() == true) { + CompositeAction compositeAction = actionService.createCompositeAction(); List thumbnails = this.thumbnailService.getThumbnails(nodeRef, contentProperty, null, null); for (NodeRef thumbnail : thumbnails) { // Execute the update thumbnail action async for each thumbnail Action action = actionService.createAction(UpdateThumbnailActionExecuter.NAME); - action.setParameterValue(CreateThumbnailActionExecuter.PARAM_CONTENT_PROPERTY, contentProperty); - actionService.executeAction(action, thumbnail, false, true); + action.setParameterValue(UpdateThumbnailActionExecuter.PARAM_CONTENT_PROPERTY, contentProperty); + action.setParameterValue(UpdateThumbnailActionExecuter.PARAM_THUMBNAIL_NODE, thumbnail); + compositeAction.addAction(action); } + + actionService.executeAction(compositeAction, nodeRef, false, true); } } + + /** + * @see org.alfresco.repo.copy.CopyServicePolicies.OnCopyNodePolicy#onCopyNode(org.alfresco.service.namespace.QName, org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.StoreRef, boolean, org.alfresco.repo.policy.PolicyScope) + */ + public void onCopyNode( QName classRef, + NodeRef sourceNodeRef, + StoreRef destinationStoreRef, + boolean copyToNewNode, + PolicyScope copyDetails) + { + // Add the automatic update property + copyDetails.addProperty( + ContentModel.ASPECT_THUMBNAILED, + ContentModel.PROP_AUTOMATIC_UPDATE, + this.nodeService.getProperty(sourceNodeRef, ContentModel.PROP_AUTOMATIC_UPDATE)); + + if (copyToNewNode == true) + { + List assocs = this.nodeService.getChildAssocs( + sourceNodeRef, + ContentModel.ASSOC_THUMBNAILS, + RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef assoc : assocs) + { + copyDetails.addChildAssociation(classRef, assoc); + } + } + // otherwise we don't care about copying the associations over or we will get duplicates + } } diff --git a/source/java/org/alfresco/repo/thumbnail/UpdateThumbnailActionExecuter.java b/source/java/org/alfresco/repo/thumbnail/UpdateThumbnailActionExecuter.java index 38d7919e21..b865055ea5 100644 --- a/source/java/org/alfresco/repo/thumbnail/UpdateThumbnailActionExecuter.java +++ b/source/java/org/alfresco/repo/thumbnail/UpdateThumbnailActionExecuter.java @@ -56,6 +56,7 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase /** Action name and parameters */ public static final String NAME = "update-thumbnail"; public static final String PARAM_CONTENT_PROPERTY = "content-property"; + public static final String PARAM_THUMBNAIL_NODE = "thumbnail-node"; /** * Set the thumbnail service @@ -83,10 +84,18 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { - if (this.nodeService.exists(actionedUponNodeRef) == true) + // Get the thumbnail + NodeRef thumbnailNodeRef = (NodeRef)action.getParameterValue(PARAM_THUMBNAIL_NODE); + if (thumbnailNodeRef == null) { + thumbnailNodeRef = actionedUponNodeRef; + } + + if (this.nodeService.exists(thumbnailNodeRef) == true && + ContentModel.TYPE_THUMBNAIL.equals(this.nodeService.getType(thumbnailNodeRef)) == true) + { // Get the thumbnail Name - String thumbnailName = (String)this.nodeService.getProperty(actionedUponNodeRef, ContentModel.PROP_THUMBNAIL_NAME); + String thumbnailName = (String)this.nodeService.getProperty(thumbnailNodeRef, ContentModel.PROP_THUMBNAIL_NAME); // Get the details of the thumbnail ThumbnailRegistry registry = this.thumbnailService.getThumbnailRegistry(); @@ -105,7 +114,7 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase } // Create the thumbnail - this.thumbnailService.updateThumbnail(actionedUponNodeRef, details.getTransformationOptions()); + this.thumbnailService.updateThumbnail(thumbnailNodeRef, details.getTransformationOptions()); } } @@ -115,7 +124,8 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase @Override protected void addParameterDefinitions(List paramList) { - paramList.add(new ParameterDefinitionImpl(PARAM_CONTENT_PROPERTY, DataTypeDefinition.QNAME, false, getParamDisplayLabel(PARAM_CONTENT_PROPERTY))); + paramList.add(new ParameterDefinitionImpl(PARAM_CONTENT_PROPERTY, DataTypeDefinition.QNAME, false, getParamDisplayLabel(PARAM_CONTENT_PROPERTY))); + paramList.add(new ParameterDefinitionImpl(PARAM_THUMBNAIL_NODE, DataTypeDefinition.QNAME, false, getParamDisplayLabel(PARAM_THUMBNAIL_NODE))); } } diff --git a/source/java/org/alfresco/wcm/webproject/WebProjectServiceImpl.java b/source/java/org/alfresco/wcm/webproject/WebProjectServiceImpl.java index e41212e1e3..f1f188c110 100644 --- a/source/java/org/alfresco/wcm/webproject/WebProjectServiceImpl.java +++ b/source/java/org/alfresco/wcm/webproject/WebProjectServiceImpl.java @@ -406,18 +406,29 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService if (this.webProjectsRootNodeRef == null) { // Get the root 'web projects' folder - ResultSet resultSet = this.searchService.query(WEBPROJECT_STORE, SearchService.LANGUAGE_LUCENE, "PATH:\""+WCMUtil.getWebProjectsPath()+"\""); - if (resultSet.length() == 0) + ResultSet resultSet = null; + try { - // No root web projects folder exists - throw new AlfrescoRuntimeException("No root 'Web Projects' folder exists (is WCM enabled ?)"); + resultSet = this.searchService.query(WEBPROJECT_STORE, SearchService.LANGUAGE_LUCENE, "PATH:\""+WCMUtil.getWebProjectsPath()+"\""); + if (resultSet.length() == 0) + { + // No root web projects folder exists + throw new AlfrescoRuntimeException("No root 'Web Projects' folder exists (is WCM enabled ?)"); + } + else if (resultSet.length() != 1) + { + // More than one root web projects folder exits + throw new AlfrescoRuntimeException("More than one root 'Web Projects' folder exists"); + } } - else if (resultSet.length() != 1) + finally { - // More than one root web projects folder exits - throw new AlfrescoRuntimeException("More than one root 'Web Projects' folder exists"); - } - + if (resultSet != null) + { + resultSet.close(); + } + } + this.webProjectsRootNodeRef = resultSet.getNodeRef(0); } @@ -804,11 +815,23 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService query.append(userName); query.append("\""); - ResultSet resultSet = searchService.query( - WEBPROJECT_STORE, - SearchService.LANGUAGE_LUCENE, - query.toString()); - List nodes = resultSet.getNodeRefs(); + ResultSet resultSet = null; + List nodes = null; + try + { + resultSet = searchService.query( + WEBPROJECT_STORE, + SearchService.LANGUAGE_LUCENE, + query.toString()); + nodes = resultSet.getNodeRefs(); + } + finally + { + if (resultSet != null) + { + resultSet.close(); + } + } if (nodes.size() == 1) {