From 980460baadab04da9a1092fe15c22a716af3d1bc Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 18 Oct 2016 16:17:20 +0200 Subject: [PATCH] SONAR-8227 Index authorization by projects --- .../component/ComponentCleanerService.java | 8 +++---- .../step/ApplyPermissionsStep.java | 2 +- .../sonar/server/es/IndexerStartupTask.java | 10 +++++---- .../server/permission/PermissionService.java | 18 +++++++++------- .../server/permission/PermissionUpdater.java | 14 ++++++++----- .../ws/template/ApplyTemplateActionTest.java | 21 ++++++++++++++----- .../server/view/index/ViewIndexerTest.java | 7 +++---- 7 files changed, 49 insertions(+), 31 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java b/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java index 1aae37b7b74..7ad9b8305e8 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java @@ -39,17 +39,17 @@ import org.sonar.server.test.index.TestIndexer; public class ComponentCleanerService { private final DbClient dbClient; - private final AuthorizationIndexer issueAuthorizationIndexer; + private final AuthorizationIndexer authorizationIndexer; private final IssueIndexer issueIndexer; private final TestIndexer testIndexer; private final ProjectMeasuresIndexer projectMeasuresIndexer; private final ResourceTypes resourceTypes; private final ComponentFinder componentFinder; - public ComponentCleanerService(DbClient dbClient, AuthorizationIndexer issueAuthorizationIndexer, IssueIndexer issueIndexer, + public ComponentCleanerService(DbClient dbClient, AuthorizationIndexer authorizationIndexer, IssueIndexer issueIndexer, TestIndexer testIndexer, ProjectMeasuresIndexer projectMeasuresIndexer, ResourceTypes resourceTypes, ComponentFinder componentFinder) { this.dbClient = dbClient; - this.issueAuthorizationIndexer = issueAuthorizationIndexer; + this.authorizationIndexer = authorizationIndexer; this.issueIndexer = issueIndexer; this.testIndexer = testIndexer; this.projectMeasuresIndexer = projectMeasuresIndexer; @@ -85,7 +85,7 @@ public class ComponentCleanerService { private void deleteFromIndices(String projectUuid) { // optimization : index "issues" is refreshed once at the end - issueAuthorizationIndexer.deleteProject(projectUuid, false); + authorizationIndexer.deleteProject(projectUuid, false); issueIndexer.deleteProject(projectUuid); testIndexer.deleteByProject(projectUuid); projectMeasuresIndexer.deleteProject(projectUuid); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ApplyPermissionsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ApplyPermissionsStep.java index ab411e4a5ac..f6c27656f65 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ApplyPermissionsStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/step/ApplyPermissionsStep.java @@ -77,7 +77,7 @@ public class ApplyPermissionsStep implements ComputationStep { if (hasNoPermissions(dbSession, projectId)) { permissionRepository.applyDefaultPermissionTemplate(dbSession, projectId); dbSession.commit(); - indexer.index(); + indexer.index(project.getUuid()); } } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/IndexerStartupTask.java b/server/sonar-server/src/main/java/org/sonar/server/es/IndexerStartupTask.java index a6e473bbea4..aba3ca3c003 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/es/IndexerStartupTask.java +++ b/server/sonar-server/src/main/java/org/sonar/server/es/IndexerStartupTask.java @@ -34,7 +34,7 @@ public class IndexerStartupTask { private static final Logger LOG = Loggers.get(IndexerStartupTask.class); private final TestIndexer testIndexer; - private final AuthorizationIndexer issueAuthorizationIndexer; + private final AuthorizationIndexer authorizationIndexer; private final IssueIndexer issueIndexer; private final UserIndexer userIndexer; private final ViewIndexer viewIndexer; @@ -46,11 +46,11 @@ public class IndexerStartupTask { * because we need {@link AuthorizationIndexer} to be executed before * {@link org.sonar.server.issue.index.IssueIndexer} */ - public IndexerStartupTask(TestIndexer testIndexer, AuthorizationIndexer issueAuthorizationIndexer, IssueIndexer issueIndexer, + public IndexerStartupTask(TestIndexer testIndexer, AuthorizationIndexer authorizationIndexer, IssueIndexer issueIndexer, UserIndexer userIndexer, ViewIndexer viewIndexer, ProjectMeasuresIndexer projectMeasuresIndexer, Settings settings) { this.testIndexer = testIndexer; - this.issueAuthorizationIndexer = issueAuthorizationIndexer; + this.authorizationIndexer = authorizationIndexer; this.issueIndexer = issueIndexer; this.userIndexer = userIndexer; this.viewIndexer = viewIndexer; @@ -61,8 +61,10 @@ public class IndexerStartupTask { public void execute() { if (!settings.getBoolean("sonar.internal.es.disableIndexes")) { + LOG.info("Index authorization"); + authorizationIndexer.index(); + LOG.info("Index issues"); - issueAuthorizationIndexer.index(); issueIndexer.index(); LOG.info("Index tests"); diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/PermissionService.java b/server/sonar-server/src/main/java/org/sonar/server/permission/PermissionService.java index df1d9d3037c..fcda00f76a7 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/PermissionService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/PermissionService.java @@ -26,6 +26,7 @@ import org.sonar.api.resources.Qualifiers; import org.sonar.api.server.ServerSide; import org.sonar.core.component.ComponentKeys; import org.sonar.core.permission.GlobalPermissions; +import org.sonar.core.util.stream.Collectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; @@ -36,6 +37,7 @@ import org.sonar.server.component.ComponentFinder; import org.sonar.server.permission.index.AuthorizationIndexer; import org.sonar.server.user.UserSession; +import static java.util.Arrays.asList; import static org.sonar.server.permission.PermissionPrivilegeChecker.checkProjectAdminUserByComponentKey; @ServerSide @@ -43,15 +45,15 @@ public class PermissionService { private final DbClient dbClient; private final PermissionRepository permissionRepository; - private final AuthorizationIndexer issueAuthorizationIndexer; + private final AuthorizationIndexer authorizationIndexer; private final UserSession userSession; private final ComponentFinder componentFinder; - public PermissionService(DbClient dbClient, PermissionRepository permissionRepository, AuthorizationIndexer issueAuthorizationIndexer, UserSession userSession, - ComponentFinder componentFinder) { + public PermissionService(DbClient dbClient, PermissionRepository permissionRepository, AuthorizationIndexer authorizationIndexer, UserSession userSession, + ComponentFinder componentFinder) { this.dbClient = dbClient; this.permissionRepository = permissionRepository; - this.issueAuthorizationIndexer = issueAuthorizationIndexer; + this.authorizationIndexer = authorizationIndexer; this.userSession = userSession; this.componentFinder = componentFinder; } @@ -85,7 +87,7 @@ public class PermissionService { Long userId = Qualifiers.PROJECT.equals(component.qualifier()) && currentUserId != null ? currentUserId.longValue() : null; permissionRepository.applyDefaultPermissionTemplate(session, component, userId); session.commit(); - indexProjectPermissions(); + indexProjectPermissions(asList(component.uuid())); } public boolean wouldCurrentUserHavePermissionWithDefaultTemplate(DbSession dbSession, String permission, @Nullable String branch, String projectKey, String qualifier) { @@ -108,10 +110,10 @@ public class PermissionService { permissionRepository.apply(dbSession, template, project, null); } dbSession.commit(); - indexProjectPermissions(); + indexProjectPermissions(projects.stream().map(ComponentDto::uuid).collect(Collectors.toList())); } - private void indexProjectPermissions() { - issueAuthorizationIndexer.index(); + private void indexProjectPermissions(List projectUuids) { + authorizationIndexer.index(projectUuids); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/PermissionUpdater.java b/server/sonar-server/src/main/java/org/sonar/server/permission/PermissionUpdater.java index 07403ad42e0..47a426a2736 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/PermissionUpdater.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/PermissionUpdater.java @@ -19,8 +19,10 @@ */ package org.sonar.server.permission; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Optional; import java.util.Set; import org.sonar.db.DbClient; @@ -35,25 +37,27 @@ import org.sonar.server.permission.index.AuthorizationIndexer; public class PermissionUpdater { private final DbClient dbClient; - private final AuthorizationIndexer issueAuthorizationIndexer; + private final AuthorizationIndexer authorizationIndexer; private final UserPermissionChanger userPermissionChanger; private final GroupPermissionChanger groupPermissionChanger; - public PermissionUpdater(DbClient dbClient, AuthorizationIndexer issueAuthorizationIndexer, - UserPermissionChanger userPermissionChanger, GroupPermissionChanger groupPermissionChanger) { + public PermissionUpdater(DbClient dbClient, AuthorizationIndexer authorizationIndexer, + UserPermissionChanger userPermissionChanger, GroupPermissionChanger groupPermissionChanger) { this.dbClient = dbClient; - this.issueAuthorizationIndexer = issueAuthorizationIndexer; + this.authorizationIndexer = authorizationIndexer; this.userPermissionChanger = userPermissionChanger; this.groupPermissionChanger = groupPermissionChanger; } public void apply(DbSession dbSession, Collection changes) { Set projectIds = new HashSet<>(); + List projectUuids = new ArrayList<>(); for (PermissionChange change : changes) { boolean changed = doApply(dbSession, change); Optional projectId = change.getProjectId(); if (changed && projectId.isPresent()) { projectIds.add(projectId.get().getId()); + projectUuids.add(projectId.get().getUuid()); } } for (Long projectId : projectIds) { @@ -62,7 +66,7 @@ public class PermissionUpdater { dbSession.commit(); if (!projectIds.isEmpty()) { - issueAuthorizationIndexer.index(); + authorizationIndexer.index(projectUuids); } } 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 d9beaf0654d..e90a36aebc5 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 @@ -19,9 +19,11 @@ */ package org.sonar.server.permission.ws.template; +import java.util.Collections; import java.util.List; import javax.annotation.Nullable; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.sonar.api.config.MapSettings; import org.sonar.api.web.UserRole; @@ -34,17 +36,19 @@ import org.sonar.db.permission.template.PermissionTemplateDto; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; import org.sonar.server.component.ComponentFinder; +import org.sonar.server.es.EsTester; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; +import org.sonar.server.issue.index.IssueIndexDefinition; import org.sonar.server.permission.PermissionService; import org.sonar.server.permission.index.AuthorizationIndexer; +import org.sonar.server.permission.index.AuthorizationIndexerTester; import org.sonar.server.permission.ws.BasePermissionWsTest; import org.sonar.server.ws.WsTester; +import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN; import static org.sonar.db.component.ComponentTesting.newProjectDto; import static org.sonarqube.ws.client.permission.PermissionsWsParameters.CONTROLLER; @@ -55,6 +59,9 @@ import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_T public class ApplyTemplateActionTest extends BasePermissionWsTest { + @Rule + public EsTester esTester = new EsTester(new IssueIndexDefinition(new MapSettings())); + private static final String ACTION = "apply_template"; private UserDto user1; @@ -64,13 +71,16 @@ public class ApplyTemplateActionTest extends BasePermissionWsTest