mirror of
				https://github.com/Alfresco/alfresco-community-repo.git
				synced 2025-10-22 15:12:38 +00:00 
			
		
		
		
	Compare commits
	
		
			38 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 8cd46d4585 | ||
|  | 11d71e1941 | ||
|  | 353d50a35c | ||
|  | 2daafc711d | ||
|  | dfa94fbe21 | ||
|  | 4a93aec66b | ||
|  | 3f0bbc9844 | ||
|  | cb9ad42101 | ||
|  | ca385b3bbc | ||
|  | 19c1582f1e | ||
|  | 06a918b082 | ||
|  | f543de9959 | ||
|  | 8124279e6a | ||
|  | 4281fd5b2d | ||
|  | d10d88306b | ||
|  | 1d7a37cd8c | ||
|  | 4bcb795452 | ||
|  | 393b064918 | ||
|  | f741f2ca45 | ||
|  | ef676f11e4 | ||
|  | 478c81fee3 | ||
|  | cf9cc8042d | ||
|  | 8d790ed1cb | ||
|  | 87c7bd2877 | ||
|  | 9125f889b0 | ||
|  | 2fb74d2691 | ||
|  | d671162dae | ||
|  | bfaa629da7 | ||
|  | 719d73a558 | ||
|  | a2aa867f3f | ||
|  | 8d745c536a | ||
|  | b0f4c21ae3 | ||
|  | 72494e34fa | ||
|  | 792b7024ea | ||
|  | 40a1371f0d | ||
|  | c22c47e63f | ||
|  | 232299d42d | ||
|  | aca7969849 | 
| @@ -7,7 +7,7 @@ | ||||
|    <parent> | ||||
|       <groupId>org.alfresco</groupId> | ||||
|       <artifactId>alfresco-community-repo-amps</artifactId> | ||||
|       <version>23.6.0.24</version> | ||||
|       <version>23.7.0.2</version> | ||||
|    </parent> | ||||
|  | ||||
|    <modules> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|    <parent> | ||||
|       <groupId>org.alfresco</groupId> | ||||
|       <artifactId>alfresco-governance-services-community-parent</artifactId> | ||||
|       <version>23.6.0.24</version> | ||||
|       <version>23.7.0.2</version> | ||||
|    </parent> | ||||
|  | ||||
|    <modules> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|    <parent> | ||||
|       <groupId>org.alfresco</groupId> | ||||
|       <artifactId>alfresco-governance-services-automation-community-repo</artifactId> | ||||
|       <version>23.6.0.24</version> | ||||
|       <version>23.7.0.2</version> | ||||
|    </parent> | ||||
|  | ||||
|    <build> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|    <parent> | ||||
|       <groupId>org.alfresco</groupId> | ||||
|       <artifactId>alfresco-governance-services-community-parent</artifactId> | ||||
|       <version>23.6.0.24</version> | ||||
|       <version>23.7.0.2</version> | ||||
|    </parent> | ||||
|  | ||||
|    <modules> | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| SOLR6_TAG=2.0.13 | ||||
| SOLR6_TAG=2.0.17 | ||||
| POSTGRES_TAG=15.4 | ||||
| ACTIVEMQ_TAG=5.18.3-jre17-rockylinux8 | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
|    <parent> | ||||
|       <groupId>org.alfresco</groupId> | ||||
|       <artifactId>alfresco-governance-services-community-repo-parent</artifactId> | ||||
|       <version>23.6.0.24</version> | ||||
|       <version>23.7.0.2</version> | ||||
|    </parent> | ||||
|  | ||||
|    <properties> | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  | ||||
| # Version label | ||||
| version.major=23 | ||||
| version.minor=6 | ||||
| version.minor=7 | ||||
| version.revision=0 | ||||
| version.label= | ||||
|  | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-governance-services-community-repo-parent</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <build> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modules> | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-amps</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <properties> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|    <parent> | ||||
|       <groupId>org.alfresco</groupId> | ||||
|       <artifactId>alfresco-community-repo</artifactId> | ||||
|       <version>23.6.0.24</version> | ||||
|       <version>23.7.0.2</version> | ||||
|    </parent> | ||||
|  | ||||
|    <dependencies> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <properties> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <dependencies> | ||||
|   | ||||
| @@ -9,6 +9,6 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-packaging</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
| </project> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-packaging</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <properties> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modules> | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| SOLR6_TAG=2.0.13 | ||||
| SOLR6_TAG=2.0.17 | ||||
| POSTGRES_TAG=15.4 | ||||
| ACTIVEMQ_TAG=5.18.3-jre17-rockylinux8 | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-packaging</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <modules> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-tests</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <organization> | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-tests</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <developers> | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-tests</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <developers> | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-tests</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <properties> | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-tests</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <developers> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo-packaging</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <properties> | ||||
|   | ||||
							
								
								
									
										16
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -2,7 +2,7 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>alfresco-community-repo</artifactId> | ||||
|     <version>23.6.0.24</version> | ||||
|     <version>23.7.0.2</version> | ||||
|     <packaging>pom</packaging> | ||||
|     <name>Alfresco Community Repo Parent</name> | ||||
|  | ||||
| @@ -24,7 +24,7 @@ | ||||
|  | ||||
|     <properties> | ||||
|         <acs.version.major>23</acs.version.major> | ||||
|         <acs.version.minor>6</acs.version.minor> | ||||
|         <acs.version.minor>7</acs.version.minor> | ||||
|         <acs.version.revision>0</acs.version.revision> | ||||
|         <acs.version.label /> | ||||
|         <amp.min.version>${acs.version.major}.0.0</amp.min.version> | ||||
| @@ -51,14 +51,14 @@ | ||||
|         <dependency.alfresco-server-root.version>7.0.1</dependency.alfresco-server-root.version> | ||||
|         <dependency.activiti-engine.version>5.23.0</dependency.activiti-engine.version> | ||||
|         <dependency.activiti.version>5.23.0</dependency.activiti.version> | ||||
|         <dependency.alfresco-transform-core.version>5.2.2-A.4</dependency.alfresco-transform-core.version> | ||||
|         <dependency.alfresco-transform-service.version>4.2.2-A.2</dependency.alfresco-transform-service.version> | ||||
|         <dependency.alfresco-transform-core.version>5.2.2</dependency.alfresco-transform-core.version> | ||||
|         <dependency.alfresco-transform-service.version>4.2.2</dependency.alfresco-transform-service.version> | ||||
|         <dependency.alfresco-greenmail.version>7.0</dependency.alfresco-greenmail.version> | ||||
|         <dependency.acs-event-model.version>0.0.33</dependency.acs-event-model.version> | ||||
|  | ||||
|         <dependency.aspectj.version>1.9.22.1</dependency.aspectj.version> | ||||
|         <dependency.spring.version>6.2.8</dependency.spring.version> | ||||
|         <dependency.spring-security.version>6.3.9</dependency.spring-security.version> | ||||
|         <dependency.spring.version>6.2.11</dependency.spring.version> | ||||
|         <dependency.spring-security.version>6.4.11</dependency.spring-security.version> | ||||
|         <dependency.antlr.version>3.5.3</dependency.antlr.version> | ||||
|         <dependency.jackson.version>2.17.2</dependency.jackson.version> | ||||
|         <dependency.cxf.version>4.1.2</dependency.cxf.version> | ||||
| @@ -113,7 +113,7 @@ | ||||
|         <dependency.jakarta-json-path.version>2.9.0</dependency.jakarta-json-path.version> | ||||
|         <dependency.json-smart.version>2.5.2</dependency.json-smart.version> | ||||
|         <alfresco.googledrive.version>4.1.0</alfresco.googledrive.version> | ||||
|         <alfresco.aos-module.version>3.3.0</alfresco.aos-module.version> | ||||
|         <alfresco.aos-module.version>3.4.0</alfresco.aos-module.version> | ||||
|         <alfresco.api-explorer.version>23.4.0</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share --> | ||||
|  | ||||
|         <alfresco.maven-plugin.version>2.2.0</alfresco.maven-plugin.version> | ||||
| @@ -154,7 +154,7 @@ | ||||
|         <connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection> | ||||
|         <developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection> | ||||
|         <url>https://github.com/Alfresco/alfresco-community-repo</url> | ||||
|         <tag>23.6.0.24</tag> | ||||
|         <tag>23.7.0.2</tag> | ||||
|     </scm> | ||||
|  | ||||
|     <distributionManagement> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <dependencies> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * #%L | ||||
|  * Alfresco Remote API | ||||
|  * %% | ||||
|  * Copyright (C) 2005 - 2016 Alfresco Software Limited | ||||
|  * Copyright (C) 2005 - 2025 Alfresco Software Limited | ||||
|  * %% | ||||
|  * This file is part of the Alfresco software.  | ||||
|  * If the software was purchased under a paid Alfresco license, the terms of  | ||||
| @@ -31,6 +31,14 @@ import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.json.simple.JSONObject; | ||||
| import org.owasp.html.PolicyFactory; | ||||
| import org.owasp.html.Sanitizers; | ||||
| import org.springframework.extensions.webscripts.Cache; | ||||
| import org.springframework.extensions.webscripts.Status; | ||||
| import org.springframework.extensions.webscripts.WebScriptRequest; | ||||
|  | ||||
| import org.alfresco.model.ContentModel; | ||||
| import org.alfresco.model.ForumModel; | ||||
| import org.alfresco.repo.content.MimetypeMap; | ||||
| @@ -44,10 +52,6 @@ import org.alfresco.service.cmr.security.PermissionService; | ||||
| import org.alfresco.service.namespace.NamespaceService; | ||||
| import org.alfresco.service.namespace.QName; | ||||
| import org.alfresco.service.namespace.RegexQNamePattern; | ||||
| import org.json.simple.JSONObject; | ||||
| import org.springframework.extensions.webscripts.Cache; | ||||
| import org.springframework.extensions.webscripts.Status; | ||||
| import org.springframework.extensions.webscripts.WebScriptRequest; | ||||
|  | ||||
| /** | ||||
|  * This class is the controller for the comments.post web script. | ||||
| @@ -58,7 +62,7 @@ import org.springframework.extensions.webscripts.WebScriptRequest; | ||||
| public class CommentsPost extends AbstractCommentsWebScript | ||||
| { | ||||
|     /** | ||||
|      *  Overrides AbstractCommentsWebScript to add comment | ||||
|      * Overrides AbstractCommentsWebScript to add comment | ||||
|      */ | ||||
|     @Override | ||||
|     protected Map<String, Object> executeImpl(NodeRef nodeRef, WebScriptRequest req, Status status, Cache cache) | ||||
| @@ -66,6 +70,19 @@ public class CommentsPost extends AbstractCommentsWebScript | ||||
|         // get json object from request | ||||
|         JSONObject json = parseJSON(req); | ||||
|  | ||||
|         // Validating and Sanitizing comment content to prevent XSS | ||||
|         String commentContent = getOrNull(json, "content"); | ||||
|         if (StringUtils.isBlank(commentContent)) | ||||
|         { | ||||
|             throw new IllegalArgumentException("Comment content must not be empty"); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS); | ||||
|             String safeContent = policy.sanitize(commentContent); | ||||
|             json.replace("content", safeContent); | ||||
|         } | ||||
|  | ||||
|         /* MNT-10231, MNT-9771 fix */ | ||||
|         this.behaviourFilter.disableBehaviour(nodeRef, ContentModel.ASPECT_AUDITABLE); | ||||
|  | ||||
| @@ -99,32 +116,32 @@ public class CommentsPost extends AbstractCommentsWebScript | ||||
|     { | ||||
|         // fetch the parent to add the node to | ||||
|         NodeRef commentsFolder = getOrCreateCommentsFolder(nodeRef); | ||||
|          | ||||
|  | ||||
|         // get a unique name | ||||
|         String name = getUniqueChildName("comment"); | ||||
|          | ||||
|  | ||||
|         // create the comment | ||||
|         NodeRef commentNodeRef = nodeService.createNode(commentsFolder,  | ||||
|                 ContentModel.ASSOC_CONTAINS,  | ||||
|                 QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(name)),  | ||||
|         NodeRef commentNodeRef = nodeService.createNode(commentsFolder, | ||||
|                 ContentModel.ASSOC_CONTAINS, | ||||
|                 QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(name)), | ||||
|                 ForumModel.TYPE_POST).getChildRef(); | ||||
|              | ||||
|  | ||||
|         // fetch the title required to create a comment | ||||
|         String title = getOrNull(json, JSON_KEY_TITLE); | ||||
|         HashMap<QName, Serializable> props = new HashMap<QName, Serializable>(1, 1.0f); | ||||
|         props.put(ContentModel.PROP_TITLE, title != null ? title : ""); | ||||
|         nodeService.addProperties(commentNodeRef, props); | ||||
|          | ||||
|  | ||||
|         ContentWriter writer = contentService.getWriter(commentNodeRef, ContentModel.PROP_CONTENT, true); | ||||
|         // fetch the content of a comment | ||||
|         String contentString = getOrNull(json, JSON_KEY_CONTENT); | ||||
|          | ||||
|  | ||||
|         writer.setMimetype(MimetypeMap.MIMETYPE_HTML); | ||||
|         writer.putContent(contentString); | ||||
|          | ||||
|  | ||||
|         return commentNodeRef; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     /** | ||||
|      * generates an comment item value | ||||
|      *  | ||||
| @@ -134,34 +151,34 @@ public class CommentsPost extends AbstractCommentsWebScript | ||||
|     private Map<String, Object> generateItemValue(NodeRef commentNodeRef) | ||||
|     { | ||||
|         Map<String, Object> result = new HashMap<String, Object>(4, 1.0f); | ||||
|          | ||||
|         String creator = (String)this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_CREATOR); | ||||
|          | ||||
|  | ||||
|         String creator = (String) this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_CREATOR); | ||||
|  | ||||
|         Serializable created = this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_CREATED); | ||||
|         Serializable modified = this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_MODIFIED); | ||||
|          | ||||
|  | ||||
|         boolean isUpdated = false; | ||||
|         if (created instanceof Date && modified instanceof Date) | ||||
|         { | ||||
|            isUpdated = ((Date)modified).getTime() - ((Date)created).getTime() > 5000; | ||||
|             isUpdated = ((Date) modified).getTime() - ((Date) created).getTime() > 5000; | ||||
|         } | ||||
|  | ||||
|         // TODO refactor v0 Comments API to use CommentService (see ACE-5437) | ||||
|         Serializable owner = this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_OWNER); | ||||
|         String currentUser = this.serviceRegistry.getAuthenticationService().getCurrentUserName(); | ||||
|          | ||||
|  | ||||
|         boolean isSiteManager = this.permissionService.hasPermission(commentNodeRef, SiteModel.SITE_MANAGER) == (AccessStatus.ALLOWED); | ||||
|         boolean isCoordinator = this.permissionService.hasPermission(commentNodeRef, PermissionService.COORDINATOR) == (AccessStatus.ALLOWED); | ||||
|         boolean canEditComment = isSiteManager || isCoordinator || currentUser.equals(creator) || currentUser.equals(owner); | ||||
|          | ||||
|  | ||||
|         result.put("node", commentNodeRef); | ||||
|         result.put("author", this.personService.getPerson(creator)); | ||||
|         result.put("isUpdated", isUpdated); | ||||
|         result.put("canEditComment", canEditComment); | ||||
|          | ||||
|  | ||||
|         return result; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     /** | ||||
|      * generates the response model for adding a comment | ||||
|      *  | ||||
| @@ -194,7 +211,7 @@ public class CommentsPost extends AbstractCommentsWebScript | ||||
|         } | ||||
|         return commentsFolder; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     /** | ||||
|      * returns the nodeRef of the existing one | ||||
|      *  | ||||
| @@ -207,7 +224,7 @@ public class CommentsPost extends AbstractCommentsWebScript | ||||
|         { | ||||
|             List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ForumModel.ASSOC_DISCUSSION, RegexQNamePattern.MATCH_ALL); | ||||
|             ChildAssociationRef firstAssoc = assocs.get(0); | ||||
|              | ||||
|  | ||||
|             return nodeService.getChildByName(firstAssoc.getChildRef(), ContentModel.ASSOC_CONTAINS, COMMENTS_TOPIC_NAME); | ||||
|         } | ||||
|         else | ||||
| @@ -220,7 +237,7 @@ public class CommentsPost extends AbstractCommentsWebScript | ||||
|     { | ||||
|         return prefix + "-" + System.currentTimeMillis(); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     /** | ||||
|      * creates the comments folder if it does not exists | ||||
|      *  | ||||
| @@ -229,35 +246,34 @@ public class CommentsPost extends AbstractCommentsWebScript | ||||
|      */ | ||||
|     private NodeRef createCommentsFolder(final NodeRef nodeRef) | ||||
|     { | ||||
|         NodeRef commentsFolder = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<NodeRef>() | ||||
|         { | ||||
|         NodeRef commentsFolder = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<NodeRef>() { | ||||
|             public NodeRef doWork() throws Exception | ||||
|             { | ||||
|                 NodeRef commentsFolder = null; | ||||
|                 AuthenticationUtil.pushAuthentication(); | ||||
|                  | ||||
|  | ||||
|                 // ALF-5240: turn off auditing round the discussion node creation to prevent | ||||
|                 // the source document from being modified by the first user leaving a comment | ||||
|                 behaviourFilter.disableBehaviour(nodeRef, ContentModel.ASPECT_AUDITABLE); | ||||
|                  | ||||
|  | ||||
|                 try | ||||
|                 {   | ||||
|                 { | ||||
|                     // MNT-12082: set System user for creating forumFolder and commentsFolder nodes | ||||
|                     AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getSystemUserName()); | ||||
|                      | ||||
|  | ||||
|                     nodeService.addAspect(nodeRef, QName.createQName(NamespaceService.FORUMS_MODEL_1_0_URI, "discussable"), null); | ||||
|                     nodeService.addAspect(nodeRef, QName.createQName(NamespaceService.FORUMS_MODEL_1_0_URI, "commentsRollup"), null); | ||||
|                     List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, QName.createQName(NamespaceService.FORUMS_MODEL_1_0_URI, "discussion"), RegexQNamePattern.MATCH_ALL); | ||||
|                     if (assocs.size() != 0) | ||||
|                     { | ||||
|                         NodeRef forumFolder = assocs.get(0).getChildRef(); | ||||
|                          | ||||
|  | ||||
|                         Map<QName, Serializable> props = new HashMap<QName, Serializable>(1, 1.0f); | ||||
|                         props.put(ContentModel.PROP_NAME, COMMENTS_TOPIC_NAME); | ||||
|                         commentsFolder = nodeService.createNode( | ||||
|                                 forumFolder, | ||||
|                                 ContentModel.ASSOC_CONTAINS,  | ||||
|                                 QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, COMMENTS_TOPIC_NAME),  | ||||
|                                 ContentModel.ASSOC_CONTAINS, | ||||
|                                 QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, COMMENTS_TOPIC_NAME), | ||||
|                                 QName.createQName(NamespaceService.FORUMS_MODEL_1_0_URI, "topic"), | ||||
|                                 props).getChildRef(); | ||||
|                     } | ||||
| @@ -267,12 +283,12 @@ public class CommentsPost extends AbstractCommentsWebScript | ||||
|                     AuthenticationUtil.popAuthentication(); | ||||
|                     behaviourFilter.enableBehaviour(nodeRef, ContentModel.ASPECT_AUDITABLE); | ||||
|                 } | ||||
|                  | ||||
|  | ||||
|                 return commentsFolder; | ||||
|             } | ||||
|      | ||||
|         }, AuthenticationUtil.getSystemUserName());  | ||||
|          | ||||
|  | ||||
|         }, AuthenticationUtil.getSystemUserName()); | ||||
|  | ||||
|         return commentsFolder; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -1,83 +1,92 @@ | ||||
| <#macro renderParent node indent="   "> | ||||
| 	<#escape x as jsonUtils.encodeJSONString(x)> | ||||
| 	${indent}"parent": | ||||
| 	${indent}{ | ||||
| 	<#if (node != rootNode) && node.parent??> | ||||
| 		<@renderParent node.parent indent+"   " /> | ||||
| 	</#if> | ||||
| 		${indent}"type": "${node.typeShort}", | ||||
| 		${indent}"isContainer": ${node.isContainer?string}, | ||||
| 		${indent}"name": "${node.properties.name!""}", | ||||
| 		${indent}"title": "${node.properties.title!""}", | ||||
| 		${indent}"description": "${node.properties.description!""}", | ||||
| 		<#if node.properties.modified??>${indent}"modified": "${xmldate(node.properties.modified)}",</#if> | ||||
| 		<#if node.properties.modifier??>${indent}"modifier": "${node.properties.modifier}",</#if> | ||||
| 		${indent}"displayPath": "${node.displayPath!""}", | ||||
| 		${indent}"qnamePath": "${node.qnamePath!""}", | ||||
| 		<#if node.aspects??> | ||||
|         ${indent}"aspects":  | ||||
|         ${indent}[ | ||||
|            <#list node.aspects as aspect> | ||||
|                  "${shortQName(aspect)}" | ||||
|               <#if aspect_has_next>,</#if> | ||||
|            </#list> | ||||
|          | ||||
|            ${indent}], | ||||
|        </#if> | ||||
| 		${indent}"nodeRef": "${node.nodeRef}" | ||||
| 	${indent}}, | ||||
| 	</#escape> | ||||
| </#macro> | ||||
|  | ||||
| <#macro pickerResultsJSON results> | ||||
| 	<#escape x as jsonUtils.encodeJSONString(x)> | ||||
| { | ||||
| 	"data": | ||||
| 	{ | ||||
| <#if parent??> | ||||
| 	<@renderParent parent /> | ||||
| </#if> | ||||
| 		"items": | ||||
| 		[ | ||||
| 		<#list results as row> | ||||
| 			{ | ||||
| 				"type": "${row.item.typeShort}", | ||||
| 				"parentType": "${row.item.parentTypeShort!""}", | ||||
| 				"isContainer": ${row.item.isContainer?string}, | ||||
| 				<#if row.container??>"container": "${row.container!""}",</#if> | ||||
| 				"name": "${row.item.properties.name!""}", | ||||
| 				<#if row.item.aspects??> | ||||
|                  "aspects": [ | ||||
|                    <#list row.item.aspects as aspect> | ||||
|                      "${shortQName(aspect)}" | ||||
|                       <#if aspect_has_next>,</#if> | ||||
|                    </#list> | ||||
|                    ], | ||||
|                  </#if> | ||||
| 				"title":<#if row.item.properties["lnk:title"]??>"${row.item.properties["lnk:title"]}", | ||||
| 						<#elseif row.item.properties["ia:whatEvent"]??>"${row.item.properties["ia:whatEvent"]}", | ||||
| 						<#else>"${row.item.properties.title!""}",</#if> | ||||
| 				"description": "${row.item.properties.description!""}", | ||||
| 				<#if row.item.properties.modified??>"modified": "${xmldate(row.item.properties.modified)}",</#if> | ||||
| 				<#if row.item.properties.modifier??>"modifier": "${row.item.properties.modifier}",</#if> | ||||
| 				<#if row.item.siteShortName??>"site": "${row.item.siteShortName}",</#if> | ||||
| 				<#if row.item.properties["ia:fromDate"]??>"fromDate": "${xmldate(row.item.properties["ia:fromDate"])}",</#if> | ||||
| 				"displayPath": "${row.item.displayPath!""}", | ||||
| 				"qnamePath": "${row.item.qnamePath!""}", | ||||
| 				<#if row.item.typeShort != "cm:person" && row.item.typeShort != "cm:authorityContainer"> | ||||
| 					"userAccess": | ||||
| 					{ | ||||
| 						"create": ${row.item.hasPermission("CreateChildren")?string}, | ||||
| 						"edit": ${row.item.hasPermission("Write")?string}, | ||||
| 						"delete": ${row.item.hasPermission("Delete")?string} | ||||
| 					}, | ||||
| 				</#if> | ||||
| 				"nodeRef": "${row.item.nodeRef}"<#if row.selectable?exists>, | ||||
| 				"selectable" : ${row.selectable?string}</#if> | ||||
| 			}<#if row_has_next>,</#if> | ||||
| 		</#list> | ||||
| 		] | ||||
| 	} | ||||
| } | ||||
| 	</#escape> | ||||
| <#macro renderParent node indent="   "> | ||||
| 	<#escape x as jsonUtils.encodeJSONString(x)> | ||||
| 	${indent}"parent": | ||||
| 	${indent}{ | ||||
| 	<#if (node != rootNode) && node.parent??> | ||||
| 		<@renderParent node.parent indent+"   " /> | ||||
| 	</#if> | ||||
| 		${indent}"type": "${node.typeShort}", | ||||
| 		${indent}"isContainer": ${node.isContainer?string}, | ||||
| 		${indent}"name": "${node.properties.name!""}", | ||||
| 		${indent}"title": "${node.properties.title!""}", | ||||
| 		${indent}"description": "${node.properties.description!""}", | ||||
| 		<#if node.properties.modified??>${indent}"modified": "${xmldate(node.properties.modified)}",</#if> | ||||
| 		<#if node.properties.modifier??>${indent}"modifier": "${node.properties.modifier}",</#if> | ||||
| 		${indent}"displayPath": "${node.displayPath!""}", | ||||
| 		${indent}"qnamePath": "${node.qnamePath!""}", | ||||
| 		<#if node.aspects??> | ||||
|         ${indent}"aspects":  | ||||
|         ${indent}[ | ||||
|            <#list node.aspects as aspect> | ||||
|                  "${shortQName(aspect)}" | ||||
|               <#if aspect_has_next>,</#if> | ||||
|            </#list> | ||||
|          | ||||
|            ${indent}], | ||||
|        </#if> | ||||
| 		${indent}"nodeRef": "${node.nodeRef}" | ||||
| 	${indent}}, | ||||
| 	</#escape> | ||||
| </#macro> | ||||
|  | ||||
| <#macro pickerResultsJSON results> | ||||
| 	<#escape x as jsonUtils.encodeJSONString(x)> | ||||
| { | ||||
| 	"data": | ||||
| 	{ | ||||
| <#if parent??> | ||||
| 	<@renderParent parent /> | ||||
| </#if> | ||||
| 		"items": | ||||
| 		[ | ||||
| 		<#list results as row> | ||||
| 			{ | ||||
| 				"type": "${row.item.typeShort}", | ||||
| 				"parentType": "${row.item.parentTypeShort!""}", | ||||
| 				"isContainer": ${row.item.isContainer?string}, | ||||
| 				<#if row.container??>"container": "${row.container!""}",</#if> | ||||
|                 <#if row.item.properties?? && row.item.properties.name??> | ||||
|                 	"name": "${row.item.properties.name!""}", | ||||
|                 <#else> | ||||
|                 	"name": "${(row.item.name)!row.item?string!""}", | ||||
|                 </#if> | ||||
|                 <#if row.item.aspects??> | ||||
|                  "aspects": [ | ||||
|                    <#list row.item.aspects as aspect> | ||||
|                      "${shortQName(aspect)}" | ||||
|                       <#if aspect_has_next>,</#if> | ||||
|                    </#list> | ||||
|                    ], | ||||
|                  </#if> | ||||
|                 <#if row.item.properties??> | ||||
| 					"title":<#if row.item.properties["lnk:title"]??>"${row.item.properties["lnk:title"]}", | ||||
| 							<#elseif row.item.properties["ia:whatEvent"]??>"${row.item.properties["ia:whatEvent"]}", | ||||
| 							<#else>"${row.item.properties.title!""}",</#if> | ||||
| 					"description": "${row.item.properties.description!""}", | ||||
|                 <#else> | ||||
| 					"title": "${(row.item.name)!row.item?string!""}", | ||||
| 					"description": "", | ||||
|                 </#if> | ||||
| 				<#if row.item.properties.modified??>"modified": "${xmldate(row.item.properties.modified)}",</#if> | ||||
| 				<#if row.item.properties.modifier??>"modifier": "${row.item.properties.modifier}",</#if> | ||||
| 				<#if row.item.siteShortName??>"site": "${row.item.siteShortName}",</#if> | ||||
| 				<#if row.item.properties["ia:fromDate"]??>"fromDate": "${xmldate(row.item.properties["ia:fromDate"])}",</#if> | ||||
| 				"displayPath": "${row.item.displayPath!""}", | ||||
| 				"qnamePath": "${row.item.qnamePath!""}", | ||||
| 				<#if row.item.typeShort != "cm:person" && row.item.typeShort != "cm:authorityContainer"> | ||||
| 					"userAccess": | ||||
| 					{ | ||||
| 						"create": ${row.item.hasPermission("CreateChildren")?string}, | ||||
| 						"edit": ${row.item.hasPermission("Write")?string}, | ||||
| 						"delete": ${row.item.hasPermission("Delete")?string} | ||||
| 					}, | ||||
| 				</#if> | ||||
| 				"nodeRef": "${row.item.nodeRef}"<#if row.selectable?exists>, | ||||
| 				"selectable" : ${row.selectable?string}</#if> | ||||
| 			}<#if row_has_next>,</#if> | ||||
| 		</#list> | ||||
| 		] | ||||
| 	} | ||||
| } | ||||
| 	</#escape> | ||||
| </#macro> | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <parent> | ||||
|         <groupId>org.alfresco</groupId> | ||||
|         <artifactId>alfresco-community-repo</artifactId> | ||||
|         <version>23.6.0.24</version> | ||||
|         <version>23.7.0.2</version> | ||||
|     </parent> | ||||
|  | ||||
|     <dependencies> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|  * #%L | ||||
|  * Alfresco Repository | ||||
|  * %% | ||||
|  * Copyright (C) 2005 - 2023 Alfresco Software Limited | ||||
|  * Copyright (C) 2005 - 2025 Alfresco Software Limited | ||||
|  * %% | ||||
|  * This file is part of the Alfresco software. | ||||
|  * If the software was purchased under a paid Alfresco license, the terms of | ||||
| @@ -39,8 +39,10 @@ import org.alfresco.service.namespace.QName; | ||||
| /** | ||||
|  * Encapsulates events occurred in a single transaction. | ||||
|  * | ||||
|  * @param <REF> entity (e.g. node, child association, peer association) reference type | ||||
|  * @param <RES> entity resource type | ||||
|  * @param <REF> | ||||
|  *            entity (e.g. node, child association, peer association) reference type | ||||
|  * @param <RES> | ||||
|  *            entity resource type | ||||
|  */ | ||||
| public abstract class EventConsolidator<REF extends EntityRef, RES extends Resource> | ||||
| { | ||||
| @@ -90,23 +92,31 @@ public abstract class EventConsolidator<REF extends EntityRef, RES extends Resou | ||||
|     /** | ||||
|      * Builds and returns the {@link RepoEvent} instance. | ||||
|      * | ||||
|      * @param eventInfo the object holding the event information | ||||
|      * @param eventInfo | ||||
|      *            the object holding the event information | ||||
|      * @return the {@link RepoEvent} instance | ||||
|      */ | ||||
|     public RepoEvent<DataAttributes<RES>> getRepoEvent(EventInfo eventInfo) | ||||
|     { | ||||
|         final RepoEvent.Builder<DataAttributes<RES>> builder = RepoEvent.builder(); | ||||
|  | ||||
|         configureRepoEventBuilder(builder, eventInfo); | ||||
|  | ||||
|         return builder.build(); | ||||
|     } | ||||
|  | ||||
|     protected void configureRepoEventBuilder(RepoEvent.Builder<DataAttributes<RES>> builder, EventInfo eventInfo) | ||||
|     { | ||||
|         EventType eventType = getDerivedEvent(); | ||||
|  | ||||
|         DataAttributes<RES> eventData = buildEventData(eventInfo, resource, eventType); | ||||
|  | ||||
|         return RepoEvent.<DataAttributes<RES>>builder() | ||||
|             .setId(eventInfo.getId()) | ||||
|             .setSource(eventInfo.getSource()) | ||||
|             .setTime(eventInfo.getTimestamp()) | ||||
|             .setType(eventType.getType()) | ||||
|             .setData(eventData) | ||||
|             .setDataschema(EventJSONSchema.getSchemaV1(eventType)) | ||||
|             .build(); | ||||
|         builder.setId(eventInfo.getId()) | ||||
|                 .setSource(eventInfo.getSource()) | ||||
|                 .setTime(eventInfo.getTimestamp()) | ||||
|                 .setType(eventType.getType()) | ||||
|                 .setData(eventData) | ||||
|                 .setDataschema(EventJSONSchema.getSchemaV1(eventType)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -114,9 +124,9 @@ public abstract class EventConsolidator<REF extends EntityRef, RES extends Resou | ||||
|      */ | ||||
|     protected DataAttributes<RES> buildEventData(EventInfo eventInfo, RES resource, EventType eventType) | ||||
|     { | ||||
|         return EventData.<RES>builder() | ||||
|             .setEventGroupId(eventInfo.getTxnId()) | ||||
|             .setResource(resource) | ||||
|             .build(); | ||||
|         return EventData.<RES> builder() | ||||
|                 .setEventGroupId(eventInfo.getTxnId()) | ||||
|                 .setResource(resource) | ||||
|                 .build(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| repository.name=Main Repository | ||||
|  | ||||
| # Schema number | ||||
| version.schema=19500 | ||||
| version.schema=19600 | ||||
|  | ||||
| # Directory configuration | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user