From 1e663d769f0e3126cec068b0d1be4911f0437ad5 Mon Sep 17 00:00:00 2001 From: mbhave Date: Tue, 11 Feb 2020 15:54:59 +0000 Subject: [PATCH 1/4] Search-2096: Tests added for Search-2096 (cherry picked from commit f8ed1490112c0cd5b0836225f5151209e2886516) --- .../search/SearchPermissionsTest.java | 77 ++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) 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..62dc9ba69 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,16 @@ 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.requests.Site; 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 +57,7 @@ public class SearchPermissionsTest extends AbstractE2EFunctionalTest * |------ permFile1 * |-- permChild2 * |------ permFile2 + * |-- permChild3 (Later: In test 2) */ parentFolder = new FolderModel("permGrandParent"); @@ -105,8 +110,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 +134,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); + } } From ccd12d2693813a7241a4988a9c8bf1066742aed5 Mon Sep 17 00:00:00 2001 From: mbhave Date: Tue, 11 Feb 2020 16:00:55 +0000 Subject: [PATCH 2/4] Search-2096: Need updateSite api from tas-rest-api version 1.30 --- e2e-test/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/e2e-test/pom.xml b/e2e-test/pom.xml index f12c76d11..64d65e2bf 100644 --- a/e2e-test/pom.xml +++ b/e2e-test/pom.xml @@ -11,8 +11,7 @@ Search Analytics E2E Tests Test Project to test Search Service and Analytics Features on a complete setup of Alfresco, Share - 1.30 - 1.26 + 1.31 1.13 3.0.19 3.3.0 From 29b53b55bd3df86ed31cee8e44c4fcc8926722a4 Mon Sep 17 00:00:00 2001 From: Angel Borroy Date: Tue, 25 Feb 2020 09:28:13 +0100 Subject: [PATCH 3/4] SEARCH-2096: Remove SEARCH-2027 approach to delete SOLR Documents only when they existed, as it has been detected some race conditions that lead to duplicating documents in the index. --- .../search/SearchPermissionsTest.java | 1 - .../alfresco/solr/SolrInformationServer.java | 28 +++++++------------ 2 files changed, 10 insertions(+), 19 deletions(-) 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 62dc9ba69..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 @@ -22,7 +22,6 @@ import javax.json.Json; import javax.json.JsonObject; import org.alfresco.dataprep.SiteService.Visibility; -import org.alfresco.rest.requests.Site; import org.alfresco.rest.search.SearchResponse; import org.alfresco.test.search.functional.AbstractE2EFunctionalTest; import org.alfresco.utility.constants.UserRole; 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 e88a75d31..0dbce72f2 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 @@ -2249,15 +2249,11 @@ 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) - { - DeleteUpdateCommand delErrorDocCmd = new DeleteUpdateCommand(request); - delErrorDocCmd.setId(errorDocId); - processor.processDelete(delErrorDocCmd); - } + // SEARCH-2096: Try finding the node before performing removal operation fails on some race conditions + // This is why the approach was removed before identifying these conditions + DeleteUpdateCommand delErrorDocCmd = new DeleteUpdateCommand(request); + delErrorDocCmd.setId(errorDocId); + processor.processDelete(delErrorDocCmd); } @@ -2273,15 +2269,11 @@ 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) - { - DeleteUpdateCommand delDocCmd = new DeleteUpdateCommand(request); - delDocCmd.setQuery(FIELD_DBID + ":" + dbid); - processor.processDelete(delDocCmd); - } + // SEARCH-2096: Try finding the node before performing removal operation fails on some race conditions + // This is why the approach was removed before identifying these conditions + DeleteUpdateCommand delDocCmd = new DeleteUpdateCommand(request); + delDocCmd.setQuery(FIELD_DBID + ":" + dbid); + processor.processDelete(delDocCmd); } From 50effd5f3c41fa5b435ed0841226b4d483f1ba66 Mon Sep 17 00:00:00 2001 From: Angel Borroy Date: Tue, 25 Feb 2020 11:37:21 +0100 Subject: [PATCH 4/4] SEARCH-2096: Using SolrQueryRequest to find existing nodes instead of current searcher. --- .../alfresco/solr/SolrInformationServer.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) 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 0dbce72f2..1679141a5 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; @@ -2248,12 +2246,13 @@ public class SolrInformationServer implements InformationServer { String errorDocId = PREFIX_ERROR + node.getId(); - - // SEARCH-2096: Try finding the node before performing removal operation fails on some race conditions - // This is why the approach was removed before identifying these conditions - DeleteUpdateCommand delErrorDocCmd = new DeleteUpdateCommand(request); - delErrorDocCmd.setId(errorDocId); - processor.processDelete(delErrorDocCmd); + // Remove document only when it exists + if (getDocListSize(FIELD_SOLR4_ID + ":" + errorDocId) > 0) + { + DeleteUpdateCommand delErrorDocCmd = new DeleteUpdateCommand(request); + delErrorDocCmd.setId(errorDocId); + processor.processDelete(delErrorDocCmd); + } } @@ -2268,13 +2267,13 @@ public class SolrInformationServer implements InformationServer private void deleteNode(UpdateRequestProcessor processor, SolrQueryRequest request, long dbid) throws IOException { - - // SEARCH-2096: Try finding the node before performing removal operation fails on some race conditions - // This is why the approach was removed before identifying these conditions - DeleteUpdateCommand delDocCmd = new DeleteUpdateCommand(request); - delDocCmd.setQuery(FIELD_DBID + ":" + dbid); - processor.processDelete(delDocCmd); - + // 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)