diff --git a/e2e-test/src/test/java/org/alfresco/test/search/functional/searchServices/search/SearchPermissionsTest.java b/e2e-test/src/test/java/org/alfresco/test/search/functional/searchServices/search/SearchPermissionsTest.java index 96417269f..763322842 100644 --- a/e2e-test/src/test/java/org/alfresco/test/search/functional/searchServices/search/SearchPermissionsTest.java +++ b/e2e-test/src/test/java/org/alfresco/test/search/functional/searchServices/search/SearchPermissionsTest.java @@ -21,12 +21,15 @@ package org.alfresco.test.search.functional.searchServices.search; import javax.json.Json; import javax.json.JsonObject; +import org.alfresco.dataprep.SiteService.Visibility; import org.alfresco.rest.search.SearchResponse; import org.alfresco.test.search.functional.AbstractE2EFunctionalTest; import org.alfresco.utility.constants.UserRole; +import org.alfresco.utility.data.RandomData; import org.alfresco.utility.model.FileModel; import org.alfresco.utility.model.FileType; import org.alfresco.utility.model.FolderModel; +import org.alfresco.utility.model.SiteModel; import org.alfresco.utility.model.UserModel; import org.testng.Assert; import org.testng.annotations.BeforeClass; @@ -53,6 +56,7 @@ public class SearchPermissionsTest extends AbstractE2EFunctionalTest * |------ permFile1 * |-- permChild2 * |------ permFile2 + * |-- permChild3 (Later: In test 2) */ parentFolder = new FolderModel("permGrandParent"); @@ -105,8 +109,8 @@ public class SearchPermissionsTest extends AbstractE2EFunctionalTest waitForContentIndexing(file2.getContent(), true); } - - @Test + + @Test(priority = 1) public void searchResultsRespectInheritedPermissions() { // Search as testUser: expect all: 5 results: When user is a Site Manager @@ -129,4 +133,72 @@ public class SearchPermissionsTest extends AbstractE2EFunctionalTest resultCount = response.getPagination().getCount(); Assert.assertTrue(resultCount == 0, "Unexpected Result count for testUser3: Expected 0, received: " + resultCount); } + + @Test(priority = 2) + public void searchResultsRespectInheritedPermissionsDisabled() throws Exception + { + // Create folder + FolderModel folder3 = dataContent.usingUser(testUser).usingSite(testSite).usingResource(parentFolder).createFolderCmisApi("permChild32"); + + // Turn off inherited permissions for folder3 + JsonObject userPermission = Json.createObjectBuilder().add("permissions", Json.createObjectBuilder().add("isInheritanceEnabled", false)).build(); + String putBody = userPermission.toString(); + restClient.authenticateUser(testUser).withCoreAPI().usingNode(folder3).updateNode(putBody); + + // Wait for indexing + waitForIndexing(folder3.getName(), true); + + // Search as testUser: expect all: 5 results: When user is a Site Manager + SearchResponse response = queryAsUser(testUser, "cm:name:perm*"); + int resultCount = response.getPagination().getCount(); + Assert.assertTrue(resultCount == 6, "Unexpected Result count for testUser: Expected 5, received: " + resultCount); + + // Search as testUser1: expect 3 results: when user is a site member but without permission to a content + response = queryAsUser(testUser1, "cm:name:perm*"); + resultCount = response.getPagination().getCount(); + Assert.assertTrue(resultCount == 3, "Unexpected Result count for testUser1: Expected 3, received: " + resultCount); + + // Search as testUser2: expect 1 result: When user isn't a site member but has granular permissions to a content + response = queryAsUser(testUser2, "cm:name:perm*"); + resultCount = response.getPagination().getCount(); + Assert.assertTrue(resultCount == 1, "Unexpected Result count for testUser2: Expected 1, received: " + resultCount); + + // Search as testUser3: expect none: 0 results: When user isn't a site member / does not have granular permissions to the content + response = queryAsUser(testUser3, "cm:name:perm*"); + resultCount = response.getPagination().getCount(); + Assert.assertTrue(resultCount == 0, "Unexpected Result count for testUser3: Expected 0, received: " + resultCount); + } + + @Test(priority = 3) + public void searchResultsOnChangingSiteVisibility() throws Exception + { + // Create Site + SiteModel testPermissionsSite = new SiteModel(RandomData.getRandomName("SiteSearchPermissions")); + testPermissionsSite.setVisibility(Visibility.PUBLIC); + + dataSite.usingUser(adminUserModel).createSite(testPermissionsSite); + + // Add Users to the site + dataUser.addUserToSite(testUser, testPermissionsSite, UserRole.SiteCollaborator); + + // Create a folder + String folderName = "Folder" + unique_searchString; + FolderModel folder = dataContent.usingUser(testUser).usingSite(testPermissionsSite).createFolderCmisApi(folderName); + + // Query + Assert.assertTrue(waitForIndexing(folder.getName(), true), "Folder isn't yet indexed"); + + // Edit Site Visibility + testPermissionsSite.setDescription("PrivateSite".concat(testPermissionsSite.getDescription())); + testPermissionsSite.setVisibility(Visibility.PRIVATE); + restClient.authenticateUser(adminUserModel).withCoreAPI().usingSite(testPermissionsSite).updateSite(testPermissionsSite); + + // Wait for indexing + Assert.assertTrue(waitForIndexing("description:" + testPermissionsSite.getDescription(), true), "New Site Description isn't yet been indexed"); + + // Query + SearchResponse response = queryAsUser(testUser, folderName); + int resultCount = response.getPagination().getCount(); + Assert.assertTrue(resultCount == 1, "Unexpected Result count for testUser: Expected 1, received: " + resultCount); + } } diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java index bd63476bb..4ca525913 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/SolrInformationServer.java @@ -151,7 +151,6 @@ import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.document.Document; -import org.apache.lucene.document.LongPoint; import org.apache.lucene.index.IndexCommit; import org.apache.lucene.index.IndexableField; import org.apache.lucene.index.LeafReaderContext; @@ -194,7 +193,6 @@ import org.apache.solr.schema.SchemaField; import org.apache.solr.search.DelegatingCollector; import org.apache.solr.search.DocIterator; import org.apache.solr.search.DocList; -import org.apache.solr.search.DocSet; import org.apache.solr.search.QueryWrapperFilter; import org.apache.solr.search.SolrIndexSearcher; import org.apache.solr.update.AddUpdateCommand; @@ -2251,11 +2249,8 @@ public class SolrInformationServer implements InformationServer { String errorDocId = PREFIX_ERROR + node.getId(); - - // Try finding the node before performing removal operation - DocSet docSet = request.getSearcher().getDocSet(new TermQuery(new Term(FIELD_SOLR4_ID, errorDocId))); - - if (docSet.size() > 0) + // Remove document only when it exists + if (getDocListSize(FIELD_SOLR4_ID + ":" + errorDocId) > 0) { DeleteUpdateCommand delErrorDocCmd = new DeleteUpdateCommand(request); delErrorDocCmd.setId(errorDocId); @@ -2275,17 +2270,13 @@ public class SolrInformationServer implements InformationServer private void deleteNode(UpdateRequestProcessor processor, SolrQueryRequest request, long dbid) throws IOException { - - // Try finding the node before performing removal operation - DocSet docSet = request.getSearcher().getDocSet(LongPoint.newExactQuery(FIELD_DBID, dbid)); - - if (docSet.size() > 0) + // Remove document only when it exists + if (getDocListSize(FIELD_DBID + ":" + dbid) > 0) { DeleteUpdateCommand delDocCmd = new DeleteUpdateCommand(request); delDocCmd.setQuery(FIELD_DBID + ":" + dbid); processor.processDelete(delDocCmd); } - } private boolean isContentIndexedForNode(Map properties)