]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8346 Make a consistent permission documentation for api/permissions WS
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Fri, 27 Jan 2017 17:21:20 +0000 (18:21 +0100)
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Mon, 30 Jan 2017 13:57:15 +0000 (14:57 +0100)
23 files changed:
server/sonar-server/src/main/java/org/sonar/server/permission/ws/AddGroupAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/AddUserAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/GroupsAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/RemoveGroupAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/RemoveUserAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchGlobalPermissionsAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/UsersAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/AddGroupToTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/AddProjectCreatorToTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/AddUserToTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/ApplyTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/BulkApplyTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/CreateTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/DeleteTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/RemoveGroupFromTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/RemoveProjectCreatorFromTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/RemoveUserFromTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/SearchTemplatesAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/SetDefaultTemplateAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/TemplateGroupsAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/TemplateUsersAction.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/template/UpdateTemplateAction.java

index 01374676c22e1f0625ccb1a7559da1c0ee6f8e05..a6bd635bedd98e9668565f8697e95ebbc6e3a7eb 100644 (file)
@@ -63,7 +63,11 @@ public class AddGroupAction implements PermissionsWsAction {
       .setDescription("Add permission to a group.<br /> " +
         "This service defaults to global permissions, but can be limited to project permissions by providing project id or project key.<br /> " +
         "The group name or group id must be provided. <br />" +
-        "It requires administration permissions to access.")
+        "Requires one of the following permissions:" +
+        "<ul>" +
+        "<li>'Administer System'</li>" +
+        "<li>'Administer' rights on the specified project</li>" +
+        "</ul>")
       .setSince("5.2")
       .setPost(true)
       .setHandler(this);
index 42ab1e18073653f37dcbbcbc2502de76dc52c3a8..5562e2b0e3dd6d9fe9c50f3c900f271aae990dbc 100644 (file)
@@ -65,7 +65,11 @@ public class AddUserAction implements PermissionsWsAction {
     WebService.NewAction action = context.createAction(ACTION)
       .setDescription("Add permission to a user.<br /> " +
         "This service defaults to global permissions, but can be limited to project permissions by providing project id or project key.<br />" +
-        "It requires administration permissions to access.")
+        "Requires one of the following permissions:" +
+        "<ul>" +
+        "<li>'Administer System'</li>" +
+        "<li>'Administer' rights on the specified project</li>" +
+        "</ul>")
       .setSince("5.2")
       .setPost(true)
       .setHandler(this);
index 3bd6492226ca027ace9a0e321a27ee8ff69cb38d..2e22e180021428086396811fed0b1439ecd88e3d 100644 (file)
@@ -75,7 +75,11 @@ public class GroupsAction implements PermissionsWsAction {
       .setDescription("Lists the groups with their permissions.<br>" +
         "This service defaults to global permissions, but can be limited to project permissions by providing project id or project key.<br> " +
         "This service defaults to all groups, but can be limited to groups with a specific permission by providing the desired permission.<br>" +
-        "It requires administration permissions to access.")
+        "Requires one of the following permissions:" +
+        "<ul>" +
+        "<li>'Administer System'</li>" +
+        "<li>'Administer' rights on the specified project</li>" +
+        "</ul>")
       .addPagingParams(DEFAULT_PAGE_SIZE, RESULTS_MAX_SIZE)
       .addSearchQuery("sonar", "names").setDescription("Limit search to group names that contain the supplied string. Must have at least %d characters.<br/>" +
         "When this parameter is not set, only groups having at least one permission are returned.", SEARCH_QUERY_MIN_LENGTH)
index 017e9e2ed6ec960a4bc10a7031d19c43876e866c..3b743868df67e7e6078e8e2525774a8dd92af637 100644 (file)
@@ -63,7 +63,11 @@ public class RemoveGroupAction implements PermissionsWsAction {
       .setDescription("Remove a permission from a group.<br /> " +
         "This service defaults to global permissions, but can be limited to project permissions by providing project id or project key.<br /> " +
         "The group id or group name must be provided, not both.<br />" +
-        "It requires administration permissions to access.")
+        "Requires one of the following permissions:" +
+        "<ul>" +
+        "<li>'Administer System'</li>" +
+        "<li>'Administer' rights on the specified project</li>" +
+        "</ul>")
       .setSince("5.2")
       .setPost(true)
       .setHandler(this);
index fedd1eab4541add160bb19aa021df7c5c53a3807..6886f4bb23fe460816ecbaf9dbfa9737e5c98102 100644 (file)
@@ -64,7 +64,11 @@ public class RemoveUserAction implements PermissionsWsAction {
     WebService.NewAction action = context.createAction(ACTION)
       .setDescription("Remove permission from a user.<br /> " +
         "This service defaults to global permissions, but can be limited to project permissions by providing project id or project key.<br /> " +
-        "It requires administration permissions to access.")
+        "Requires one of the following permissions:" +
+        "<ul>" +
+        "<li>'Administer System'</li>" +
+        "<li>'Administer' rights on the specified project</li>" +
+        "</ul>")
       .setSince("5.2")
       .setPost(true)
       .setHandler(this);
index 3950dd43868acfac711bbd32535710a66be9521e..ce460ef57d42743844bfa4c7fddbf5c1262d334f 100644 (file)
@@ -61,7 +61,7 @@ public class SearchGlobalPermissionsAction implements PermissionsWsAction {
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction(ACTION)
       .setDescription("List global permissions. <br />" +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'")
       .setResponseExample(getClass().getResource("search_global_permissions-example.json"))
       .setSince("5.2")
       .setHandler(this);
index c6c5522be119cb7427d46a0a7ce7cc10e2e86267..05474fddf18e589a6f8f6e398a1728625b2e5ec4 100644 (file)
@@ -76,7 +76,11 @@ public class SearchProjectPermissionsAction implements PermissionsWsAction {
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("search_project_permissions")
       .setDescription("List project permissions. A project can be a technical project, a view or a developer.<br />" +
-        "Requires 'Administer System' permission or 'Administer' rights on the specified project.")
+        "Requires one of the following permissions:" +
+        "<ul>" +
+        "<li>'Administer System'</li>" +
+        "<li>'Administer' rights on the specified project</li>" +
+        "</ul>")
       .setResponseExample(getClass().getResource("search_project_permissions-example.json"))
       .setSince("5.2")
       .addPagingParams(25)
index 93a2d717104a823e333f42da369026650b78788d..9b1f28cd243124d0c626621eec7e8e389383284f 100644 (file)
@@ -76,7 +76,11 @@ public class UsersAction implements PermissionsWsAction {
       .setDescription("Lists the users with their permissions as individual users rather than through group affiliation.<br>" +
         "This service defaults to global permissions, but can be limited to project permissions by providing project id or project key.<br> " +
         "This service defaults to all users, but can be limited to users with a specific permission by providing the desired permission.<br>" +
-        "It requires administration permissions to access.")
+        "Requires one of the following permissions:" +
+        "<ul>" +
+        "<li>'Administer System'</li>" +
+        "<li>'Administer' rights on the specified project</li>" +
+        "</ul>")
       .addPagingParams(DEFAULT_PAGE_SIZE, RESULTS_MAX_SIZE)
       .setInternal(true)
       .setResponseExample(getClass().getResource("users-example.json"))
index 0da23f6befb34d26011c5ff8897dd9b39383d5c4..5fd97f8f815b120df43f7ea512d2f66f5b43634d 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import org.sonar.api.server.ws.Request;
@@ -60,7 +61,7 @@ public class AddGroupToTemplateAction implements PermissionsWsAction {
       .setSince("5.2")
       .setDescription("Add a group to a permission template.<br /> " +
         "The group id or group name must be provided. <br />" +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .setHandler(this);
 
     createTemplateParameters(action);
index 642793ca3b8a8d8b58a9c111380561c1b08e1593..b1c6db512f934617e257f867c340bdca9652a568 100644 (file)
@@ -56,11 +56,22 @@ public class AddProjectCreatorToTemplateAction implements PermissionsWsAction {
     this.system = system;
   }
 
+  private static AddProjectCreatorToTemplateWsRequest toWsRequest(Request request) {
+    AddProjectCreatorToTemplateWsRequest wsRequest = AddProjectCreatorToTemplateWsRequest.builder()
+      .setPermission(request.mandatoryParam(PARAM_PERMISSION))
+      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
+      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
+      .setTemplateName(request.param(PARAM_TEMPLATE_NAME))
+      .build();
+    validateProjectPermission(wsRequest.getPermission());
+    return wsRequest;
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("add_project_creator_to_template")
       .setDescription("Add a project creator to a permission template.<br>" +
-        "Requires the 'Administer' permission.")
+        "Requires the following permission: 'Administer System'.")
       .setSince("6.0")
       .setPost(true)
       .setHandler(this);
@@ -109,15 +120,4 @@ public class AddProjectCreatorToTemplateAction implements PermissionsWsAction {
     dbClient.permissionTemplateCharacteristicDao().update(dbSession, targetTemplatePermission);
     dbSession.commit();
   }
-
-  private static AddProjectCreatorToTemplateWsRequest toWsRequest(Request request) {
-    AddProjectCreatorToTemplateWsRequest wsRequest = AddProjectCreatorToTemplateWsRequest.builder()
-      .setPermission(request.mandatoryParam(PARAM_PERMISSION))
-      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
-      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
-      .setTemplateName(request.param(PARAM_TEMPLATE_NAME))
-      .build();
-    validateProjectPermission(wsRequest.getPermission());
-    return wsRequest;
-  }
 }
index b6a36e1bfd67ce342e6f832a0b1980f02804056c..c1b20ddca0d1c304269cc80813e772a327ef5bff 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import java.util.List;
@@ -55,6 +56,15 @@ public class AddUserToTemplateAction implements PermissionsWsAction {
     this.userSession = userSession;
   }
 
+  private static AddUserToTemplateWsRequest toAddUserToTemplateWsRequest(Request request) {
+    return new AddUserToTemplateWsRequest()
+      .setLogin(request.mandatoryParam(PARAM_USER_LOGIN))
+      .setPermission(request.mandatoryParam(PARAM_PERMISSION))
+      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
+      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
+      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context
@@ -62,7 +72,7 @@ public class AddUserToTemplateAction implements PermissionsWsAction {
       .setPost(true)
       .setSince("5.2")
       .setDescription("Add a user to a permission template.<br /> " +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .setHandler(this);
 
     createTemplateParameters(action);
@@ -94,15 +104,6 @@ public class AddUserToTemplateAction implements PermissionsWsAction {
     }
   }
 
-  private static AddUserToTemplateWsRequest toAddUserToTemplateWsRequest(Request request) {
-    return new AddUserToTemplateWsRequest()
-      .setLogin(request.mandatoryParam(PARAM_USER_LOGIN))
-      .setPermission(request.mandatoryParam(PARAM_PERMISSION))
-      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
-      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
-      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
-  }
-
   private boolean isUserAlreadyAdded(DbSession dbSession, long templateId, String userLogin, String permission) {
     PermissionQuery permissionQuery = PermissionQuery.builder().setPermission(permission).build();
     List<String> usersWithPermission = dbClient.permissionTemplateDao().selectUserLoginsByQueryAndTemplate(dbSession, permissionQuery, templateId);
index 3fddb19e16f4e57474378ce2e33dd8ede5bbe6a8..96be29e7a84d845004e91ebd2144660823698c52 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import java.util.Collections;
@@ -57,16 +58,21 @@ public class ApplyTemplateAction implements PermissionsWsAction {
     this.wsSupport = wsSupport;
   }
 
+  private static ApplyTemplateWsRequest toApplyTemplateWsRequest(Request request) {
+    return new ApplyTemplateWsRequest()
+      .setProjectId(request.param(PARAM_PROJECT_ID))
+      .setProjectKey(request.param(PARAM_PROJECT_KEY))
+      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
+      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("apply_template")
       .setDescription("Apply a permission template to one project.<br>" +
         "The project id or project key must be provided.<br>" +
         "The template id or name must be provided.<br>" +
-        "Requires the following permission:" +
-        "<ul>" +
-        "  <li>'Administer System'</li>" +
-        "</ul>")
+        "Requires the following permission: 'Administer System'.")
       .setPost(true)
       .setSince("5.2")
       .setHandler(this);
@@ -92,12 +98,4 @@ public class ApplyTemplateAction implements PermissionsWsAction {
       permissionTemplateService.apply(dbSession, template, Collections.singletonList(project));
     }
   }
-
-  private static ApplyTemplateWsRequest toApplyTemplateWsRequest(Request request) {
-    return new ApplyTemplateWsRequest()
-      .setProjectId(request.param(PARAM_PROJECT_ID))
-      .setProjectKey(request.param(PARAM_PROJECT_KEY))
-      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
-      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
-  }
 }
index 4ee9b1d4ac0452fa73a4e699e09f1336724576c2..926c898152c8abcb2593ef181fd09d81bcfe3ad5 100644 (file)
@@ -70,15 +70,21 @@ public class BulkApplyTemplateAction implements PermissionsWsAction {
     this.resourceTypes = resourceTypes;
   }
 
+  private static BulkApplyTemplateWsRequest toBulkApplyTemplateWsRequest(Request request) {
+    return new BulkApplyTemplateWsRequest()
+      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
+      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
+      .setTemplateName(request.param(PARAM_TEMPLATE_NAME))
+      .setQualifier(request.param(PARAM_QUALIFIER))
+      .setQuery(request.param(Param.TEXT_QUERY));
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("bulk_apply_template")
       .setDescription("Apply a permission template to several projects.<br />" +
         "The template id or name must be provided.<br />" +
-        "Requires the following permission:" +
-        "<ul>" +
-        "  <li>'Administer System'</li>" +
-        "</ul>")
+        "Requires the following permission: 'Administer System'.")
       .setPost(true)
       .setSince("5.5")
       .setHandler(this);
@@ -119,13 +125,4 @@ public class BulkApplyTemplateAction implements PermissionsWsAction {
       ? Collections2.transform(resourceTypes.getRoots(), ResourceType::getQualifier).toArray(new String[resourceTypes.getRoots().size()])
       : (new String[] {qualifier});
   }
-
-  private static BulkApplyTemplateWsRequest toBulkApplyTemplateWsRequest(Request request) {
-    return new BulkApplyTemplateWsRequest()
-      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
-      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
-      .setTemplateName(request.param(PARAM_TEMPLATE_NAME))
-      .setQualifier(request.param(PARAM_QUALIFIER))
-      .setQuery(request.param(Param.TEXT_QUERY));
-  }
 }
index 70005a438bd9c59ba2ba401ce47530e290119ccf..45510ea2a835abf195496fd98672c06744ba69ca 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import java.util.Date;
@@ -65,11 +66,24 @@ public class CreateTemplateAction implements PermissionsWsAction {
     this.wsSupport = wsSupport;
   }
 
+  private static CreateTemplateWsRequest toCreateTemplateWsRequest(Request request) {
+    return new CreateTemplateWsRequest()
+      .setName(request.mandatoryParam(PARAM_NAME))
+      .setDescription(request.param(PARAM_DESCRIPTION))
+      .setProjectKeyPattern(request.param(PARAM_PROJECT_KEY_PATTERN))
+      .setOrganizationKey(request.param(PARAM_ORGANIZATION_KEY));
+  }
+
+  private static CreateTemplateWsResponse buildResponse(PermissionTemplateDto permissionTemplateDto) {
+    PermissionTemplate permissionTemplateBuilder = toPermissionTemplateResponse(permissionTemplateDto);
+    return CreateTemplateWsResponse.newBuilder().setPermissionTemplate(permissionTemplateBuilder).build();
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("create_template")
       .setDescription("Create a permission template.<br />" +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .setResponseExample(getClass().getResource("create_template-example.json"))
       .setSince("5.2")
       .setPost(true)
@@ -105,14 +119,6 @@ public class CreateTemplateAction implements PermissionsWsAction {
     }
   }
 
-  private static CreateTemplateWsRequest toCreateTemplateWsRequest(Request request) {
-    return new CreateTemplateWsRequest()
-      .setName(request.mandatoryParam(PARAM_NAME))
-      .setDescription(request.param(PARAM_DESCRIPTION))
-      .setProjectKeyPattern(request.param(PARAM_PROJECT_KEY_PATTERN))
-      .setOrganizationKey(request.param(PARAM_ORGANIZATION_KEY));
-  }
-
   private void validateTemplateNameForCreation(DbSession dbSession, OrganizationDto org, String name) {
     validateTemplateNameFormat(name);
 
@@ -134,9 +140,4 @@ public class CreateTemplateAction implements PermissionsWsAction {
     dbSession.commit();
     return template;
   }
-
-  private static CreateTemplateWsResponse buildResponse(PermissionTemplateDto permissionTemplateDto) {
-    PermissionTemplate permissionTemplateBuilder = toPermissionTemplateResponse(permissionTemplateDto);
-    return CreateTemplateWsResponse.newBuilder().setPermissionTemplate(permissionTemplateBuilder).build();
-  }
 }
index f1ff7df0def39fea3826556fb64dd5b2a17d15c4..1a42c04774c9d3c033142ffbad9f23f7aaeee9ae 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import org.sonar.api.server.ws.Request;
@@ -53,11 +54,18 @@ public class DeleteTemplateAction implements PermissionsWsAction {
     this.defaultTemplatesResolver = defaultTemplatesResolver;
   }
 
+  private static DeleteTemplateWsRequest toDeleteTemplateWsRequest(Request request) {
+    return new DeleteTemplateWsRequest()
+      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
+      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
+      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("delete_template")
       .setDescription("Delete a permission template.<br />" +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .setSince("5.2")
       .setPost(true)
       .setHandler(this);
@@ -117,11 +125,4 @@ public class DeleteTemplateAction implements PermissionsWsAction {
         "It is not possible to delete the default permission template for views"));
   }
 
-  private static DeleteTemplateWsRequest toDeleteTemplateWsRequest(Request request) {
-    return new DeleteTemplateWsRequest()
-      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
-      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
-      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
-  }
-
 }
index c9548101c40d5bac7457dc3c916f4b35f1a03acb..157616a6850fa1f0556c306ee474be15165c5232 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import org.sonar.api.server.ws.Request;
@@ -57,7 +58,7 @@ public class RemoveGroupFromTemplateAction implements PermissionsWsAction {
       .setSince("5.2")
       .setDescription("Remove a group from a permission template.<br /> " +
         "The group id or group name must be provided. <br />" +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .setHandler(this);
 
     createTemplateParameters(action);
index e73a3f26fe7cc0925d8656a056c761e17c4c702a..dab42553d70b8044e9445e00a4cb90d01ff50e63 100644 (file)
@@ -20,7 +20,6 @@
 
 package org.sonar.server.permission.ws.template;
 
-import java.util.Optional;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -57,11 +56,22 @@ public class RemoveProjectCreatorFromTemplateAction implements PermissionsWsActi
     this.system = system;
   }
 
+  private static RemoveProjectCreatorFromTemplateWsRequest toWsRequest(Request request) {
+    RemoveProjectCreatorFromTemplateWsRequest wsRequest = RemoveProjectCreatorFromTemplateWsRequest.builder()
+      .setPermission(request.mandatoryParam(PARAM_PERMISSION))
+      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
+      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
+      .setTemplateName(request.param(PARAM_TEMPLATE_NAME))
+      .build();
+    validateProjectPermission(wsRequest.getPermission());
+    return wsRequest;
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("remove_project_creator_from_template")
       .setDescription("Remove a project creator from a permission template.<br>" +
-        "Requires the 'Administer' permission.")
+        "Requires the following permission: 'Administer System'.")
       .setSince("6.0")
       .setPost(true)
       .setHandler(this);
@@ -83,10 +93,8 @@ public class RemoveProjectCreatorFromTemplateAction implements PermissionsWsActi
       checkGlobalAdmin(userSession, template.getOrganizationUuid());
 
       PermissionTemplateCharacteristicDao dao = dbClient.permissionTemplateCharacteristicDao();
-      Optional<PermissionTemplateCharacteristicDto> templatePermission = dao.selectByPermissionAndTemplateId(dbSession, request.getPermission(), template.getId());
-      if (templatePermission.isPresent()) {
-        updateTemplateCharacteristic(dbSession, templatePermission.get());
-      }
+      dao.selectByPermissionAndTemplateId(dbSession, request.getPermission(), template.getId())
+        .ifPresent(permissionTemplateCharacteristicDto -> updateTemplateCharacteristic(dbSession, permissionTemplateCharacteristicDto));
     }
   }
 
@@ -97,15 +105,4 @@ public class RemoveProjectCreatorFromTemplateAction implements PermissionsWsActi
     dbClient.permissionTemplateCharacteristicDao().update(dbSession, targetTemplatePermission);
     dbSession.commit();
   }
-
-  private static RemoveProjectCreatorFromTemplateWsRequest toWsRequest(Request request) {
-    RemoveProjectCreatorFromTemplateWsRequest wsRequest = RemoveProjectCreatorFromTemplateWsRequest.builder()
-      .setPermission(request.mandatoryParam(PARAM_PERMISSION))
-      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
-      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
-      .setTemplateName(request.param(PARAM_TEMPLATE_NAME))
-      .build();
-    validateProjectPermission(wsRequest.getPermission());
-    return wsRequest;
-  }
 }
index ba373ebdabfadc843d339be2a27ce939bbd29480..ef29e13daab44689c7887dcaec7d0ba5745db861 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import org.sonar.api.server.ws.Request;
@@ -53,6 +54,15 @@ public class RemoveUserFromTemplateAction implements PermissionsWsAction {
     this.userSession = userSession;
   }
 
+  private static RemoveUserFromTemplateWsRequest toRemoveUserFromTemplateWsRequest(Request request) {
+    return new RemoveUserFromTemplateWsRequest()
+      .setPermission(request.mandatoryParam(PARAM_PERMISSION))
+      .setLogin(request.mandatoryParam(PARAM_USER_LOGIN))
+      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
+      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
+      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context
@@ -60,7 +70,7 @@ public class RemoveUserFromTemplateAction implements PermissionsWsAction {
       .setPost(true)
       .setSince("5.2")
       .setDescription("Remove a user from a permission template.<br /> " +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .setHandler(this);
 
     createTemplateParameters(action);
@@ -90,13 +100,4 @@ public class RemoveUserFromTemplateAction implements PermissionsWsAction {
       dbSession.commit();
     }
   }
-
-  private static RemoveUserFromTemplateWsRequest toRemoveUserFromTemplateWsRequest(Request request) {
-    return new RemoveUserFromTemplateWsRequest()
-      .setPermission(request.mandatoryParam(PARAM_PERMISSION))
-      .setLogin(request.mandatoryParam(PARAM_USER_LOGIN))
-      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
-      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
-      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
-  }
 }
index cfeb7b67289daf72a9c4faf4a3c2c10d97810d6f..a4cab3f2c993307e9887a4575bf96ef5bb7203cc 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import java.util.Locale;
@@ -42,8 +43,8 @@ import org.sonarqube.ws.WsPermissions.SearchTemplatesWsResponse.TemplateIdQualif
 import org.sonarqube.ws.client.permission.SearchTemplatesWsRequest;
 
 import static org.sonar.api.utils.DateUtils.formatDateTime;
-import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN;
 import static org.sonar.core.util.Protobuf.setNullable;
+import static org.sonar.server.permission.PermissionPrivilegeChecker.checkGlobalAdmin;
 import static org.sonar.server.permission.ws.PermissionsWsParametersBuilder.createOrganizationParameter;
 import static org.sonar.server.ws.WsUtils.writeProtobuf;
 import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_ORGANIZATION_KEY;
@@ -66,46 +67,6 @@ public class SearchTemplatesAction implements PermissionsWsAction {
     this.dataLoader = dataLoader;
   }
 
-  @Override
-  public void define(WebService.NewController context) {
-    WebService.NewAction action = context.createAction("search_templates")
-      .setDescription("List permission templates.<br />" +
-        "Requires the following permission:" +
-        "<ul>" +
-        "  <li>'Administer System'</li>" +
-        "</ul>")
-      .setResponseExample(getClass().getResource("search_templates-example.json"))
-      .setSince("5.2")
-      .addSearchQuery("defau", "permission template names")
-      .setHandler(this);
-
-    createOrganizationParameter(action);
-  }
-
-  @Override
-  public void handle(Request wsRequest, Response wsResponse) throws Exception {
-    try (DbSession dbSession = dbClient.openSession(false)) {
-      OrganizationDto org = support.findOrganization(dbSession, wsRequest.param(PARAM_ORGANIZATION_KEY));
-      SearchTemplatesWsRequest request = new SearchTemplatesWsRequest()
-        .setOrganizationUuid(org.getUuid())
-        .setQuery(wsRequest.param(Param.TEXT_QUERY));
-      userSession.checkLoggedIn().checkOrganizationPermission(request.getOrganizationUuid(), SYSTEM_ADMIN);
-
-      SearchTemplatesWsResponse searchTemplatesWsResponse = buildResponse(dataLoader.load(dbSession, request));
-      writeProtobuf(searchTemplatesWsResponse, wsRequest, wsResponse);
-    }
-  }
-
-  private WsPermissions.SearchTemplatesWsResponse buildResponse(SearchTemplatesData data) {
-    SearchTemplatesWsResponse.Builder response = SearchTemplatesWsResponse.newBuilder();
-
-    buildTemplatesResponse(response, data);
-    buildDefaultTemplatesResponse(response, data);
-    buildPermissionsResponse(response);
-
-    return response.build();
-  }
-
   private static void buildDefaultTemplatesResponse(SearchTemplatesWsResponse.Builder response, SearchTemplatesData data) {
     TemplateIdQualifier.Builder templateUuidQualifierBuilder = TemplateIdQualifier.newBuilder();
 
@@ -148,6 +109,43 @@ public class SearchTemplatesAction implements PermissionsWsAction {
     }
   }
 
+  @Override
+  public void define(WebService.NewController context) {
+    WebService.NewAction action = context.createAction("search_templates")
+      .setDescription("List permission templates.<br />" +
+        "Requires the following permission: 'Administer System'.")
+      .setResponseExample(getClass().getResource("search_templates-example.json"))
+      .setSince("5.2")
+      .addSearchQuery("defau", "permission template names")
+      .setHandler(this);
+
+    createOrganizationParameter(action);
+  }
+
+  @Override
+  public void handle(Request wsRequest, Response wsResponse) throws Exception {
+    try (DbSession dbSession = dbClient.openSession(false)) {
+      OrganizationDto org = support.findOrganization(dbSession, wsRequest.param(PARAM_ORGANIZATION_KEY));
+      SearchTemplatesWsRequest request = new SearchTemplatesWsRequest()
+        .setOrganizationUuid(org.getUuid())
+        .setQuery(wsRequest.param(Param.TEXT_QUERY));
+      checkGlobalAdmin(userSession, request.getOrganizationUuid());
+
+      SearchTemplatesWsResponse searchTemplatesWsResponse = buildResponse(dataLoader.load(dbSession, request));
+      writeProtobuf(searchTemplatesWsResponse, wsRequest, wsResponse);
+    }
+  }
+
+  private WsPermissions.SearchTemplatesWsResponse buildResponse(SearchTemplatesData data) {
+    SearchTemplatesWsResponse.Builder response = SearchTemplatesWsResponse.newBuilder();
+
+    buildTemplatesResponse(response, data);
+    buildDefaultTemplatesResponse(response, data);
+    buildPermissionsResponse(response);
+
+    return response.build();
+  }
+
   private void buildPermissionsResponse(SearchTemplatesWsResponse.Builder response) {
     Permission.Builder permissionResponse = Permission.newBuilder();
     for (String permissionKey : ProjectPermissions.ALL) {
index 20a96d4dc440b9ed3e684cfec286b75319ffb7a9..b085f261b9fde0ef4c9c75bc0f18fbdbed521b2d 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import org.sonar.api.i18n.I18n;
@@ -63,11 +64,19 @@ public class SetDefaultTemplateAction implements PermissionsWsAction {
     this.i18n = i18n;
   }
 
+  private static SetDefaultTemplateWsRequest toSetDefaultTemplateWsRequest(Request request) {
+    return new SetDefaultTemplateWsRequest()
+      .setQualifier(request.param(PARAM_QUALIFIER))
+      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
+      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
+      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("set_default_template")
       .setDescription("Set a permission template as default.<br />" +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .setPost(true)
       .setSince("5.2")
       .setHandler(this);
@@ -94,14 +103,6 @@ public class SetDefaultTemplateAction implements PermissionsWsAction {
     }
   }
 
-  private static SetDefaultTemplateWsRequest toSetDefaultTemplateWsRequest(Request request) {
-    return new SetDefaultTemplateWsRequest()
-      .setQualifier(request.param(PARAM_QUALIFIER))
-      .setTemplateId(request.param(PARAM_TEMPLATE_ID))
-      .setOrganization(request.param(PARAM_ORGANIZATION_KEY))
-      .setTemplateName(request.param(PARAM_TEMPLATE_NAME));
-  }
-
   private PermissionTemplateDto findTemplate(DbSession dbSession, SetDefaultTemplateWsRequest request) {
     return wsSupport.findTemplate(dbSession, newTemplateRef(request.getTemplateId(),
       request.getOrganization(), request.getTemplateName()));
index 637417db7c6240a72d805c10e6da12e32911b239..a15aa7c7446810e10ed0d1e24f5d4510c9863bbb 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import com.google.common.collect.Multimap;
@@ -65,6 +66,42 @@ public class TemplateGroupsAction implements PermissionsWsAction {
     this.support = support;
   }
 
+  private static PermissionQuery buildPermissionQuery(Request request) {
+    String textQuery = request.param(TEXT_QUERY);
+    String permission = request.param(PARAM_PERMISSION);
+    PermissionQuery.Builder permissionQuery = PermissionQuery.builder()
+      .setPermission(permission != null ? validateProjectPermission(permission) : null)
+      .setPageIndex(request.mandatoryParamAsInt(PAGE))
+      .setPageSize(request.mandatoryParamAsInt(PAGE_SIZE))
+      .setSearchQuery(textQuery);
+    if (textQuery == null) {
+      permissionQuery.withAtLeastOnePermission();
+    }
+    return permissionQuery.build();
+  }
+
+  private static WsPermissions.WsGroupsResponse buildResponse(List<GroupDto> groups, List<PermissionTemplateGroupDto> groupPermissions, Paging paging) {
+    Multimap<Long, String> permissionsByGroupId = TreeMultimap.create();
+    groupPermissions.forEach(groupPermission -> permissionsByGroupId.put(groupPermission.getGroupId(), groupPermission.getPermission()));
+    WsPermissions.WsGroupsResponse.Builder response = WsPermissions.WsGroupsResponse.newBuilder();
+
+    groups.forEach(group -> {
+      WsPermissions.Group.Builder wsGroup = response.addGroupsBuilder()
+        .setName(group.getName());
+      if (group.getId() != 0L) {
+        wsGroup.setId(String.valueOf(group.getId()));
+      }
+      setNullable(group.getDescription(), wsGroup::setDescription);
+      wsGroup.addAllPermissions(permissionsByGroupId.get(group.getId()));
+    });
+
+    response.getPagingBuilder()
+      .setPageIndex(paging.pageIndex())
+      .setPageSize(paging.pageSize())
+      .setTotal(paging.total());
+    return response.build();
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("template_groups")
@@ -72,7 +109,7 @@ public class TemplateGroupsAction implements PermissionsWsAction {
       .setInternal(true)
       .setDescription("Lists the groups with their permission as individual groups rather than through user affiliation on the chosen template.<br />" +
         "This service defaults to all groups, but can be limited to groups with a specific permission by providing the desired permission.<br>" +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .addPagingParams(DEFAULT_PAGE_SIZE, RESULTS_MAX_SIZE)
       .setResponseExample(getClass().getResource("template_groups-example.json"))
       .setHandler(this);
@@ -103,42 +140,6 @@ public class TemplateGroupsAction implements PermissionsWsAction {
     }
   }
 
-  private static PermissionQuery buildPermissionQuery(Request request) {
-    String textQuery = request.param(TEXT_QUERY);
-    String permission = request.param(PARAM_PERMISSION);
-    PermissionQuery.Builder permissionQuery = PermissionQuery.builder()
-      .setPermission(permission != null ? validateProjectPermission(permission) : null)
-      .setPageIndex(request.mandatoryParamAsInt(PAGE))
-      .setPageSize(request.mandatoryParamAsInt(PAGE_SIZE))
-      .setSearchQuery(textQuery);
-    if (textQuery == null) {
-      permissionQuery.withAtLeastOnePermission();
-    }
-    return permissionQuery.build();
-  }
-
-  private static WsPermissions.WsGroupsResponse buildResponse(List<GroupDto> groups, List<PermissionTemplateGroupDto> groupPermissions, Paging paging) {
-    Multimap<Long, String> permissionsByGroupId = TreeMultimap.create();
-    groupPermissions.forEach(groupPermission -> permissionsByGroupId.put(groupPermission.getGroupId(), groupPermission.getPermission()));
-    WsPermissions.WsGroupsResponse.Builder response = WsPermissions.WsGroupsResponse.newBuilder();
-
-    groups.forEach(group -> {
-      WsPermissions.Group.Builder wsGroup = response.addGroupsBuilder()
-        .setName(group.getName());
-      if (group.getId() != 0L) {
-        wsGroup.setId(String.valueOf(group.getId()));
-      }
-      setNullable(group.getDescription(), wsGroup::setDescription);
-      wsGroup.addAllPermissions(permissionsByGroupId.get(group.getId()));
-    });
-
-    response.getPagingBuilder()
-      .setPageIndex(paging.pageIndex())
-      .setPageSize(paging.pageSize())
-      .setTotal(paging.total());
-    return response.build();
-  }
-
   private List<GroupDto> findGroups(DbSession dbSession, PermissionQuery dbQuery, PermissionTemplateDto template) {
     List<String> orderedNames = dbClient.permissionTemplateDao().selectGroupNamesByQueryAndTemplate(dbSession, dbQuery, template.getOrganizationUuid(), template.getId());
     List<GroupDto> groups = dbClient.groupDao().selectByNames(dbSession, template.getOrganizationUuid(), orderedNames);
index 0d4fd48e8d79c96f5ff73f5bd3babb462a0bd180..18675eaef6808c9760198874a7cb744b86b7d1cf 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import com.google.common.collect.Multimap;
@@ -67,6 +68,41 @@ public class TemplateUsersAction implements PermissionsWsAction {
     this.support = support;
   }
 
+  private static PermissionQuery buildQuery(Request wsRequest, PermissionTemplateDto template) {
+    String textQuery = wsRequest.param(TEXT_QUERY);
+    String permission = wsRequest.param(PARAM_PERMISSION);
+    PermissionQuery.Builder query = PermissionQuery.builder()
+      .setTemplate(template.getUuid())
+      .setPermission(permission != null ? validateProjectPermission(permission) : null)
+      .setPageIndex(wsRequest.mandatoryParamAsInt(PAGE))
+      .setPageSize(wsRequest.mandatoryParamAsInt(PAGE_SIZE))
+      .setSearchQuery(textQuery);
+    if (textQuery == null) {
+      query.withAtLeastOnePermission();
+    }
+    return query.build();
+  }
+
+  private static WsPermissions.UsersWsResponse buildResponse(List<UserDto> users, List<PermissionTemplateUserDto> permissionTemplateUsers, Paging paging) {
+    Multimap<Long, String> permissionsByUserId = TreeMultimap.create();
+    permissionTemplateUsers.forEach(userPermission -> permissionsByUserId.put(userPermission.getUserId(), userPermission.getPermission()));
+
+    UsersWsResponse.Builder responseBuilder = UsersWsResponse.newBuilder();
+    users.forEach(user -> {
+      WsPermissions.User.Builder userResponse = responseBuilder.addUsersBuilder()
+        .setLogin(user.getLogin())
+        .addAllPermissions(permissionsByUserId.get(user.getId()));
+      setNullable(user.getEmail(), userResponse::setEmail);
+      setNullable(user.getName(), userResponse::setName);
+    });
+    responseBuilder.getPagingBuilder()
+      .setPageIndex(paging.pageIndex())
+      .setPageSize(paging.pageSize())
+      .setTotal(paging.total())
+      .build();
+    return responseBuilder.build();
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context
@@ -74,7 +110,7 @@ public class TemplateUsersAction implements PermissionsWsAction {
       .setSince("5.2")
       .setDescription("Lists the users with their permission as individual users rather than through group affiliation on the chosen template. <br />" +
         "This service defaults to all users, but can be limited to users with a specific permission by providing the desired permission.<br>" +
-        "It requires administration permissions to access.<br />")
+        "Requires the following permission: 'Administer System'.")
       .addPagingParams(DEFAULT_PAGE_SIZE, RESULTS_MAX_SIZE)
       .setInternal(true)
       .setResponseExample(getClass().getResource("template_users-example.json"))
@@ -106,41 +142,6 @@ public class TemplateUsersAction implements PermissionsWsAction {
     }
   }
 
-  private static PermissionQuery buildQuery(Request wsRequest, PermissionTemplateDto template) {
-    String textQuery = wsRequest.param(TEXT_QUERY);
-    String permission = wsRequest.param(PARAM_PERMISSION);
-    PermissionQuery.Builder query = PermissionQuery.builder()
-      .setTemplate(template.getUuid())
-      .setPermission(permission != null ? validateProjectPermission(permission) : null)
-      .setPageIndex(wsRequest.mandatoryParamAsInt(PAGE))
-      .setPageSize(wsRequest.mandatoryParamAsInt(PAGE_SIZE))
-      .setSearchQuery(textQuery);
-    if (textQuery == null) {
-      query.withAtLeastOnePermission();
-    }
-    return query.build();
-  }
-
-  private static WsPermissions.UsersWsResponse buildResponse(List<UserDto> users, List<PermissionTemplateUserDto> permissionTemplateUsers, Paging paging) {
-    Multimap<Long, String> permissionsByUserId = TreeMultimap.create();
-    permissionTemplateUsers.forEach(userPermission -> permissionsByUserId.put(userPermission.getUserId(), userPermission.getPermission()));
-
-    UsersWsResponse.Builder responseBuilder = UsersWsResponse.newBuilder();
-    users.forEach(user -> {
-      WsPermissions.User.Builder userResponse = responseBuilder.addUsersBuilder()
-        .setLogin(user.getLogin())
-        .addAllPermissions(permissionsByUserId.get(user.getId()));
-      setNullable(user.getEmail(), userResponse::setEmail);
-      setNullable(user.getName(), userResponse::setName);
-    });
-    responseBuilder.getPagingBuilder()
-      .setPageIndex(paging.pageIndex())
-      .setPageSize(paging.pageSize())
-      .setTotal(paging.total())
-      .build();
-    return responseBuilder.build();
-  }
-
   private List<UserDto> findUsers(DbSession dbSession, PermissionQuery query, PermissionTemplateDto template) {
     List<String> orderedLogins = dbClient.permissionTemplateDao().selectUserLoginsByQueryAndTemplate(dbSession, query, template.getId());
     return Ordering.explicit(orderedLogins).onResultOf(UserDto::getLogin).immutableSortedCopy(dbClient.userDao().selectByLogins(dbSession, orderedLogins));
index f2691406dc7246be015f074314f08faaa9c338a4..b78c4c11cd7748b78412b3f99dbfa65226ea6bc0 100644 (file)
@@ -17,6 +17,7 @@
  * 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.permission.ws.template;
 
 import java.util.Date;
@@ -65,11 +66,24 @@ public class UpdateTemplateAction implements PermissionsWsAction {
     this.wsSupport = wsSupport;
   }
 
+  private static UpdateTemplateWsRequest toUpdateTemplateWsRequest(Request request) {
+    return new UpdateTemplateWsRequest()
+      .setId(request.mandatoryParam(PARAM_ID))
+      .setName(request.param(PARAM_NAME))
+      .setDescription(request.param(PARAM_DESCRIPTION))
+      .setProjectKeyPattern(request.param(PARAM_PROJECT_KEY_PATTERN));
+  }
+
+  private static UpdateTemplateWsResponse buildResponse(PermissionTemplateDto permissionTemplate) {
+    PermissionTemplate permissionTemplateBuilder = toPermissionTemplateResponse(permissionTemplate);
+    return UpdateTemplateWsResponse.newBuilder().setPermissionTemplate(permissionTemplateBuilder).build();
+  }
+
   @Override
   public void define(WebService.NewController context) {
     WebService.NewAction action = context.createAction("update_template")
       .setDescription("Update a permission template.<br />" +
-        "It requires administration permissions to access.")
+        "Requires the following permission: 'Administer System'.")
       .setResponseExample(getClass().getResource("update_template-example.json"))
       .setSince("5.2")
       .setPost(true)
@@ -109,14 +123,6 @@ public class UpdateTemplateAction implements PermissionsWsAction {
     }
   }
 
-  private static UpdateTemplateWsRequest toUpdateTemplateWsRequest(Request request) {
-    return new UpdateTemplateWsRequest()
-      .setId(request.mandatoryParam(PARAM_ID))
-      .setName(request.param(PARAM_NAME))
-      .setDescription(request.param(PARAM_DESCRIPTION))
-      .setProjectKeyPattern(request.param(PARAM_PROJECT_KEY_PATTERN));
-  }
-
   private void validateTemplate(DbSession dbSession, PermissionTemplateDto templateToUpdate) {
     validateTemplateNameForUpdate(dbSession, templateToUpdate.getOrganizationUuid(), templateToUpdate.getName(), templateToUpdate.getId());
     validateProjectPattern(templateToUpdate.getKeyPattern());
@@ -137,11 +143,6 @@ public class UpdateTemplateAction implements PermissionsWsAction {
     return dbClient.permissionTemplateDao().update(dbSession, templateToUpdate);
   }
 
-  private static UpdateTemplateWsResponse buildResponse(PermissionTemplateDto permissionTemplate) {
-    PermissionTemplate permissionTemplateBuilder = toPermissionTemplateResponse(permissionTemplate);
-    return UpdateTemplateWsResponse.newBuilder().setPermissionTemplate(permissionTemplateBuilder).build();
-  }
-
   private void validateTemplateNameForUpdate(DbSession dbSession, String organizationUuid, String name, long id) {
     validateTemplateNameFormat(name);