aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Schwarz <daniel.schwarz@sonarsource.com>2017-01-13 17:27:12 +0100
committerDaniel Schwarz <daniel.schwarz@sonarsource.com>2017-01-16 17:44:33 +0100
commit66414bc7e9bb7041609e890a521eaa1840e1c02c (patch)
tree4cc42a7d64b6ec58903d7a14194448c2f397c4e5
parentf148820194951234a9ea9593067eab23424f7840 (diff)
downloadsonarqube-66414bc7e9bb7041609e890a521eaa1840e1c02c.tar.gz
sonarqube-66414bc7e9bb7041609e890a521eaa1840e1c02c.zip
SONAR-7282 add authorization to the ComponentIndex
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentDoc.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java37
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexDefinition.java18
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndexer.java35
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/permission/index/PermissionIndexer.java20
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java4
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java16
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/index/ComponentIndexTest.java90
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java14
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java7
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/permission/index/PermissionIndexerTester.java6
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/permission/ws/template/ApplyTemplateActionTest.java6
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupTest.java26
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java11
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java11
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);