mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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
This commit is contained in:
@@ -29,21 +29,27 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.repo.copy.CopyServicePolicies;
|
||||||
import org.alfresco.repo.node.NodeServicePolicies;
|
import org.alfresco.repo.node.NodeServicePolicies;
|
||||||
import org.alfresco.repo.policy.Behaviour;
|
import org.alfresco.repo.policy.Behaviour;
|
||||||
import org.alfresco.repo.policy.JavaBehaviour;
|
import org.alfresco.repo.policy.JavaBehaviour;
|
||||||
import org.alfresco.repo.policy.PolicyComponent;
|
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.Action;
|
||||||
import org.alfresco.service.cmr.action.ActionService;
|
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.DataTypeDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||||
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
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.ContentData;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeService;
|
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.cmr.thumbnail.ThumbnailService;
|
||||||
import org.alfresco.service.namespace.NamespaceService;
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
|
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||||
import org.alfresco.util.EqualsHelper;
|
import org.alfresco.util.EqualsHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,7 +57,8 @@ import org.alfresco.util.EqualsHelper;
|
|||||||
*
|
*
|
||||||
* @author Roy Wetherall
|
* @author Roy Wetherall
|
||||||
*/
|
*/
|
||||||
public class ThumbnailedAspect implements NodeServicePolicies.OnUpdatePropertiesPolicy
|
public class ThumbnailedAspect implements NodeServicePolicies.OnUpdatePropertiesPolicy,
|
||||||
|
CopyServicePolicies.OnCopyNodePolicy
|
||||||
{
|
{
|
||||||
/** Services */
|
/** Services */
|
||||||
private PolicyComponent policyComponent;
|
private PolicyComponent policyComponent;
|
||||||
@@ -119,6 +126,10 @@ public class ThumbnailedAspect implements NodeServicePolicies.OnUpdateProperties
|
|||||||
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
|
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
|
||||||
ContentModel.ASPECT_THUMBNAILED,
|
ContentModel.ASPECT_THUMBNAILED,
|
||||||
new JavaBehaviour(this, "onUpdateProperties", Behaviour.NotificationFrequency.TRANSACTION_COMMIT));
|
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);
|
Boolean automaticUpdate = (Boolean)this.nodeService.getProperty(nodeRef, ContentModel.PROP_AUTOMATIC_UPDATE);
|
||||||
if (automaticUpdate != null && automaticUpdate.booleanValue() == true)
|
if (automaticUpdate != null && automaticUpdate.booleanValue() == true)
|
||||||
{
|
{
|
||||||
|
CompositeAction compositeAction = actionService.createCompositeAction();
|
||||||
List<NodeRef> thumbnails = this.thumbnailService.getThumbnails(nodeRef, contentProperty, null, null);
|
List<NodeRef> thumbnails = this.thumbnailService.getThumbnails(nodeRef, contentProperty, null, null);
|
||||||
|
|
||||||
for (NodeRef thumbnail : thumbnails)
|
for (NodeRef thumbnail : thumbnails)
|
||||||
{
|
{
|
||||||
// Execute the update thumbnail action async for each thumbnail
|
// Execute the update thumbnail action async for each thumbnail
|
||||||
Action action = actionService.createAction(UpdateThumbnailActionExecuter.NAME);
|
Action action = actionService.createAction(UpdateThumbnailActionExecuter.NAME);
|
||||||
action.setParameterValue(CreateThumbnailActionExecuter.PARAM_CONTENT_PROPERTY, contentProperty);
|
action.setParameterValue(UpdateThumbnailActionExecuter.PARAM_CONTENT_PROPERTY, contentProperty);
|
||||||
actionService.executeAction(action, thumbnail, false, true);
|
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<ChildAssociationRef> 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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -56,6 +56,7 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase
|
|||||||
/** Action name and parameters */
|
/** Action name and parameters */
|
||||||
public static final String NAME = "update-thumbnail";
|
public static final String NAME = "update-thumbnail";
|
||||||
public static final String PARAM_CONTENT_PROPERTY = "content-property";
|
public static final String PARAM_CONTENT_PROPERTY = "content-property";
|
||||||
|
public static final String PARAM_THUMBNAIL_NODE = "thumbnail-node";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the thumbnail service
|
* Set the thumbnail service
|
||||||
@@ -83,10 +84,18 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase
|
|||||||
@Override
|
@Override
|
||||||
protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
|
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
|
// 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
|
// Get the details of the thumbnail
|
||||||
ThumbnailRegistry registry = this.thumbnailService.getThumbnailRegistry();
|
ThumbnailRegistry registry = this.thumbnailService.getThumbnailRegistry();
|
||||||
@@ -105,7 +114,7 @@ public class UpdateThumbnailActionExecuter extends ActionExecuterAbstractBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the thumbnail
|
// 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
|
@Override
|
||||||
protected void addParameterDefinitions(List<ParameterDefinition> paramList)
|
protected void addParameterDefinitions(List<ParameterDefinition> 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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -406,18 +406,29 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
|
|||||||
if (this.webProjectsRootNodeRef == null)
|
if (this.webProjectsRootNodeRef == null)
|
||||||
{
|
{
|
||||||
// Get the root 'web projects' folder
|
// Get the root 'web projects' folder
|
||||||
ResultSet resultSet = this.searchService.query(WEBPROJECT_STORE, SearchService.LANGUAGE_LUCENE, "PATH:\""+WCMUtil.getWebProjectsPath()+"\"");
|
ResultSet resultSet = null;
|
||||||
if (resultSet.length() == 0)
|
try
|
||||||
{
|
{
|
||||||
// No root web projects folder exists
|
resultSet = this.searchService.query(WEBPROJECT_STORE, SearchService.LANGUAGE_LUCENE, "PATH:\""+WCMUtil.getWebProjectsPath()+"\"");
|
||||||
throw new AlfrescoRuntimeException("No root 'Web Projects' folder exists (is WCM enabled ?)");
|
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
|
if (resultSet != null)
|
||||||
throw new AlfrescoRuntimeException("More than one root 'Web Projects' folder exists");
|
{
|
||||||
}
|
resultSet.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.webProjectsRootNodeRef = resultSet.getNodeRef(0);
|
this.webProjectsRootNodeRef = resultSet.getNodeRef(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -804,11 +815,23 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService
|
|||||||
query.append(userName);
|
query.append(userName);
|
||||||
query.append("\"");
|
query.append("\"");
|
||||||
|
|
||||||
ResultSet resultSet = searchService.query(
|
ResultSet resultSet = null;
|
||||||
WEBPROJECT_STORE,
|
List<NodeRef> nodes = null;
|
||||||
SearchService.LANGUAGE_LUCENE,
|
try
|
||||||
query.toString());
|
{
|
||||||
List<NodeRef> nodes = resultSet.getNodeRefs();
|
resultSet = searchService.query(
|
||||||
|
WEBPROJECT_STORE,
|
||||||
|
SearchService.LANGUAGE_LUCENE,
|
||||||
|
query.toString());
|
||||||
|
nodes = resultSet.getNodeRefs();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (resultSet != null)
|
||||||
|
{
|
||||||
|
resultSet.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (nodes.size() == 1)
|
if (nodes.size() == 1)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user