]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8662 Wrong entries in "Administration" menu of a project dashboard when not...
authorStas Vilchik <stas-vilchik@users.noreply.github.com>
Thu, 9 Feb 2017 09:52:23 +0000 (10:52 +0100)
committerGitHub <noreply@github.com>
Thu, 9 Feb 2017 09:52:23 +0000 (10:52 +0100)
server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java
server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_configuration_for_quality_gate_admin.json [new file with mode: 0644]
server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_configuration_for_quality_profile_admin.json
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.js

index b15ccd19b7e2f593fec32e6232d13f846d6baa8e..6bb6be1c1da79ab6c569fad90c09149a719bd4ac 100644 (file)
@@ -59,6 +59,7 @@ import org.sonar.server.user.UserSession;
 import static org.sonar.api.measures.CoreMetrics.QUALITY_PROFILES_KEY;
 import static org.sonar.api.web.UserRole.ADMIN;
 import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.core.permission.GlobalPermissions.QUALITY_GATE_ADMIN;
 import static org.sonar.core.permission.GlobalPermissions.QUALITY_PROFILE_ADMIN;
 import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
 import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
@@ -139,7 +140,9 @@ public class ComponentAction implements NavigationWsAction {
       writeComponent(json, session, component, org, analysis.orElse(null));
       writeProfiles(json, session, component);
       writeQualityGate(json, session, component);
-      if (userSession.hasComponentPermission(ADMIN, component) || userSession.hasOrganizationPermission(org.getUuid(), QUALITY_PROFILE_ADMIN)) {
+      if (userSession.hasComponentPermission(ADMIN, component) ||
+        userSession.hasOrganizationPermission(org.getUuid(), QUALITY_PROFILE_ADMIN) ||
+        userSession.hasOrganizationPermission(org.getUuid(), QUALITY_GATE_ADMIN)) {
         writeConfiguration(json, component);
       }
       writeBreadCrumbs(json, session, component);
@@ -225,10 +228,12 @@ public class ComponentAction implements NavigationWsAction {
   private void writeConfigPageAccess(JsonWriter json, boolean isAdmin, ComponentDto component) {
     boolean isProject = Qualifiers.PROJECT.equals(component.qualifier());
     boolean showManualMeasures = isAdmin && !Qualifiers.DIRECTORY.equals(component.qualifier());
+    boolean isQualityProfileAdmin = userSession.hasOrganizationPermission(component.getOrganizationUuid(), QUALITY_PROFILE_ADMIN);
+    boolean isQualityGateAdmin = userSession.hasOrganizationPermission(component.getOrganizationUuid(), QUALITY_GATE_ADMIN);
 
     json.prop("showSettings", isAdmin && componentTypeHasProperty(component, PROPERTY_CONFIGURABLE));
-    json.prop("showQualityProfiles", isProject);
-    json.prop("showQualityGates", isProject);
+    json.prop("showQualityProfiles", isProject && (isAdmin || isQualityProfileAdmin));
+    json.prop("showQualityGates", isProject && (isAdmin || isQualityGateAdmin));
     json.prop("showManualMeasures", showManualMeasures);
     json.prop("showLinks", isAdmin && isProject);
     json.prop("showPermissions", isAdmin && componentTypeHasProperty(component, PROPERTY_HAS_ROLE_POLICY));
index 7b58db290d7cb9ce1a06586127ed1d0c625c2f30..54afe3e27e878a328105390bbc0f9e8b57625eeb 100644 (file)
@@ -64,6 +64,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.sonar.api.measures.CoreMetrics.QUALITY_PROFILES_KEY;
 import static org.sonar.api.web.page.Page.Scope.COMPONENT;
+import static org.sonar.core.permission.GlobalPermissions.QUALITY_GATE_ADMIN;
 import static org.sonar.core.permission.GlobalPermissions.QUALITY_PROFILE_ADMIN;
 import static org.sonar.db.component.ComponentTesting.newDirectory;
 import static org.sonar.db.component.ComponentTesting.newFileDto;
@@ -315,6 +316,17 @@ public class ComponentActionTest {
     executeAndVerify(project.key(), "return_configuration_for_quality_profile_admin.json");
   }
 
+  @Test
+  public void return_configuration_for_quality_gate_admin() throws Exception {
+    init();
+    componentDbTester.insertComponent(project);
+    userSessionRule.logIn()
+      .addProjectUuidPermissions(UserRole.USER, project.uuid())
+      .addOrganizationPermission(project.getOrganizationUuid(), QUALITY_GATE_ADMIN);
+
+    executeAndVerify(project.key(), "return_configuration_for_quality_gate_admin.json");
+  }
+
   @Test
   public void return_bread_crumbs_on_several_levels() throws Exception {
     init();
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_configuration_for_quality_gate_admin.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_configuration_for_quality_gate_admin.json
new file mode 100644 (file)
index 0000000..893e9df
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "configuration": {
+    "showSettings": false,
+    "showQualityProfiles": false,
+    "showQualityGates": true,
+    "showManualMeasures": false,
+    "showLinks": false,
+    "showPermissions": false,
+    "showHistory": false,
+    "showUpdateKey": false
+  }
+}
index 0b8a1b3a05d014ce6164d8ab1fc99989d31de958..8a8dd68ca933190fbf0522ee5c8dbd7b7d145a58 100644 (file)
@@ -2,7 +2,7 @@
   "configuration": {
     "showSettings": false,
     "showQualityProfiles": true,
-    "showQualityGates": true,
+    "showQualityGates": false,
     "showManualMeasures": false,
     "showLinks": false,
     "showPermissions": false,
index 4d9aa5f18ee8aba67ab2ddfc8143b73d83732c3d..6b64ac85174d257e925996b20367acb062d86391 100644 (file)
@@ -278,6 +278,10 @@ export default class ComponentNavMenu extends React.Component {
   renderDeletionLink () {
     const { qualifier } = this.props.component;
 
+    if (!this.props.conf.showSettings) {
+      return null;
+    }
+
     if (qualifier !== 'TRK' && qualifier !== 'VW') {
       return null;
     }