aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-webserver-webapi
diff options
context:
space:
mode:
authorMatteo Mara <matteo.mara@sonarsource.com>2022-04-25 16:18:48 +0200
committersonartech <sonartech@sonarsource.com>2022-04-29 20:03:19 +0000
commit38ef03badd49880738ea9e1ab686d4e1c68247ac (patch)
tree3d154accfd457733e2698754ca9bb1edb6e2f9ef /server/sonar-webserver-webapi
parentac2259ccb777e0f143d828debc101d34444ad35f (diff)
downloadsonarqube-38ef03badd49880738ea9e1ab686d4e1c68247ac.tar.gz
sonarqube-38ef03badd49880738ea9e1ab686d4e1c68247ac.zip
SONAR-16263 Handle analysis token lifecycle
Diffstat (limited to 'server/sonar-webserver-webapi')
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java12
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/GenerateAction.java8
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenActionTest.java2
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/TokenRenewActionTest.java2
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java51
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/usertoken/ws/GenerateActionTest.java8
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;