]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-19784 Improve GitHub project lookup to disallow visibility update
authorAntoine Vigneau <antoine.vigneau@sonarsource.com>
Mon, 3 Jul 2023 09:43:58 +0000 (11:43 +0200)
committersonartech <sonartech@sonarsource.com>
Tue, 18 Jul 2023 20:03:21 +0000 (20:03 +0000)
server/sonar-server-common/src/main/java/org/sonar/server/management/DelegatingManagedInstanceService.java [deleted file]
server/sonar-server-common/src/main/java/org/sonar/server/management/DelegatingManagedServices.java [new file with mode: 0644]
server/sonar-server-common/src/test/java/org/sonar/server/management/DelegatingManagedInstanceServiceTest.java [deleted file]
server/sonar-server-common/src/test/java/org/sonar/server/management/DelegatingManagedServicesTest.java [new file with mode: 0644]
server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateVisibilityActionIT.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java
server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java

diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/management/DelegatingManagedInstanceService.java b/server/sonar-server-common/src/main/java/org/sonar/server/management/DelegatingManagedInstanceService.java
deleted file mode 100644 (file)
index 9b9e109..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2023 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.management;
-
-import com.google.common.collect.MoreCollectors;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import javax.annotation.Priority;
-import org.sonar.api.server.ServerSide;
-import org.sonar.db.DbSession;
-
-import static java.util.function.Function.identity;
-import static java.util.stream.Collectors.toMap;
-import static java.util.stream.Collectors.toSet;
-import static org.sonar.api.utils.Preconditions.checkState;
-
-@ServerSide
-@Priority(ManagedInstanceService.DELEGATING_INSTANCE_PRIORITY)
-public class DelegatingManagedInstanceService implements ManagedInstanceService, ManagedProjectService {
-
-  private static final IllegalStateException NOT_MANAGED_INSTANCE_EXCEPTION = new IllegalStateException("This instance is not managed.");
-  private final Set<ManagedInstanceService> delegates;
-
-  public DelegatingManagedInstanceService(Set<ManagedInstanceService> delegates) {
-    this.delegates = delegates;
-  }
-
-  public final boolean isInstanceExternallyManaged() {
-    return delegates.stream().anyMatch(ManagedInstanceService::isInstanceExternallyManaged);
-  }
-
-  @Override
-  public String getProviderName() {
-    return findManagedInstanceService()
-      .map(ManagedInstanceService::getProviderName)
-      .orElseThrow(() -> NOT_MANAGED_INSTANCE_EXCEPTION);
-  }
-
-  @Override
-  public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
-    return findManagedInstanceService()
-      .map(managedInstanceService -> managedInstanceService.getUserUuidToManaged(dbSession, userUuids))
-      .orElse(returnNonManagedForAll(userUuids));
-  }
-
-  @Override
-  public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
-    return findManagedInstanceService()
-      .map(managedInstanceService -> managedInstanceService.getGroupUuidToManaged(dbSession, groupUuids))
-      .orElse(returnNonManagedForAll(groupUuids));
-  }
-
-  @Override
-  public String getManagedUsersSqlFilter(boolean filterByManaged) {
-    return findManagedInstanceService()
-      .map(managedInstanceService -> managedInstanceService.getManagedUsersSqlFilter(filterByManaged))
-      .orElseThrow(() -> NOT_MANAGED_INSTANCE_EXCEPTION);
-  }
-
-  @Override
-  public String getManagedGroupsSqlFilter(boolean filterByManaged) {
-    return findManagedInstanceService()
-      .map(managedInstanceService -> managedInstanceService.getManagedGroupsSqlFilter(filterByManaged))
-      .orElseThrow(() -> NOT_MANAGED_INSTANCE_EXCEPTION);
-  }
-
-  @Override
-  public boolean isUserManaged(DbSession dbSession, String login) {
-    return findManagedInstanceService()
-      .map(managedInstanceService -> managedInstanceService.isUserManaged(dbSession, login))
-      .orElse(false);
-  }
-
-  private Optional<ManagedInstanceService> findManagedInstanceService() {
-    Set<ManagedInstanceService> managedInstanceServices = delegates.stream()
-      .filter(ManagedInstanceService::isInstanceExternallyManaged)
-      .collect(toSet());
-
-    checkState(managedInstanceServices.size() < 2,
-      "The instance can't be managed by more than one identity provider and %s were found.", managedInstanceServices.size());
-    return managedInstanceServices.stream().collect(MoreCollectors.toOptional());
-  }
-
-  private static Map<String, Boolean> returnNonManagedForAll(Set<String> resourcesUuid) {
-    return resourcesUuid.stream().collect(toMap(identity(), any -> false));
-  }
-
-  @Override
-  public boolean isProjectManaged(DbSession dbSession, String projectKey) {
-    return findManagedProjectService()
-      .map(managedProjectService -> managedProjectService.isProjectManaged(dbSession, projectKey))
-      .orElse(false);
-  }
-
-  private Optional<ManagedProjectService> findManagedProjectService() {
-    return findManagedInstanceService()
-      .filter(ManagedProjectService.class::isInstance)
-      .map(ManagedProjectService.class::cast);
-  }
-}
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/management/DelegatingManagedServices.java b/server/sonar-server-common/src/main/java/org/sonar/server/management/DelegatingManagedServices.java
new file mode 100644 (file)
index 0000000..6f24321
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2023 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.management;
+
+import com.google.common.collect.MoreCollectors;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import javax.annotation.Priority;
+import org.sonar.api.server.ServerSide;
+import org.sonar.db.DbSession;
+
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Collectors.toSet;
+import static org.sonar.api.utils.Preconditions.checkState;
+
+@ServerSide
+@Priority(ManagedInstanceService.DELEGATING_INSTANCE_PRIORITY)
+public class DelegatingManagedServices implements ManagedInstanceService, ManagedProjectService {
+
+  private static final IllegalStateException NOT_MANAGED_INSTANCE_EXCEPTION = new IllegalStateException("This instance is not managed.");
+  private final Set<ManagedInstanceService> delegates;
+
+  public DelegatingManagedServices(Set<ManagedInstanceService> delegates) {
+    this.delegates = delegates;
+  }
+
+  public final boolean isInstanceExternallyManaged() {
+    return delegates.stream().anyMatch(ManagedInstanceService::isInstanceExternallyManaged);
+  }
+
+  @Override
+  public String getProviderName() {
+    return findManagedInstanceService()
+      .map(ManagedInstanceService::getProviderName)
+      .orElseThrow(() -> NOT_MANAGED_INSTANCE_EXCEPTION);
+  }
+
+  @Override
+  public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
+    return findManagedInstanceService()
+      .map(managedInstanceService -> managedInstanceService.getUserUuidToManaged(dbSession, userUuids))
+      .orElse(returnNonManagedForAll(userUuids));
+  }
+
+  @Override
+  public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
+    return findManagedInstanceService()
+      .map(managedInstanceService -> managedInstanceService.getGroupUuidToManaged(dbSession, groupUuids))
+      .orElse(returnNonManagedForAll(groupUuids));
+  }
+
+  @Override
+  public String getManagedUsersSqlFilter(boolean filterByManaged) {
+    return findManagedInstanceService()
+      .map(managedInstanceService -> managedInstanceService.getManagedUsersSqlFilter(filterByManaged))
+      .orElseThrow(() -> NOT_MANAGED_INSTANCE_EXCEPTION);
+  }
+
+  @Override
+  public String getManagedGroupsSqlFilter(boolean filterByManaged) {
+    return findManagedInstanceService()
+      .map(managedInstanceService -> managedInstanceService.getManagedGroupsSqlFilter(filterByManaged))
+      .orElseThrow(() -> NOT_MANAGED_INSTANCE_EXCEPTION);
+  }
+
+  @Override
+  public boolean isUserManaged(DbSession dbSession, String login) {
+    return findManagedInstanceService()
+      .map(managedInstanceService -> managedInstanceService.isUserManaged(dbSession, login))
+      .orElse(false);
+  }
+
+  private Optional<ManagedInstanceService> findManagedInstanceService() {
+    Set<ManagedInstanceService> managedInstanceServices = delegates.stream()
+      .filter(ManagedInstanceService::isInstanceExternallyManaged)
+      .collect(toSet());
+
+    checkState(managedInstanceServices.size() < 2,
+      "The instance can't be managed by more than one identity provider and %s were found.", managedInstanceServices.size());
+    return managedInstanceServices.stream().collect(MoreCollectors.toOptional());
+  }
+
+  private static Map<String, Boolean> returnNonManagedForAll(Set<String> resourcesUuid) {
+    return resourcesUuid.stream().collect(toMap(identity(), any -> false));
+  }
+
+  @Override
+  public boolean isProjectManaged(DbSession dbSession, String projectKey) {
+    return findManagedProjectService()
+      .map(managedProjectService -> managedProjectService.isProjectManaged(dbSession, projectKey))
+      .orElse(false);
+  }
+
+  private Optional<ManagedProjectService> findManagedProjectService() {
+    return findManagedInstanceService()
+      .filter(ManagedProjectService.class::isInstance)
+      .map(ManagedProjectService.class::cast);
+  }
+}
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/management/DelegatingManagedInstanceServiceTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/management/DelegatingManagedInstanceServiceTest.java
deleted file mode 100644 (file)
index 1aa7acd..0000000
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2023 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.management;
-
-import java.util.Map;
-import java.util.Set;
-import org.jetbrains.annotations.NotNull;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.sonar.db.DbSession;
-
-import static java.util.Collections.emptySet;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class DelegatingManagedInstanceServiceTest {
-
-  @Mock
-  private DbSession dbSession;
-
-  @Test
-  public void getProviderName_whenNotManaged_shouldThrow() {
-    DelegatingManagedInstanceService managedInstanceService = noManagedInstanceService();
-
-    assertThatThrownBy(managedInstanceService::getProviderName)
-      .isInstanceOf(IllegalStateException.class)
-      .hasMessage("This instance is not managed.");
-  }
-
-  @Test
-  public void getProviderName_whenManaged_shouldReturnName() {
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(Set.of(new AlwaysManagedInstanceService()));
-
-    assertThat(managedInstanceService.getProviderName()).isEqualTo("Always");
-  }
-
-  @Test
-  public void isInstanceExternallyManaged_whenNoManagedInstanceService_returnsFalse() {
-    DelegatingManagedInstanceService managedInstanceService = noManagedInstanceService();
-    assertThat(managedInstanceService.isInstanceExternallyManaged()).isFalse();
-  }
-
-  @Test
-  public void isInstanceExternallyManaged_whenAllManagedInstanceServiceReturnsFalse_returnsFalse() {
-    Set<ManagedInstanceService> delegates = Set.of(new NeverManagedInstanceService(), new NeverManagedInstanceService());
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(delegates);
-
-    assertThat(managedInstanceService.isInstanceExternallyManaged()).isFalse();
-  }
-
-  @Test
-  public void isInstanceExternallyManaged_whenOneManagedInstanceServiceReturnsTrue_returnsTrue() {
-    Set<ManagedInstanceService> delegates = Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService());
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(delegates);
-
-    assertThat(managedInstanceService.isInstanceExternallyManaged()).isTrue();
-  }
-
-  @Test
-  public void getUserUuidToManaged_whenNoDelegates_setAllUsersAsNonManaged() {
-    Set<String> userUuids = Set.of("a", "b");
-    DelegatingManagedInstanceService managedInstanceService = noManagedInstanceService();
-
-    Map<String, Boolean> userUuidToManaged = managedInstanceService.getUserUuidToManaged(dbSession, userUuids);
-
-    assertThat(userUuidToManaged).containsExactlyInAnyOrderEntriesOf(Map.of("a", false, "b", false));
-  }
-
-  @Test
-  public void getUserUuidToManaged_delegatesToRightService_andPropagateAnswer() {
-    Set<String> userUuids = Set.of("a", "b");
-    Map<String, Boolean> serviceResponse = Map.of("a", false, "b", true);
-
-    ManagedInstanceService anotherManagedInstanceService = getManagedInstanceService(userUuids, serviceResponse);
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(Set.of(new NeverManagedInstanceService(), anotherManagedInstanceService));
-
-    Map<String, Boolean> userUuidToManaged = managedInstanceService.getUserUuidToManaged(dbSession, userUuids);
-
-    assertThat(userUuidToManaged).containsExactlyInAnyOrderEntriesOf(serviceResponse);
-  }
-
-  @Test
-  public void getGroupUuidToManaged_whenNoDelegates_setAllUsersAsNonManaged() {
-    Set<String> groupUuids = Set.of("a", "b");
-    DelegatingManagedInstanceService managedInstanceService = noManagedInstanceService();
-
-    Map<String, Boolean> groupUuidToManaged = managedInstanceService.getGroupUuidToManaged(dbSession, groupUuids);
-
-    assertThat(groupUuidToManaged).containsExactlyInAnyOrderEntriesOf(Map.of("a", false, "b", false));
-  }
-
-  @Test
-  public void isUserManaged_delegatesToRightService_andPropagateAnswer() {
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService()));
-
-    assertThat(managedInstanceService.isUserManaged(dbSession, "login")).isTrue();
-  }
-
-  @Test
-  public void isUserManaged_whenNoDelegates_returnsFalse() {
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(Set.of());
-
-    assertThat(managedInstanceService.isUserManaged(dbSession, "login")).isFalse();
-  }
-
-  @Test
-  public void getGroupUuidToManaged_delegatesToRightService_andPropagateAnswer() {
-    Set<String> groupUuids = Set.of("a", "b");
-    Map<String, Boolean> serviceResponse = Map.of("a", false, "b", true);
-
-    ManagedInstanceService anotherManagedInstanceService = getManagedInstanceService(groupUuids, serviceResponse);
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(Set.of(new NeverManagedInstanceService(), anotherManagedInstanceService));
-
-    Map<String, Boolean> groupUuidToManaged = managedInstanceService.getGroupUuidToManaged(dbSession, groupUuids);
-
-    assertThat(groupUuidToManaged).containsExactlyInAnyOrderEntriesOf(serviceResponse);
-  }
-
-  @Test
-  public void getGroupUuidToManaged_ifMoreThanOneDelegatesActivated_throws() {
-    Set<ManagedInstanceService> managedInstanceServices = Set.of(new AlwaysManagedInstanceService(), new AlwaysManagedInstanceService());
-    DelegatingManagedInstanceService delegatingManagedInstanceService = new DelegatingManagedInstanceService(managedInstanceServices);
-    assertThatIllegalStateException()
-      .isThrownBy(() -> delegatingManagedInstanceService.getGroupUuidToManaged(dbSession, Set.of("a")))
-      .withMessage("The instance can't be managed by more than one identity provider and 2 were found.");
-  }
-
-  @Test
-  public void getUserUuidToManaged_ifMoreThanOneDelegatesActivated_throws() {
-    Set<ManagedInstanceService> managedInstanceServices = Set.of(new AlwaysManagedInstanceService(), new AlwaysManagedInstanceService());
-    DelegatingManagedInstanceService delegatingManagedInstanceService = new DelegatingManagedInstanceService(managedInstanceServices);
-    assertThatIllegalStateException()
-      .isThrownBy(() -> delegatingManagedInstanceService.getUserUuidToManaged(dbSession, Set.of("a")))
-      .withMessage("The instance can't be managed by more than one identity provider and 2 were found.");
-  }
-
-  @Test
-  public void getManagedUsersSqlFilter_whenNoDelegates_throws() {
-    Set<ManagedInstanceService> managedInstanceServices = emptySet();
-    DelegatingManagedInstanceService delegatingManagedInstanceService = new DelegatingManagedInstanceService(managedInstanceServices);
-    assertThatIllegalStateException()
-      .isThrownBy(() -> delegatingManagedInstanceService.getManagedUsersSqlFilter(true))
-      .withMessage("This instance is not managed.");
-  }
-
-  @Test
-  public void getManagedUsersSqlFilter_delegatesToRightService_andPropagateAnswer() {
-    AlwaysManagedInstanceService alwaysManagedInstanceService = new AlwaysManagedInstanceService();
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(Set.of(new NeverManagedInstanceService(), alwaysManagedInstanceService));
-
-    assertThat(managedInstanceService.getManagedUsersSqlFilter(true)).isNotNull().isEqualTo(alwaysManagedInstanceService.getManagedUsersSqlFilter(
-      true));
-  }
-
-  @Test
-  public void getManagedGroupsSqlFilter_whenNoDelegates_throws() {
-    Set<ManagedInstanceService> managedInstanceServices = emptySet();
-    DelegatingManagedInstanceService delegatingManagedInstanceService = new DelegatingManagedInstanceService(managedInstanceServices);
-    assertThatIllegalStateException()
-      .isThrownBy(() -> delegatingManagedInstanceService.getManagedGroupsSqlFilter(true))
-      .withMessage("This instance is not managed.");
-  }
-
-  @Test
-  public void getManagedGroupsSqlFilter_delegatesToRightService_andPropagateAnswer() {
-    AlwaysManagedInstanceService alwaysManagedInstanceService = new AlwaysManagedInstanceService();
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(Set.of(new NeverManagedInstanceService(), alwaysManagedInstanceService));
-
-    assertThat(managedInstanceService.getManagedGroupsSqlFilter(true)).isNotNull().isEqualTo(alwaysManagedInstanceService.getManagedGroupsSqlFilter(
-      true));
-  }
-
-  private ManagedInstanceService getManagedInstanceService(Set<String> userUuids, Map<String, Boolean> uuidToManaged) {
-    ManagedInstanceService anotherManagedInstanceService = mock(ManagedInstanceService.class);
-    when(anotherManagedInstanceService.isInstanceExternallyManaged()).thenReturn(true);
-    when(anotherManagedInstanceService.getGroupUuidToManaged(dbSession, userUuids)).thenReturn(uuidToManaged);
-    when(anotherManagedInstanceService.getUserUuidToManaged(dbSession, userUuids)).thenReturn(uuidToManaged);
-    return anotherManagedInstanceService;
-  }
-
-  @Test
-  public void isProjectManaged_whenManagedInstanceServices_shouldDelegatesToRightService() {
-    DelegatingManagedInstanceService managedInstanceService = new DelegatingManagedInstanceService(Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService()));
-
-    assertThat(managedInstanceService.isProjectManaged(dbSession, "project_key")).isTrue();
-  }
-
-  @Test
-  public void isProjectManaged_whenManagedNoInstanceServices_returnsFalse() {
-    DelegatingManagedInstanceService managedInstanceService = noManagedInstanceService();
-
-    assertThat(managedInstanceService.isProjectManaged(dbSession, "project_key")).isFalse();
-  }
-
-  @NotNull
-  private static DelegatingManagedInstanceService noManagedInstanceService() {
-    return new DelegatingManagedInstanceService(emptySet());
-  }
-
-  private static class NeverManagedInstanceService implements ManagedInstanceService, ManagedProjectService {
-
-    @Override
-    public boolean isInstanceExternallyManaged() {
-      return false;
-    }
-
-    @Override
-    public String getProviderName() {
-      return "Never";
-    }
-
-    @Override
-    public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
-      return null;
-    }
-
-    @Override
-    public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
-      return null;
-    }
-
-    @Override
-    public String getManagedUsersSqlFilter(boolean filterByManaged) {
-      return null;
-    }
-
-    @Override
-    public String getManagedGroupsSqlFilter(boolean filterByManaged) {
-      return null;
-    }
-
-    @Override
-    public boolean isUserManaged(DbSession dbSession, String login) {
-      return false;
-    }
-
-    @Override
-    public boolean isProjectManaged(DbSession dbSession, String projectKey) {
-      return false;
-    }
-  }
-
-  private static class AlwaysManagedInstanceService implements ManagedInstanceService, ManagedProjectService {
-
-    @Override
-    public boolean isInstanceExternallyManaged() {
-      return true;
-    }
-
-    @Override
-    public String getProviderName() {
-      return "Always";
-    }
-
-    @Override
-    public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
-      return null;
-    }
-
-    @Override
-    public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
-      return null;
-    }
-
-    @Override
-    public String getManagedUsersSqlFilter(boolean filterByManaged) {
-      return "any filter";
-    }
-
-    @Override
-    public String getManagedGroupsSqlFilter(boolean filterByManaged) {
-      return "any filter";
-    }
-
-    @Override
-    public boolean isUserManaged(DbSession dbSession, String login) {
-      return true;
-    }
-
-    @Override
-    public boolean isProjectManaged(DbSession dbSession, String projectKey) {
-      return true;
-    }
-  }
-
-}
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/management/DelegatingManagedServicesTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/management/DelegatingManagedServicesTest.java
new file mode 100644 (file)
index 0000000..042f467
--- /dev/null
@@ -0,0 +1,305 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2023 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.management;
+
+import java.util.Map;
+import java.util.Set;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.sonar.db.DbSession;
+
+import static java.util.Collections.emptySet;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public class DelegatingManagedServicesTest {
+
+  private static final DelegatingManagedServices NO_MANAGED_SERVICES = new DelegatingManagedServices(emptySet());
+
+  @Mock
+  private DbSession dbSession;
+
+  @Test
+  public void getProviderName_whenNotManaged_shouldThrow() {
+    DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
+
+    assertThatThrownBy(managedInstanceService::getProviderName)
+      .isInstanceOf(IllegalStateException.class)
+      .hasMessage("This instance is not managed.");
+  }
+
+  @Test
+  public void getProviderName_whenManaged_shouldReturnName() {
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new AlwaysManagedInstanceService()));
+
+    assertThat(managedInstanceService.getProviderName()).isEqualTo("Always");
+  }
+
+  @Test
+  public void isInstanceExternallyManaged_whenNoManagedInstanceService_returnsFalse() {
+    DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
+    assertThat(managedInstanceService.isInstanceExternallyManaged()).isFalse();
+  }
+
+  @Test
+  public void isInstanceExternallyManaged_whenAllManagedInstanceServiceReturnsFalse_returnsFalse() {
+    Set<ManagedInstanceService> delegates = Set.of(new NeverManagedInstanceService(), new NeverManagedInstanceService());
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(delegates);
+
+    assertThat(managedInstanceService.isInstanceExternallyManaged()).isFalse();
+  }
+
+  @Test
+  public void isInstanceExternallyManaged_whenOneManagedInstanceServiceReturnsTrue_returnsTrue() {
+    Set<ManagedInstanceService> delegates = Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService());
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(delegates);
+
+    assertThat(managedInstanceService.isInstanceExternallyManaged()).isTrue();
+  }
+
+  @Test
+  public void getUserUuidToManaged_whenNoDelegates_setAllUsersAsNonManaged() {
+    Set<String> userUuids = Set.of("a", "b");
+    DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
+
+    Map<String, Boolean> userUuidToManaged = managedInstanceService.getUserUuidToManaged(dbSession, userUuids);
+
+    assertThat(userUuidToManaged).containsExactlyInAnyOrderEntriesOf(Map.of("a", false, "b", false));
+  }
+
+  @Test
+  public void getUserUuidToManaged_delegatesToRightService_andPropagateAnswer() {
+    Set<String> userUuids = Set.of("a", "b");
+    Map<String, Boolean> serviceResponse = Map.of("a", false, "b", true);
+
+    ManagedInstanceService anotherManagedInstanceService = getManagedInstanceService(userUuids, serviceResponse);
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), anotherManagedInstanceService));
+
+    Map<String, Boolean> userUuidToManaged = managedInstanceService.getUserUuidToManaged(dbSession, userUuids);
+
+    assertThat(userUuidToManaged).containsExactlyInAnyOrderEntriesOf(serviceResponse);
+  }
+
+  @Test
+  public void getGroupUuidToManaged_whenNoDelegates_setAllUsersAsNonManaged() {
+    Set<String> groupUuids = Set.of("a", "b");
+    DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
+
+    Map<String, Boolean> groupUuidToManaged = managedInstanceService.getGroupUuidToManaged(dbSession, groupUuids);
+
+    assertThat(groupUuidToManaged).containsExactlyInAnyOrderEntriesOf(Map.of("a", false, "b", false));
+  }
+
+  @Test
+  public void isUserManaged_delegatesToRightService_andPropagateAnswer() {
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService()));
+
+    assertThat(managedInstanceService.isUserManaged(dbSession, "login")).isTrue();
+  }
+
+  @Test
+  public void isUserManaged_whenNoDelegates_returnsFalse() {
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of());
+
+    assertThat(managedInstanceService.isUserManaged(dbSession, "login")).isFalse();
+  }
+
+  @Test
+  public void getGroupUuidToManaged_delegatesToRightService_andPropagateAnswer() {
+    Set<String> groupUuids = Set.of("a", "b");
+    Map<String, Boolean> serviceResponse = Map.of("a", false, "b", true);
+
+    ManagedInstanceService anotherManagedInstanceService = getManagedInstanceService(groupUuids, serviceResponse);
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), anotherManagedInstanceService));
+
+    Map<String, Boolean> groupUuidToManaged = managedInstanceService.getGroupUuidToManaged(dbSession, groupUuids);
+
+    assertThat(groupUuidToManaged).containsExactlyInAnyOrderEntriesOf(serviceResponse);
+  }
+
+  @Test
+  public void getGroupUuidToManaged_ifMoreThanOneDelegatesActivated_throws() {
+    Set<ManagedInstanceService> managedInstanceServices = Set.of(new AlwaysManagedInstanceService(), new AlwaysManagedInstanceService());
+    DelegatingManagedServices delegatingManagedServices = new DelegatingManagedServices(managedInstanceServices);
+    assertThatIllegalStateException()
+      .isThrownBy(() -> delegatingManagedServices.getGroupUuidToManaged(dbSession, Set.of("a")))
+      .withMessage("The instance can't be managed by more than one identity provider and 2 were found.");
+  }
+
+  @Test
+  public void getUserUuidToManaged_ifMoreThanOneDelegatesActivated_throws() {
+    Set<ManagedInstanceService> managedInstanceServices = Set.of(new AlwaysManagedInstanceService(), new AlwaysManagedInstanceService());
+    DelegatingManagedServices delegatingManagedServices = new DelegatingManagedServices(managedInstanceServices);
+    assertThatIllegalStateException()
+      .isThrownBy(() -> delegatingManagedServices.getUserUuidToManaged(dbSession, Set.of("a")))
+      .withMessage("The instance can't be managed by more than one identity provider and 2 were found.");
+  }
+
+  @Test
+  public void getManagedUsersSqlFilter_whenNoDelegates_throws() {
+    Set<ManagedInstanceService> managedInstanceServices = emptySet();
+    DelegatingManagedServices delegatingManagedServices = new DelegatingManagedServices(managedInstanceServices);
+    assertThatIllegalStateException()
+      .isThrownBy(() -> delegatingManagedServices.getManagedUsersSqlFilter(true))
+      .withMessage("This instance is not managed.");
+  }
+
+  @Test
+  public void getManagedUsersSqlFilter_delegatesToRightService_andPropagateAnswer() {
+    AlwaysManagedInstanceService alwaysManagedInstanceService = new AlwaysManagedInstanceService();
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), alwaysManagedInstanceService));
+
+    assertThat(managedInstanceService.getManagedUsersSqlFilter(true)).isNotNull().isEqualTo(alwaysManagedInstanceService.getManagedUsersSqlFilter(
+      true));
+  }
+
+  @Test
+  public void getManagedGroupsSqlFilter_whenNoDelegates_throws() {
+    Set<ManagedInstanceService> managedInstanceServices = emptySet();
+    DelegatingManagedServices delegatingManagedServices = new DelegatingManagedServices(managedInstanceServices);
+    assertThatIllegalStateException()
+      .isThrownBy(() -> delegatingManagedServices.getManagedGroupsSqlFilter(true))
+      .withMessage("This instance is not managed.");
+  }
+
+  @Test
+  public void getManagedGroupsSqlFilter_delegatesToRightService_andPropagateAnswer() {
+    AlwaysManagedInstanceService alwaysManagedInstanceService = new AlwaysManagedInstanceService();
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), alwaysManagedInstanceService));
+
+    assertThat(managedInstanceService.getManagedGroupsSqlFilter(true)).isNotNull().isEqualTo(alwaysManagedInstanceService.getManagedGroupsSqlFilter(
+      true));
+  }
+
+  private ManagedInstanceService getManagedInstanceService(Set<String> userUuids, Map<String, Boolean> uuidToManaged) {
+    ManagedInstanceService anotherManagedInstanceService = mock(ManagedInstanceService.class);
+    when(anotherManagedInstanceService.isInstanceExternallyManaged()).thenReturn(true);
+    when(anotherManagedInstanceService.getGroupUuidToManaged(dbSession, userUuids)).thenReturn(uuidToManaged);
+    when(anotherManagedInstanceService.getUserUuidToManaged(dbSession, userUuids)).thenReturn(uuidToManaged);
+    return anotherManagedInstanceService;
+  }
+
+  @Test
+  public void isProjectManaged_whenManagedInstanceServices_shouldDelegatesToRightService() {
+    DelegatingManagedServices managedInstanceService = new DelegatingManagedServices(Set.of(new NeverManagedInstanceService(), new AlwaysManagedInstanceService()));
+
+    assertThat(managedInstanceService.isProjectManaged(dbSession, "project_key")).isTrue();
+  }
+
+  @Test
+  public void isProjectManaged_whenManagedNoInstanceServices_returnsFalse() {
+    DelegatingManagedServices managedInstanceService = NO_MANAGED_SERVICES;
+
+    assertThat(managedInstanceService.isProjectManaged(dbSession, "project_key")).isFalse();
+  }
+
+  private static class NeverManagedInstanceService implements ManagedInstanceService, ManagedProjectService {
+
+    @Override
+    public boolean isInstanceExternallyManaged() {
+      return false;
+    }
+
+    @Override
+    public String getProviderName() {
+      return "Never";
+    }
+
+    @Override
+    public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
+      return null;
+    }
+
+    @Override
+    public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
+      return null;
+    }
+
+    @Override
+    public String getManagedUsersSqlFilter(boolean filterByManaged) {
+      return null;
+    }
+
+    @Override
+    public String getManagedGroupsSqlFilter(boolean filterByManaged) {
+      return null;
+    }
+
+    @Override
+    public boolean isUserManaged(DbSession dbSession, String login) {
+      return false;
+    }
+
+    @Override
+    public boolean isProjectManaged(DbSession dbSession, String projectKey) {
+      return false;
+    }
+  }
+
+  private static class AlwaysManagedInstanceService implements ManagedInstanceService, ManagedProjectService {
+
+    @Override
+    public boolean isInstanceExternallyManaged() {
+      return true;
+    }
+
+    @Override
+    public String getProviderName() {
+      return "Always";
+    }
+
+    @Override
+    public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
+      return null;
+    }
+
+    @Override
+    public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
+      return null;
+    }
+
+    @Override
+    public String getManagedUsersSqlFilter(boolean filterByManaged) {
+      return "any filter";
+    }
+
+    @Override
+    public String getManagedGroupsSqlFilter(boolean filterByManaged) {
+      return "any filter";
+    }
+
+    @Override
+    public boolean isUserManaged(DbSession dbSession, String login) {
+      return true;
+    }
+
+    @Override
+    public boolean isProjectManaged(DbSession dbSession, String projectKey) {
+      return true;
+    }
+  }
+
+}
index 861b74b42b3d2b20bfba0b34fca3c7def32f7e8b..c59d664d2136c1ff5483f0c114f4387bfb9c74a3 100644 (file)
 package org.sonar.server.project.ws;
 
 import java.util.Arrays;
-import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
-import org.apache.commons.lang.NotImplementedException;
 import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Configuration;
@@ -61,12 +59,11 @@ import org.sonar.server.es.TestIndexers;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.UnauthorizedException;
-import org.sonar.server.management.DelegatingManagedInstanceService;
-import org.sonar.server.management.ManagedInstanceService;
-import org.sonar.server.management.ManagedProjectService;
+import org.sonar.server.management.DelegatingManagedServices;
 import org.sonar.server.permission.PermissionService;
 import org.sonar.server.permission.PermissionServiceImpl;
 import org.sonar.server.permission.index.FooIndexDefinition;
+import org.sonar.server.project.Visibility;
 import org.sonar.server.project.VisibilityService;
 import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.TestRequest;
@@ -78,6 +75,8 @@ import static java.util.Optional.of;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.assertj.core.api.Assertions.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.sonar.api.CoreProperties.CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_PROPERTY;
@@ -110,10 +109,10 @@ public class UpdateVisibilityActionIT {
   private final DbSession dbSession = dbTester.getSession();
   private final TestIndexers projectIndexers = new TestIndexers();
   private final Configuration configuration = mock(Configuration.class);
-  private final DelegatingManagedInstanceService delegatingManagedInstanceService = new DelegatingManagedInstanceService(Set.of(new ControllableManagedProjectService()));
+  private final DelegatingManagedServices delegatingManagedServices = mock(DelegatingManagedServices.class);
 
   private final VisibilityService visibilityService = new VisibilityService(dbClient, projectIndexers, new SequenceUuidFactory());
-  private final UpdateVisibilityAction underTest = new UpdateVisibilityAction(dbClient, userSessionRule, configuration, visibilityService, delegatingManagedInstanceService);
+  private final UpdateVisibilityAction underTest = new UpdateVisibilityAction(dbClient, userSessionRule, configuration, visibilityService, delegatingManagedServices);
   private final WsActionTester ws = new WsActionTester(underTest);
 
   private final Random random = new Random();
@@ -311,9 +310,10 @@ public class UpdateVisibilityActionIT {
 
   @Test
   public void execute_throws_BadRequestException_if_entity_is_project_and_managed() {
+    when(delegatingManagedServices.isProjectManaged(any(), eq(MANAGED_PROJECT_KEY))).thenReturn(true);
     ProjectDto project = dbTester.components().insertPublicProject(p -> p.setKey(MANAGED_PROJECT_KEY)).getProjectDto();
     request.setParam(PARAM_PROJECT, project.getKey())
-      .setParam(PARAM_VISIBILITY, randomVisibility);
+      .setParam(PARAM_VISIBILITY, Visibility.PUBLIC.getLabel());
     userSessionRule.addProjectPermission(UserRole.ADMIN, project);
 
     assertThatThrownBy(request::execute)
@@ -717,50 +717,4 @@ public class UpdateVisibilityActionIT {
     return random.nextBoolean() ? dbTester.components().insertPublicProject() : dbTester.components().insertPrivateProject();
   }
 
-  private static class ControllableManagedProjectService implements ManagedInstanceService, ManagedProjectService {
-
-    @Override
-    public boolean isInstanceExternallyManaged() {
-      return true;
-    }
-
-    @Override
-    public String getProviderName() {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, Boolean> getUserUuidToManaged(DbSession dbSession, Set<String> userUuids) {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, Boolean> getGroupUuidToManaged(DbSession dbSession, Set<String> groupUuids) {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String getManagedUsersSqlFilter(boolean filterByManaged) {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String getManagedGroupsSqlFilter(boolean filterByManaged) {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public boolean isUserManaged(DbSession dbSession, String login) {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public boolean isProjectManaged(DbSession dbSession, String projectKey) {
-      if (projectKey.equals(MANAGED_PROJECT_KEY)) {
-        return true;
-      }
-      return false;
-    }
-  }
-
 }
index f8275601eb6faec7cab1c4528ccf5a6a603b62ca..2dd8219571d67653781f871e37f36e7d042bd6b0 100644 (file)
@@ -27,7 +27,7 @@ import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.entity.EntityDto;
 import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.management.DelegatingManagedInstanceService;
+import org.sonar.server.management.DelegatingManagedServices;
 import org.sonar.server.project.Visibility;
 import org.sonar.server.project.VisibilityService;
 import org.sonar.server.user.UserSession;
@@ -48,15 +48,15 @@ public class UpdateVisibilityAction implements ProjectsWsAction {
   private final UserSession userSession;
   private final Configuration configuration;
   private final VisibilityService visibilityService;
-  private final DelegatingManagedInstanceService delegatingManagedInstanceService;
+  private final DelegatingManagedServices delegatingInstanceService;
 
   public UpdateVisibilityAction(DbClient dbClient, UserSession userSession, Configuration configuration,
-    VisibilityService visibilityService, DelegatingManagedInstanceService delegatingManagedInstanceService) {
+    VisibilityService visibilityService, DelegatingManagedServices delegatingInstanceService) {
     this.dbClient = dbClient;
     this.userSession = userSession;
     this.configuration = configuration;
-    this.delegatingManagedInstanceService = delegatingManagedInstanceService;
     this.visibilityService = visibilityService;
+    this.delegatingInstanceService = delegatingInstanceService;
   }
 
   public void define(WebService.NewController context) {
@@ -103,12 +103,12 @@ public class UpdateVisibilityAction implements ProjectsWsAction {
     if (!isProjectAdmin || (!isGlobalAdmin && !allowChangingPermissionsByProjectAdmins)) {
       throw insufficientPrivilegesException();
     }
-    checkRequest(notManagedProject(dbSession, entityDto), "Cannot change visibility of a managed project");
+    checkRequest(!isManagedProject(dbSession, entityDto), "Cannot change visibility of a managed project");
   }
 
 
-  private boolean notManagedProject(DbSession dbSession, EntityDto entityDto) {
-    return !entityDto.isProject() || !delegatingManagedInstanceService.isProjectManaged(dbSession, entityDto.getKey());
+  private boolean isManagedProject(DbSession dbSession, EntityDto entityDto) {
+    return entityDto.isProject() && delegatingInstanceService.isProjectManaged(dbSession, entityDto.getKey());
   }
 
 }
index 687029da316aa6c4940aab09d056297078803125..6c82a7168cf7463aaf72344191c2744902a64061 100644 (file)
@@ -126,7 +126,7 @@ import org.sonar.server.language.LanguageValidation;
 import org.sonar.server.language.ws.LanguageWs;
 import org.sonar.server.log.ServerLogging;
 import org.sonar.server.loginmessage.LoginMessageFeature;
-import org.sonar.server.management.DelegatingManagedInstanceService;
+import org.sonar.server.management.DelegatingManagedServices;
 import org.sonar.server.measure.index.ProjectsEsModule;
 import org.sonar.server.measure.live.LiveMeasureModule;
 import org.sonar.server.measure.ws.MeasuresWsModule;
@@ -307,7 +307,7 @@ public class PlatformLevel4 extends PlatformLevel {
       new MonitoringWsModule(),
       DefaultBranchNameResolver.class,
       DefaultDocumentationLinkGenerator.class,
-      DelegatingManagedInstanceService.class,
+      DelegatingManagedServices.class,
 
       // batch
       new BatchWsModule(),