import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_GROUP_ID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_GROUP_NAME;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PERMISSION;
-import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_ID;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_UUID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_KEY;
public class AddGroupAction implements PermissionsWsAction {
.setDescription("Group id")
.setExampleValue("42");
- action.createParam(PARAM_PROJECT_ID)
+ action.createParam(PARAM_PROJECT_UUID)
.setDescription("Project id")
.setExampleValue("ce4c03d6-430f-40a9-b777-ad877c00aa4d");
import org.sonar.server.permission.PermissionUpdater;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PERMISSION;
-import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_ID;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_UUID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_KEY;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_USER_LOGIN;
@Override
public void define(WebService.NewController context) {
WebService.NewAction action = context.createAction(ACTION)
- .setDescription("Add permission to a user.<br /> Requires 'Administer System' permission.")
+ .setDescription("Add permission to a user.<br /> " +
+ "If the project id or project key is provided, a project permission is created.<br />" +
+ "Requires 'Administer System' permission.")
.setSince("5.2")
.setPost(true)
.setHandler(this);
.setDescription("User login")
.setExampleValue("g.hopper");
- action.createParam(PARAM_PROJECT_ID)
+ action.createParam(PARAM_PROJECT_UUID)
.setDescription("Project id")
.setExampleValue("ce4c03d6-430f-40a9-b777-ad877c00aa4d");
public static final String PARAM_PERMISSION = "permission";
public static final String PARAM_GROUP_NAME = "groupName";
public static final String PARAM_GROUP_ID = "groupId";
- public static final String PARAM_PROJECT_ID = "projectId";
+ public static final String PARAM_PROJECT_UUID = "projectId";
public static final String PARAM_PROJECT_KEY = "projectKey";
public static final String PARAM_USER_LOGIN = "login";
PermissionChange permissionChange = new PermissionChange()
.setPermission(permission)
.setUser(userLogin);
- addProjectToPermissionChange(dbSession, permissionChange, request.param(PARAM_PROJECT_ID), request.param(PARAM_PROJECT_KEY));
+ addProjectToPermissionChange(dbSession, permissionChange, request.param(PARAM_PROJECT_UUID), request.param(PARAM_PROJECT_KEY));
return permissionChange;
} finally {
String permission = request.mandatoryParam(PARAM_PERMISSION);
String groupNameParam = request.param(PARAM_GROUP_NAME);
Long groupId = request.paramAsLong(PARAM_GROUP_ID);
- String projectUuid = request.param(PARAM_PROJECT_ID);
+ String projectUuid = request.param(PARAM_PROJECT_UUID);
String projectKey = request.param(PARAM_PROJECT_KEY);
String groupName = searchGroupName(dbSession, groupNameParam, groupId);
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_GROUP_ID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_GROUP_NAME;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PERMISSION;
-import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_ID;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_UUID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_KEY;
public class RemoveGroupAction implements PermissionsWsAction {
.setDescription("Group id")
.setExampleValue("42");
- action.createParam(PARAM_PROJECT_ID)
+ action.createParam(PARAM_PROJECT_UUID)
.setDescription("Project id")
.setExampleValue("ce4c03d6-430f-40a9-b777-ad877c00aa4d");
import org.sonar.server.permission.PermissionChange;
import org.sonar.server.permission.PermissionUpdater;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PERMISSION;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_UUID;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_KEY;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_USER_LOGIN;
+
public class RemoveUserAction implements PermissionsWsAction {
public static final String ACTION = "remove_user";
- public static final String PARAM_PERMISSION = "permission";
- public static final String PARAM_USER_LOGIN = "login";
private final PermissionUpdater permissionUpdater;
+ private final PermissionWsCommons permissionWsCommons;
- public RemoveUserAction(PermissionUpdater permissionUpdater) {
+ public RemoveUserAction(PermissionUpdater permissionUpdater, PermissionWsCommons permissionWsCommons) {
this.permissionUpdater = permissionUpdater;
+ this.permissionWsCommons = permissionWsCommons;
}
@Override
public void define(WebService.NewController context) {
WebService.NewAction action = context.createAction(ACTION)
- .setDescription("Remove permission from a user.<br /> Requires 'Administer System' permission.")
+ .setDescription("Remove permission from a user.<br /> " +
+ "If the project id is provided, a project permission is removed.<br />" +
+ "Requires 'Administer System' permission.")
.setSince("5.2")
.setPost(true)
.setHandler(this);
.setRequired(true)
.setDescription("User login")
.setExampleValue("g.hopper");
+
+ action.createParam(PARAM_PROJECT_UUID)
+ .setDescription("Project id")
+ .setExampleValue("ce4c03d6-430f-40a9-b777-ad877c00aa4d");
+
+ action.createParam(PARAM_PROJECT_KEY)
+ .setDescription("Project key")
+ .setExampleValue("org.apache.hbas:hbase");
}
@Override
public void handle(Request request, Response response) throws Exception {
- String permission = request.mandatoryParam(PARAM_PERMISSION);
- String userLogin = request.mandatoryParam(PARAM_USER_LOGIN);
- permissionUpdater.removePermission(
- new PermissionChange()
- .setPermission(permission)
- .setUser(userLogin)
- );
+ PermissionChange permissionChange = permissionWsCommons.buildUserPermissionChange(request);
+ permissionUpdater.removePermission(permissionChange);
response.noContent();
}
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_GROUP_ID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_GROUP_NAME;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PERMISSION;
-import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_ID;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_UUID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_KEY;
import static org.sonar.server.permission.ws.PermissionsWs.ENDPOINT;
newRequest()
.setParam(PARAM_GROUP_NAME, "sonar-administrators")
- .setParam(PARAM_PROJECT_ID, "project-uuid")
+ .setParam(PARAM_PROJECT_UUID, "project-uuid")
.setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
newRequest()
.setParam(PARAM_GROUP_NAME, "sonar-administrators")
- .setParam(PARAM_PROJECT_ID, "unknown-project-uuid")
+ .setParam(PARAM_PROJECT_UUID, "unknown-project-uuid")
.setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
}
newRequest()
.setParam(PARAM_GROUP_NAME, "sonar-administrators")
- .setParam(PARAM_PROJECT_ID, "file-uuid")
+ .setParam(PARAM_PROJECT_UUID, "file-uuid")
.setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
}
import static org.sonar.server.component.ComponentTesting.newProjectDto;
import static org.sonar.server.permission.ws.AddUserAction.ACTION;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PERMISSION;
-import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_ID;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_UUID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_KEY;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_USER_LOGIN;
ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
.setParam(PARAM_USER_LOGIN, "ray.bradbury")
- .setParam(PARAM_PROJECT_ID, "project-uuid")
+ .setParam(PARAM_PROJECT_UUID, "project-uuid")
.setParam(PermissionWsCommons.PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
.setParam(PARAM_USER_LOGIN, "ray.bradbury")
- .setParam(PARAM_PROJECT_ID, "unknown-project-uuid")
+ .setParam(PARAM_PROJECT_UUID, "unknown-project-uuid")
.setParam(PermissionWsCommons.PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
}
ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
.setParam(PARAM_USER_LOGIN, "ray.bradbury")
- .setParam(PARAM_PROJECT_ID, "file-uuid")
+ .setParam(PARAM_PROJECT_UUID, "file-uuid")
.setParam(PermissionWsCommons.PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
}
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_GROUP_ID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_GROUP_NAME;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PERMISSION;
-import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_ID;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_UUID;
import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_KEY;
import static org.sonar.server.permission.ws.RemoveGroupAction.ACTION;
newRequest()
.setParam(PARAM_GROUP_NAME, "sonar-administrators")
- .setParam(PARAM_PROJECT_ID, "project-uuid")
+ .setParam(PARAM_PROJECT_UUID, "project-uuid")
.setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
newRequest()
.setParam(PARAM_GROUP_NAME, "sonar-administrators")
- .setParam(PARAM_PROJECT_ID, "unknown-project-uuid")
+ .setParam(PARAM_PROJECT_UUID, "unknown-project-uuid")
.setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
}
newRequest()
.setParam(PARAM_GROUP_NAME, "sonar-administrators")
- .setParam(PARAM_PROJECT_ID, "file-uuid")
+ .setParam(PARAM_PROJECT_UUID, "file-uuid")
.setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
}
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import org.junit.rules.ExpectedException;
import org.mockito.ArgumentCaptor;
import org.sonar.api.utils.System2;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
+import org.sonar.db.component.ComponentDto;
+import org.sonar.server.component.ComponentFinder;
+import org.sonar.server.exceptions.BadRequestException;
+import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.exceptions.ServerException;
import org.sonar.server.permission.PermissionChange;
import org.sonar.server.permission.PermissionUpdater;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.ws.WsTester;
+import org.sonar.test.DbTests;
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.component.ComponentTesting.newFileDto;
+import static org.sonar.server.component.ComponentTesting.newProjectDto;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PERMISSION;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_KEY;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_PROJECT_UUID;
+import static org.sonar.server.permission.ws.PermissionWsCommons.PARAM_USER_LOGIN;
import static org.sonar.server.permission.ws.RemoveUserAction.ACTION;
+@Category(DbTests.class)
public class RemoveUserActionTest {
- UserSessionRule userSession = UserSessionRule.standalone();
- WsTester ws;
@Rule
public DbTester db = DbTester.create(System2.INSTANCE);
@Rule
public ExpectedException expectedException = ExpectedException.none();
- private PermissionUpdater permissionUpdater;
+ UserSessionRule userSession = UserSessionRule.standalone();
+ WsTester ws;
+ PermissionUpdater permissionUpdater;
+ DbClient dbClient;
+ DbSession dbSession;
+ ArgumentCaptor<PermissionChange> permissionChangeCaptor = ArgumentCaptor.forClass(PermissionChange.class);
@Before
public void setUp() {
permissionUpdater = mock(PermissionUpdater.class);
+ dbClient = db.getDbClient();
+ dbSession = db.getSession();
ws = new WsTester(new PermissionsWs(
- new RemoveUserAction(permissionUpdater)));
+ new RemoveUserAction(permissionUpdater, new PermissionWsCommons(dbClient, new ComponentFinder(dbClient)))));
userSession.login("admin").setGlobalPermissions(SYSTEM_ADMIN);
}
@Test
public void call_permission_service_with_right_data() throws Exception {
ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
- .setParam(RemoveUserAction.PARAM_USER_LOGIN, "ray.bradbury")
- .setParam(RemoveUserAction.PARAM_PERMISSION, SYSTEM_ADMIN)
+ .setParam(PARAM_USER_LOGIN, "ray.bradbury")
+ .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
- ArgumentCaptor<PermissionChange> permissionChangeCaptor = ArgumentCaptor.forClass(PermissionChange.class);
verify(permissionUpdater).removePermission(permissionChangeCaptor.capture());
PermissionChange permissionChange = permissionChangeCaptor.getValue();
assertThat(permissionChange.user()).isEqualTo("ray.bradbury");
}
@Test
- public void get_request_are_not_authorized() throws Exception {
+ public void remove_with_project_uuid() throws Exception {
+ insertComponent(newProjectDto("project-uuid").setKey("project-key"));
+
+ ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
+ .setParam(PARAM_USER_LOGIN, "ray.bradbury")
+ .setParam(PARAM_PROJECT_UUID, "project-uuid")
+ .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
+ .execute();
+
+ verify(permissionUpdater).removePermission(permissionChangeCaptor.capture());
+ PermissionChange permissionChange = permissionChangeCaptor.getValue();
+ assertThat(permissionChange.component()).isEqualTo("project-key");
+ }
+
+ @Test
+ public void remove_with_project_key() throws Exception {
+ insertComponent(newProjectDto("project-uuid").setKey("project-key"));
+
+ ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
+ .setParam(PARAM_USER_LOGIN, "ray.bradbury")
+ .setParam(PARAM_PROJECT_KEY, "project-key")
+ .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
+ .execute();
+
+ verify(permissionUpdater).removePermission(permissionChangeCaptor.capture());
+ PermissionChange permissionChange = permissionChangeCaptor.getValue();
+ assertThat(permissionChange.component()).isEqualTo("project-key");
+ }
+
+ @Test
+ public void fail_when_project_does_not_exist() throws Exception {
+ expectedException.expect(NotFoundException.class);
+
+ ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
+ .setParam(PARAM_USER_LOGIN, "ray.bradbury")
+ .setParam(PARAM_PROJECT_UUID, "unknown-project-uuid")
+ .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
+ .execute();
+ }
+
+ @Test
+ public void fail_when_component_is_not_a_project() throws Exception {
+ expectedException.expect(BadRequestException.class);
+ insertComponent(newFileDto(newProjectDto(), "file-uuid"));
+
+ ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
+ .setParam(PARAM_USER_LOGIN, "ray.bradbury")
+ .setParam(PARAM_PROJECT_UUID, "file-uuid")
+ .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
+ .execute();
+ }
+
+ @Test
+ public void fail_when_get_request() throws Exception {
expectedException.expect(ServerException.class);
ws.newGetRequest(PermissionsWs.ENDPOINT, ACTION)
- .setParam(RemoveUserAction.PARAM_USER_LOGIN, "george.orwell")
- .setParam(RemoveUserAction.PARAM_PERMISSION, SYSTEM_ADMIN)
+ .setParam(PARAM_USER_LOGIN, "george.orwell")
+ .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
}
expectedException.expect(IllegalArgumentException.class);
ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
- .setParam(RemoveUserAction.PARAM_PERMISSION, SYSTEM_ADMIN)
+ .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
}
expectedException.expect(IllegalArgumentException.class);
ws.newPostRequest(PermissionsWs.ENDPOINT, ACTION)
- .setParam(RemoveUserAction.PARAM_USER_LOGIN, "jrr.tolkien")
+ .setParam(PARAM_USER_LOGIN, "jrr.tolkien")
.execute();
}
+
+ private void insertComponent(ComponentDto component) {
+ dbClient.componentDao().insert(dbSession, component);
+ dbSession.commit();
+ }
}