diff options
author | Daniel Schwarz <daniel.schwarz@sonarsource.com> | 2017-01-13 17:27:12 +0100 |
---|---|---|
committer | Daniel Schwarz <daniel.schwarz@sonarsource.com> | 2017-01-16 17:44:33 +0100 |
commit | 66414bc7e9bb7041609e890a521eaa1840e1c02c (patch) | |
tree | 4cc42a7d64b6ec58903d7a14194448c2f397c4e5 | |
parent | f148820194951234a9ea9593067eab23424f7840 (diff) | |
download | sonarqube-66414bc7e9bb7041609e890a521eaa1840e1c02c.tar.gz sonarqube-66414bc7e9bb7041609e890a521eaa1840e1c02c.zip |
SONAR-7282 add authorization to the ComponentIndex
16 files changed, 271 insertions, 36 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentDoc.java b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentDoc.java index 1c4931c75a0..34a923aa2fd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentDoc.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentDoc.java @@ -35,12 +35,12 @@ public class ComponentDoc extends BaseDoc { @Override public String getRouting() { - return getField(ComponentIndexDefinition.FIELD_PROJECT_UUID); + return getProjectUuid(); } @Override public String getParent() { - return null; + return getProjectUuid(); } public ComponentDoc setId(String s) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java index e60bf8136d2..de32c49b8cf 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java @@ -21,29 +21,40 @@ package org.sonar.server.component.index; import java.util.Arrays; import java.util.List; +import java.util.Optional; +import java.util.Set; import org.apache.commons.lang.StringUtils; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.sonar.core.util.stream.Collectors; import org.sonar.server.es.BaseIndex; import org.sonar.server.es.DefaultIndexSettings; import org.sonar.server.es.EsClient; +import org.sonar.server.user.UserSession; import static org.elasticsearch.index.query.QueryBuilders.boolQuery; +import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; import static org.elasticsearch.index.query.QueryBuilders.matchQuery; import static org.elasticsearch.index.query.QueryBuilders.termQuery; +import static org.sonar.server.component.index.ComponentIndexDefinition.FIELD_AUTHORIZATION_GROUPS; +import static org.sonar.server.component.index.ComponentIndexDefinition.FIELD_AUTHORIZATION_USERS; import static org.sonar.server.component.index.ComponentIndexDefinition.FIELD_KEY; import static org.sonar.server.component.index.ComponentIndexDefinition.FIELD_NAME; import static org.sonar.server.component.index.ComponentIndexDefinition.FIELD_QUALIFIER; import static org.sonar.server.component.index.ComponentIndexDefinition.INDEX_COMPONENTS; +import static org.sonar.server.component.index.ComponentIndexDefinition.TYPE_AUTHORIZATION; import static org.sonar.server.component.index.ComponentIndexDefinition.TYPE_COMPONENT; public class ComponentIndex extends BaseIndex { - public ComponentIndex(EsClient client) { + private final UserSession userSession; + + public ComponentIndex(EsClient client, UserSession userSession) { super(client); + this.userSession = userSession; } public List<String> search(ComponentIndexQuery query) { @@ -61,16 +72,34 @@ public class ComponentIndex extends BaseIndex { .collect(Collectors.toList()); } - private static QueryBuilder createQuery(ComponentIndexQuery query) { + private QueryBuilder createQuery(ComponentIndexQuery query) { BoolQueryBuilder esQuery = boolQuery(); + esQuery.filter(createAuthorizationFilter()); + query.getQualifier().ifPresent(q -> esQuery.filter(termQuery(FIELD_QUALIFIER, q))); // We will truncate the search to the maximum length of nGrams in the index. // Otherwise the search would for sure not find any results. String truncatedQuery = StringUtils.left(query.getQuery(), DefaultIndexSettings.MAXIMUM_NGRAM_LENGTH); - return esQuery + return esQuery.must(boolQuery() .should(matchQuery(FIELD_NAME + "." + SEARCH_PARTIAL_SUFFIX, truncatedQuery)) - .should(matchQuery(FIELD_KEY + "." + SORT_SUFFIX, query.getQuery()).boost(3f)); + .should(matchQuery(FIELD_KEY + "." + SORT_SUFFIX, query.getQuery()).boost(3f))); + } + + private QueryBuilder createAuthorizationFilter() { + Integer userLogin = userSession.getUserId(); + Set<String> userGroupNames = userSession.getUserGroups(); + BoolQueryBuilder groupsAndUser = boolQuery(); + + Optional.ofNullable(userLogin) + .map(Integer::longValue) + .ifPresent(userId -> groupsAndUser.should(termQuery(FIELD_AUTHORIZATION_USERS, userId))); + + userGroupNames.stream() + .forEach(group -> groupsAndUser.should(termQuery(FIELD_AUTHORIZATION_GROUPS, group))); + + return QueryBuilders.hasParentQuery(TYPE_AUTHORIZATION, + QueryBuilders.boolQuery().must(matchAllQuery()).filter(groupsAndUser)); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexDefinition.java b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexDefinition.java index 4c0b229ec2f..7f69d3bb5fa 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexDefinition.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexDefinition.java @@ -19,6 +19,7 @@ */ package org.sonar.server.component.index; +import com.google.common.collect.ImmutableMap; import org.sonar.api.config.Settings; import org.sonar.server.es.IndexDefinition; import org.sonar.server.es.NewIndex; @@ -26,13 +27,18 @@ import org.sonar.server.es.NewIndex; public class ComponentIndexDefinition implements IndexDefinition { public static final String INDEX_COMPONENTS = "components"; - public static final String TYPE_COMPONENT = "component"; + public static final String TYPE_COMPONENT = "component"; public static final String FIELD_PROJECT_UUID = "project_uuid"; public static final String FIELD_KEY = "key"; public static final String FIELD_NAME = "name"; public static final String FIELD_QUALIFIER = "qualifier"; + public static final String TYPE_AUTHORIZATION = "authorization"; + public static final String FIELD_AUTHORIZATION_GROUPS = "groupNames"; + public static final String FIELD_AUTHORIZATION_USERS = "users"; + public static final String FIELD_AUTHORIZATION_UPDATED_AT = "updatedAt"; + private static final int DEFAULT_NUMBER_OF_SHARDS = 5; private final Settings settings; @@ -49,6 +55,8 @@ public class ComponentIndexDefinition implements IndexDefinition { // type "component" NewIndex.NewIndexType mapping = index.createType(TYPE_COMPONENT); + mapping.setAttribute("_parent", ImmutableMap.of("type", TYPE_AUTHORIZATION)); + mapping.setAttribute("_routing", ImmutableMap.of("required", "true")); mapping.stringFieldBuilder(FIELD_PROJECT_UUID).build(); mapping.stringFieldBuilder(FIELD_KEY).enableSorting().build(); mapping.stringFieldBuilder(FIELD_NAME).enableGramSearch().build(); @@ -56,5 +64,13 @@ public class ComponentIndexDefinition implements IndexDefinition { // do not store document but only indexation of information mapping.setEnableSource(false); + + // type "authorization" + NewIndex.NewIndexType authorizationMapping = index.createType(TYPE_AUTHORIZATION); + authorizationMapping.setAttribute("_routing", ImmutableMap.of("required", "true")); + authorizationMapping.createDateTimeField(FIELD_AUTHORIZATION_UPDATED_AT); + authorizationMapping.stringFieldBuilder(FIELD_AUTHORIZATION_GROUPS).disableNorms().build(); + authorizationMapping.stringFieldBuilder(FIELD_AUTHORIZATION_USERS).disableNorms().build(); + authorizationMapping.setEnableSource(false); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexer.java index 0482527c8d3..9f628f9ac75 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexer.java @@ -36,10 +36,8 @@ import org.sonar.db.component.ComponentDto; import org.sonar.server.es.BulkIndexer; import org.sonar.server.es.EsClient; -import static org.elasticsearch.index.query.QueryBuilders.boolQuery; -import static org.elasticsearch.index.query.QueryBuilders.termQuery; -import static org.sonar.server.component.index.ComponentIndexDefinition.FIELD_PROJECT_UUID; import static org.sonar.server.component.index.ComponentIndexDefinition.INDEX_COMPONENTS; +import static org.sonar.server.component.index.ComponentIndexDefinition.TYPE_AUTHORIZATION; import static org.sonar.server.component.index.ComponentIndexDefinition.TYPE_COMPONENT; public class ComponentIndexer implements Startable { @@ -78,7 +76,7 @@ public class ComponentIndexer implements Startable { */ public void indexByProjectUuid(String projectUuid) { try (DbSession dbSession = dbClient.openSession(false)) { - deleteByProjectUuid(projectUuid); + deleteComponentsByProjectUuid(projectUuid); index( dbClient .componentDao() @@ -87,12 +85,25 @@ public class ComponentIndexer implements Startable { } } - public void deleteByProjectUuid(String projectUuid) { - BulkIndexer.delete(esClient, INDEX_COMPONENTS, esClient - .prepareSearch(INDEX_COMPONENTS) - .setTypes(TYPE_COMPONENT) - .setFetchSource(false) - .setQuery(boolQuery().filter(termQuery(FIELD_PROJECT_UUID, projectUuid)))); + public void deleteByProjectUuid(String uuid) { + deleteComponentsByProjectUuid(uuid); + deleteAuthorizationByProjectUuid(uuid); + } + + private void deleteComponentsByProjectUuid(String projectUuid) { + esClient + .prepareDelete(INDEX_COMPONENTS, TYPE_COMPONENT, projectUuid) + .setRouting(projectUuid) + .setRefresh(true) + .get(); + } + + private void deleteAuthorizationByProjectUuid(String projectUuid) { + esClient + .prepareDelete(INDEX_COMPONENTS, TYPE_AUTHORIZATION, projectUuid) + .setRouting(projectUuid) + .setRefresh(true) + .get(); } void index(ComponentDto... docs) { @@ -117,10 +128,12 @@ public class ComponentIndexer implements Startable { private static IndexRequest newIndexRequest(ComponentDoc doc) { return new IndexRequest(INDEX_COMPONENTS, TYPE_COMPONENT, doc.getId()) + .routing(doc.getRouting()) + .parent(doc.getParent()) .source(doc.getFields()); } - private static ComponentDoc toDocument(ComponentDto component) { + public static ComponentDoc toDocument(ComponentDto component) { return new ComponentDoc() .setId(component.uuid()) .setName(component.name()) diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java index 39a70eb072d..8bec33afa16 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java @@ -38,6 +38,7 @@ import org.elasticsearch.action.search.SearchResponse; import org.picocontainer.Startable; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.server.component.index.ComponentIndexDefinition; import org.sonar.server.es.BulkIndexer; import org.sonar.server.es.EsClient; import org.sonar.server.es.EsUtils; @@ -49,7 +50,7 @@ import static java.util.Collections.singletonList; import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; /** - * Manages the synchronization of index issues/authorization with authorization settings defined in database : + * Manages the synchronization of indexes with authorization settings defined in database: * <ul> * <li>index the projects with recent permission changes</li> * <li>delete project orphans from index</li> @@ -77,9 +78,11 @@ public class PermissionIndexer implements Startable { public void indexAllIfEmpty() { Future submit = executor.submit(() -> { if (isIndexEmpty(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_AUTHORIZATION) || - isIndexEmpty(ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION)) { + isIndexEmpty(ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION) || + isIndexEmpty(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION)) { truncate(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_AUTHORIZATION); truncate(ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION); + truncate(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION); try (DbSession dbSession = dbClient.openSession(false)) { index(new PermissionIndexerDao().selectAll(dbClient, dbSession)); } @@ -116,6 +119,7 @@ public class PermissionIndexer implements Startable { for (PermissionIndexerDao.Dto dto : authorizations) { bulkRequest.add(newIssuesAuthorizationIndexRequest(dto)); bulkRequest.add(newProjectMeasuresAuthorizationIndexRequest(dto)); + bulkRequest.add(newComponentsAuthorizationIndexRequest(dto)); count++; if (count >= MAX_BATCH_SIZE) { EsUtils.executeBulkRequest(bulkRequest, BULK_ERROR_MESSAGE); @@ -126,6 +130,7 @@ public class PermissionIndexer implements Startable { EsUtils.executeBulkRequest(bulkRequest, BULK_ERROR_MESSAGE); esClient.prepareRefresh(IssueIndexDefinition.INDEX).get(); esClient.prepareRefresh(ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES).get(); + esClient.prepareRefresh(ComponentIndexDefinition.INDEX_COMPONENTS).get(); } public void index(DbSession dbSession, String projectUuid) { @@ -140,6 +145,7 @@ public class PermissionIndexer implements Startable { void index(PermissionIndexerDao.Dto dto) { index(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_AUTHORIZATION, newIssuesAuthorizationIndexRequest(dto)); index(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION, newProjectMeasuresAuthorizationIndexRequest(dto)); + index(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION, newComponentsAuthorizationIndexRequest(dto)); } private void index(String index, String type, IndexRequest indexRequest) { @@ -173,6 +179,16 @@ public class PermissionIndexer implements Startable { .source(doc); } + private static IndexRequest newComponentsAuthorizationIndexRequest(PermissionIndexerDao.Dto dto) { + Map<String, Object> doc = ImmutableMap.of( + ComponentIndexDefinition.FIELD_AUTHORIZATION_GROUPS, dto.getGroups(), + ComponentIndexDefinition.FIELD_AUTHORIZATION_USERS, dto.getUsers(), + ComponentIndexDefinition.FIELD_AUTHORIZATION_UPDATED_AT, new Date(dto.getUpdatedAt())); + return new IndexRequest(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION, dto.getProjectUuid()) + .routing(dto.getProjectUuid()) + .source(doc); + } + @Override public void start() { // nothing to do at startup diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java b/server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java index c1c68776e4a..20c9d60d7cd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java @@ -33,6 +33,7 @@ import org.sonar.api.utils.log.Loggers; import org.sonar.db.DbSession; import org.sonar.db.MyBatis; import org.sonar.db.version.SqTables; +import org.sonar.server.component.index.ComponentIndexDefinition; import org.sonar.server.es.BulkIndexer; import org.sonar.server.es.EsClient; import org.sonar.server.issue.index.IssueIndexDefinition; @@ -127,6 +128,7 @@ public class BackendCleanup { clearIndex(IssueIndexDefinition.INDEX); clearIndex(ViewIndexDefinition.INDEX); clearIndex(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES); + clearIndex(ComponentIndexDefinition.INDEX_COMPONENTS); } catch (SQLException e) { throw new IllegalStateException("Fail to reset data", e); diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java index 833177f03d8..5465b0da67a 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java @@ -255,12 +255,16 @@ public class ComponentCleanerServiceTest { assertThat(es.getIds(TestIndexDefinition.INDEX, TestIndexDefinition.TYPE)).contains(data.testId); assertThat(es.getIds(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES)).contains(data.project.uuid()); assertThat(es.getIds(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION)).contains(data.project.uuid()); + assertThat(es.getIds(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_COMPONENT)).contains(data.project.uuid()); + assertThat(es.getIds(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION)).contains(data.project.uuid()); } else { assertThat(es.getIds(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_ISSUE)).doesNotContain(data.issueKey); assertThat(es.getIds(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_AUTHORIZATION)).doesNotContain(data.project.uuid()); assertThat(es.getIds(TestIndexDefinition.INDEX, TestIndexDefinition.TYPE)).doesNotContain(data.testId); assertThat(es.getIds(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES)).doesNotContain(data.project.uuid()); assertThat(es.getIds(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION)).doesNotContain(data.project.uuid()); + assertThat(es.getIds(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_COMPONENT)).doesNotContain(data.project.uuid()); + assertThat(es.getIds(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION)).doesNotContain(data.project.uuid()); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java index a7dfd09d701..33cdd014f2c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java @@ -53,6 +53,8 @@ import static org.elasticsearch.index.query.QueryBuilders.termQuery; import static org.sonar.db.component.ComponentTesting.newFileDto; import static org.sonar.db.component.ComponentTesting.newModuleDto; import static org.sonar.db.component.ComponentTesting.newProjectDto; +import static org.sonar.server.component.index.ComponentIndexDefinition.INDEX_COMPONENTS; +import static org.sonar.server.component.index.ComponentIndexDefinition.TYPE_COMPONENT; import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES; import static org.sonar.server.measure.index.ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES; @@ -78,7 +80,6 @@ public class ComponentServiceUpdateKeyTest { private ProjectMeasuresIndexer projectMeasuresIndexer = new ProjectMeasuresIndexer(system2, dbClient, es.client()); private ComponentIndexer componentIndexer = new ComponentIndexer(dbClient, es.client()); - private ComponentService underTest = new ComponentService(dbClient, i18n, userSession, system2, new ComponentFinder(dbClient), projectMeasuresIndexer, componentIndexer); @Before @@ -240,9 +241,15 @@ public class ComponentServiceUpdateKeyTest { private ComponentDto insertProject(String key) { ComponentDto project = componentDb.insertComponent(newProjectDto(db.organizations().insert()).setKey(key)); projectMeasuresIndexer.index(project.uuid()); + index(project.uuid()); return project; } + private void index(String projectUuid) { + projectMeasuresIndexer.index(projectUuid); + componentIndexer.indexByProjectUuid(projectUuid); + } + private void assertComponentKeyHasBeenUpdated(String oldKey, String newKey) { assertThat(dbClient.componentDao().selectByKey(dbSession, oldKey)).isAbsent(); assertThat(dbClient.componentDao().selectByKey(dbSession, newKey)).isPresent(); @@ -255,6 +262,11 @@ public class ComponentServiceUpdateKeyTest { .setQuery(boolQuery().must(matchAllQuery()).filter( boolQuery().must(termQuery(ProjectMeasuresIndexDefinition.FIELD_KEY, key)))); assertThat(request.get().getHits()).hasSize(1); - } + es.client().prepareSearch(INDEX_COMPONENTS) + .setTypes(TYPE_COMPONENT) + .setQuery(boolQuery().must(matchAllQuery()).filter( + boolQuery().must(termQuery(ComponentIndexDefinition.FIELD_KEY, key)))); + assertThat(request.get().getHits()).hasSize(1); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java index c9bfe62b3e2..56444940037 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java @@ -20,6 +20,7 @@ package org.sonar.server.component.index; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.IntStream; import org.assertj.core.api.AbstractListAssert; @@ -28,6 +29,7 @@ import org.junit.Rule; import org.junit.Test; import org.sonar.api.config.MapSettings; import org.sonar.api.resources.Qualifiers; +import org.sonar.api.security.DefaultGroups; import org.sonar.api.utils.System2; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; @@ -35,24 +37,34 @@ import org.sonar.db.component.ComponentTesting; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationTesting; import org.sonar.server.es.EsTester; +import org.sonar.server.permission.index.PermissionIndexerTester; +import org.sonar.server.tester.UserSessionRule; +import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; public class ComponentIndexTest { + private static final Integer TEST_USER_ID = 42; + private static final String TEST_USER_GROUP = "TestUsers"; + @Rule public EsTester es = new EsTester(new ComponentIndexDefinition(new MapSettings())); @Rule public DbTester db = DbTester.create(System2.INSTANCE); + @Rule + public UserSessionRule userSession = UserSessionRule.standalone(); + private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es); + private ComponentIndex index; private ComponentIndexer indexer; private OrganizationDto organization; @Before public void setUp() { - index = new ComponentIndex(es.client()); + index = new ComponentIndex(es.client(), userSession); indexer = new ComponentIndexer(db.getDbClient(), es.client()); organization = OrganizationTesting.newOrganizationDto(); } @@ -65,6 +77,13 @@ public class ComponentIndexTest { } @Test + public void should_not_return_components_that_do_not_match_at_all() { + indexProject("banana", "Banana Project 1"); + + assertNoSearchResults("Apple"); + } + + @Test public void search_projects_by_exact_name() { ComponentDto struts = indexProject("struts", "Apache Struts"); indexProject("sonarqube", "SonarQube"); @@ -222,6 +241,50 @@ public class ComponentIndexTest { assertNoSearchResults("th?Key"); } + @Test + public void should_respect_confidentiallity() { + indexer.index(newProject("sonarqube", "Quality Product")); + + // do not give any permissions to that project + + assertNoSearchResults("sonarqube"); + assertNoSearchResults("Quality Product"); + } + + @Test + public void should_find_project_for_which_the_user_has_direct_permission() { + login(); + + ComponentDto project = newProject("sonarqube", "Quality Product"); + indexer.index(project); + + // give the user explicit access + authorizationIndexerTester.indexProjectPermission(project.uuid(), + emptyList(), + Collections.singletonList((long) TEST_USER_ID)); + + assertSearchResults("sonarqube", project); + } + + @Test + public void should_find_project_for_which_the_user_has_indirect_permission_through_group() { + login(); + + ComponentDto project = newProject("sonarqube", "Quality Product"); + indexer.index(project); + + // give the user implicit access (though group) + authorizationIndexerTester.indexProjectPermission(project.uuid(), + Collections.singletonList(TEST_USER_GROUP), + emptyList()); + + assertSearchResults("sonarqube", project); + } + + private void login() { + userSession.login("john").setUserId(TEST_USER_ID).setUserGroups(TEST_USER_GROUP); + } + private AbstractListAssert<?, ? extends List<? extends String>, String> assertSearch(String query) { return assertSearch(new ComponentIndexQuery(query)); } @@ -244,19 +307,30 @@ public class ComponentIndexTest { } private ComponentDto indexProject(String key, String name) { - ComponentDto dto = ComponentTesting.newProjectDto(organization, "UUID_" + key) + return index( + ComponentTesting.newProjectDto(organization, "UUID_" + key) + .setKey(key) + .setName(name)); + } + + private ComponentDto newProject(String key, String name) { + return ComponentTesting.newProjectDto(organization, "UUID_" + key) .setKey(key) .setName(name); - indexer.index(dto); - return dto; } private ComponentDto indexFile(ComponentDto project, String fileKey, String fileName) { - ComponentDto dto = ComponentTesting.newFileDto(project) - .setKey(fileKey) - .setName(fileName); + return index( + ComponentTesting.newFileDto(project) + .setKey(fileKey) + .setName(fileName)); + } + + private ComponentDto index(ComponentDto dto) { indexer.index(dto); + authorizationIndexerTester.indexProjectPermission(dto.uuid(), + Collections.singletonList(DefaultGroups.ANYONE), + emptyList()); return dto; } - } diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java index 0b140d31a09..47ce136b51c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java @@ -19,6 +19,7 @@ */ package org.sonar.server.component.ws; +import java.util.Collections; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -34,9 +35,13 @@ import org.sonar.server.component.index.ComponentIndex; import org.sonar.server.component.index.ComponentIndexDefinition; import org.sonar.server.component.index.ComponentIndexer; import org.sonar.server.es.EsTester; +import org.sonar.server.permission.index.PermissionIndexerTester; +import org.sonar.server.tester.UserSessionRule; import org.sonarqube.ws.WsComponents.SuggestionsWsResponse; +import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.api.security.DefaultGroups.ANYONE; import static org.sonar.db.component.ComponentTesting.newProjectDto; public class SuggestionsActionTest { @@ -47,14 +52,18 @@ public class SuggestionsActionTest { @Rule public EsTester es = new EsTester(new ComponentIndexDefinition(new MapSettings())); + @Rule + public UserSessionRule userSessionRule = UserSessionRule.standalone(); + private ComponentIndex index; private ComponentIndexer indexer; private SuggestionsAction action; private OrganizationDto organization; + private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(es); @Before public void setUp() { - index = new ComponentIndex(es.client()); + index = new ComponentIndex(es.client(), userSessionRule); indexer = new ComponentIndexer(db.getDbClient(), es.client()); action = new SuggestionsAction(db.getDbClient(), index); organization = OrganizationTesting.newOrganizationDto(); @@ -67,6 +76,9 @@ public class SuggestionsActionTest { db.commit(); indexer.index(); + authorizationIndexerTester.indexProjectPermission(dto.uuid(), + Collections.singletonList(ANYONE), + emptyList()); SuggestionsWsResponse response = action.doHandle(dto.getKey()); diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java index f469e8d64da..7b40f3bbc60 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java @@ -34,6 +34,7 @@ import org.sonar.db.permission.GroupPermissionDto; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDbTester; import org.sonar.db.user.UserDto; +import org.sonar.server.component.index.ComponentIndexDefinition; import org.sonar.server.es.EsTester; import org.sonar.server.issue.index.IssueIndexDefinition; import org.sonar.server.measure.index.ProjectMeasuresIndexDefinition; @@ -55,7 +56,10 @@ public class PermissionIndexerTest { public DbTester dbTester = DbTester.create(System2.INSTANCE); @Rule - public EsTester esTester = new EsTester(new IssueIndexDefinition(new MapSettings()), new ProjectMeasuresIndexDefinition(new MapSettings())); + public EsTester esTester = new EsTester( + new IssueIndexDefinition(new MapSettings()), + new ProjectMeasuresIndexDefinition(new MapSettings()), + new ComponentIndexDefinition(new MapSettings())); ComponentDbTester componentDbTester = new ComponentDbTester(dbTester); UserDbTester userDbTester = new UserDbTester(dbTester); @@ -105,6 +109,7 @@ public class PermissionIndexerTest { assertThat(esTester.countDocuments(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_AUTHORIZATION)).isEqualTo(1100); assertThat(esTester.countDocuments(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION)).isEqualTo(1100); + assertThat(esTester.countDocuments(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION)).isEqualTo(1100); } @Test diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java index 9793ec14e90..2e3a18c3103 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java @@ -23,6 +23,7 @@ package org.sonar.server.permission.index; import java.util.List; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.index.query.BoolQueryBuilder; +import org.sonar.server.component.index.ComponentIndexDefinition; import org.sonar.server.es.EsTester; import org.sonar.server.issue.index.IssueIndexDefinition; import org.sonar.server.measure.index.ProjectMeasuresIndexDefinition; @@ -56,11 +57,13 @@ public class PermissionIndexerTester { public void verifyEmptyProjectPermission() { assertThat(esTester.countDocuments(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_AUTHORIZATION)).isZero(); assertThat(esTester.countDocuments(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION)).isZero(); + assertThat(esTester.countDocuments(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION)).isZero(); } public void verifyProjectDoesNotExist(String projectUuid) { assertThat(esTester.getIds(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_AUTHORIZATION)).doesNotContain(projectUuid); assertThat(esTester.getIds(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION)).doesNotContain(projectUuid); + assertThat(esTester.getIds(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION)).doesNotContain(projectUuid); } public void verifyProjectExistsWithoutPermission(String projectUuid) { @@ -74,6 +77,9 @@ public class PermissionIndexerTester { verifyProjectExistsWithPermissionInIndex(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_AUTHORIZATION, ProjectMeasuresIndexDefinition.FIELD_AUTHORIZATION_PROJECT_UUID, ProjectMeasuresIndexDefinition.FIELD_AUTHORIZATION_GROUPS, ProjectMeasuresIndexDefinition.FIELD_AUTHORIZATION_USERS, projectUuid, groupNames, userLogins); + verifyProjectExistsWithPermissionInIndex(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_AUTHORIZATION, + "_id", ComponentIndexDefinition.FIELD_AUTHORIZATION_GROUPS, + ComponentIndexDefinition.FIELD_AUTHORIZATION_USERS, projectUuid, groupNames, userLogins); } private void verifyProjectExistsWithPermissionInIndex(String index, String type, String projectField, String groupField, String userField, String projectUuid, diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/ApplyTemplateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/ApplyTemplateActionTest.java index 1dd8b847cf4..36ede579116 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/ApplyTemplateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/ApplyTemplateActionTest.java @@ -34,6 +34,7 @@ import org.sonar.db.permission.PermissionQuery; import org.sonar.db.permission.template.PermissionTemplateDto; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; +import org.sonar.server.component.index.ComponentIndexDefinition; import org.sonar.server.es.EsTester; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; @@ -59,7 +60,10 @@ import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_T public class ApplyTemplateActionTest extends BasePermissionWsTest<ApplyTemplateAction> { @Rule - public EsTester esTester = new EsTester(new IssueIndexDefinition(new MapSettings()), new ProjectMeasuresIndexDefinition(new MapSettings())); + public EsTester esTester = new EsTester( + new IssueIndexDefinition(new MapSettings()), + new ProjectMeasuresIndexDefinition(new MapSettings()), + new ComponentIndexDefinition(new MapSettings())); private UserDto user1; private UserDto user2; diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupTest.java b/server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupTest.java index f797ed0a32a..e5287522e86 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupTest.java @@ -19,12 +19,19 @@ */ package org.sonar.server.platform; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.sonar.api.config.MapSettings; import org.sonar.api.utils.System2; import org.sonar.db.DbTester; +import org.sonar.db.component.ComponentTesting; +import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.organization.OrganizationTesting; import org.sonar.db.rule.RuleTesting; +import org.sonar.server.component.index.ComponentDoc; +import org.sonar.server.component.index.ComponentIndexDefinition; +import org.sonar.server.component.index.ComponentIndexer; import org.sonar.server.es.EsTester; import org.sonar.server.issue.IssueDocTesting; import org.sonar.server.issue.index.IssueIndexDefinition; @@ -45,12 +52,19 @@ public class BackendCleanupTest { new RuleIndexDefinition(new MapSettings()), new IssueIndexDefinition(new MapSettings()), new ViewIndexDefinition(new MapSettings()), - new ProjectMeasuresIndexDefinition(new MapSettings())); + new ProjectMeasuresIndexDefinition(new MapSettings()), + new ComponentIndexDefinition(new MapSettings())); @Rule public DbTester dbTester = DbTester.create(System2.INSTANCE); BackendCleanup backendCleanup = new BackendCleanup(esTester.client(), dbTester.myBatis()); + private OrganizationDto organization; + + @Before + public void setUp() { + organization = OrganizationTesting.newOrganizationDto(); + } @Test public void clear_db() { @@ -68,10 +82,12 @@ public class BackendCleanupTest { public void clear_indexes() throws Exception { esTester.putDocuments(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_ISSUE, IssueDocTesting.newDoc()); esTester.putDocuments(RuleIndexDefinition.INDEX, RuleIndexDefinition.TYPE_RULE, newRuleDoc()); + esTester.putDocuments(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_COMPONENT, newComponentDoc()); backendCleanup.clearIndexes(); assertThat(esTester.countDocuments(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_ISSUE)).isEqualTo(0); + assertThat(esTester.countDocuments(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_COMPONENT)).isEqualTo(0); } @Test @@ -79,11 +95,13 @@ public class BackendCleanupTest { dbTester.prepareDbUnit(getClass(), "shared.xml"); esTester.putDocuments(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_ISSUE, IssueDocTesting.newDoc()); esTester.putDocuments(RuleIndexDefinition.INDEX, RuleIndexDefinition.TYPE_RULE, newRuleDoc()); + esTester.putDocuments(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_COMPONENT, newComponentDoc()); backendCleanup.clearAll(); assertThat(esTester.countDocuments(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_ISSUE)).isEqualTo(0); assertThat(esTester.countDocuments(RuleIndexDefinition.INDEX, RuleIndexDefinition.TYPE_RULE)).isEqualTo(0); + assertThat(esTester.countDocuments(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_COMPONENT)).isEqualTo(0); assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(0); assertThat(dbTester.countRowsOfTable("snapshots")).isEqualTo(0); @@ -101,6 +119,7 @@ public class BackendCleanupTest { .setId("PROJECT") .setKey("Key") .setName("Name")); + esTester.putDocuments(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_COMPONENT, newComponentDoc()); backendCleanup.resetData(); @@ -110,6 +129,7 @@ public class BackendCleanupTest { assertThat(esTester.countDocuments(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_ISSUE)).isZero(); assertThat(esTester.countDocuments(ViewIndexDefinition.INDEX, ViewIndexDefinition.TYPE_VIEW)).isZero(); assertThat(esTester.countDocuments(ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES, ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES)).isZero(); + assertThat(esTester.countDocuments(ComponentIndexDefinition.INDEX_COMPONENTS, ComponentIndexDefinition.TYPE_COMPONENT)).isZero(); // Rules should not be removed assertThat(dbTester.countRowsOfTable("rules")).isEqualTo(1); @@ -119,4 +139,8 @@ public class BackendCleanupTest { private static RuleDoc newRuleDoc() { return new RuleDoc().setKey(RuleTesting.XOO_X1.toString()).setRepository(RuleTesting.XOO_X1.repository()); } + + private ComponentDoc newComponentDoc() { + return ComponentIndexer.toDocument(ComponentTesting.newProjectDto(organization)); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java index 875f98d51b6..8716be79cfa 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java @@ -20,6 +20,7 @@ package org.sonar.server.project.ws; import java.util.Arrays; +import java.util.Collections; import java.util.stream.IntStream; import org.junit.Before; import org.junit.Rule; @@ -30,6 +31,7 @@ import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.ResourceType; import org.sonar.api.resources.ResourceTypes; import org.sonar.api.rule.RuleKey; +import org.sonar.api.security.DefaultGroups; import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; import org.sonar.core.permission.GlobalPermissions; @@ -57,12 +59,14 @@ import org.sonar.server.issue.index.IssueAuthorizationDoc; import org.sonar.server.issue.index.IssueIndexDefinition; import org.sonar.server.issue.index.IssueIndexer; import org.sonar.server.measure.index.ProjectMeasuresIndexer; +import org.sonar.server.permission.index.PermissionIndexerTester; import org.sonar.server.test.index.TestDoc; import org.sonar.server.test.index.TestIndexDefinition; import org.sonar.server.test.index.TestIndexer; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.ws.WsTester; +import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; @@ -98,6 +102,7 @@ public class BulkDeleteActionTest { private ResourceType resourceType; private ComponentIndex componentIndex; private ComponentIndexer componentIndexer; + private PermissionIndexerTester permissionIndexerTester; @Before public void setUp() { @@ -106,8 +111,9 @@ public class BulkDeleteActionTest { ResourceTypes mockResourceTypes = mock(ResourceTypes.class); when(mockResourceTypes.get(anyString())).thenReturn(resourceType); - componentIndex = new ComponentIndex(es.client()); + componentIndex = new ComponentIndex(es.client(), userSessionRule); componentIndexer = new ComponentIndexer(dbClient, es.client()); + permissionIndexerTester = new PermissionIndexerTester(es); ws = new WsTester(new ProjectsWs( new BulkDeleteAction( @@ -252,5 +258,8 @@ public class BulkDeleteActionTest { } componentIndexer.indexByProjectUuid(project.uuid()); + permissionIndexerTester.indexProjectPermission(project.uuid(), + Collections.singletonList(DefaultGroups.ANYONE), + emptyList()); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java index 16343cf98fa..247cd7a1856 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java @@ -19,6 +19,7 @@ */ package org.sonar.server.project.ws; +import java.util.Collections; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -28,6 +29,7 @@ import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.ResourceType; import org.sonar.api.resources.ResourceTypes; import org.sonar.api.rule.RuleKey; +import org.sonar.api.security.DefaultGroups; import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; @@ -54,12 +56,14 @@ import org.sonar.server.issue.index.IssueAuthorizationDoc; import org.sonar.server.issue.index.IssueIndexDefinition; import org.sonar.server.issue.index.IssueIndexer; import org.sonar.server.measure.index.ProjectMeasuresIndexer; +import org.sonar.server.permission.index.PermissionIndexerTester; import org.sonar.server.test.index.TestDoc; import org.sonar.server.test.index.TestIndexDefinition; import org.sonar.server.test.index.TestIndexer; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.ws.WsTester; +import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.assertThat; import static org.mockito.Matchers.anyString; @@ -95,6 +99,7 @@ public class DeleteActionTest { private ResourceType resourceType; public ComponentIndex componentIndex; public ComponentIndexer componentIndexer; + private PermissionIndexerTester permissionIndexerTester; @Before public void setUp() { @@ -103,8 +108,9 @@ public class DeleteActionTest { ResourceTypes mockResourceTypes = mock(ResourceTypes.class); when(mockResourceTypes.get(anyString())).thenReturn(resourceType); - componentIndex = new ComponentIndex(es.client()); + componentIndex = new ComponentIndex(es.client(), userSessionRule); componentIndexer = new ComponentIndexer(dbClient, es.client()); + permissionIndexerTester = new PermissionIndexerTester(es); ws = new WsTester(new ProjectsWs( new DeleteAction( @@ -263,6 +269,9 @@ public class DeleteActionTest { es.putDocuments(IssueIndexDefinition.INDEX, IssueIndexDefinition.TYPE_AUTHORIZATION, new IssueAuthorizationDoc().setProjectUuid(project.uuid())); componentIndexer.indexByProjectUuid(project.uuid()); + permissionIndexerTester.indexProjectPermission(project.uuid(), + Collections.singletonList(DefaultGroups.ANYONE), + emptyList()); TestDoc testDoc = new TestDoc().setUuid("test-uuid-" + suffix).setProjectUuid(project.uuid()).setFileUuid(project.uuid()); es.putDocuments(TestIndexDefinition.INDEX, TestIndexDefinition.TYPE, testDoc); |