From 5ba22ecf098e123ab1db3dc3258e5739eb7063c6 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Tue, 27 Sep 2016 22:58:38 +0200 Subject: [PATCH] Complete move from RoleDao/PermissionDao to UserPermissionDao --- .../SearchProjectPermissionsDataLoader.java | 6 +- .../CountByProjectAndPermissionDto.java | 22 +- .../sonar/db/permission/PermissionDao.java | 15 - .../sonar/db/permission/PermissionMapper.java | 2 - .../db/permission/UserPermissionDao.java | 24 ++ .../db/permission/UserPermissionDto.java | 3 + .../db/permission/UserPermissionMapper.java | 7 +- .../main/java/org/sonar/db/user/RoleDao.java | 13 + .../sonar/db/permission/PermissionMapper.xml | 15 - .../db/permission/UserPermissionMapper.xml | 30 +- .../db/permission/UserPermissionDaoTest.java | 300 ++++-------------- .../permission/UserWithPermissionDaoTest.java | 32 -- 12 files changed, 138 insertions(+), 331 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java index b693827ae57..495635cfb1a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java +++ b/server/sonar-server/src/main/java/org/sonar/server/permission/ws/SearchProjectPermissionsDataLoader.java @@ -107,10 +107,8 @@ public class SearchProjectPermissionsDataLoader { private Table userCountByRootComponentIdAndPermission(DbSession dbSession, List rootComponentIds) { final Table userCountByRootComponentIdAndPermission = TreeBasedTable.create(); - dbClient.permissionDao().usersCountByComponentIdAndPermission(dbSession, rootComponentIds, context -> { - CountByProjectAndPermissionDto row = (CountByProjectAndPermissionDto) context.getResultObject(); - userCountByRootComponentIdAndPermission.put(row.getComponentId(), row.getPermission(), row.getCount()); - }); + dbClient.userPermissionDao().countUsersByProjectPermission(dbSession, rootComponentIds).forEach( + row -> userCountByRootComponentIdAndPermission.put(row.getComponentId(), row.getPermission(), row.getCount())); return userCountByRootComponentIdAndPermission; } diff --git a/sonar-db/src/main/java/org/sonar/db/permission/CountByProjectAndPermissionDto.java b/sonar-db/src/main/java/org/sonar/db/permission/CountByProjectAndPermissionDto.java index 52c51e31f7f..b366d9dfb85 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/CountByProjectAndPermissionDto.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/CountByProjectAndPermissionDto.java @@ -19,32 +19,34 @@ */ package org.sonar.db.permission; +import com.google.common.annotations.VisibleForTesting; + public class CountByProjectAndPermissionDto { private long componentId; private String permission; private int count; - public long getComponentId() { - return componentId; + public CountByProjectAndPermissionDto() { + // used by MyBatis } - public void setComponentId(long componentId) { + @VisibleForTesting + public CountByProjectAndPermissionDto(long componentId, String permission, int count) { this.componentId = componentId; + this.permission = permission; + this.count = count; } - public String getPermission() { - return permission; + public long getComponentId() { + return componentId; } - public void setPermission(String permission) { - this.permission = permission; + public String getPermission() { + return permission; } public int getCount() { return count; } - public void setCount(int count) { - this.count = count; - } } diff --git a/sonar-db/src/main/java/org/sonar/db/permission/PermissionDao.java b/sonar-db/src/main/java/org/sonar/db/permission/PermissionDao.java index 94046785c1c..fa4ba4c0255 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/PermissionDao.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/PermissionDao.java @@ -78,21 +78,6 @@ public class PermissionDao implements Dao { return executeLargeInputs(groupNames, groups -> mapper(dbSession).selectGroupPermissionByGroupNames(groups, projectId)); } - /** - * Each row returns a CountByProjectAndPermissionDto - */ - public void usersCountByComponentIdAndPermission(DbSession dbSession, List componentIds, ResultHandler resultHandler) { - Map parameters = new HashMap<>(1); - - executeLargeInputsWithoutOutput( - componentIds, - partitionedComponentIds -> { - parameters.put("componentIds", partitionedComponentIds); - mapper(dbSession).usersCountByProjectIdAndPermission(parameters, resultHandler); - return null; - }); - } - /** * Each row returns a CountByProjectAndPermissionDto */ diff --git a/sonar-db/src/main/java/org/sonar/db/permission/PermissionMapper.java b/sonar-db/src/main/java/org/sonar/db/permission/PermissionMapper.java index 3cf1e024487..5033f64a702 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/PermissionMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/PermissionMapper.java @@ -44,7 +44,5 @@ public interface PermissionMapper { List selectGroupPermissionByGroupNames(@Param("groupNames") List groupNames, @Nullable @Param("projectId") Long projectId); - void usersCountByProjectIdAndPermission(Map parameters, ResultHandler resultHandler); - void groupsCountByProjectIdAndPermission(Map parameters, ResultHandler resultHandler); } diff --git a/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionDao.java b/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionDao.java index 45b56e12c48..e1e5ef11ffd 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionDao.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionDao.java @@ -21,6 +21,7 @@ package org.sonar.db.permission; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; import javax.annotation.Nullable; import org.apache.ibatis.session.RowBounds; import org.sonar.db.Dao; @@ -28,7 +29,9 @@ import org.sonar.db.DatabaseUtils; import org.sonar.db.DbSession; import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Arrays.asList; import static java.util.Collections.emptyList; +import static org.apache.commons.lang.StringUtils.isNotEmpty; import static org.sonar.db.DatabaseUtils.executeLargeInputs; public class UserPermissionDao implements Dao { @@ -68,6 +71,27 @@ public class UserPermissionDao implements Dao { mapper(dbSession).insert(dto); } + /** + * Delete permissions for a user, permissions for a project, or a mix of them. In all cases + * scope can be restricted to a specified permission. + * @see UserPermissionMapper#delete(String, String, String) + */ + public void delete(DbSession dbSession, @Nullable String login, @Nullable String projectUuid, @Nullable String permission) { + checkArgument(isNotEmpty(login) || isNotEmpty(projectUuid), "At least one of login or project must be set"); + mapper(dbSession).delete(login, projectUuid, permission); + } + + // shortcuts for migration + public List selectUserPermissions(DbSession dbSession, String userLogin, @Nullable String projectUuid) { + PermissionQuery query = PermissionQuery.builder() + .withAtLeastOnePermission() + .setComponentUuid(projectUuid) + .build(); + return select(dbSession, query, asList(userLogin)).stream() + .map(p -> p.getPermission()) + .collect(Collectors.toList()); + } + private static UserPermissionMapper mapper(DbSession dbSession) { return dbSession.getMapper(UserPermissionMapper.class); } diff --git a/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionDto.java b/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionDto.java index 25f89349a0f..3801c5bc42b 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionDto.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionDto.java @@ -45,6 +45,9 @@ public class UserPermissionDto { return userId; } + /** + * @return {@code null} if it's a global permission, else return the project id. + */ @CheckForNull public Long getComponentId() { return componentId; diff --git a/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionMapper.java b/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionMapper.java index 63f9d691e90..489d73ceeff 100644 --- a/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/permission/UserPermissionMapper.java @@ -48,7 +48,12 @@ public interface UserPermissionMapper { * Count the number of users per permission for a given list of projects. * @param projectIds a non-null and non-empty list of project ids */ - List countUsersByProjectPermission(List projectIds); + List countUsersByProjectPermission(@Param("projectIds") List projectIds); void insert(UserPermissionDto dto); + + /** + * Delete permissions by user and/or by project. In both cases scope can be restricted to a specified permission + */ + void delete(@Nullable @Param("login") String login, @Nullable @Param("projectUuid") String projectUuid, @Nullable @Param("permission") String permission); } diff --git a/sonar-db/src/main/java/org/sonar/db/user/RoleDao.java b/sonar-db/src/main/java/org/sonar/db/user/RoleDao.java index ea0664df682..5a1fbd03347 100644 --- a/sonar-db/src/main/java/org/sonar/db/user/RoleDao.java +++ b/sonar-db/src/main/java/org/sonar/db/user/RoleDao.java @@ -27,10 +27,15 @@ import org.sonar.db.DbSession; public class RoleDao implements Dao { + /** + * @deprecated replaced by {@link org.sonar.db.permission.UserPermissionDao#selectUserPermissions(DbSession, String, String)} + */ + @Deprecated public List selectUserPermissions(DbSession session, String userLogin, @Nullable Long resourceId) { return mapper(session).selectUserPermissions(userLogin, resourceId); } + // TODO to be moved to PermissionVerifierDao public List selectComponentIdsByPermissionAndUserId(DbSession dbSession, String permission, long userId) { return mapper(dbSession).selectComponentIdsByPermissionAndUserId(permission, userId); } @@ -43,10 +48,18 @@ public class RoleDao implements Dao { mapper(session).insertGroupRole(groupRole); } + /** + * @deprecated replaced by {@link org.sonar.db.permission.UserPermissionDao#insert(DbSession, org.sonar.db.permission.UserPermissionDto)} + */ + @Deprecated public void insertUserRole(DbSession session, UserPermissionDto userRole) { mapper(session).insertUserRole(userRole); } + /** + * @deprecated replaced by {@link org.sonar.db.permission.UserPermissionDao#delete(DbSession, String, String, String)} + */ + @Deprecated public void deleteUserRole(UserPermissionDto userRole, DbSession session) { mapper(session).deleteUserRole(userRole); } diff --git a/sonar-db/src/main/resources/org/sonar/db/permission/PermissionMapper.xml b/sonar-db/src/main/resources/org/sonar/db/permission/PermissionMapper.xml index 708c2967047..1c8a956c2a6 100644 --- a/sonar-db/src/main/resources/org/sonar/db/permission/PermissionMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/permission/PermissionMapper.xml @@ -92,21 +92,6 @@ - - + - - INSERT INTO group_roles (group_id, resource_id, role) - VALUES (#{groupId}, #{resourceId}, #{role}) - - insert into user_roles (user_id, resource_id, role) values (#{userId,jdbcType=BIGINT}, #{componentId,jdbcType=BIGINT}, #{permission,jdbcType=VARCHAR}) + + delete from user_roles + + + + and resource_id = (select id from projects where uuid = #{projectUuid}) + + + and resource_id is null + + + + and user_id = (select id from users where login = #{login}) + + + and role = #{permission} + + + diff --git a/sonar-db/src/test/java/org/sonar/db/permission/UserPermissionDaoTest.java b/sonar-db/src/test/java/org/sonar/db/permission/UserPermissionDaoTest.java index 153f71da5e8..2bb1f4338bb 100644 --- a/sonar-db/src/test/java/org/sonar/db/permission/UserPermissionDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/permission/UserPermissionDaoTest.java @@ -21,9 +21,8 @@ package org.sonar.db.permission; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; -import java.util.Objects; -import java.util.function.Predicate; import javax.annotation.Nullable; import org.junit.Before; import org.junit.Rule; @@ -71,13 +70,16 @@ public class UserPermissionDaoTest { UserPermissionDto global3 = insertGlobalPermission(PROVISIONING, user2.getId()); UserPermissionDto project1Perm = insertProjectPermission(USER, user3.getId(), this.project1.getId()); - // global permissions of users who has at least one global permission + // global permissions of users who has at least one global permission, ordered by user name then permission PermissionQuery query = PermissionQuery.builder().withAtLeastOnePermission().build(); - expectPermissions(query, null, global1, global2, global3); + expectPermissions(query, null, global2, global3, global1); // default query returns all permissions query = PermissionQuery.builder().build(); - expectPermissions(query, null, global1, global2, global3, project1Perm); + expectPermissions(query, null, project1Perm, global2, global3, global1); + + // return empty list if non-null but empty logins + expectPermissions(query, Collections.emptyList()); // global permissions of user1 query = PermissionQuery.builder().withAtLeastOnePermission().build(); @@ -89,7 +91,7 @@ public class UserPermissionDaoTest { // global permissions of user1, user2 and another one query = PermissionQuery.builder().withAtLeastOnePermission().build(); - expectPermissions(query, asList(user1.getLogin(), user2.getLogin(), "missing"), global1, global2, global3); + expectPermissions(query, asList(user1.getLogin(), user2.getLogin(), "missing"), global2, global3, global1); // empty global permissions if login does not exist query = PermissionQuery.builder().withAtLeastOnePermission().build(); @@ -105,7 +107,7 @@ public class UserPermissionDaoTest { // global permissions "admin" query = PermissionQuery.builder().setPermission(SYSTEM_ADMIN).build(); - expectPermissions(query, null, global1, global2); + expectPermissions(query, null, global2, global1); // empty if nobody has the specified global permission query = PermissionQuery.builder().setPermission("missing").build(); @@ -113,7 +115,7 @@ public class UserPermissionDaoTest { // search by user name (matches 2 users) query = PermissionQuery.builder().withAtLeastOnePermission().setSearchQuery("Mari").build(); - expectPermissions(query, null, global1, global2, global3); + expectPermissions(query, null, global2, global3, global1); // search by user name (matches 2 users) and global permission query = PermissionQuery.builder().setSearchQuery("Mari").setPermission(PROVISIONING).build(); @@ -134,15 +136,15 @@ public class UserPermissionDaoTest { // project permissions of users who has at least one permission on this project PermissionQuery query = PermissionQuery.builder().withAtLeastOnePermission().setComponentUuid(project1.uuid()).build(); - expectPermissions(query, null, perm1, perm2, perm3); + expectPermissions(query, null, perm3, perm2, perm1); // default query on the project returns all permissions query = PermissionQuery.builder().setComponentUuid(project1.uuid()).build(); - expectPermissions(query, null, perm1, perm2, perm3); + expectPermissions(query, null, perm3, perm2, perm1); // project permissions of user1 query = PermissionQuery.builder().withAtLeastOnePermission().setComponentUuid(project1.uuid()).build(); - expectPermissions(query, asList(user1.getLogin()), perm1, perm2); + expectPermissions(query, asList(user1.getLogin()), perm2, perm1); // project permissions of user2 query = PermissionQuery.builder().withAtLeastOnePermission().setComponentUuid(project1.uuid()).build(); @@ -166,11 +168,11 @@ public class UserPermissionDaoTest { // search by user name (matches 2 users) query = PermissionQuery.builder().setSearchQuery("Mari").setComponentUuid(project1.uuid()).build(); - expectPermissions(query, null, perm1, perm2, perm3); + expectPermissions(query, null, perm3, perm2, perm1); // search by user name (matches 2 users) and project permission query = PermissionQuery.builder().setSearchQuery("Mari").setPermission(ISSUE_ADMIN).setComponentUuid(project1.uuid()).build(); - expectPermissions(query, null, perm2, perm3); + expectPermissions(query, null, perm3, perm2); // search by user name (no match) query = PermissionQuery.builder().setSearchQuery("Unknown").setComponentUuid(project1.uuid()).build(); @@ -181,12 +183,51 @@ public class UserPermissionDaoTest { expectPermissions(query, null); } + @Test + public void countUsersByProjectPermission() { + insertGlobalPermission(SYSTEM_ADMIN, user1.getId()); + insertProjectPermission(USER, user1.getId(), project1.getId()); + insertProjectPermission(ISSUE_ADMIN, user1.getId(), project1.getId()); + insertProjectPermission(ISSUE_ADMIN, user2.getId(), project1.getId()); + insertProjectPermission(ISSUE_ADMIN, user2.getId(), project2.getId()); + + // no projects -> return empty list + assertThat(underTest.countUsersByProjectPermission(dbTester.getSession(), Collections.emptyList())).isEmpty(); + + // one project + expectCount(asList(project1.getId()), + new UserCountPerProjectPermission(project1.getId(), USER, 1), + new UserCountPerProjectPermission(project1.getId(), ISSUE_ADMIN, 2)); + + // multiple projects + expectCount(asList(project1.getId(), project2.getId(), -1L), + new UserCountPerProjectPermission(project1.getId(), USER, 1), + new UserCountPerProjectPermission(project1.getId(), ISSUE_ADMIN, 2), + new UserCountPerProjectPermission(project2.getId(), ISSUE_ADMIN, 1)); + } + + private void expectCount(List projectIds, UserCountPerProjectPermission... expected) { + List got = underTest.countUsersByProjectPermission(dbTester.getSession(), projectIds); + assertThat(got).hasSize(expected.length); + + for (UserCountPerProjectPermission expect : expected) { + boolean found = got.stream().anyMatch(b -> b.getPermission().equals(expect.getPermission()) && + b.getCount() == expect.getCount() && + b.getComponentId() == expect.getComponentId()); + assertThat(found).isTrue(); + } + } + private void expectPermissions(PermissionQuery query, @Nullable Collection logins, UserPermissionDto... expected) { // test method "select()" List permissions = underTest.select(dbTester.getSession(), query, logins); assertThat(permissions).hasSize(expected.length); - for (UserPermissionDto permission : expected) { - assertThat(permissions).matches(list -> list.stream().anyMatch(new HasPermission(permission))); + for (int i = 0; i < expected.length; i++) { + ExtendedUserPermissionDto got = permissions.get(i); + UserPermissionDto expect = expected[i]; + assertThat(got.getUserId()).isEqualTo(expect.getUserId()); + assertThat(got.getPermission()).isEqualTo(expect.getPermission()); + assertThat(got.getComponentId()).isEqualTo(expect.getComponentId()); } if (logins == null) { @@ -209,233 +250,4 @@ public class UserPermissionDaoTest { dbTester.commit(); return dto; } - - private final class HasPermission implements Predicate { - private final UserPermissionDto expect; - - HasPermission(UserPermissionDto dto) { - this.expect = dto; - } - - @Override - public boolean test(ExtendedUserPermissionDto dto) { - return dto.getUserId() == expect.getUserId() && - dto.getPermission().equals(expect.getPermission()) && - Objects.equals(dto.getComponentId(), expect.getComponentId()); - } - } - - // @Test - // public void count_logins_by_query() { - // UserDto user1 = userDb.insertUser(newUserDto()); - // UserDto user2 = userDb.insertUser(newUserDto()); - // UserDto user3 = userDb.insertUser(newUserDto()); - // UserDto user4 = userDb.insertUser(newUserDto()); - // ComponentDto project = componentDb.insertComponent(newProjectDto()); - // - // permissionDb.addGlobalPermissionToUser(SYSTEM_ADMIN, user1.getId()); - // permissionDb.addGlobalPermissionToUser(SYSTEM_ADMIN, user2.getId()); - // permissionDb.addGlobalPermissionToUser(SYSTEM_ADMIN, user3.getId()); - // permissionDb.addGlobalPermissionToUser(PROVISIONING, user3.getId()); - // permissionDb.addProjectPermissionToUser(USER, user4.getId(), project.getId()); - // - // assertThat(countUsersByQuery(PermissionQuery.builder().build())).isEqualTo(4); - // assertThat(countUsersByQuery(PermissionQuery.builder().setPermission(PROVISIONING).build())).isEqualTo(1); - // assertThat(countUsersByQuery(PermissionQuery.builder().withAtLeastOnePermission().setComponentUuid(project.uuid()).build())).isEqualTo(1); - // } - // - // @Test - // public void select_logins_by_query_is_ordered_by_name() { - // UserDto user3 = userDb.insertUser(newUserDto().setName("3-name").setLogin("3-login")); - // UserDto user2 = userDb.insertUser(newUserDto().setName("2-name").setLogin("2-login")); - // UserDto user1 = userDb.insertUser(newUserDto().setName("1-name").setLogin("1-login")); - // UserDto user4 = userDb.insertUser(newUserDto().setName("4-name").setLogin("4-login")); - // - // ComponentDto project = componentDb.insertComponent(newProjectDto("project-uuid")); - // - // permissionDb.addGlobalPermissionToUser(SYSTEM_ADMIN, user3.getId()); - // permissionDb.addGlobalPermissionToUser(PROVISIONING, user3.getId()); - // permissionDb.addGlobalPermissionToUser(SYSTEM_ADMIN, user2.getId()); - // permissionDb.addGlobalPermissionToUser(SYSTEM_ADMIN, user1.getId()); - // permissionDb.addProjectPermissionToUser(USER, user4.getId(), project.getId()); - // - // assertThat(selectLoginsByQuery(PermissionQuery.builder().build())).containsExactly("1-login", "2-login", "3-login", "4-login"); - // } - // - // @Test - // public void select_logins_are_paginated() { - // IntStream.rangeClosed(0, 9) - // .forEach(i -> userDb.insertUser(newUserDto().setName(i + "-name").setLogin(i + "-login"))); - // - // PermissionQuery.Builder dbQuery = PermissionQuery.builder().setPageIndex(2).setPageSize(3); - // List result = selectLoginsByQuery(dbQuery.build()); - // int count = countUsersByQuery(dbQuery.build()); - // - // assertThat(result).hasSize(3).containsOnlyOnce("3-login", "4-login", "5-login"); - // assertThat(count).isEqualTo(10); - // } - // - // @Test - // public void select_logins_with_query() { - // userDb.insertUser(newUserDto().setName("1-name").setLogin("1-login")); - // userDb.insertUser(newUserDto().setName("unknown")); - // - // PermissionQuery.Builder dbQuery = PermissionQuery.builder().setSearchQuery("nam"); - // List users = selectLoginsByQuery(dbQuery.build()); - // - // assertThat(users).hasSize(1); - // assertThat(users.get(0)).isEqualTo("1-login"); - // } - // - // @Test - // public void select_logins_with_global_permissions() { - // UserDto user3 = userDb.insertUser(newUserDto().setName("3-name")); - // UserDto user2 = userDb.insertUser(newUserDto().setName("2-name")); - // UserDto user1 = userDb.insertUser(newUserDto().setName("1-name")); - // UserDto user4 = userDb.insertUser(newUserDto().setName("4-name")); - // - // ComponentDto project = componentDb.insertComponent(newProjectDto("project-uuid")); - // - // permissionDb.addGlobalPermissionToUser(SCAN_EXECUTION, user3.getId()); - // permissionDb.addGlobalPermissionToUser(PROVISIONING, user3.getId()); - // permissionDb.addGlobalPermissionToUser(SCAN_EXECUTION, user2.getId()); - // permissionDb.addGlobalPermissionToUser(SYSTEM_ADMIN, user1.getId()); - // // project permission - // permissionDb.addProjectPermissionToUser(SCAN_EXECUTION, user4.getId(), project.getId()); - // - // PermissionQuery.Builder dbQuery = PermissionQuery.builder() - // .setComponentUuid(null) - // .setPermission(SCAN_EXECUTION) - // .withAtLeastOnePermission(); - // List result = selectLoginsByQuery(dbQuery.build()); - // int count = countUsersByQuery(dbQuery.build()); - // - // assertThat(result).hasSize(2).containsExactly(user2.getLogin(), user3.getLogin()); - // assertThat(count).isEqualTo(2); - // } - // - // @Test - // public void select_logins_with_project_permissions() { - // // create reversed list of user - // List dbUsers = IntStream.rangeClosed(1, 4) - // .mapToObj(i -> userDb.insertUser(newUserDto().setName(i + "-name").setLogin(i + "-login"))) - // .collect(Collectors.toList()); - // - // ComponentDto project = componentDb.insertComponent(newProjectDto("project-uuid")); - // - // permissionDb.addProjectPermissionToUser(SCAN_EXECUTION, dbUsers.get(0).getId(), project.getId()); - // permissionDb.addProjectPermissionToUser(PROVISIONING, dbUsers.get(0).getId(), project.getId()); - // permissionDb.addProjectPermissionToUser(SCAN_EXECUTION, dbUsers.get(1).getId(), project.getId()); - // permissionDb.addProjectPermissionToUser(SYSTEM_ADMIN, dbUsers.get(2).getId(), project.getId()); - // // global permission - // permissionDb.addGlobalPermissionToUser(SCAN_EXECUTION, dbUsers.get(3).getId()); - // - // PermissionQuery.Builder dbQuery = PermissionQuery.builder() - // .setComponentUuid(null) - // .setPermission(SCAN_EXECUTION) - // .withAtLeastOnePermission() - // .setComponentUuid(project.uuid()); - // List result = selectLoginsByQuery(dbQuery.build()); - // int count = countUsersByQuery(dbQuery.build()); - // - // assertThat(result).hasSize(2).containsOnlyOnce(dbUsers.get(0).getLogin(), dbUsers.get(1).getLogin()); - // assertThat(count).isEqualTo(2); - // } - // - // @Test - // public void select_user_permissions_by_logins_with_global_permissions() { - // UserDto firstUser = userDb.insertUser(newUserDto()); - // permissionDb.addGlobalPermissionToUser(ADMIN, firstUser.getId()); - // - // UserDto secondUser = userDb.insertUser(newUserDto()); - // permissionDb.addGlobalPermissionToUser(USER, secondUser.getId()); - // - // UserDto thirdUser = userDb.insertUser(newUserDto()); - // ComponentDto project = componentDb.insertComponent(newProjectDto()); - // permissionDb.addProjectPermissionToUser(ADMIN, thirdUser.getId(), project.getId()); - // - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, (asList(firstUser.getLogin(), secondUser.getLogin(), - // thirdUser.getLogin())), null)) - // .extracting(org.sonar.db.user.UserPermissionDto::getUserId, org.sonar.db.user.UserPermissionDto::getPermission, - // org.sonar.db.user.UserPermissionDto::getComponentId) - // .containsOnly( - // tuple(firstUser.getId(), ADMIN, null), - // tuple(secondUser.getId(), USER, null)); - // - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, singletonList(thirdUser.getLogin()), null)).isEmpty(); - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, singletonList("unknown"), null)).isEmpty(); - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, Collections.emptyList(), null)).isEmpty(); - // } - // - // @Test - // public void select_user_permissions_by_logins_with_project_permissions() { - // UserDto firstUser = userDb.insertUser(newUserDto()); - // ComponentDto project = componentDb.insertComponent(newProjectDto()); - // permissionDb.addProjectPermissionToUser(ADMIN, firstUser.getId(), project.getId()); - // - // UserDto secondUser = userDb.insertUser(newUserDto()); - // permissionDb.addProjectPermissionToUser(USER, secondUser.getId(), project.getId()); - // - // UserDto thirdUser = userDb.insertUser(newUserDto()); - // ComponentDto anotherProject = componentDb.insertComponent(newProjectDto()); - // permissionDb.addProjectPermissionToUser(ADMIN, thirdUser.getId(), anotherProject.getId()); - // - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, (asList(firstUser.getLogin(), secondUser.getLogin(), - // thirdUser.getLogin())), project.getId())) - // .extracting(org.sonar.db.user.UserPermissionDto::getUserId, org.sonar.db.user.UserPermissionDto::getPermission, - // org.sonar.db.user.UserPermissionDto::getComponentId) - // .containsOnly( - // tuple(firstUser.getId(), ADMIN, project.getId()), - // tuple(secondUser.getId(), USER, project.getId())); - // - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, (asList(firstUser.getLogin(), secondUser.getLogin(), - // thirdUser.getLogin())), anotherProject.getId())) - // .extracting(org.sonar.db.user.UserPermissionDto::getUserId, org.sonar.db.user.UserPermissionDto::getPermission, - // org.sonar.db.user.UserPermissionDto::getComponentId) - // .containsOnly( - // tuple(thirdUser.getId(), ADMIN, anotherProject.getId())); - // - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, singletonList(thirdUser.getLogin()), project.getId())).isEmpty(); - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, singletonList("unknown"), project.getId())).isEmpty(); - // assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, Collections.emptyList(), project.getId())).isEmpty(); - // } - // - // @Test - // public void user_count_by_component_and_permission() { - // UserDto user1 = userDb.insertUser(); - // UserDto user2 = userDb.insertUser(); - // UserDto user3 = userDb.insertUser(); - // - // addPermissionToUser(ISSUE_ADMIN, user1.getId(), 42L); - // addPermissionToUser(ADMIN, user1.getId(), 123L); - // addPermissionToUser(ADMIN, user2.getId(), 123L); - // addPermissionToUser(ADMIN, user3.getId(), 123L); - // addPermissionToUser(USER, user1.getId(), 123L); - // addPermissionToUser(USER, user1.getId(), 456L); - // - // final List result = new ArrayList<>(); - // underTest.usersCountByComponentIdAndPermission(dbTester.getSession(), asList(123L, 456L, 789L), - // context -> result.add((CountByProjectAndPermissionDto) context.getResultObject())); - // assertThat(result).hasSize(3); - // assertThat(result).extracting("permission").containsOnly(ADMIN, USER); - // assertThat(result).extracting("componentId").containsOnly(123L, 456L); - // assertThat(result).extracting("count").containsOnly(3, 1); - // } - // - // private List selectLoginsByQuery(PermissionQuery query) { - // return underTest.selectLoginsByPermissionQuery(session, query); - // } - // - // private int countUsersByQuery(PermissionQuery query) { - // return underTest.countUsersByQuery(session, query); - // } - // - // private void addPermissionToUser(String permission, long userId, long resourceId) { - // dbTester.getDbClient().roleDao().insertUserRole(dbTester.getSession(), new org.sonar.db.user.UserPermissionDto() - // .setPermission(permission) - // .setUserId(userId) - // .setComponentId(resourceId)); - // dbTester.commit(); - // } - } diff --git a/sonar-db/src/test/java/org/sonar/db/permission/UserWithPermissionDaoTest.java b/sonar-db/src/test/java/org/sonar/db/permission/UserWithPermissionDaoTest.java index 55873f22343..3aafda45c0e 100644 --- a/sonar-db/src/test/java/org/sonar/db/permission/UserWithPermissionDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/permission/UserWithPermissionDaoTest.java @@ -19,7 +19,6 @@ */ package org.sonar.db.permission; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -40,7 +39,6 @@ import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; import static org.sonar.api.web.UserRole.ADMIN; -import static org.sonar.api.web.UserRole.ISSUE_ADMIN; import static org.sonar.api.web.UserRole.USER; import static org.sonar.core.permission.GlobalPermissions.PROVISIONING; import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION; @@ -250,28 +248,6 @@ public class UserWithPermissionDaoTest { assertThat(underTest.selectUserPermissionsByLoginsAnProject(session, Collections.emptyList(), project.getId())).isEmpty(); } - @Test - public void user_count_by_component_and_permission() { - UserDto user1 = userDb.insertUser(); - UserDto user2 = userDb.insertUser(); - UserDto user3 = userDb.insertUser(); - - addPermissionToUser(ISSUE_ADMIN, user1.getId(), 42L); - addPermissionToUser(ADMIN, user1.getId(), 123L); - addPermissionToUser(ADMIN, user2.getId(), 123L); - addPermissionToUser(ADMIN, user3.getId(), 123L); - addPermissionToUser(USER, user1.getId(), 123L); - addPermissionToUser(USER, user1.getId(), 456L); - - final List result = new ArrayList<>(); - underTest.usersCountByComponentIdAndPermission(dbTester.getSession(), asList(123L, 456L, 789L), - context -> result.add((CountByProjectAndPermissionDto) context.getResultObject())); - assertThat(result).hasSize(3); - assertThat(result).extracting("permission").containsOnly(ADMIN, USER); - assertThat(result).extracting("componentId").containsOnly(123L, 456L); - assertThat(result).extracting("count").containsOnly(3, 1); - } - private List selectLoginsByQuery(PermissionQuery query) { return underTest.selectLoginsByPermissionQuery(session, query); } @@ -280,12 +256,4 @@ public class UserWithPermissionDaoTest { return underTest.countUsersByQuery(session, query); } - private void addPermissionToUser(String permission, long userId, long resourceId) { - dbTester.getDbClient().roleDao().insertUserRole(dbTester.getSession(), new UserPermissionDto() - .setPermission(permission) - .setUserId(userId) - .setComponentId(resourceId)); - dbTester.commit(); - } - } -- 2.39.5