diff --git a/config/alfresco/dbscripts/db-schema-context.xml b/config/alfresco/dbscripts/db-schema-context.xml index 676f47c338..f5d2b9569c 100644 --- a/config/alfresco/dbscripts/db-schema-context.xml +++ b/config/alfresco/dbscripts/db-schema-context.xml @@ -88,6 +88,7 @@ + diff --git a/config/alfresco/dbscripts/upgrade/5.0/org.hibernate.dialect.Dialect/activiti-correct-tenant-id-MSSQL.sql b/config/alfresco/dbscripts/upgrade/5.0/org.hibernate.dialect.Dialect/activiti-correct-tenant-id-MSSQL.sql new file mode 100644 index 0000000000..c27401ded5 --- /dev/null +++ b/config/alfresco/dbscripts/upgrade/5.0/org.hibernate.dialect.Dialect/activiti-correct-tenant-id-MSSQL.sql @@ -0,0 +1,23 @@ +-- +-- Title: Correct Tenant Id after Patch 8004 +-- Database: SQLServer +-- Since: V5.0 Schema 8045 +-- Author: Mark Rogers +-- +-- Please contact support@alfresco.com if you need assistance with the upgrade. +-- +-- Changes the value of TENANT_ID on MS SqlServer after patch 8004 + +-- No Op on platforms other than SQLServer + +-- +-- Record script finish +-- +DELETE FROM alf_applied_patch WHERE id = 'patch.db-V5.0-activiti-correct-tenant-id-MSSQL'; +INSERT INTO alf_applied_patch + (id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report) + VALUES + ( + 'patch.db-V5.0-activiti-correct-tenant-id-MSSQL', 'Manually executed script upgrade V5.0: patch.db-V5.0-activiti-correct-tenant-id-MSSQL', + 0, 8045, -1, 8046, null, 'UNKNOWN', ${TRUE}, ${TRUE}, 'Script completed' + ); \ No newline at end of file diff --git a/config/alfresco/messages/patch-service.properties b/config/alfresco/messages/patch-service.properties index 00fc3a58bb..f14827d83a 100644 --- a/config/alfresco/messages/patch-service.properties +++ b/config/alfresco/messages/patch-service.properties @@ -372,7 +372,7 @@ patch.downloadsFolder.description=Ensures the Syste Downloads folder exists. patch.downloadsFolder.result.exists=The System Downloads folder already exists. patch.downloadsFolder.result.created=The System Downloads folder was created. -patch.db-V5.1-metadata-query-indexes.description=Add additional indexes to support transactional metadata query direct to the database.>>>>>>> .merge-right.r99951 +patch.db-V5.1-metadata-query-indexes.description=Add additional indexes to support transactional metadata query direct to the database. patch.alfrescoModelAdministrators.description=Adds the 'GROUP_ALFRESCO_MODEL_ADMINISTRATORS' group @@ -386,4 +386,7 @@ patch.addSurfConfigFolders.description=Adds 'cm:extensions' and 'cm:module-deplo patch.spacesBootstrapSmartDownloadFolder.description=Adds Smart Download Folder in Data Dictionary. patch.spacesBootstrapSmartTemplatesFolder.description=Adds Smart Templates Folder in Data Dictionary. -patch.spacesBootstrapSmartFolderExample.description=Adds smartFoldersExample.json file in Smart Templates Folder. \ No newline at end of file +patch.spacesBootstrapSmartFolderExample.description=Adds smartFoldersExample.json file in Smart Templates Folder. + +patch.db-v4.2-migrate-activiti-workflows.description=Migrated workflow variables into newly created table. +patch.db-V5.0-activiti-correct-tenant-id-MSSQL.description=Update Tenant ID column in Activiti for MSSQL diff --git a/config/alfresco/patch/patch-services-context.xml b/config/alfresco/patch/patch-services-context.xml index b1ddf23e93..2dd0465061 100644 --- a/config/alfresco/patch/patch-services-context.xml +++ b/config/alfresco/patch/patch-services-context.xml @@ -1414,4 +1414,16 @@ + + + + + + + + + classpath:alfresco/dbscripts/upgrade/5.0/${db.script.dialect}/activiti-correct-tenant-id-MSSQL.sql + + + diff --git a/config/alfresco/version.properties b/config/alfresco/version.properties index b7870c972e..f3f174db56 100644 --- a/config/alfresco/version.properties +++ b/config/alfresco/version.properties @@ -23,4 +23,4 @@ version.build=r@scm-revision@-b@build-number@ # Schema number -version.schema=9016 +version.schema=9017 diff --git a/source/java/org/alfresco/repo/virtual/ActualEnvironment.java b/source/java/org/alfresco/repo/virtual/ActualEnvironment.java index 57c19ee5bf..989d88d3ea 100644 --- a/source/java/org/alfresco/repo/virtual/ActualEnvironment.java +++ b/source/java/org/alfresco/repo/virtual/ActualEnvironment.java @@ -102,9 +102,11 @@ public interface ActualEnvironment FileInfo create(NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException; - ContentWriter getWriter(NodeRef nodeRef, QName propertyQName, boolean update) - throws InvalidNodeRefException, InvalidTypeException; + ContentWriter getWriter(NodeRef nodeRef, QName propertyQName, boolean update) throws InvalidNodeRefException, + InvalidTypeException; void addAspect(NodeRef nodeRef, QName aspectTypeQName, Map aspectProperties) throws InvalidNodeRefException, InvalidAspectException; + + boolean hasPermission(NodeRef nodeRef, String perm); } diff --git a/source/java/org/alfresco/repo/virtual/AlfrescoEnviroment.java b/source/java/org/alfresco/repo/virtual/AlfrescoEnviroment.java index 38b802f36e..2e0a1600c0 100644 --- a/source/java/org/alfresco/repo/virtual/AlfrescoEnviroment.java +++ b/source/java/org/alfresco/repo/virtual/AlfrescoEnviroment.java @@ -44,6 +44,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchParameters; +import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.namespace.NamespacePrefixResolver; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QNamePattern; @@ -60,14 +61,14 @@ public class AlfrescoEnviroment implements ActualEnvironment private NamespacePrefixResolver namespacePrefixResolver; private Repository repositoryHelper; - + private NodeRefResolver nodeRefResolver; public void setNodeRefResolver(NodeRefResolver nodeRefResolver) { this.nodeRefResolver = nodeRefResolver; } - + public void setAlfrescoAPIFacet(AlfrescoAPIFacet apiFacet) { this.apiFacet = apiFacet; @@ -82,7 +83,7 @@ public class AlfrescoEnviroment implements ActualEnvironment { return this.serviceRegistry; } - + public void setRepositoryHelper(Repository repository) { this.repositoryHelper = repository; @@ -299,4 +300,11 @@ public class AlfrescoEnviroment implements ActualEnvironment Resource resource = resolver.getResource("classpath:" + classpath); return resource.exists(); } + + @Override + public boolean hasPermission(NodeRef nodeRef, String perm) + { + return apiFacet.getPermissionService().hasPermission(nodeRef, + perm).equals(AccessStatus.ALLOWED); + } } diff --git a/source/java/org/alfresco/repo/virtual/bundle/VirtualPermissionServiceExtension.java b/source/java/org/alfresco/repo/virtual/bundle/VirtualPermissionServiceExtension.java index e43697d16f..a0f51321a6 100644 --- a/source/java/org/alfresco/repo/virtual/bundle/VirtualPermissionServiceExtension.java +++ b/source/java/org/alfresco/repo/virtual/bundle/VirtualPermissionServiceExtension.java @@ -74,7 +74,7 @@ public class VirtualPermissionServiceExtension extends { Reference reference = Reference.fromNodeRef(nodeRef); AccessStatus virtualAccessStatus = smartStore.hasPermission(reference, - perm); + perm); if (!AccessStatus.UNDETERMINED.equals(virtualAccessStatus)) { return virtualAccessStatus; @@ -107,7 +107,7 @@ public class VirtualPermissionServiceExtension extends { Reference reference = Reference.fromNodeRef(nodeRef); AccessStatus virtualAccessStatus = smartStore.hasPermission(reference, - perm); + perm); if (!AccessStatus.UNDETERMINED.equals(virtualAccessStatus)) { return virtualAccessStatus; @@ -206,10 +206,13 @@ public class VirtualPermissionServiceExtension extends private NodeRef establishPermisisonAdherence(Reference reference) { NodeRef nodeToAdhereTo = smartStore.adhere(reference, - VirtualStore.FILING_OR_MATERIAL_ADHERENCE); + VirtualStore.FILING_OR_MATERIAL_ADHERENCE); if (logger.isDebugEnabled()) { - logger.debug("Could not establish permission adherence for " + reference.toString()); + if (nodeToAdhereTo == null) + { + logger.debug("Could not establish permission adherence for " + reference.toString()); + } } return nodeToAdhereTo; diff --git a/source/java/org/alfresco/repo/virtual/template/TemplateFilingRule.java b/source/java/org/alfresco/repo/virtual/template/TemplateFilingRule.java index 67f5cbc899..165b62ea23 100644 --- a/source/java/org/alfresco/repo/virtual/template/TemplateFilingRule.java +++ b/source/java/org/alfresco/repo/virtual/template/TemplateFilingRule.java @@ -33,6 +33,7 @@ import org.alfresco.repo.virtual.config.NodeRefPathExpression; import org.alfresco.repo.virtual.ref.GetActualNodeRefMethod; import org.alfresco.repo.virtual.ref.Reference; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.NamespacePrefixResolver; import org.alfresco.service.namespace.QName; import org.alfresco.util.ISO9075; @@ -59,7 +60,6 @@ public class TemplateFilingRule implements FilingRule private Map stringProperties; - public TemplateFilingRule(ActualEnvironment environment, String path, String type, Set aspects, Map properties) { @@ -176,15 +176,35 @@ public class TemplateFilingRule implements FilingRule } else { - String[] pathElements = NodeRefPathExpression.splitAndNormalizePath(path); for (int i = 0; i < pathElements.length; i++) { - pathElements[i]=ISO9075.decode(pathElements[i]); + pathElements[i] = ISO9075.decode(pathElements[i]); } fParentRef = env.findQNamePath(pathElements); } + boolean noReadPermissions = false; + if (fParentRef != null && !env.hasPermission(fParentRef, + PermissionService.READ_PERMISSIONS)) + { + fParentRef = null; + noReadPermissions = true; + } + if (logger.isDebugEnabled()) + { + if (fParentRef == null) + { + if (noReadPermissions) + { + logger.debug("Current user does not have READ_PERMISSIONS for filing path" + path + "."); + } + else + { + logger.debug("The filing path " + path + " doesn't exist."); + } + } + } if (failIfNotFound && fParentRef == null) { throw new VirtualizationException("The filing path " + path + " could not be resolved."); diff --git a/source/test-java/org/alfresco/repo/virtual/bundle/VirtualPermissionServiceExtensionTest.java b/source/test-java/org/alfresco/repo/virtual/bundle/VirtualPermissionServiceExtensionTest.java index e094c4acbd..0924a38b39 100644 --- a/source/test-java/org/alfresco/repo/virtual/bundle/VirtualPermissionServiceExtensionTest.java +++ b/source/test-java/org/alfresco/repo/virtual/bundle/VirtualPermissionServiceExtensionTest.java @@ -27,7 +27,6 @@ import java.util.Map; import java.util.Set; import org.alfresco.model.ContentModel; -import org.alfresco.repo.jscript.ScriptNode; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.security.permissions.NodePermissionEntry; @@ -36,13 +35,13 @@ import org.alfresco.repo.security.permissions.PermissionServiceSPI; import org.alfresco.repo.virtual.VirtualizationIntegrationTest; import org.alfresco.repo.virtual.store.VirtualStoreImpl; import org.alfresco.repo.virtual.store.VirtualUserPermissions; -import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.site.SiteService; +import org.alfresco.service.cmr.site.SiteVisibility; import org.junit.Test; public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegrationTest @@ -62,6 +61,16 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra /** original user permissions to be restored on tear down */ private VirtualUserPermissions savedUserPermissions; + private NodeRef testSiteFolder = null, smartFolder = null, contributionDocsFolder = null; + + private SiteService siteService; + + private String sName = "mytestsite_ace_5162"; + + private NodeRef myContentSMF; + + private NodeRef contributionsSMF; + @Override protected void setUp() throws Exception { @@ -69,10 +78,12 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra // we set our own virtual user permissions in order to be context xml // independent smartStore = VirtualPermissionServiceExtensionTest.ctx.getBean("smartStore", - VirtualStoreImpl.class); + VirtualStoreImpl.class); permissionService = VirtualPermissionServiceExtensionTest.ctx.getBean("permissionServiceImpl", PermissionServiceSPI.class); + siteService = VirtualPermissionServiceExtensionTest.ctx.getBean("siteService", + SiteService.class); user1 = "user1"; @@ -95,6 +106,15 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra PermissionService.DELETE_CHILDREN, false); + this.permissionService.setPermission(this.virtualFolder1NodeRef, + user1, + PermissionService.READ_PERMISSIONS, + true); + this.permissionService.setPermission(this.virtualFolder1NodeRef, + user2, + PermissionService.READ_PERMISSIONS, + true); + this.permissionService.setPermission(this.virtualFolder1NodeRef, user1, PermissionService.READ_PROPERTIES, @@ -225,9 +245,6 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra ContentModel.ASSOC_CONTAINS, "FilingFolder_filing_path"); - - - assertEquals(AccessStatus.DENIED, hasPermissionAs(filingFolderVirtualNodeRef, PermissionService.DELETE, @@ -236,7 +253,7 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra assertEquals(AccessStatus.DENIED, hasPermissionAs(filingFolderVirtualNodeRef, asTypedPermission(PermissionService.DELETE), - user1) ); + user1)); assertEquals(AccessStatus.DENIED, hasPermissionAs(filingFolderVirtualNodeRef, @@ -249,7 +266,7 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra user1)); } - + @Test public void testHasPermissionAdherence_folderPath() throws Exception { @@ -270,12 +287,16 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra "FilingFolder"); NodeRef filingFolderNodeRef = filingFolderChildAssoc.getChildRef(); - + + this.permissionService.setPermission(filingFolderNodeRef, + user1, + PermissionService.READ_PERMISSIONS, + true); this.permissionService.setPermission(filingFolderNodeRef, user1, PermissionService.CREATE_CHILDREN, true); - + this.permissionService.setPermission(filingFolderNodeRef, user2, PermissionService.CREATE_CHILDREN, @@ -295,7 +316,7 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra hasPermissionAs(filingFolderNodeRef, PermissionService.CREATE_CHILDREN, user2)); - + assertEquals(AccessStatus.DENIED, hasPermissionAs(filingFolderVirtualNodeRef, PermissionService.DELETE, @@ -615,6 +636,243 @@ public class VirtualPermissionServiceExtensionTest extends VirtualizationIntegra } + @Test + public void testNodes_WithfilingPath_withNoReadPermissions_hasReadonlyPermission() throws Exception + { + final String[] deniedReadOnly = new String[] { PermissionService.UNLOCK, PermissionService.CANCEL_CHECK_OUT, + PermissionService.CHANGE_PERMISSIONS, PermissionService.CREATE_CHILDREN, PermissionService.DELETE, + PermissionService.WRITE, PermissionService.DELETE_NODE, PermissionService.WRITE_PROPERTIES, + PermissionService.WRITE_CONTENT, PermissionService.CREATE_ASSOCIATIONS }; + + NodeRef virtualFolderT5 = createVirtualizedFolder(testRootFolder.getNodeRef(), + "VirtualFolderT5", + TEST_TEMPLATE_5_JSON_SYS_PATH); + + NodeRef filingFolderVirtualNodeRef = nodeService.getChildByName(virtualFolderT5, + ContentModel.ASSOC_CONTAINS, + "FilingFolder_filing_path"); + + ChildAssociationRef filingFolderChildAssoc = createFolder(rootNodeRef, + "FilingFolder"); + + NodeRef filingFolderNodeRef = filingFolderChildAssoc.getChildRef(); + + this.permissionService.setPermission(filingFolderNodeRef, + user1, + PermissionService.READ_PERMISSIONS, + false); + + this.permissionService.setPermission(filingFolderNodeRef, + user1, + PermissionService.CREATE_CHILDREN, + true); + + this.permissionService.setPermission(filingFolderNodeRef, + user2, + PermissionService.CREATE_CHILDREN, + false); + + assertEquals(AccessStatus.DENIED, + hasPermissionAs(filingFolderNodeRef, + PermissionService.DELETE, + user1)); + + assertEquals(AccessStatus.ALLOWED, + hasPermissionAs(filingFolderNodeRef, + PermissionService.CREATE_CHILDREN, + user1)); + + assertEquals(AccessStatus.DENIED, + hasPermissionAs(filingFolderNodeRef, + PermissionService.CREATE_CHILDREN, + user2)); + + // for virtual folder + + StringBuilder nonDeniedTrace = new StringBuilder(); + for (int i = 0; i < deniedReadOnly.length; i++) + { + AccessStatus accessStatus = hasPermissionAs(filingFolderVirtualNodeRef, + deniedReadOnly[i], + user1); + if (!AccessStatus.DENIED.equals(accessStatus)) + { + if (nonDeniedTrace.length() > 0) + { + nonDeniedTrace.append(","); + } + nonDeniedTrace.append(deniedReadOnly[i]); + } + } + + assertTrue("Non-denied permissions on RO virtual nodes : " + nonDeniedTrace, + nonDeniedTrace.length() == 0); + + this.permissionService.setPermission(filingFolderNodeRef, + user1, + PermissionService.DELETE_CHILDREN, + true); + + this.permissionService.setPermission(filingFolderNodeRef, + user2, + PermissionService.DELETE_CHILDREN, + false); + + this.permissionService.setPermission(filingFolderNodeRef, + user1, + PermissionService.READ_PROPERTIES, + true); + + this.permissionService.setPermission(filingFolderNodeRef, + user1, + PermissionService.CREATE_CHILDREN, + false); + + this.permissionService.setPermission(filingFolderNodeRef, + user1, + PermissionService.DELETE, + true); + + assertEquals(AccessStatus.ALLOWED, + hasPermissionAs(filingFolderNodeRef, + PermissionService.DELETE, + user1)); + + assertEquals(AccessStatus.DENIED, + hasPermissionAs(filingFolderNodeRef, + PermissionService.CREATE_CHILDREN, + user1)); + + StringBuilder nonDeniedTrace1 = new StringBuilder(); + for (int i = 0; i < deniedReadOnly.length; i++) + { + AccessStatus accessStatus = hasPermissionAs(filingFolderVirtualNodeRef, + deniedReadOnly[i], + user1); + if (!AccessStatus.DENIED.equals(accessStatus)) + { + if (nonDeniedTrace1.length() > 0) + { + nonDeniedTrace1.append(","); + } + nonDeniedTrace1.append(deniedReadOnly[i]); + } + } + + assertTrue("Non-denied permissions on RO virtual nodes : " + nonDeniedTrace1, + nonDeniedTrace1.length() == 0); + + } + + @Test + public void testPerm_ace_5162() throws Exception + { + final String[] deniedReadOnly = new String[] { PermissionService.UNLOCK, PermissionService.CANCEL_CHECK_OUT, + PermissionService.CHANGE_PERMISSIONS, PermissionService.CREATE_CHILDREN, PermissionService.DELETE, + PermissionService.WRITE, PermissionService.DELETE_NODE, PermissionService.WRITE_PROPERTIES, + PermissionService.WRITE_CONTENT, PermissionService.CREATE_ASSOCIATIONS }; + + try + { + // Create a public site + + siteService.createSite("testSitePreset", + sName, + sName, + sName, + SiteVisibility.PUBLIC); + + testSiteFolder = siteService.createContainer(sName, + "TestSiteFolder", + ContentModel.TYPE_FOLDER, + null); + + smartFolder = createVirtualizedFolder(testSiteFolder, + "SmartFolder", + "C" + TEST_TEMPLATE_CLASSPATH + "testTemplate7.json"); + contributionDocsFolder = createFolder(testSiteFolder, + "Contribution Docs").getChildRef(); + permissionService.setInheritParentPermissions(contributionDocsFolder, + false); + + myContentSMF = nodeService.getChildByName(smartFolder, + ContentModel.ASSOC_CONTAINS, + "My content"); + assertNotNull(myContentSMF); + + contributionsSMF = nodeService.getChildByName(myContentSMF, + ContentModel.ASSOC_CONTAINS, + "Contributions"); + assertNotNull(contributionsSMF); + + // test that the all denied permissions for read only virtual nodes + // apply for virtual nodes with filing path with no READ_PERMISSONS + // for authenticated user + StringBuilder nonDeniedTrace = new StringBuilder(); + for (int i = 0; i < deniedReadOnly.length; i++) + { + AccessStatus accessStatus = hasPermissionAs(contributionsSMF, + deniedReadOnly[i], + user1); + if (!AccessStatus.DENIED.equals(accessStatus)) + { + if (nonDeniedTrace.length() > 0) + { + nonDeniedTrace.append(","); + } + nonDeniedTrace.append(deniedReadOnly[i]); + } + } + + assertTrue("Non-denied permissions on RO virtual nodes : " + nonDeniedTrace, + nonDeniedTrace.length() == 0); + + // test that the admin user can see documents from virtual nodes + // with filing path with no inherited parent permissions + fileAndFolderService.create(contributionsSMF, + "T1", + ContentModel.TYPE_CONTENT); + + NodeRef childContet = nodeService.getChildByName(contributionsSMF, + ContentModel.ASSOC_CONTAINS, + "T1"); + assertNotNull(childContet); + + assertTrue(nodeService.getChildAssocs(contributionsSMF).size() > 0); + + // test that the user1 can't see documents from virtual nodes with + // filing path with no inherited parent permissions + RunAsWork hasChildAssocs = new RunAsWork() + { + @Override + public Boolean doWork() throws Exception + { + return nodeService.getChildAssocs(contributionsSMF).size() > 0; + } + }; + + boolean value = AuthenticationUtil.runAs(hasChildAssocs, + user1); + assertFalse(value); + } + finally + { + if (contributionDocsFolder != null) + { + nodeService.deleteNode(contributionDocsFolder); + } + if (smartFolder != null) + { + nodeService.deleteNode(smartFolder); + } + if (testSiteFolder != null) + { + nodeService.deleteNode(testSiteFolder); + } + siteService.deleteSite(sName); + } + } + private String asTypedPermission(String perm) { return smartStore.getUserPermissions().getPermissionTypeQName() + "." + perm; diff --git a/source/test-resources/org/alfresco/repo/virtual/template/testTemplate7.json b/source/test-resources/org/alfresco/repo/virtual/template/testTemplate7.json new file mode 100644 index 0000000000..836a877078 --- /dev/null +++ b/source/test-resources/org/alfresco/repo/virtual/template/testTemplate7.json @@ -0,0 +1,35 @@ +{ + "name":"Smart Folders Example", + "nodes":[ + { + "id":"1", + "name":"My content", + "description":"My files in this repository", + "nodes":[ + { + "id":"13", + "name":"Contributions", + "description":"My 'dublin core' contributions - add new documents here to contribute", + "search":{ + "language":"fts-alfresco", + "query":"+ASPECT:'cm:dublincore' AND (PATH:'/app:company_home/st:sites/cm:mytestsite_ace_5162/cm:TestSiteFolder/cm:Contribution_x0020_Docs/*')" + }, + "filing":{ + "path":"/app:company_home/st:sites/cm:mytestsite_ace_5162/cm:TestSiteFolder/cm:Contribution_x0020_Docs", + "classification":{ + "type":"cm:content", + "aspects":[ + "cm:dublincore" + ] + }, + "properties":{ + "cm:contributor":"%CURRENT_USER%", + "cm:rights":"Alfresco", + "cm:publisher":"Alfresco" + } + } + } + ] + } + ] +} \ No newline at end of file