From 375808af9e8f91c14dbaf2dfb84a383ba3687b21 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Thu, 23 Mar 2017 16:18:39 +0100 Subject: [PATCH] SONAR-9006 add canCustomizeRule to response of api/rules/app --- .../org/sonar/server/rule/ws/AppAction.java | 11 +++-- .../sonar/server/rule/ws/AppActionTest.java | 47 ++++++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java index 5c008df76d9..c757ed20a07 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/AppAction.java @@ -30,6 +30,7 @@ import org.sonar.db.DbSession; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; import org.sonar.db.qualityprofile.QualityProfileDto; +import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.user.UserSession; import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_ORGANIZATION; @@ -40,12 +41,15 @@ public class AppAction implements RulesWsAction { private final DbClient dbClient; private final UserSession userSession; private final RuleWsSupport wsSupport; + private final DefaultOrganizationProvider defaultOrganizationProvider; - public AppAction(Languages languages, DbClient dbClient, UserSession userSession, RuleWsSupport wsSupport) { + public AppAction(Languages languages, DbClient dbClient, UserSession userSession, RuleWsSupport wsSupport, + DefaultOrganizationProvider defaultOrganizationProvider) { this.languages = languages; this.dbClient = dbClient; this.userSession = userSession; this.wsSupport = wsSupport; + this.defaultOrganizationProvider = defaultOrganizationProvider; } @Override @@ -81,8 +85,9 @@ public class AppAction implements RulesWsAction { } private void addPermissions(OrganizationDto organization, JsonWriter json) { - boolean canWrite = userSession.hasPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, organization); - json.prop("canWrite", canWrite); + boolean isAdminister = userSession.hasPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, organization); + json.prop("canWrite", isAdminister); + json.prop("canCustomizeRule", isAdminister && organization.getUuid().equals(defaultOrganizationProvider.get().getUuid())); } private void addProfiles(DbSession dbSession, OrganizationDto organization, JsonWriter json) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java index a764dc6ab40..9c4e519c70d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/AppActionTest.java @@ -58,7 +58,7 @@ public class AppActionTest { private Languages languages = new Languages(LANG1, LANG2); private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private RuleWsSupport wsSupport = new RuleWsSupport(db.getDbClient(), userSession, defaultOrganizationProvider); - private AppAction underTest = new AppAction(languages, db.getDbClient(), userSession, wsSupport); + private AppAction underTest = new AppAction(languages, db.getDbClient(), userSession, wsSupport, defaultOrganizationProvider); private WsActionTester tester = new WsActionTester(underTest); @Test @@ -209,6 +209,51 @@ public class AppActionTest { assertJson(json).isSimilarTo("{ \"canWrite\": false }"); } + @Test + public void canCustomizeRule_is_true_if_user_is_profile_administrator_of_default_organization_and_no_organization_is_specified() { + userSession.addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, db.getDefaultOrganization()); + + String json = tester.newRequest().execute().getInput(); + + assertJson(json).isSimilarTo("{ \"canCustomizeRule\": true }"); + } + + @Test + public void canCustomizeRule_is_true_if_user_is_profile_administrator_of_specified_default_organization() { + userSession.addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, db.getDefaultOrganization()); + + String json = tester.newRequest() + .setParam("organization", db.getDefaultOrganization().getKey()) + .execute().getInput(); + + assertJson(json).isSimilarTo("{ \"canCustomizeRule\": true }"); + } + + @Test + public void canCustomizeRule_is_false_if_user_is_profile_administrator_of_specified_non_default_organization() { + OrganizationDto organization = db.organizations().insert(); + userSession.addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, organization); + + String json = tester.newRequest() + .setParam("organization", organization.getKey()) + .execute().getInput(); + + assertJson(json).isSimilarTo("{ \"canCustomizeRule\": false }"); + } + + @Test + public void canCustomizeRule_is_false_if_user_is_not_profile_administrator_of_specified_non_default_organization() { + OrganizationDto organization1 = db.organizations().insert(); + OrganizationDto organization2 = db.organizations().insert(); + userSession.addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, organization1); + + String json = tester.newRequest() + .setParam("organization", organization2.getKey()) + .execute().getInput(); + + assertJson(json).isSimilarTo("{ \"canCustomizeRule\": false }"); + } + private void insertRules() { RuleRepositoryDto repo1 = new RuleRepositoryDto("xoo", "xoo", "SonarQube"); RuleRepositoryDto repo2 = new RuleRepositoryDto("squid", "ws", "SonarQube"); -- 2.39.5