From 9bd348ba69df3ced03cbbc68a304aafad3181d4d Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Tue, 28 Jul 2015 14:58:21 +0200 Subject: [PATCH] SONAR-6480 WS permissions/add_user add global permission to a user --- .../server/permission/ws/AddUserAction.java | 73 +++++++++++++ .../permission/ws/PermissionsWsModule.java | 3 +- .../permission/ws/AddUserActionTest.java | 100 ++++++++++++++++++ .../ws/PermissionsWsModuleTest.java | 2 +- 4 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/permission/ws/AddUserAction.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/permission/ws/AddUserActionTest.java diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/AddUserAction.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/AddUserAction.java new file mode 100644 index 00000000000..b6e23e75001 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/AddUserAction.java @@ -0,0 +1,73 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.permission.ws; + +import org.sonar.api.server.ws.Request; +import org.sonar.api.server.ws.Response; +import org.sonar.api.server.ws.WebService; +import org.sonar.core.permission.GlobalPermissions; +import org.sonar.server.permission.InternalPermissionService; +import org.sonar.server.permission.PermissionChange; + +public class AddUserAction implements PermissionsWsAction { + + public static final String ACTION = "add_user"; + public static final String PARAM_PERMISSION = "permission"; + public static final String PARAM_USER_LOGIN = "login"; + + private final InternalPermissionService permissionService; + + public AddUserAction(InternalPermissionService permissionService) { + this.permissionService = permissionService; + } + + @Override + public void define(WebService.NewController context) { + WebService.NewAction action = context.createAction(ACTION) + .setDescription("Add permission to a user.
Requires 'Administer System' permission.") + .setSince("5.2") + .setPost(true) + .setHandler(this); + + action.createParam(PARAM_PERMISSION) + .setDescription("Permission") + .setRequired(true) + .setPossibleValues(GlobalPermissions.ALL); + + action.createParam(PARAM_USER_LOGIN) + .setRequired(true) + .setDescription("User login") + .setExampleValue("g.hopper"); + } + + @Override + public void handle(Request request, Response response) throws Exception { + String permission = request.mandatoryParam(PARAM_PERMISSION); + String userLogin = request.mandatoryParam(PARAM_USER_LOGIN); + permissionService.addPermission( + new PermissionChange() + .setPermission(permission) + .setUser(userLogin) + ); + + response.noContent(); + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionsWsModule.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionsWsModule.java index 3ca51ee7b8c..320aa5dcf5e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionsWsModule.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionsWsModule.java @@ -27,6 +27,7 @@ public class PermissionsWsModule extends Module { protected void configureModule() { add( PermissionsWs.class, - AddGroupAction.class); + AddGroupAction.class, + AddUserAction.class); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/AddUserActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/AddUserActionTest.java new file mode 100644 index 00000000000..cdca7081096 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/AddUserActionTest.java @@ -0,0 +1,100 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.permission.ws; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.mockito.ArgumentCaptor; +import org.sonar.api.utils.System2; +import org.sonar.db.DbTester; +import org.sonar.server.exceptions.ServerException; +import org.sonar.server.permission.InternalPermissionService; +import org.sonar.server.permission.PermissionChange; +import org.sonar.server.tester.UserSessionRule; +import org.sonar.server.ws.WsTester; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN; +import static org.sonar.server.permission.ws.AddUserAction.ACTION; + +public class AddUserActionTest { + UserSessionRule userSession = UserSessionRule.standalone(); + WsTester ws; + @Rule + public DbTester db = DbTester.create(System2.INSTANCE); + @Rule + public ExpectedException expectedException = ExpectedException.none(); + private InternalPermissionService permissionService; + + @Before + public void setUp() { + permissionService = mock(InternalPermissionService.class); + ws = new WsTester(new PermissionsWs( + new AddUserAction(permissionService))); + userSession.login("admin").setGlobalPermissions(SYSTEM_ADMIN); + } + + @Test + public void call_permission_service_with_right_data() throws Exception { + ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION) + .setParam(AddUserAction.PARAM_USER_LOGIN, "ray.bradbury") + .setParam(AddUserAction.PARAM_PERMISSION, SYSTEM_ADMIN) + .execute(); + + ArgumentCaptor permissionChangeCaptor = ArgumentCaptor.forClass(PermissionChange.class); + verify(permissionService).addPermission(permissionChangeCaptor.capture()); + PermissionChange permissionChange = permissionChangeCaptor.getValue(); + assertThat(permissionChange.user()).isEqualTo("ray.bradbury"); + assertThat(permissionChange.permission()).isEqualTo(SYSTEM_ADMIN); + } + + @Test + public void get_request_are_not_authorized() throws Exception { + expectedException.expect(ServerException.class); + + ws.newGetRequest(PermissionsWs.ENDPOINT, ACTION) + .setParam(AddUserAction.PARAM_USER_LOGIN, "george.orwell") + .setParam(AddUserAction.PARAM_PERMISSION, SYSTEM_ADMIN) + .execute(); + } + + @Test + public void fail_when_user_login_is_missing() throws Exception { + expectedException.expect(IllegalArgumentException.class); + + ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION) + .setParam(AddUserAction.PARAM_PERMISSION, SYSTEM_ADMIN) + .execute(); + } + + @Test + public void fail_when_permission_is_missing() throws Exception { + expectedException.expect(IllegalArgumentException.class); + + ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION) + .setParam(AddUserAction.PARAM_USER_LOGIN, "jrr.tolkien") + .execute(); + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/PermissionsWsModuleTest.java b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/PermissionsWsModuleTest.java index ca3956f90c0..1e1923ef789 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/permission/ws/PermissionsWsModuleTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/permission/ws/PermissionsWsModuleTest.java @@ -30,6 +30,6 @@ public class PermissionsWsModuleTest { public void verify_count_of_added_components() { ComponentContainer container = new ComponentContainer(); new PermissionsWsModule().configure(container); - assertThat(container.size()).isEqualTo(4); + assertThat(container.size()).isEqualTo(5); } } -- 2.39.5