diff options
author | Matteo Mara <matteo.mara@sonarsource.com> | 2022-04-25 16:18:48 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2022-04-29 20:03:19 +0000 |
commit | 38ef03badd49880738ea9e1ab686d4e1c68247ac (patch) | |
tree | 3d154accfd457733e2698754ca9bb1edb6e2f9ef /server/sonar-webserver-webapi | |
parent | ac2259ccb777e0f143d828debc101d34444ad35f (diff) | |
download | sonarqube-38ef03badd49880738ea9e1ab686d4e1c68247ac.tar.gz sonarqube-38ef03badd49880738ea9e1ab686d4e1c68247ac.zip |
SONAR-16263 Handle analysis token lifecycle
Diffstat (limited to 'server/sonar-webserver-webapi')
8 files changed, 70 insertions, 17 deletions
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java index 6298e21679a..22111431fd7 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java @@ -31,7 +31,7 @@ import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectBadgeTokenDto; import org.sonar.server.user.UserSession; import org.sonar.server.usertoken.TokenGenerator; -import org.sonar.server.usertoken.TokenType; +import org.sonar.db.user.TokenType; import org.sonarqube.ws.ProjectBadgeToken.TokenWsResponse; import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java index 23905c9d668..f89f55f4178 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java @@ -29,7 +29,7 @@ import org.sonar.db.DbSession; import org.sonar.db.project.ProjectDto; import org.sonar.server.user.UserSession; import org.sonar.server.usertoken.TokenGenerator; -import org.sonar.server.usertoken.TokenType; +import org.sonar.db.user.TokenType; import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java index 630c3f55c60..2ca216902c0 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java @@ -68,6 +68,7 @@ public class ComponentCleanerService { public void delete(DbSession dbSession, ProjectDto project) { dbClient.purgeDao().deleteProject(dbSession, project.getUuid(), project.getQualifier(), project.getName(), project.getKey()); dbClient.userDao().cleanHomepage(dbSession, project); + dbClient.userTokenDao().deleteByProjectKey(dbSession, project.getKey()); projectIndexers.commitAndIndexProjects(dbSession, singletonList(project), PROJECT_DELETION); } @@ -78,19 +79,20 @@ public class ComponentCleanerService { } public void delete(DbSession dbSession, ComponentDto project) { - checkArgument(!hasNotProjectScope(project) && !isNotDeletable(project) && project.getMainBranchProjectUuid() == null, "Only projects can be deleted"); + checkArgument(hasProjectScope(project) && isDeletable(project) && project.getMainBranchProjectUuid() == null, "Only projects can be deleted"); dbClient.purgeDao().deleteProject(dbSession, project.uuid(), project.qualifier(), project.name(), project.getKey()); dbClient.userDao().cleanHomepage(dbSession, project); + dbClient.userTokenDao().deleteByProjectKey(dbSession, project.getKey()); projectIndexers.commitAndIndexComponents(dbSession, singletonList(project), PROJECT_DELETION); } - private static boolean hasNotProjectScope(ComponentDto project) { - return !Scopes.PROJECT.equals(project.scope()); + private static boolean hasProjectScope(ComponentDto project) { + return Scopes.PROJECT.equals(project.scope()); } - private boolean isNotDeletable(ComponentDto project) { + private boolean isDeletable(ComponentDto project) { ResourceType resourceType = resourceTypes.get(project.qualifier()); // this essentially means PROJECTS, VIEWS and APPS (not SUBVIEWS) - return resourceType == null || !resourceType.getBooleanProperty("deletable"); + return resourceType != null && resourceType.getBooleanProperty("deletable"); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/GenerateAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/GenerateAction.java index 79992ae442f..ccecb44f153 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/GenerateAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/GenerateAction.java @@ -31,7 +31,7 @@ import org.sonar.db.user.UserDto; import org.sonar.db.user.UserTokenDto; import org.sonar.server.exceptions.ServerException; import org.sonar.server.usertoken.TokenGenerator; -import org.sonar.server.usertoken.TokenType; +import org.sonar.db.user.TokenType; import org.sonarqube.ws.UserTokens; import org.sonarqube.ws.UserTokens.GenerateWsResponse; @@ -39,9 +39,9 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.net.HttpURLConnection.HTTP_INTERNAL_ERROR; import static org.sonar.api.utils.DateUtils.formatDateTime; import static org.sonar.server.exceptions.BadRequestException.checkRequest; -import static org.sonar.server.usertoken.TokenType.GLOBAL_ANALYSIS_TOKEN; -import static org.sonar.server.usertoken.TokenType.PROJECT_ANALYSIS_TOKEN; -import static org.sonar.server.usertoken.TokenType.USER_TOKEN; +import static org.sonar.db.user.TokenType.GLOBAL_ANALYSIS_TOKEN; +import static org.sonar.db.user.TokenType.PROJECT_ANALYSIS_TOKEN; +import static org.sonar.db.user.TokenType.USER_TOKEN; import static org.sonar.server.usertoken.ws.UserTokenSupport.ACTION_GENERATE; import static org.sonar.server.usertoken.ws.UserTokenSupport.PARAM_LOGIN; import static org.sonar.server.usertoken.ws.UserTokenSupport.PARAM_NAME; diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenActionTest.java index 46fe9733d4b..b078773fc77 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenActionTest.java @@ -29,7 +29,7 @@ import org.sonar.db.component.ComponentDto; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.usertoken.TokenGenerator; -import org.sonar.server.usertoken.TokenType; +import org.sonar.db.user.TokenType; import org.sonar.server.ws.TestRequest; import org.sonar.server.ws.TestResponse; import org.sonar.server.ws.WsActionTester; diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenRenewActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenRenewActionTest.java index 65b2ad86325..37a02948c42 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenRenewActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenRenewActionTest.java @@ -33,7 +33,7 @@ import org.sonar.db.project.ProjectDto; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.usertoken.TokenGenerator; -import org.sonar.server.usertoken.TokenType; +import org.sonar.db.user.TokenType; import org.sonar.server.ws.TestRequest; import org.sonar.server.ws.TestResponse; import org.sonar.server.ws.WsActionTester; diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java index 6e207d2e7de..21612c44734 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java @@ -19,6 +19,7 @@ */ package org.sonar.server.component; +import java.util.List; import org.junit.Rule; import org.junit.Test; import org.sonar.api.resources.ResourceType; @@ -85,6 +86,38 @@ public class ComponentCleanerServiceTest { } @Test + public void delete_list_of_components_from_db() { + ComponentDto componentDto1 = db.components().insertPublicProject(); + ComponentDto componentDto2 = db.components().insertPublicProject(); + ComponentDto componentDto3 = db.components().insertPublicProject(); + + mockResourceTypeAsValidProject(); + + underTest.deleteComponents(dbSession, asList(componentDto1, componentDto2)); + dbSession.commit(); + + assertNotExists(componentDto1); + assertNotExists(componentDto2); + assertExists(componentDto3); + } + + @Test + public void fail_with_IAE_if_project_non_deletable() { + ComponentDto componentDto1 = db.components().insertPublicProject(); + ComponentDto componentDto2 = db.components().insertPublicProject(); + + mockResourceTypeAsNonDeletable(); + + dbSession.commit(); + + List<ComponentDto> componentDtos = asList(componentDto1, componentDto2); + + assertThatThrownBy(() -> underTest.deleteComponents(dbSession, componentDtos)) + .withFailMessage("Only projects can be deleted") + .isInstanceOf(IllegalArgumentException.class); + } + + @Test public void delete_application_from_db_and_index() { DbData data1 = insertProjectData(); DbData data2 = insertProjectData(); @@ -176,6 +209,12 @@ public class ComponentCleanerServiceTest { when(mockResourceTypes.get(anyString())).thenReturn(resourceType); } + private void mockResourceTypeAsNonDeletable() { + ResourceType resourceType = mock(ResourceType.class); + when(resourceType.getBooleanProperty("deletable")).thenReturn(false); + when(mockResourceTypes.get(anyString())).thenReturn(resourceType); + } + private void assertNotExists(DbData data) { assertDataInDb(data, false); assertThat(projectIndexers.hasBeenCalled(data.branch.getUuid(), PROJECT_DELETION)).isTrue(); @@ -198,6 +237,18 @@ public class ComponentCleanerServiceTest { assertThat(dbClient.branchDao().selectByUuid(dbSession, appOrProject.getUuid()).isPresent()).isEqualTo(exists); } + private void assertNotExists(ComponentDto componentDto) { + assertComponentExists(componentDto, false); + } + + private void assertExists(ComponentDto componentDto) { + assertComponentExists(componentDto, true); + } + + private void assertComponentExists(ComponentDto componentDto, boolean exists) { + assertThat(dbClient.componentDao().selectByUuid(dbSession, componentDto.uuid()).isPresent()).isEqualTo(exists); + } + private static class DbData { final ProjectDto project; final BranchDto branch; diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/GenerateActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/GenerateActionTest.java index 3928d32c23d..a56be8b720c 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/GenerateActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/GenerateActionTest.java @@ -35,7 +35,7 @@ import org.sonar.server.exceptions.ServerException; import org.sonar.server.exceptions.UnauthorizedException; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.usertoken.TokenGenerator; -import org.sonar.server.usertoken.TokenType; +import org.sonar.db.user.TokenType; import org.sonar.server.ws.TestRequest; import org.sonar.server.ws.WsActionTester; import org.sonarqube.ws.MediaTypes; @@ -47,9 +47,9 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.sonar.db.permission.GlobalPermission.SCAN; -import static org.sonar.server.usertoken.TokenType.GLOBAL_ANALYSIS_TOKEN; -import static org.sonar.server.usertoken.TokenType.PROJECT_ANALYSIS_TOKEN; -import static org.sonar.server.usertoken.TokenType.USER_TOKEN; +import static org.sonar.db.user.TokenType.GLOBAL_ANALYSIS_TOKEN; +import static org.sonar.db.user.TokenType.PROJECT_ANALYSIS_TOKEN; +import static org.sonar.db.user.TokenType.USER_TOKEN; import static org.sonar.server.usertoken.ws.UserTokenSupport.PARAM_LOGIN; import static org.sonar.server.usertoken.ws.UserTokenSupport.PARAM_NAME; import static org.sonar.server.usertoken.ws.UserTokenSupport.PARAM_PROJECT_KEY; |