Skip to content

Commit

Permalink
SONAR-6474 WS usergroups/delete handles group name
Browse files Browse the repository at this point in the history
  • Loading branch information
teryk committed Oct 6, 2015
1 parent 7e12c02 commit 5b439ef
Show file tree
Hide file tree
Showing 29 changed files with 254 additions and 133 deletions.
Expand Up @@ -30,6 +30,7 @@
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.component.ComponentFinder;
import org.sonar.server.usergroups.ws.UserGroupFinder;
import org.sonar.server.usergroups.ws.WsGroupRef;

import static java.lang.String.format;
Expand All @@ -40,11 +41,13 @@
public class PermissionDependenciesFinder {
private final DbClient dbClient;
private final ComponentFinder componentFinder;
private final UserGroupFinder userGroupFinder;
private final ResourceTypes resourceTypes;

public PermissionDependenciesFinder(DbClient dbClient, ComponentFinder componentFinder, ResourceTypes resourceTypes) {
public PermissionDependenciesFinder(DbClient dbClient, ComponentFinder componentFinder, UserGroupFinder userGroupFinder, ResourceTypes resourceTypes) {
this.dbClient = dbClient;
this.componentFinder = componentFinder;
this.userGroupFinder = userGroupFinder;
this.resourceTypes = resourceTypes;
}

Expand Down Expand Up @@ -76,26 +79,11 @@ public String getGroupName(DbSession dbSession, PermissionRequest request) {
*/
@CheckForNull
public GroupDto getGroup(DbSession dbSession, WsGroupRef group) {
Long groupId = group.id();
String groupName = group.name();

if (isAnyone(groupName)) {
if (isAnyone(group.name())) {
return null;
}

GroupDto groupDto = null;

if (groupId != null) {
groupDto = checkFound(dbClient.groupDao().selectById(dbSession, groupId),
format("Group with id '%d' is not found", groupId));
}

if (groupName != null) {
groupDto = checkFound(dbClient.groupDao().selectByName(dbSession, groupName),
format("Group with name '%s' is not found", groupName));
}

return groupDto;
return userGroupFinder.getGroup(dbSession, group);
}

public UserDto getUser(DbSession dbSession, String userLogin) {
Expand Down
Expand Up @@ -31,18 +31,18 @@
import org.sonar.server.user.UserSession;

import static org.sonar.db.MyBatis.closeQuietly;
import static org.sonar.server.usergroups.ws.GroupUpdater.DESCRIPTION_MAX_LENGTH;
import static org.sonar.server.usergroups.ws.GroupUpdater.NAME_MAX_LENGTH;
import static org.sonar.server.usergroups.ws.GroupUpdater.PARAM_DESCRIPTION;
import static org.sonar.server.usergroups.ws.GroupUpdater.PARAM_NAME;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.DESCRIPTION_MAX_LENGTH;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.NAME_MAX_LENGTH;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.PARAM_DESCRIPTION;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.PARAM_NAME;

public class CreateAction implements UserGroupsWsAction {

private final DbClient dbClient;
private final UserSession userSession;
private final GroupUpdater groupUpdater;
private final UserGroupUpdater groupUpdater;

public CreateAction(DbClient dbClient, UserSession userSession, GroupUpdater groupUpdater) {
public CreateAction(DbClient dbClient, UserSession userSession, UserGroupUpdater groupUpdater) {
this.dbClient = dbClient;
this.groupUpdater = groupUpdater;
this.userSession = userSession;
Expand Down
Expand Up @@ -19,64 +19,67 @@
*/
package org.sonar.server.usergroups.ws;

import com.google.common.base.Preconditions;
import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewController;
import org.sonar.core.permission.GlobalPermissions;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.MyBatis;
import org.sonar.db.user.GroupDto;
import org.sonar.server.db.DbClient;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.user.UserSession;

public class DeleteAction implements UserGroupsWsAction {
import static com.google.common.base.Preconditions.checkArgument;
import static java.lang.String.format;
import static org.sonar.server.usergroups.ws.UserGroupsWsParameters.PARAM_GROUP_ID;
import static org.sonar.server.usergroups.ws.UserGroupsWsParameters.PARAM_GROUP_NAME;

private static final String PARAM_ID = "id";
public class DeleteAction implements UserGroupsWsAction {

private final DbClient dbClient;
private final UserGroupFinder userGroupFinder;
private final UserSession userSession;
private final Settings settings;

public DeleteAction(DbClient dbClient, UserSession userSession, Settings settings) {
public DeleteAction(DbClient dbClient, UserGroupFinder userGroupFinder, UserSession userSession, Settings settings) {
this.dbClient = dbClient;
this.userGroupFinder = userGroupFinder;
this.userSession = userSession;
this.settings = settings;
}

@Override
public void define(NewController context) {
context.createAction("delete")
.setDescription("Delete a group. The default group cannot be deleted. Requires System Administrator permission.")
WebService.NewAction action = context.createAction("delete")
.setDescription(format("Delete a group. The default groups cannot be deleted.<br/>" +
"'%s' or '%s' must be provided." +
"Requires System Administrator permission.",
PARAM_GROUP_ID, PARAM_GROUP_NAME))
.setHandler(this)
.setSince("5.2")
.setPost(true)
.createParam(PARAM_ID)
.setDescription("ID of the group to delete.")
.setRequired(true);
.setPost(true);

UserGroupsWsParameters.createGroupParameters(action);
}

@Override
public void handle(Request request, Response response) throws Exception {
userSession.checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);

long groupId = request.mandatoryParamAsLong(PARAM_ID);

WsGroupRef groupRef = WsGroupRef.fromUserGroupsRequest(request);

DbSession dbSession = dbClient.openSession(false);
try {
if (dbClient.groupDao().selectById(dbSession, groupId) == null) {
throw new NotFoundException(String.format("Could not find a group with id=%d", groupId));
}
GroupDto group = userGroupFinder.getGroup(dbSession, groupRef);
long groupId = group.getId();

checkNotTryingToDeleteDefaultGroup(dbSession, groupId);

removeGroupMembers(groupId, dbSession);
removeGroupPermissions(groupId, dbSession);
removeFromPermissionTemplates(groupId, dbSession);
removeGroupMembers(dbSession, groupId);
removeGroupPermissions(dbSession, groupId);
removeFromPermissionTemplates(dbSession, groupId);
dbClient.groupDao().deleteById(dbSession, groupId);

dbSession.commit();
Expand All @@ -89,19 +92,19 @@ public void handle(Request request, Response response) throws Exception {
private void checkNotTryingToDeleteDefaultGroup(DbSession dbSession, long groupId) {
String defaultGroupName = settings.getString(CoreProperties.CORE_DEFAULT_GROUP);
GroupDto defaultGroup = dbClient.groupDao().selectOrFailByName(dbSession, defaultGroupName);
Preconditions.checkArgument(groupId != defaultGroup.getId(),
String.format("Default group '%s' cannot be deleted", defaultGroupName));
checkArgument(groupId != defaultGroup.getId(),
format("Default group '%s' cannot be deleted", defaultGroupName));
}

private void removeGroupMembers(long groupId, DbSession dbSession) {
private void removeGroupMembers(DbSession dbSession, long groupId) {
dbClient.userGroupDao().deleteMembersByGroupId(dbSession, groupId);
}

private void removeGroupPermissions(long groupId, DbSession dbSession) {
private void removeGroupPermissions(DbSession dbSession, long groupId) {
dbClient.roleDao().deleteGroupRolesByGroupId(dbSession, groupId);
}

private void removeFromPermissionTemplates(long groupId, DbSession dbSession) {
private void removeFromPermissionTemplates(DbSession dbSession, long groupId) {
dbClient.permissionTemplateDao().deleteByGroup(dbSession, groupId);
}
}
Expand Up @@ -33,19 +33,19 @@
import org.sonar.server.user.UserSession;

import static org.sonar.db.MyBatis.closeQuietly;
import static org.sonar.server.usergroups.ws.GroupUpdater.DESCRIPTION_MAX_LENGTH;
import static org.sonar.server.usergroups.ws.GroupUpdater.NAME_MAX_LENGTH;
import static org.sonar.server.usergroups.ws.GroupUpdater.PARAM_DESCRIPTION;
import static org.sonar.server.usergroups.ws.GroupUpdater.PARAM_ID;
import static org.sonar.server.usergroups.ws.GroupUpdater.PARAM_NAME;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.DESCRIPTION_MAX_LENGTH;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.NAME_MAX_LENGTH;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.PARAM_DESCRIPTION;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.PARAM_ID;
import static org.sonar.server.usergroups.ws.UserGroupUpdater.PARAM_NAME;

public class UpdateAction implements UserGroupsWsAction {

private final DbClient dbClient;
private final UserSession userSession;
private final GroupUpdater groupUpdater;
private final UserGroupUpdater groupUpdater;

public UpdateAction(DbClient dbClient, UserSession userSession, GroupUpdater groupUpdater) {
public UpdateAction(DbClient dbClient, UserSession userSession, UserGroupUpdater groupUpdater) {
this.dbClient = dbClient;
this.groupUpdater = groupUpdater;
this.userSession = userSession;
Expand Down
@@ -0,0 +1,55 @@
/*
* 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.usergroups.ws;

import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.user.GroupDto;

import static java.lang.String.format;
import static org.sonar.server.ws.WsUtils.checkFound;

public class UserGroupFinder {
private final DbClient dbClient;

public UserGroupFinder(DbClient dbClient) {
this.dbClient = dbClient;
}

public GroupDto getGroup(DbSession dbSession, WsGroupRef group) {
Long groupId = group.id();
String groupName = group.name();

GroupDto groupDto = null;

if (groupId != null) {
groupDto = checkFound(dbClient.groupDao().selectById(dbSession, groupId),
format("Group with id '%d' is not found", groupId));
}

if (groupName != null) {
groupDto = checkFound(dbClient.groupDao().selectByName(dbSession, groupName),
format("Group with name '%s' is not found", groupName));
}

return groupDto;
}
}
Expand Up @@ -29,7 +29,7 @@
import org.sonar.server.exceptions.BadRequestException;

@ServerSide
public class GroupUpdater {
public class UserGroupUpdater {

static final String PARAM_ID = "id";
static final String PARAM_DESCRIPTION = "description";
Expand All @@ -43,7 +43,7 @@ public class GroupUpdater {

private final DbClient dbClient;

public GroupUpdater(DbClient dbClient) {
public UserGroupUpdater(DbClient dbClient) {
this.dbClient = dbClient;
}

Expand Down
Expand Up @@ -26,8 +26,10 @@ public class UserGroupsModule extends Module {
@Override
protected void configureModule() {
add(
GroupUpdater.class,
UserGroupsWs.class,
UserGroupUpdater.class,
UserGroupFinder.class,
// actions
SearchAction.class,
CreateAction.class,
DeleteAction.class,
Expand Down
Expand Up @@ -42,6 +42,7 @@
import org.sonar.server.permission.PermissionChange;
import org.sonar.server.permission.PermissionUpdater;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.usergroups.ws.UserGroupFinder;
import org.sonar.server.ws.WsTester;
import org.sonar.test.DbTests;

Expand All @@ -52,12 +53,12 @@
import static org.sonar.db.component.ComponentTesting.newProjectDto;
import static org.sonar.db.component.ComponentTesting.newView;
import static org.sonar.server.permission.ws.AddGroupAction.ACTION;
import static org.sonar.server.permission.ws.PermissionsWs.ENDPOINT;
import static org.sonar.server.permission.ws.WsPermissionParameters.PARAM_GROUP_ID;
import static org.sonar.server.permission.ws.WsPermissionParameters.PARAM_GROUP_NAME;
import static org.sonar.server.permission.ws.WsPermissionParameters.PARAM_PERMISSION;
import static org.sonar.server.permission.ws.WsPermissionParameters.PARAM_PROJECT_KEY;
import static org.sonar.server.permission.ws.WsPermissionParameters.PARAM_PROJECT_ID;
import static org.sonar.server.permission.ws.PermissionsWs.ENDPOINT;
import static org.sonar.server.permission.ws.WsPermissionParameters.PARAM_PROJECT_KEY;

@Category(DbTests.class)
public class AddGroupActionTest {
Expand All @@ -79,7 +80,12 @@ public void setUp() {
dbClient = db.getDbClient();
ComponentFinder componentFinder = new ComponentFinder(dbClient);
ws = new WsTester(new PermissionsWs(
new AddGroupAction(dbClient, new PermissionChangeBuilder(new PermissionDependenciesFinder(dbClient, componentFinder, resourceTypes)), permissionUpdater)));
new AddGroupAction(dbClient, new PermissionChangeBuilder(new PermissionDependenciesFinder(
dbClient,
componentFinder,
new UserGroupFinder(dbClient),
resourceTypes)),
permissionUpdater)));
userSession.login("admin").setGlobalPermissions(SYSTEM_ADMIN);
}

Expand Down
Expand Up @@ -41,6 +41,7 @@
import org.sonar.server.permission.PermissionChange;
import org.sonar.server.permission.PermissionUpdater;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.usergroups.ws.UserGroupFinder;
import org.sonar.server.ws.WsTester;
import org.sonar.test.DbTests;

Expand Down Expand Up @@ -81,7 +82,8 @@ public void setUp() {
dbSession = db.getSession();
ComponentFinder componentFinder = new ComponentFinder(dbClient);
ws = new WsTester(new PermissionsWs(
new AddUserAction(dbClient, permissionUpdater, new PermissionChangeBuilder(new PermissionDependenciesFinder(dbClient, componentFinder, resourceTypes)))));
new AddUserAction(dbClient, permissionUpdater, new PermissionChangeBuilder(new PermissionDependenciesFinder(dbClient, componentFinder, new UserGroupFinder(dbClient),
resourceTypes)))));
userSession.login("admin").setGlobalPermissions(SYSTEM_ADMIN);
}

Expand Down
Expand Up @@ -47,6 +47,7 @@
import org.sonar.server.exceptions.UnauthorizedException;
import org.sonar.server.permission.PermissionFinder;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.usergroups.ws.UserGroupFinder;
import org.sonar.server.ws.WsActionTester;
import org.sonar.test.DbTests;

Expand Down Expand Up @@ -85,7 +86,7 @@ public void setUp() {
dbClient = db.getDbClient();
dbSession = db.getSession();
PermissionFinder permissionFinder = new PermissionFinder(dbClient);
underTest = new GroupsAction(dbClient, userSession, permissionFinder, new PermissionDependenciesFinder(dbClient, new ComponentFinder(dbClient), resourceTypes));
underTest = new GroupsAction(dbClient, userSession, permissionFinder, new PermissionDependenciesFinder(dbClient, new ComponentFinder(dbClient), new UserGroupFinder(dbClient), resourceTypes));
ws = new WsActionTester(underTest);

userSession.login("login").setGlobalPermissions(SYSTEM_ADMIN);
Expand Down
Expand Up @@ -42,6 +42,7 @@
import org.sonar.server.permission.PermissionChange;
import org.sonar.server.permission.PermissionUpdater;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.usergroups.ws.UserGroupFinder;
import org.sonar.server.ws.WsTester;
import org.sonar.test.DbTests;

Expand Down Expand Up @@ -78,7 +79,7 @@ public void setUp() {
DbClient dbClient = db.getDbClient();
ComponentFinder componentFinder = new ComponentFinder(dbClient);
ws = new WsTester(new PermissionsWs(
new RemoveGroupAction(dbClient, new PermissionChangeBuilder(new PermissionDependenciesFinder(dbClient, componentFinder, resourceTypes)), permissionUpdater)));
new RemoveGroupAction(dbClient, new PermissionChangeBuilder(new PermissionDependenciesFinder(dbClient, componentFinder, new UserGroupFinder(dbClient), resourceTypes)), permissionUpdater)));
userSession.login("admin").setGlobalPermissions(SYSTEM_ADMIN);
}

Expand Down

0 comments on commit 5b439ef

Please sign in to comment.