]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR_17313 Allow to provision projects with Global Analysis Token, when user has...
authorAurelien Poscia <aurelien.poscia@sonarsource.com>
Mon, 26 Sep 2022 07:24:30 +0000 (09:24 +0200)
committersonartech <sonartech@sonarsource.com>
Mon, 26 Sep 2022 20:03:17 +0000 (20:03 +0000)
server/sonar-webserver-auth/src/main/java/org/sonar/server/user/TokenUserSession.java
server/sonar-webserver-auth/src/test/java/org/sonar/server/user/TokenUserSessionTest.java

index 9c1e401e4cf38d1f169ada80db42165a4a5f0c27..c47709f6ec7a369de3a6c66b5b2c93e7568e44aa 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.server.user;
 
+import java.util.EnumSet;
+import java.util.Set;
 import org.sonar.db.DbClient;
 import org.sonar.db.permission.GlobalPermission;
 import org.sonar.db.user.TokenType;
@@ -28,6 +30,7 @@ import org.sonar.db.user.UserTokenDto;
 public class TokenUserSession extends ServerUserSession {
 
   private static final String SCAN = "scan";
+  private static final Set<GlobalPermission> GLOBAL_ANALYSIS_TOKEN_SUPPORTED_PERMISSIONS = EnumSet.of(GlobalPermission.SCAN, GlobalPermission.PROVISION_PROJECTS);
   private final UserTokenDto userToken;
 
   public TokenUserSession(DbClient dbClient, UserDto user, UserTokenDto userToken) {
@@ -66,8 +69,7 @@ public class TokenUserSession extends ServerUserSession {
         //the project analysis token to work for multiple projects in case the user has Global Permissions.
         return false;
       case GLOBAL_ANALYSIS_TOKEN:
-        return GlobalPermission.SCAN.equals(permission) &&
-          super.hasPermissionImpl(permission);
+        return GLOBAL_ANALYSIS_TOKEN_SUPPORTED_PERMISSIONS.contains(permission) && super.hasPermissionImpl(permission);
       default:
         throw new IllegalArgumentException("Unsupported token type " + tokenType.name());
     }
index 0af1c638820ad9e5b68171a2ae4e352288e5ebc8..43c1b3946485c42810e373b8b74d92a47f4b83ed 100644 (file)
@@ -144,6 +144,40 @@ public class TokenUserSessionTest {
     assertThat(userSession.hasPermission(GlobalPermission.SCAN)).isTrue();
   }
 
+  @Test
+  public void test_hasProvisionProjectsGlobalPermission_for_GlobalAnalysisToken_returnsTrueIfUserIsGranted() {
+    UserDto user = db.users().insertUser();
+
+    db.users().insertPermissionOnUser(user, GlobalPermission.SCAN);
+    db.users().insertPermissionOnUser(user, GlobalPermission.PROVISION_PROJECTS);
+
+    TokenUserSession userSession = mockGlobalAnalysisTokenUserSession(user);
+
+    assertThat(userSession.hasPermission(GlobalPermission.PROVISION_PROJECTS)).isTrue();
+  }
+
+  @Test
+  public void test_hasProvisionProjectsGlobalPermission_for_GlobalAnalysisToken_returnsFalseIfUserIsNotGranted() {
+    UserDto user = db.users().insertUser();
+
+    db.users().insertPermissionOnUser(user, GlobalPermission.SCAN);
+
+    TokenUserSession userSession = mockGlobalAnalysisTokenUserSession(user);
+
+    assertThat(userSession.hasPermission(GlobalPermission.PROVISION_PROJECTS)).isFalse();
+  }
+
+  @Test
+  public void test_hasAdministerGlobalPermission_for_GlobalAnalysisToken_returnsFalse() {
+    UserDto user = db.users().insertUser();
+
+    db.users().insertPermissionOnUser(user, GlobalPermission.ADMINISTER);
+
+    TokenUserSession userSession = mockGlobalAnalysisTokenUserSession(user);
+
+    assertThat(userSession.hasPermission(GlobalPermission.ADMINISTER)).isFalse();
+  }
+
   private TokenUserSession mockTokenUserSession(UserDto userDto) {
     return new TokenUserSession(dbClient, userDto, mockUserTokenDto());
   }
@@ -156,7 +190,7 @@ public class TokenUserSessionTest {
     return new TokenUserSession(dbClient, userDto, mockGlobalAnalysisTokenDto());
   }
 
-  private UserTokenDto mockUserTokenDto() {
+  private static UserTokenDto mockUserTokenDto() {
     UserTokenDto userTokenDto = new UserTokenDto();
     userTokenDto.setType(USER_TOKEN.name());
     userTokenDto.setName("User Token");
@@ -164,7 +198,7 @@ public class TokenUserSessionTest {
     return userTokenDto;
   }
 
-  private UserTokenDto mockProjectAnalysisTokenDto(ComponentDto componentDto) {
+  private static UserTokenDto mockProjectAnalysisTokenDto(ComponentDto componentDto) {
     UserTokenDto userTokenDto = new UserTokenDto();
     userTokenDto.setType(PROJECT_ANALYSIS_TOKEN.name());
     userTokenDto.setName("Project Analysis Token");
@@ -175,7 +209,7 @@ public class TokenUserSessionTest {
     return userTokenDto;
   }
 
-  private UserTokenDto mockGlobalAnalysisTokenDto() {
+  private static UserTokenDto mockGlobalAnalysisTokenDto() {
     UserTokenDto userTokenDto = new UserTokenDto();
     userTokenDto.setType(GLOBAL_ANALYSIS_TOKEN.name());
     userTokenDto.setName("Global Analysis Token");