import org.sonar.server.permission.PermissionUpdater;
import org.sonar.server.user.UserSession;
-import static org.sonar.server.permission.ws.WsParameters.createGroupIdParameter;
import static org.sonar.server.permission.ws.WsParameters.createGroupNameParameter;
import static org.sonar.server.permission.ws.WsParameters.createProjectParameters;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
WebService.NewAction action = context.createAction(ACTION)
.setDescription("Add a 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 />" +
+ "The group name must be provided. <br />" +
"Requires one of the following permissions:" +
"<ul>" +
"<li>'Administer System'</li>" +
"</ul>")
.setSince("5.2")
.setChangelog(
- new Change("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'name' instead."))
+ new Change("10.0", "Parameter 'groupId' is removed. Use 'groupName' instead."),
+ new Change("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."))
.setPost(true)
.setHandler(this);
wsParameters.createPermissionParameter(action, "The permission you would like to grant to the group.");
createGroupNameParameter(action);
- createGroupIdParameter(action);
createProjectParameters(action);
}
import org.sonar.server.permission.GroupUuidOrAnyone;
import org.sonar.server.permission.ws.template.WsTemplateRef;
import org.sonar.server.user.UserSession;
-import org.sonar.server.usergroups.ws.GroupWsRef;
import org.sonar.server.usergroups.ws.GroupWsSupport;
import org.sonarqube.ws.client.permission.PermissionsWsParameters;
import static java.util.Optional.ofNullable;
import static org.sonar.server.exceptions.NotFoundException.checkFound;
import static org.sonar.server.permission.PermissionPrivilegeChecker.checkProjectAdmin;
-import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
public class PermissionWsSupport {
}
public GroupUuidOrAnyone findGroup(DbSession dbSession, Request request) {
- String groupUuid = request.param(PARAM_GROUP_ID);
- String groupName = request.param(PARAM_GROUP_NAME);
- GroupWsRef groupRef = GroupWsRef.create(groupUuid, groupName);
- return groupWsSupport.findGroupOrAnyone(dbSession, groupRef);
+ String groupName = request.mandatoryParam(PARAM_GROUP_NAME);
+ return groupWsSupport.findGroupOrAnyone(dbSession, groupName);
}
public UserId findUser(DbSession dbSession, String login) {
import org.sonar.server.user.UserSession;
import static java.util.Collections.singletonList;
-import static org.sonar.server.permission.ws.WsParameters.createGroupIdParameter;
import static org.sonar.server.permission.ws.WsParameters.createGroupNameParameter;
import static org.sonar.server.permission.ws.WsParameters.createProjectParameters;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
WebService.NewAction action = context.createAction(ACTION)
.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 />" +
+ "The group name must be provided.<br />" +
"Requires one of the following permissions:" +
"<ul>" +
"<li>'Administer System'</li>" +
.setSince("5.2")
.setPost(true)
.setChangelog(
+ new Change("10.0", "Parameter 'groupId' is removed. Use 'groupName' instead."),
new Change("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."))
.setHandler(this);
wsParameters.createPermissionParameter(action, "The permission you would like to revoke from the group.");
createGroupNameParameter(action);
- createGroupIdParameter(action);
createProjectParameters(action);
}
import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_DESCRIPTION;
-import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
public static void createGroupNameParameter(WebService.NewAction action) {
action.createParam(PARAM_GROUP_NAME)
+ .setRequired(true)
.setDescription("Group name or 'anyone' (case insensitive)")
.setExampleValue("sonar-administrators");
}
- public static void createGroupIdParameter(WebService.NewAction action) {
- action.createParam(PARAM_GROUP_ID)
- .setDescription("Group id, use 'name' param instead")
- .setDeprecatedSince("8.4")
- .setExampleValue(UUID_EXAMPLE_01);
- }
-
public static void createProjectParameters(WebService.NewAction action) {
action.createParam(PARAM_PROJECT_ID)
.setDescription("Project id")
import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN;
import static org.sonar.server.exceptions.BadRequestException.checkRequest;
import static org.sonar.server.permission.PermissionPrivilegeChecker.checkGlobalAdmin;
-import static org.sonar.server.permission.ws.WsParameters.createGroupIdParameter;
import static org.sonar.server.permission.ws.WsParameters.createGroupNameParameter;
import static org.sonar.server.permission.ws.WsParameters.createTemplateParameters;
import static org.sonar.server.permission.ws.template.WsTemplateRef.fromRequest;
.setPost(true)
.setSince("5.2")
.setDescription("Add a group to a permission template.<br /> " +
- "The group id or group name must be provided. <br />" +
+ "The group name must be provided. <br />" +
"Requires the following permission: 'Administer System'.")
.setChangelog(
+ new Change("10.0", "Parameter 'groupId' is removed. Use 'groupName' instead."),
new Change("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."))
.setHandler(this);
createTemplateParameters(action);
wsParameters.createProjectPermissionParameter(action);
- createGroupIdParameter(action);
createGroupNameParameter(action);
}
import org.sonar.server.user.UserSession;
import static org.sonar.server.permission.PermissionPrivilegeChecker.checkGlobalAdmin;
-import static org.sonar.server.permission.ws.WsParameters.createGroupIdParameter;
import static org.sonar.server.permission.ws.WsParameters.createGroupNameParameter;
import static org.sonar.server.permission.ws.WsParameters.createTemplateParameters;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
.setPost(true)
.setSince("5.2")
.setDescription("Remove a group from a permission template.<br /> " +
- "The group id or group name must be provided. <br />" +
+ "The group name must be provided. <br />" +
"Requires the following permission: 'Administer System'.")
.setChangelog(
+ new Change("10.0", "Parameter 'groupId' is removed. Use 'groupName' instead."),
new Change("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."))
.setHandler(this);
createTemplateParameters(action);
wsParameters.createProjectPermissionParameter(action);
- createGroupIdParameter(action);
createGroupNameParameter(action);
}
import static java.lang.String.format;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
import static org.sonar.server.exceptions.NotFoundException.checkFound;
-import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_ID;
import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_NAME;
import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_LOGIN;
import static org.sonar.server.usergroups.ws.GroupWsSupport.defineGroupWsParameters;
public void define(NewController context) {
NewAction action = context.createAction("add_user")
.setDescription(format("Add a user to a group.<br />" +
- "'%s' or '%s' must be provided.<br />" +
- "Requires the following permission: 'Administer System'.", PARAM_GROUP_ID, PARAM_GROUP_NAME))
+ "'%s' must be provided.<br />" +
+ "Requires the following permission: 'Administer System'.", PARAM_GROUP_NAME))
.setHandler(this)
.setPost(true)
.setSince("5.2")
.setChangelog(
+ new Change("10.0", "Parameter 'id' is removed. Use 'name' instead."),
new Change("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
defineGroupWsParameters(action);
import static com.google.common.base.Preconditions.checkArgument;
import static java.lang.String.format;
-import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_ID;
import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_NAME;
import static org.sonar.server.usergroups.ws.GroupWsSupport.defineGroupWsParameters;
public void define(NewController context) {
WebService.NewAction action = context.createAction("delete")
.setDescription(format("Delete a group. The default groups cannot be deleted.<br/>" +
- "'%s' or '%s' must be provided.<br />" +
- "Requires the following permission: 'Administer System'.",
- PARAM_GROUP_ID, PARAM_GROUP_NAME))
+ "'%s' must be provided.<br />" +
+ "Requires the following permission: 'Administer System'.", PARAM_GROUP_NAME))
.setHandler(this)
.setSince("5.2")
.setPost(true)
.setChangelog(
+ new Change("10.0", "Parameter 'id' is removed. Use 'name' instead."),
new Change("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
defineGroupWsParameters(action);
package org.sonar.server.usergroups.ws;
import java.util.Optional;
+import org.sonar.api.security.DefaultGroups;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.WebService;
import org.sonar.db.DbClient;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Optional.ofNullable;
-import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01;
import static org.sonar.server.exceptions.BadRequestException.checkRequest;
-import static org.sonar.server.exceptions.NotFoundException.checkFound;
import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional;
/**
static final String PARAM_GROUP_ID = "id";
static final String PARAM_GROUP_NAME = "name";
+ static final String PARAM_GROUP_CURRENT_NAME = "currentName";
static final String PARAM_GROUP_DESCRIPTION = "description";
static final String PARAM_LOGIN = "login";
}
/**
- * Find a group by its id (parameter {@link #PARAM_GROUP_ID}) or group name (parameter {@link #PARAM_GROUP_NAME}). The virtual
+ * Find a group by its group name (parameter {@link #PARAM_GROUP_NAME}). The virtual
* group "Anyone" is not supported.
*
* @throws NotFoundException if parameters are missing/incorrect, if the requested group does not exist
}
public GroupDto findGroupDto(DbSession dbSession, Request request) {
- String uuid = request.param(PARAM_GROUP_ID);
- String name = request.param(PARAM_GROUP_NAME);
- return findGroupDto(dbSession, GroupWsRef.create(uuid, name));
+ String groupName = request.mandatoryParam(PARAM_GROUP_NAME);
+ return findGroupDto(dbSession, groupName);
}
- public GroupDto findGroupDto(DbSession dbSession, GroupWsRef ref) {
- if (ref.hasUuid()) {
- GroupDto group = dbClient.groupDao().selectByUuid(dbSession, ref.getUuid());
- checkFound(group, "No group with id '%s'", ref.getUuid());
- return group;
- }
+ public GroupDto findGroupDto(DbSession dbSession, String groupName) {
- Optional<GroupDto> group = dbClient.groupDao().selectByName(dbSession, ref.getName());
- checkFoundWithOptional(group, "No group with name '%s'", ref.getName());
+ Optional<GroupDto> group = dbClient.groupDao().selectByName(dbSession, groupName);
+ checkFoundWithOptional(group, "No group with name '%s'", groupName);
return group.get();
}
- public GroupUuidOrAnyone findGroupOrAnyone(DbSession dbSession, GroupWsRef ref) {
- if (ref.hasUuid()) {
- GroupDto group = dbClient.groupDao().selectByUuid(dbSession, ref.getUuid());
- checkFound(group, "No group with id '%s'", ref.getUuid());
- return GroupUuidOrAnyone.from(group);
- }
+ public GroupUuidOrAnyone findGroupOrAnyone(DbSession dbSession, String groupName) {
- if (ref.isAnyone()) {
+ if (DefaultGroups.isAnyone(groupName)) {
return GroupUuidOrAnyone.forAnyone();
}
- Optional<GroupDto> group = dbClient.groupDao().selectByName(dbSession, ref.getName());
- checkFoundWithOptional(group, "No group with name '%s'", ref.getName());
+ Optional<GroupDto> group = dbClient.groupDao().selectByName(dbSession, groupName);
+ checkFoundWithOptional(group, "No group with name '%s'", groupName);
return GroupUuidOrAnyone.from(group.get());
}
}
static void defineGroupWsParameters(WebService.NewAction action) {
- defineGroupIdWsParameter(action);
defineGroupNameWsParameter(action);
}
- private static void defineGroupIdWsParameter(WebService.NewAction action) {
- action.createParam(PARAM_GROUP_ID)
- .setDescription("Group id, use 'name' instead")
- .setDeprecatedSince("8.4")
- .setExampleValue(UUID_EXAMPLE_01);
- }
-
private static void defineGroupNameWsParameter(WebService.NewAction action) {
action.createParam(PARAM_GROUP_NAME)
+ .setRequired(true)
.setDescription("Group name")
.setExampleValue("sonar-administrators");
}
import static java.lang.String.format;
import static org.sonar.server.exceptions.BadRequestException.checkRequest;
import static org.sonar.server.exceptions.NotFoundException.checkFound;
-import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_ID;
import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_NAME;
import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_LOGIN;
import static org.sonar.server.usergroups.ws.GroupWsSupport.defineGroupWsParameters;
public void define(NewController context) {
NewAction action = context.createAction("remove_user")
.setDescription(format("Remove a user from a group.<br />" +
- "'%s' or '%s' must be provided.<br>" +
- "Requires the following permission: 'Administer System'.",
- PARAM_GROUP_ID, PARAM_GROUP_NAME))
+ "'%s' must be provided.<br>" +
+ "Requires the following permission: 'Administer System'.", PARAM_GROUP_NAME))
.setHandler(this)
.setPost(true)
.setSince("5.2")
.setChangelog(
+ new Change("10.0", "Parameter 'id' is removed. Use 'name' instead."),
new Change("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
defineGroupWsParameters(action);
import org.sonarqube.ws.UserGroups;
import static java.lang.String.format;
-import static java.util.Optional.ofNullable;
import static org.sonar.api.user.UserGroupValidation.GROUP_NAME_MAX_LENGTH;
import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
-import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_CURRENT_NAME;
import static org.sonar.server.usergroups.ws.GroupWsSupport.DESCRIPTION_MAX_LENGTH;
+import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_CURRENT_NAME;
import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_DESCRIPTION;
-import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_ID;
import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_NAME;
import static org.sonar.server.usergroups.ws.GroupWsSupport.toProtobuf;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
.setResponseExample(getClass().getResource("update.example.json"))
.setSince("5.2")
.setChangelog(
+ new Change("10.0", "Parameter 'id' is removed in favor of 'currentName'"),
new Change("8.5", "Parameter 'id' deprecated in favor of 'currentName'"),
new Change("8.4", "Parameter 'id' format changes from integer to string"),
new Change("6.4", "The default group is no longer editable"));
- action.createParam(PARAM_GROUP_ID)
- .setDescription("Identifier of the group. Use '" + PARAM_CURRENT_NAME + "' instead.")
- .setExampleValue(UUID_EXAMPLE_01)
- .setDeprecatedSince("8.5");
-
- action.createParam(PARAM_CURRENT_NAME)
- .setDescription("Name of the group to be updated. Mandatory unless '" + PARAM_GROUP_ID + "' is used.")
+ action.createParam(PARAM_GROUP_CURRENT_NAME)
+ .setDescription("Name of the group to be updated.")
+ .setRequired(true)
.setExampleValue(UUID_EXAMPLE_01)
.setSince("8.5");
@Override
public void handle(Request request, Response response) throws Exception {
try (DbSession dbSession = dbClient.openSession(false)) {
- String groupUuid = request.param(PARAM_GROUP_ID);
- String currentName = request.param(PARAM_CURRENT_NAME);
+ String currentName = request.mandatoryParam(PARAM_GROUP_CURRENT_NAME);
- if ((groupUuid == null && currentName == null) || (groupUuid != null && currentName != null)) {
- throw new IllegalArgumentException(format("Need to specify one and only one of '%s' or '%s'", PARAM_GROUP_ID, PARAM_CURRENT_NAME));
- }
-
- GroupDto group;
- if (groupUuid != null) {
- group = ofNullable(dbClient.groupDao().selectByUuid(dbSession, groupUuid))
- .orElseThrow(() -> new NotFoundException(format("Could not find a user group with id '%s'.", groupUuid)));
- } else {
- group = dbClient.groupDao().selectByName(dbSession, currentName)
+ GroupDto group = dbClient.groupDao().selectByName(dbSession, currentName)
.orElseThrow(() -> new NotFoundException(format("Could not find a user group with name '%s'.", currentName)));
- }
userSession.checkPermission(ADMINISTER);
support.checkGroupIsNotDefault(dbSession, group);
.addSearchQuery("freddy", "names", "logins")
.addPagingParams(25)
.setChangelog(
+ new Change("10.0", "Parameter 'id' is removed. Use 'name' instead."),
new Change("9.8", "response fields 'total', 's', 'ps' have been deprecated, please use 'paging' object instead."),
new Change("9.8", "The field 'paging' has been added to the response."),
new Change("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
import static org.sonar.db.permission.GlobalPermission.SCAN;
-import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PROJECT_ID;
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isTrue();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
- tuple("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'name' instead."));
+ tuple("10.0", "Parameter 'groupId' is removed. Use 'groupName' instead."),
+ tuple("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."));
}
@Test
assertThat(db.users().selectGroupPermissions(group, null)).containsOnly("provisioning");
}
- @Test
- public void add_permission_to_group_referenced_by_its_id() {
- GroupDto group = db.users().insertGroup("sonar-administrators");
- loginAsAdmin();
-
- newRequest()
- .setParam(PARAM_GROUP_ID, group.getUuid())
- .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
- .execute();
-
- assertThat(db.users().selectGroupPermissions(group, null)).containsOnly(SYSTEM_ADMIN);
- }
@Test
public void add_permission_to_project_referenced_by_its_id() {
}
@Test
- public void fail_when_group_name_and_group_id_are_missing() {
+ public void fail_when_group_name_is_missing() {
loginAsAdmin();
assertThatThrownBy(() -> {
.setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
})
- .isInstanceOf(BadRequestException.class)
- .hasMessage("Group name or group id must be provided");
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("The 'groupName' parameter is missing");
}
@Test
import static org.sonar.db.component.ComponentTesting.newSubPortfolio;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
-import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PROJECT_ID;
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isTrue();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
+ tuple("10.0", "Parameter 'groupId' is removed. Use 'groupName' instead."),
tuple("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."));
}
assertThat(db.users().selectGroupPermissions(aGroup, null)).containsOnly(ADMINISTER.getKey());
}
- @Test
- public void remove_permission_using_group_id() {
- db.users().insertPermissionOnGroup(aGroup, ADMINISTER);
- db.users().insertPermissionOnGroup(aGroup, PROVISION_PROJECTS);
- loginAsAdmin();
-
- newRequest()
- .setParam(PARAM_GROUP_ID, aGroup.getUuid())
- .setParam(PARAM_PERMISSION, PROVISION_PROJECTS.getKey())
- .execute();
-
- assertThat(db.users().selectGroupPermissions(aGroup, null)).containsOnly(ADMINISTER.getKey());
- }
-
@Test
public void remove_project_permission() {
ComponentDto project = db.components().insertPrivateProject();
.setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
.execute();
})
- .isInstanceOf(BadRequestException.class)
- .hasMessage("Group name or group id must be provided");
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("The 'groupName' parameter is missing");
}
@Test
.hasMessage("The 'permission' parameter is missing");
}
- @Test
- public void fail_when_group_id_does_not_exist() {
- loginAsAdmin();
-
- assertThatThrownBy(() -> {
- newRequest()
- .setParam(PARAM_PERMISSION, SYSTEM_ADMIN)
- .setParam(PARAM_GROUP_ID, "999999")
- .execute();
- })
- .isInstanceOf(NotFoundException.class)
- .hasMessage("No group with id '999999'");
- }
-
@Test
public void fail_when_project_uuid_and_project_key_are_provided() {
ComponentDto project = db.components().insertPrivateProject();
import static org.sonar.api.web.UserRole.ADMIN;
import static org.sonar.api.web.UserRole.CODEVIEWER;
import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID;
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isTrue();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
- tuple("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."));
+ tuple("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."),
+ tuple("10.0", "Parameter 'groupId' is removed. Use 'groupName' instead."));
}
@Test
assertThat(getGroupNamesInTemplateAndPermission(template, CODEVIEWER)).containsExactly(group.getName());
}
- @Test
- public void add_with_group_id() {
- loginAsAdmin();
-
- newRequest()
- .setParam(PARAM_TEMPLATE_ID, template.getUuid())
- .setParam(PARAM_PERMISSION, CODEVIEWER)
- .setParam(PARAM_GROUP_ID, String.valueOf(group.getUuid()))
- .execute();
-
- assertThat(getGroupNamesInTemplateAndPermission(template, CODEVIEWER)).containsExactly(group.getName());
- }
-
@Test
public void does_not_add_a_group_twice() {
loginAsAdmin();
loginAsAdmin();
assertThatThrownBy(() -> newRequest(null, template.getUuid(), CODEVIEWER))
- .isInstanceOf(BadRequestException.class);
+ .isInstanceOf(IllegalArgumentException.class);
}
@Test
import static org.sonar.api.security.DefaultGroups.ANYONE;
import static org.sonar.api.web.UserRole.CODEVIEWER;
import static org.sonar.db.permission.GlobalPermission.SCAN;
-import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID;
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isTrue();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
+ tuple("10.0", "Parameter 'groupId' is removed. Use 'groupName' instead."),
tuple("8.4", "Parameter 'groupId' is deprecated. Format changes from integer to string. Use 'groupName' instead."));
}
assertThat(getGroupNamesInTemplateAndPermission(template, PERMISSION)).isEmpty();
}
- @Test
- public void remove_group_with_group_id() {
- newRequest()
- .setParam(PARAM_TEMPLATE_ID, template.getUuid())
- .setParam(PARAM_PERMISSION, PERMISSION)
- .setParam(PARAM_GROUP_ID, String.valueOf(group.getUuid()))
- .execute();
-
- assertThat(getGroupNamesInTemplateAndPermission(template, PERMISSION)).isEmpty();
- }
-
@Test
public void remove_group_twice_without_error() {
newRequest(group.getName(), template.getUuid(), PERMISSION);
assertThatThrownBy(() -> {
newRequest(null, template.getUuid(), PERMISSION);
})
- .isInstanceOf(BadRequestException.class);
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("The 'groupName' parameter is missing");
}
@Test
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isTrue();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
+ tuple("10.0", "Parameter 'id' is removed. Use 'name' instead."),
tuple("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
}
- @Test
- public void add_user_to_group_referenced_by_its_id() {
- insertDefaultGroup();
- GroupDto group = db.users().insertGroup();
- UserDto user = db.users().insertUser();
- loginAsAdmin();
-
- newRequest()
- .setParam("id", group.getUuid())
- .setParam("login", user.getLogin())
- .execute();
-
- assertThat(db.users().selectGroupUuidsOfUser(user)).containsOnly(group.getUuid());
- }
@Test
public void add_user_to_group_referenced_by_its_name() {
loginAsAdmin();
newRequest()
- .setParam("id", admins.getUuid())
- .setParam("login", user.getLogin())
+ .setParam(PARAM_GROUP_NAME, admins.getName())
+ .setParam(PARAM_LOGIN, user.getLogin())
.execute();
assertThat(db.users().selectGroupUuidsOfUser(user)).containsOnly(admins.getUuid(), users.getUuid());
loginAsAdmin();
newRequest()
- .setParam("id", users.getUuid())
- .setParam("login", user.getLogin())
+ .setParam(PARAM_GROUP_NAME, users.getName())
+ .setParam(PARAM_LOGIN, user.getLogin())
.execute();
// do not insert duplicated row
loginAsAdmin();
newRequest()
- .setParam("id", users.getUuid())
- .setParam("login", user2.getLogin())
+ .setParam(PARAM_GROUP_NAME, users.getName())
+ .setParam(PARAM_LOGIN, user2.getLogin())
.execute();
assertThat(db.users().selectGroupUuidsOfUser(user1)).containsOnly(users.getUuid());
loginAsAdmin();
TestResponse response = newRequest()
- .setParam("id", group.getUuid())
- .setParam("login", user.getLogin())
+ .setParam(PARAM_GROUP_NAME, group.getName())
+ .setParam(PARAM_LOGIN, user.getLogin())
.execute();
assertThat(response.getStatus()).isEqualTo(HTTP_NO_CONTENT);
public void fail_if_group_does_not_exist() {
UserDto user = db.users().insertUser();
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, "unknown")
+ .setParam(PARAM_LOGIN, user.getLogin());
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", "42")
- .setParam("login", user.getLogin())
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(NotFoundException.class)
- .hasMessage("No group with id '42'");
+ .hasMessage("No group with name 'unknown'");
}
@Test
public void fail_if_user_does_not_exist() {
GroupDto group = db.users().insertGroup("admins");
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, group.getName())
+ .setParam(PARAM_LOGIN, "my-admin");
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", group.getUuid())
- .setParam("login", "my-admin")
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(NotFoundException.class)
.hasMessage("Could not find a user with login 'my-admin'");
}
UserDto user = db.users().insertUser();
GroupDto defaultGroup = db.users().insertDefaultGroup();
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, defaultGroup.getName())
+ .setParam(PARAM_LOGIN, user.getLogin());
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", defaultGroup.getUuid())
- .setParam(PARAM_LOGIN, user.getLogin())
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Default group 'sonar-users' cannot be used to perform this action");
}
GroupDto group = db.users().insertGroup();
UserDto user = db.users().insertUser();
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_LOGIN, user.getLogin())
+ .setParam(PARAM_GROUP_NAME, group.getName());
- assertThatThrownBy(() -> {
- newRequest()
- .setParam(PARAM_LOGIN, user.getLogin())
- .setParam(PARAM_GROUP_NAME, group.getName())
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalStateException.class)
.hasMessage("Default group cannot be found");
}
private void executeRequest(GroupDto groupDto, UserDto userDto) {
newRequest()
- .setParam("id", groupDto.getUuid())
- .setParam("login", userDto.getLogin())
+ .setParam(PARAM_GROUP_NAME, groupDto.getName())
+ .setParam(PARAM_LOGIN, userDto.getLogin())
.execute();
}
import org.sonar.db.qualityprofile.QProfileDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
-import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.usergroups.DefaultGroupFinder;
import org.sonar.server.ws.TestRequest;
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
-import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_ID;
import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_NAME;
public class DeleteActionTest {
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isTrue();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
+ tuple("10.0", "Parameter 'id' is removed. Use 'name' instead."),
tuple("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
}
loginAsAdmin();
TestResponse response = newRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.execute();
assertThat(response.getStatus()).isEqualTo(204);
}
- @Test
- public void delete_by_id() {
- addAdmin();
- insertDefaultGroup();
- GroupDto group = db.users().insertGroup();
- loginAsAdmin();
-
- newRequest()
- .setParam("id", group.getUuid())
- .execute();
-
- assertThat(db.users().selectGroupByUuid(group.getUuid())).isNull();
- }
-
@Test
public void delete_by_name() {
addAdmin();
loginAsAdmin();
newRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.execute();
assertThat(db.countRowsOfTable("groups_users")).isZero();
loginAsAdmin();
newRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.execute();
assertThat(db.countRowsOfTable("group_roles")).isZero();
assertThat(db.countRowsOfTable("perm_templates_groups")).isOne();
newRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.execute();
assertThat(db.countRowsOfTable("perm_templates_groups")).isZero();
loginAsAdmin();
newRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.execute();
assertThat(db.countRowsOfTable("qprofile_edit_groups")).isZero();
loginAsAdmin();
newRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.execute();
assertThat(db.countRowsOfTable("qgate_group_permissions")).isZero();
}
- @Test
- public void fail_if_id_does_not_exist() {
- addAdmin();
- loginAsAdmin();
- int groupId = 123;
-
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", String.valueOf(groupId))
- .execute();
- })
- .isInstanceOf(NotFoundException.class)
- .hasMessage("No group with id '" + groupId + "'");
- }
@Test
public void fail_to_delete_default_group() {
assertThatThrownBy(() -> {
newRequest()
- .setParam("id", defaultGroup.getUuid())
+ .setParam(PARAM_GROUP_NAME, defaultGroup.getName())
.execute();
})
.isInstanceOf(IllegalArgumentException.class)
GroupDto group = db.users().insertGroup();
db.users().insertPermissionOnGroup(group, SYSTEM_ADMIN);
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, group.getName());
- assertThatThrownBy(() -> {
- newRequest()
- .setParam(PARAM_GROUP_NAME, group.getName())
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("The last system admin group cannot be deleted");
}
private void executeDeleteGroupRequest(GroupDto adminGroup1) {
newRequest()
- .setParam(PARAM_GROUP_ID, adminGroup1.getUuid())
+ .setParam(PARAM_GROUP_NAME, adminGroup1.getName())
.execute();
}
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isTrue();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
+ tuple("10.0", "Parameter 'id' is removed. Use 'name' instead."),
tuple("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
}
loginAsAdmin();
newRequest()
- .setParam("id", group.getUuid())
- .setParam("login", user.getLogin())
- .execute();
-
- assertThat(db.users().selectGroupUuidsOfUser(user)).isEmpty();
- }
-
- @Test
- public void remove_user_by_group_id() {
- // keep an administrator
- insertAnAdministrator();
- insertDefaultGroup();
- GroupDto users = db.users().insertGroup("users");
- UserDto user = db.users().insertUser("my-admin");
- db.users().insertMember(users, user);
- loginAsAdmin();
-
- newRequest()
- .setParam("id", users.getUuid())
- .setParam("login", user.getLogin())
+ .setParam(PARAM_GROUP_NAME, group.getName())
+ .setParam(PARAM_LOGIN, user.getLogin())
.execute();
assertThat(db.users().selectGroupUuidsOfUser(user)).isEmpty();
loginAsAdmin();
newRequest()
- .setParam("id", admins.getUuid())
- .setParam("login", user.getLogin())
+ .setParam(PARAM_GROUP_NAME, admins.getName())
+ .setParam(PARAM_LOGIN, user.getLogin())
.execute();
assertThat(db.users().selectGroupUuidsOfUser(user)).containsOnly(users.getUuid());
loginAsAdmin();
TestResponse response = newRequest()
- .setParam("id", users.getUuid())
- .setParam("login", user.getLogin())
+ .setParam(PARAM_GROUP_NAME, users.getName())
+ .setParam(PARAM_LOGIN, user.getLogin())
.execute();
assertThat(response.getStatus()).isEqualTo(HTTP_NO_CONTENT);
@Test
public void fail_if_unknown_group() {
UserDto user = db.users().insertUser("my-admin");
+ loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, "unknown")
+ .setParam(PARAM_LOGIN, user.getLogin());
- assertThatThrownBy(() -> {
- loginAsAdmin();
- newRequest()
- .setParam("id", "42")
- .setParam("login", user.getLogin())
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(NotFoundException.class);
}
public void fail_if_unknown_user() {
insertDefaultGroup();
GroupDto group = db.users().insertGroup("admins");
+ loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, group.getName())
+ .setParam(PARAM_LOGIN, "my-admin");
- assertThatThrownBy(() -> {
- loginAsAdmin();
- newRequest()
- .setParam("id", group.getUuid())
- .setParam("login", "my-admin")
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(NotFoundException.class);
}
UserDto user = db.users().insertUser();
db.users().insertMember(group, user);
userSession.logIn("admin");
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, group.getName())
+ .setParam(PARAM_LOGIN, user.getLogin());
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", group.getUuid())
- .setParam("login", user.getLogin())
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(ForbiddenException.class)
.hasMessage("Insufficient privileges");
}
UserDto adminUser = db.users().insertUser("the-single-admin");
db.users().insertMember(adminGroup, adminUser);
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, adminGroup.getName())
+ .setParam(PARAM_LOGIN, adminUser.getLogin());
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", adminGroup.getUuid())
- .setParam("login", adminUser.getLogin())
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(BadRequestException.class)
.hasMessage("The last administrator user cannot be removed");
}
GroupDto defaultGroup = db.users().insertDefaultGroup();
db.users().insertMember(defaultGroup, user);
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, defaultGroup.getName())
+ .setParam(PARAM_LOGIN, user.getLogin());
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", defaultGroup.getUuid())
- .setParam(PARAM_LOGIN, user.getLogin())
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Default group 'sonar-users' cannot be used to perform this action");
}
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
+import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_CURRENT_NAME;
+import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_DESCRIPTION;
+import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_NAME;
import static org.sonar.test.JsonAssert.assertJson;
public class UpdateActionTest {
loginAsAdmin();
String result = newRequest()
- .setParam("id", group.getUuid())
- .setParam("name", "new-name")
- .setParam("description", "New Description")
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_NAME, "new-name")
+ .setParam(PARAM_GROUP_DESCRIPTION, "New Description")
.execute().getInput();
- assertJson(result).isSimilarTo("{" +
- " \"group\": {" +
- " \"name\": \"new-name\"," +
- " \"description\": \"New Description\"," +
- " \"membersCount\": 1" +
- " }" +
- "}");
+ assertJson(result).isSimilarTo("""
+ {
+ "group": {
+ "name": "new-name",
+ "description": "New Description",
+ "membersCount": 1
+ }
+ }""");
}
@Test
loginAsAdmin();
String result = newRequest()
- .setParam("id", group.getUuid())
- .setParam("name", "new-name")
- .execute().getInput();
-
- assertJson(result).isSimilarTo("{" +
- " \"group\": {" +
- " \"name\": \"new-name\"," +
- " \"description\": \"" + group.getDescription() + "\"," +
- " \"membersCount\": 0" +
- " }" +
- "}");
- }
-
- @Test
- public void update_only_name_by_name() {
- insertDefaultGroup();
- GroupDto group = db.users().insertGroup();
- loginAsAdmin();
-
- String result = newRequest()
- .setParam("currentName", group.getName())
- .setParam("name", "new-name")
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_NAME, "new-name")
.execute().getInput();
- assertJson(result).isSimilarTo("{" +
- " \"group\": {" +
- " \"name\": \"new-name\"," +
- " \"description\": \"" + group.getDescription() + "\"," +
- " \"membersCount\": 0" +
- " }" +
- "}");
+ assertJson(result).isSimilarTo(String.format("""
+ {
+ "group": {
+ "name": "new-name",
+ "description": "%s",
+ "membersCount": 0
+ }
+ }""", group.getDescription()));
}
@Test
loginAsAdmin();
String result = newRequest()
- .setParam("id", group.getUuid())
- .setParam("description", "New Description")
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_DESCRIPTION, "New Description")
.execute().getInput();
- assertJson(result).isSimilarTo("{" +
- " \"group\": {" +
- " \"name\": \"" + group.getName() + "\"," +
- " \"description\": \"New Description\"," +
- " \"membersCount\": 0" +
- " }" +
- "}");
+ assertJson(result).isSimilarTo(String.format("""
+ {
+ "group": {
+ "name": "%s",
+ "description": "New Description",
+ "membersCount": 0
+ }
+ }""", group.getName()));
}
@Test
loginAsAdmin();
String result = newRequest()
- .setParam("id", group.getUuid())
- .setParam("name", "new-name")
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_NAME, "new-name")
.execute().getInput();
assertJson(result).isSimilarTo("{" +
assertThatThrownBy(() -> {
newRequest()
- .setParam("id", group.getUuid())
- .setParam("name", "some-product-bu")
- .setParam("description", "Business Unit for Some Awesome Product")
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_NAME, "some-product-bu")
+ .setParam(PARAM_GROUP_DESCRIPTION, "Business Unit for Some Awesome Product")
.execute();
})
.isInstanceOf(ForbiddenException.class);
insertDefaultGroup();
GroupDto group = db.users().insertGroup();
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_NAME, "");
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", group.getUuid())
- .setParam("name", "")
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Group name cannot be empty");
}
@Test
- public void fail_if_no_id_and_no_currentname_are_provided() {
+ public void fail_if_no_currentname_are_provided() {
insertDefaultGroup();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_NAME, "newname");
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("name", "newname")
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Need to specify one and only one of 'id' or 'currentName'");
- }
-
- @Test
- public void fail_if_both_id_and_currentname_are_provided() {
- insertDefaultGroup();
-
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", "id")
- .setParam("currentName", "name")
- .execute();
- })
- .isInstanceOf(IllegalArgumentException.class)
- .hasMessage("Need to specify one and only one of 'id' or 'currentName'");
+ .hasMessage("The 'currentName' parameter is missing");
}
@Test
insertDefaultGroup();
GroupDto group = db.users().insertGroup();
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_NAME, "AnYoNe");
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", group.getUuid())
- .setParam("name", "AnYoNe")
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Anyone group cannot be used");
}
String newName = "new-name";
db.users().insertGroup(newName);
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_CURRENT_NAME, groupToBeRenamed.getName())
+ .setParam(PARAM_GROUP_NAME, newName);
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", groupToBeRenamed.getUuid())
- .setParam("name", newName)
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(ServerException.class)
.hasMessage("Group 'new-name' already exists");
}
- @Test
- public void fail_if_unknown_group_id() {
- loginAsAdmin();
-
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", "42")
- .execute();
- })
- .isInstanceOf(NotFoundException.class)
- .hasMessage("Could not find a user group with id '42'.");
- }
-
@Test
public void fail_if_unknown_group_name() {
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_CURRENT_NAME, "42");
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("currentName", "42")
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(NotFoundException.class)
.hasMessage("Could not find a user group with name '42'.");
}
public void fail_to_update_default_group_name() {
GroupDto group = db.users().insertDefaultGroup();
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_NAME, "new name");
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", group.getUuid())
- .setParam("name", "new name")
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Default group 'sonar-users' cannot be used to perform this action");
}
public void fail_to_update_default_group_description() {
GroupDto group = db.users().insertDefaultGroup();
loginAsAdmin();
+ TestRequest request = newRequest()
+ .setParam(PARAM_GROUP_CURRENT_NAME, group.getName())
+ .setParam(PARAM_GROUP_DESCRIPTION, "new description");
- assertThatThrownBy(() -> {
- newRequest()
- .setParam("id", group.getUuid())
- .setParam("description", "new description")
- .execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Default group 'sonar-users' cannot be used to perform this action");
}
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
import static org.sonar.db.user.UserTesting.newUserDto;
-import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_ID;
+import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_NAME;
import static org.sonar.test.JsonAssert.assertJson;
public class UsersActionTest {
assertThat(wsDef.since()).isEqualTo("5.2");
assertThat(wsDef.isPost()).isFalse();
assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
+ tuple("10.0", "Parameter 'id' is removed. Use 'name' instead."),
tuple("9.8", "response fields 'total', 's', 'ps' have been deprecated, please use 'paging' object instead."),
tuple("9.8", "The field 'paging' has been added to the response."),
tuple("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
@Test
public void fail_if_unknown_group_uuid() {
loginAsAdmin();
+ TestRequest request = newUsersRequest()
+ .setParam(PARAM_GROUP_NAME, "unknown")
+ .setParam("login", "john");
- assertThatThrownBy(() -> {
- newUsersRequest()
- .setParam("id", "42")
- .setParam("login", "john").execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(NotFoundException.class)
- .hasMessage("No group with id '42'");
+ .hasMessage("No group with name 'unknown'");
}
@Test
public void fail_if_not_admin() {
GroupDto group = db.users().insertGroup();
userSession.logIn("not-admin");
+ TestRequest request = newUsersRequest()
+ .setParam(PARAM_GROUP_NAME, group.getName())
+ .setParam("login", "john");
- assertThatThrownBy(() -> {
- newUsersRequest()
- .setParam("id", group.getUuid())
- .setParam("login", "john").execute();
- })
+ assertThatThrownBy(request::execute)
.isInstanceOf(ForbiddenException.class);
}
String result = newUsersRequest()
.setParam("login", "john")
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.execute()
.getInput();
- assertJson(result).isSimilarTo("{\n" +
- " \"p\": 1,\n" +
- " \"total\": 0,\n" +
- " \"paging\": {\n" +
- " \"pageIndex\": 1,\n" +
- " \"pageSize\": 25,\n" +
- " \"total\": 0\n" +
- " }," +
- " \"users\": []\n" +
- "}");
- }
-
- @Test
- public void return_members_by_group_uuid() {
- GroupDto group = db.users().insertGroup();
- UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada.login").setName("Ada Lovelace"));
- UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper"));
- db.users().insertMember(group, lovelace);
- loginAsAdmin();
-
- String result = newUsersRequest()
- .setParam("id", group.getUuid())
- .setParam(Param.SELECTED, SelectionMode.ALL.value())
- .execute()
- .getInput();
-
- assertJson(result).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" +
- " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
- " ]\n" +
- "}\n");
+ assertJson(result).isSimilarTo("""
+ {
+ "p": 1,
+ "total": 0,
+ "paging": {
+ "pageIndex": 1,
+ "pageSize": 25,
+ "total": 0
+ }, "users": []
+ }""");
}
@Test
loginAsAdmin();
String result = newUsersRequest()
- .setParam("name", group.getName())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.setParam(Param.SELECTED, SelectionMode.ALL.value())
.execute()
.getInput();
- assertJson(result).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" +
- " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
- " ]\n" +
- "}\n");
+ assertJson(result).isSimilarTo("""
+ {
+ "users": [
+ {"login": "ada.login", "name": "Ada Lovelace", "selected": true},
+ {"login": "grace", "name": "Grace Hopper", "selected": false}
+ ]
+ }
+ """);
}
@Test
db.users().insertMember(group, graceHopper);
loginAsAdmin();
- String response = newUsersRequest().setParam(PARAM_GROUP_ID, group.getUuid()).execute().getInput();
+ String response = newUsersRequest().setParam(PARAM_GROUP_NAME, group.getName()).execute().getInput();
assertThat(response).contains("Ada Lovelace", "Grace Hopper");
}
loginAsAdmin();
assertJson(newUsersRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.execute()
- .getInput()).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\"login\": \"ada\", \"name\": \"Ada Lovelace\", \"selected\": true}\n" +
- " ]\n" +
- "}");
+ .getInput()).isSimilarTo("""
+ {
+ "users": [
+ {"login": "ada", "name": "Ada Lovelace", "selected": true}
+ ]
+ }""");
assertJson(newUsersRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.setParam(Param.SELECTED, SelectionMode.SELECTED.value())
.execute()
- .getInput()).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\"login\": \"ada\", \"name\": \"Ada Lovelace\", \"selected\": true}\n" +
- " ]\n" +
- "}");
+ .getInput()).isSimilarTo("""
+ {
+ "users": [
+ {"login": "ada", "name": "Ada Lovelace", "selected": true}
+ ]
+ }""");
}
@Test
loginAsAdmin();
String result = newUsersRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.setParam(Param.SELECTED, SelectionMode.DESELECTED.value())
.execute()
.getInput();
- assertJson(result).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
- " ]\n" +
- "}");
+ assertJson(result).isSimilarTo("""
+ {
+ "users": [
+ {"login": "grace", "name": "Grace Hopper", "selected": false}
+ ]
+ }""");
}
@Test
loginAsAdmin();
assertJson(newUsersRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.setParam("ps", "1")
.setParam(Param.SELECTED, SelectionMode.ALL.value())
.execute()
- .getInput()).isSimilarTo("{\n" +
- " \"p\": 1,\n" +
- " \"ps\": 1,\n" +
- " \"total\": 2,\n" +
- " \"paging\": {\n" +
- " \"pageIndex\": 1,\n" +
- " \"pageSize\": 1,\n" +
- " \"total\": 2\n" +
- " }," +
- " \"users\": [\n" +
- " {\"login\": \"ada\", \"name\": \"Ada Lovelace\", \"selected\": true}\n" +
- " ]\n" +
- "}");
+ .getInput()).isSimilarTo("""
+ {
+ "p": 1,
+ "ps": 1,
+ "total": 2,
+ "paging": {
+ "pageIndex": 1,
+ "pageSize": 1,
+ "total": 2
+ }, "users": [
+ {"login": "ada", "name": "Ada Lovelace", "selected": true}
+ ]
+ }""");
assertJson(newUsersRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.setParam("ps", "1")
.setParam("p", "2")
.setParam(Param.SELECTED, SelectionMode.ALL.value())
.execute()
- .getInput()).isSimilarTo("{\n" +
- " \"p\": 2,\n" +
- " \"ps\": 1,\n" +
- " \"total\": 2,\n" +
- " \"paging\": {\n" +
- " \"pageIndex\": 2,\n" +
- " \"pageSize\": 1,\n" +
- " \"total\": 2\n" +
- " }," +
- " \"users\": [\n" +
- " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
- " ]\n" +
- "}");
+ .getInput()).isSimilarTo("""
+ {
+ "p": 2,
+ "ps": 1,
+ "total": 2,
+ "paging": {
+ "pageIndex": 2,
+ "pageSize": 1,
+ "total": 2
+ }, "users": [
+ {"login": "grace", "name": "Grace Hopper", "selected": false}
+ ]
+ }""");
}
@Test
loginAsAdmin();
assertJson(newUsersRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.setParam("q", "ace")
.setParam(Param.SELECTED, SelectionMode.ALL.value())
.execute()
- .getInput()).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" +
- " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
- " ]\n" +
- "}\n");
-
- assertJson(newUsersRequest().setParam("id", group.getUuid())
+ .getInput()).isSimilarTo("""
+ {
+ "users": [
+ {"login": "ada.login", "name": "Ada Lovelace", "selected": true},
+ {"login": "grace", "name": "Grace Hopper", "selected": false}
+ ]
+ }
+ """);
+
+ assertJson(newUsersRequest().setParam(PARAM_GROUP_NAME, group.getName())
.setParam("q", ".logi")
.execute()
- .getInput()).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\n" +
- " \"login\": \"ada.login\",\n" +
- " \"name\": \"Ada Lovelace\",\n" +
- " \"selected\": true\n" +
- " }\n" +
- " ]\n" +
- "}\n");
-
- assertJson(newUsersRequest().setParam("id", group.getUuid())
+ .getInput()).isSimilarTo("""
+ {
+ "users": [
+ {
+ "login": "ada.login",
+ "name": "Ada Lovelace",
+ "selected": true
+ }
+ ]
+ }
+ """);
+
+ assertJson(newUsersRequest().setParam(PARAM_GROUP_NAME, group.getName())
.setParam("q", "OvE")
.execute()
- .getInput()).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\n" +
- " \"login\": \"ada.login\",\n" +
- " \"name\": \"Ada Lovelace\",\n" +
- " \"selected\": true\n" +
- " }\n" +
- " ]\n" +
- "}\n");
-
- assertJson(newUsersRequest().setParam("id", group.getUuid())
+ .getInput()).isSimilarTo("""
+ {
+ "users": [
+ {
+ "login": "ada.login",
+ "name": "Ada Lovelace",
+ "selected": true
+ }
+ ]
+ }
+ """);
+
+ assertJson(newUsersRequest().setParam(PARAM_GROUP_NAME, group.getName())
.setParam("q", "mail")
.execute()
- .getInput()).isSimilarTo("{\n" +
- " \"users\": [\n" +
- " {\n" +
- " \"login\": \"ada.login\",\n" +
- " \"name\": \"Ada Lovelace\",\n" +
- " \"selected\": true\n" +
- " }\n" +
- " ]\n" +
- "}\n");
+ .getInput()).isSimilarTo("""
+ {
+ "users": [
+ {
+ "login": "ada.login",
+ "name": "Ada Lovelace",
+ "selected": true
+ }
+ ]
+ }
+ """);
}
@Test
loginAsAdmin();
String result = newUsersRequest()
- .setParam("id", group.getUuid())
+ .setParam(PARAM_GROUP_NAME, group.getName())
.setParam(Param.SELECTED, SelectionMode.ALL.value())
.execute()
.getInput();
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_KEY = "projectKey";
public static final String PARAM_USER_LOGIN = "login";
@Generated("sonar-ws-generator")
public class AddGroupRequest {
- private String groupId;
private String groupName;
private String permission;
private String projectId;
private String projectKey;
- /**
- * Example value: "42"
- */
- public AddGroupRequest setGroupId(String groupId) {
- this.groupId = groupId;
- return this;
- }
-
- public String getGroupId() {
- return groupId;
- }
-
/**
* Example value: "sonar-administrators"
*/
@Generated("sonar-ws-generator")
public class AddGroupToTemplateRequest {
- private String groupId;
private String groupName;
private String permission;
private String templateId;
private String templateName;
- /**
- * Example value: "42"
- */
- public AddGroupToTemplateRequest setGroupId(String groupId) {
- this.groupId = groupId;
- return this;
- }
-
- public String getGroupId() {
- return groupId;
- }
-
/**
* Example value: "sonar-administrators"
*/
public void addGroup(AddGroupRequest request) {
call(
new PostRequest(path("add_group"))
- .setParam("groupId", request.getGroupId())
.setParam("groupName", request.getGroupName())
.setParam("permission", request.getPermission())
.setParam("projectId", request.getProjectId())
public void addGroupToTemplate(AddGroupToTemplateRequest request) {
call(
new PostRequest(path("add_group_to_template"))
- .setParam("groupId", request.getGroupId())
.setParam("groupName", request.getGroupName())
.setParam("permission", request.getPermission())
.setParam("templateId", request.getTemplateId())
public void removeGroup(RemoveGroupRequest request) {
call(
new PostRequest(path("remove_group"))
- .setParam("groupId", request.getGroupId())
.setParam("groupName", request.getGroupName())
.setParam("permission", request.getPermission())
.setParam("projectId", request.getProjectId())
public void removeGroupFromTemplate(RemoveGroupFromTemplateRequest request) {
call(
new PostRequest(path("remove_group_from_template"))
- .setParam("groupId", request.getGroupId())
.setParam("groupName", request.getGroupName())
.setParam("permission", request.getPermission())
.setParam("templateId", request.getTemplateId())
*/
@Generated("sonar-ws-generator")
public class RemoveGroupFromTemplateRequest {
-
- private String groupId;
private String groupName;
private String permission;
private String templateId;
private String templateName;
- /**
- * Example value: "42"
- */
- public RemoveGroupFromTemplateRequest setGroupId(String groupId) {
- this.groupId = groupId;
- return this;
- }
-
- public String getGroupId() {
- return groupId;
- }
-
/**
* Example value: "sonar-administrators"
*/
@Generated("sonar-ws-generator")
public class RemoveGroupRequest {
- private String groupId;
private String groupName;
private String permission;
private String projectId;
private String projectKey;
- /**
- * Example value: "42"
- */
- public RemoveGroupRequest setGroupId(String groupId) {
- this.groupId = groupId;
- return this;
- }
-
- public String getGroupId() {
- return groupId;
- }
-
/**
* Example value: "sonar-administrators"
*/
@Generated("sonar-ws-generator")
public class AddUserRequest {
- private String id;
private String login;
private String name;
- /**
- * Example value: "42"
- */
- public AddUserRequest setId(String id) {
- this.id = id;
- return this;
- }
-
- public String getId() {
- return id;
- }
-
/**
* Example value: "g.hopper"
*/
@Generated("sonar-ws-generator")
public class DeleteRequest {
- private String id;
private String name;
- /**
- * Example value: "42"
- */
- public DeleteRequest setId(String id) {
- this.id = id;
- return this;
- }
-
- public String getId() {
- return id;
- }
-
/**
* Example value: "sonar-administrators"
*/
@Generated("sonar-ws-generator")
public class RemoveUserRequest {
- private String id;
private String login;
private String name;
- /**
- * Example value: "42"
- */
- public RemoveUserRequest setId(String id) {
- this.id = id;
- return this;
- }
-
- public String getId() {
- return id;
- }
-
/**
* Example value: "g.hopper"
*/
public class UpdateRequest {
private String description;
- private String id;
private String name;
/**
return description;
}
- /**
- * This is a mandatory parameter.
- * Example value: "42"
- */
- public UpdateRequest setId(String id) {
- this.id = id;
- return this;
- }
-
- public String getId() {
- return id;
- }
-
/**
* Example value: "my-group"
*/
public void addUser(AddUserRequest request) {
call(
new PostRequest(path("add_user"))
- .setParam("id", request.getId())
.setParam("login", request.getLogin())
.setParam("name", request.getName())
.setMediaType(MediaTypes.JSON)).content();
public void delete(DeleteRequest request) {
call(
new PostRequest(path("delete"))
- .setParam("id", request.getId())
.setParam("name", request.getName())
.setMediaType(MediaTypes.JSON)).content();
}
public void removeUser(RemoveUserRequest request) {
call(
new PostRequest(path("remove_user"))
- .setParam("id", request.getId())
.setParam("login", request.getLogin())
.setParam("name", request.getName())
.setMediaType(MediaTypes.JSON)).content();
call(
new PostRequest(path("update"))
.setParam("description", request.getDescription())
- .setParam("id", request.getId())
.setParam("name", request.getName()),
UpdateWsResponse.parser());
}
public String users(UsersRequest request) {
return call(
new GetRequest(path("users"))
- .setParam("id", request.getId())
.setParam("name", request.getName())
.setParam("p", request.getP())
.setParam("ps", request.getPs())
@Generated("sonar-ws-generator")
public class UsersRequest {
- private String id;
private String name;
private String p;
private String ps;
private String q;
private String selected;
- /**
- * Example value: "42"
- */
- public UsersRequest setId(String id) {
- this.id = id;
- return this;
- }
-
- public String getId() {
- return id;
- }
-
/**
* Example value: "sonar-administrators"
*/