private boolean isMemberOf(DbSession dbSession, UserDto user, GroupDto groupId) { return dbClient.groupMembershipDao().selectGroupIdsByUserId(dbSession, user.getId()).contains(groupId.getId()); }
private void writeUser(DbSession dbSession, Response response, String uuid) { try (JsonWriter json = response.newJsonWriter()) { json.beginObject(); json.name("user"); UserDto user = dbClient.userDao().selectByUuid(dbSession, uuid); checkState(user != null, "User with uuid '%s' doesn't exist", uuid); Set<String> groups = new HashSet<>(dbClient.groupMembershipDao().selectGroupsByLogins(dbSession, singletonList(uuid)).get(uuid)); userWriter.write(json, user, groups, UserJsonWriter.FIELDS); json.endObject().close(); } }
@Test public void members_should_be_paginated() { db.users().insertMember(group1, user1); db.users().insertMember(group2, user1); db.users().insertMember(group3, user1); db.users().insertMember(group2, user2); List<UserMembershipDto> result = underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).build(), 0, 2); assertThat(result).hasSize(2); assertThat(result.get(0).getName()).isEqualTo("Admin name"); assertThat(result.get(1).getName()).isEqualTo("Not Admin"); result = underTest.selectMembers(db.getSession(), newQuery().groupId(100).build(), 1, 2); assertThat(result).hasSize(1); assertThat(result.get(0).getName()).isEqualTo("Not Admin"); result = underTest.selectMembers(db.getSession(), newQuery().groupId(100).build(), 2, 1); assertThat(result).isEmpty(); }
private GroupsWsResponse doHandle(GroupsRequest request) { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = findOrganizationByKey(dbSession, request.getOrganization()); userSession.checkPermission(OrganizationPermission.ADMINISTER, organization); String login = request.getLogin(); GroupMembershipQuery query = GroupMembershipQuery.builder() .organizationUuid(organization.getUuid()) .groupSearch(request.getQuery()) .membership(getMembership(request.getSelected())) .pageIndex(request.getPage()) .pageSize(request.getPageSize()) .build(); UserDto user = checkFound(dbClient.userDao().selectActiveUserByLogin(dbSession, login), "Unknown user: %s", login); int total = dbClient.groupMembershipDao().countGroups(dbSession, query, user.getId()); Paging paging = forPageIndex(query.pageIndex()).withPageSize(query.pageSize()).andTotal(total); List<GroupMembershipDto> groups = dbClient.groupMembershipDao().selectGroups(dbSession, query, user.getId(), paging.offset(), query.pageSize()); return buildResponse(groups, defaultGroupFinder.findDefaultGroup(dbSession, organization.getUuid()), paging); } }
@Override public void handle(Request request, Response response) throws Exception { int pageSize = request.mandatoryParamAsInt(Param.PAGE_SIZE); int page = request.mandatoryParamAsInt(Param.PAGE); String queryString = request.param(Param.TEXT_QUERY); String selected = request.mandatoryParam(Param.SELECTED); try (DbSession dbSession = dbClient.openSession(false)) { GroupId group = support.findGroup(dbSession, request); userSession.checkPermission(OrganizationPermission.ADMINISTER, group.getOrganizationUuid()); UserMembershipQuery query = UserMembershipQuery.builder() .groupId(group.getId()) .organizationUuid(group.getOrganizationUuid()) .memberSearch(queryString) .membership(getMembership(selected)) .pageIndex(page) .pageSize(pageSize) .build(); int total = dbClient.groupMembershipDao().countMembers(dbSession, query); Paging paging = forPageIndex(page).withPageSize(pageSize).andTotal(total); List<UserMembershipDto> users = dbClient.groupMembershipDao().selectMembers(dbSession, query, paging.offset(), paging.pageSize()); try (JsonWriter json = response.newJsonWriter()) { json.beginObject(); writeMembers(json, users); writePaging(json, paging); json.endObject(); } } }
public List<Integer> selectGroupIdsByUserId(DbSession dbSession, int userId) { return mapper(dbSession).selectGroupIdsByUserId(userId); }
private void assertMember(String organizationUuid, int userId) { assertThat(dbClient.organizationMemberDao().select(dbSession, organizationUuid, userId)).isPresent(); Integer defaultGroupId = dbClient.organizationDao().getDefaultGroupId(dbSession, organizationUuid).get(); assertThat(db.getDbClient().groupMembershipDao().selectGroups(db.getSession(), GroupMembershipQuery.builder() .membership(IN) .organizationUuid(organizationUuid).build(), userId, 0, 10)) .extracting(GroupMembershipDto::getId) .containsOnly(defaultGroupId.longValue()); } }
@Test public void count_groups() { db.users().insertMember(group1, user1); db.users().insertMember(group2, user1); db.users().insertMember(group3, user1); db.users().insertMember(group2, user2); // user1 is member of 3 groups assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user1.getId())).isEqualTo(3); assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user1.getId())).isZero(); // user2 is member of 1 group on 3 assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user2.getId())).isEqualTo(1); assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user2.getId())).isEqualTo(2); // user3 is member of 0 group assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user3.getId())).isZero(); assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user3.getId())).isEqualTo(3); // unknown user is member of 0 group assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), 999)).isZero(); assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), 999)).isEqualTo(3); }
@Override public void handle(Request request, Response response) throws Exception { int page = request.mandatoryParamAsInt(Param.PAGE); int pageSize = request.mandatoryParamAsInt(Param.PAGE_SIZE); SearchOptions options = new SearchOptions() .setPage(page, pageSize); String query = defaultIfBlank(request.param(Param.TEXT_QUERY), ""); Set<String> fields = neededFields(request); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = groupWsSupport.findOrganizationByKey(dbSession, request.param(PARAM_ORGANIZATION_KEY)); userSession.checkLoggedIn().checkPermission(ADMINISTER, organization); GroupDto defaultGroup = defaultGroupFinder.findDefaultGroup(dbSession, organization.getUuid()); int limit = dbClient.groupDao().countByQuery(dbSession, organization.getUuid(), query); Paging paging = forPageIndex(page).withPageSize(pageSize).andTotal(limit); List<GroupDto> groups = dbClient.groupDao().selectByQuery(dbSession, organization.getUuid(), query, options.getOffset(), pageSize); List<Integer> groupIds = groups.stream().map(GroupDto::getId).collect(MoreCollectors.toList(groups.size())); Map<String, Integer> userCountByGroup = dbClient.groupMembershipDao().countUsersByGroups(dbSession, groupIds); writeProtobuf(buildResponse(groups, userCountByGroup, fields, paging, defaultGroup), request, response); } }
@Test public void count_members() { GroupDto emptyGroup = db.users().insertGroup(organizationDto, "sonar-nobody"); db.users().insertMember(group1, user1); db.users().insertMember(group2, user1); db.users().insertMember(group3, user1); db.users().insertMember(group2, user2); // 100 has 1 member and 1 non member assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group1.getId()).membership(UserMembershipQuery.IN).build())).isEqualTo(1); assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group1.getId()).membership(UserMembershipQuery.OUT).build())).isEqualTo(1); // 101 has 2 members assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group2.getId()).membership(UserMembershipQuery.IN).build())).isEqualTo(2); assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group2.getId()).membership(UserMembershipQuery.OUT).build())).isZero(); // 102 has 1 member and 1 non member assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group3.getId()).membership(UserMembershipQuery.IN).build())).isEqualTo(1); assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group3.getId()).membership(UserMembershipQuery.OUT).build())).isEqualTo(1); // 103 has no member assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(emptyGroup.getId()).membership(UserMembershipQuery.IN).build())).isZero(); assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(emptyGroup.getId()).membership(UserMembershipQuery.OUT).build())).isEqualTo(2); }
@Override public void handle(Request request, Response response) throws Exception { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = getOrganization(dbSession, request.param("organization")); userSession.checkMembership(organization); UserQuery.Builder userQuery = buildUserQuery(request, organization); SearchOptions searchOptions = buildSearchOptions(request); SearchResult<UserDoc> searchResults = userIndex.search(userQuery.build(), searchOptions); List<String> orderedLogins = searchResults.getDocs().stream().map(UserDoc::login).collect(MoreCollectors.toList()); List<UserDto> users = dbClient.userDao().selectByLogins(dbSession, orderedLogins).stream() .sorted(Ordering.explicit(orderedLogins).onResultOf(UserDto::getLogin)) .collect(MoreCollectors.toList()); Multiset<String> groupCountByLogin = null; if (userSession.hasPermission(ADMINISTER, organization)) { groupCountByLogin = dbClient.groupMembershipDao().countGroupByLoginsAndOrganization(dbSession, orderedLogins, organization.getUuid()); } Common.Paging wsPaging = buildWsPaging(request, searchResults); SearchMembersWsResponse wsResponse = buildResponse(users, wsPaging, groupCountByLogin); writeProtobuf(wsResponse, request, response); } }
private GroupsWsResponse doHandle(GroupsRequest request) { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = findOrganizationByKey(dbSession, request.getOrganization()); userSession.checkPermission(OrganizationPermission.ADMINISTER, organization); String login = request.getLogin(); GroupMembershipQuery query = GroupMembershipQuery.builder() .organizationUuid(organization.getUuid()) .groupSearch(request.getQuery()) .membership(getMembership(request.getSelected())) .pageIndex(request.getPage()) .pageSize(request.getPageSize()) .build(); UserDto user = checkFound(dbClient.userDao().selectActiveUserByLogin(dbSession, login), "Unknown user: %s", login); int total = dbClient.groupMembershipDao().countGroups(dbSession, query, user.getId()); Paging paging = forPageIndex(query.pageIndex()).withPageSize(query.pageSize()).andTotal(total); List<GroupMembershipDto> groups = dbClient.groupMembershipDao().selectGroups(dbSession, query, user.getId(), paging.offset(), query.pageSize()); return buildResponse(groups, defaultGroupFinder.findDefaultGroup(dbSession, organization.getUuid()), paging); } }
@Override public void handle(Request request, Response response) throws Exception { int pageSize = request.mandatoryParamAsInt(Param.PAGE_SIZE); int page = request.mandatoryParamAsInt(Param.PAGE); String queryString = request.param(Param.TEXT_QUERY); String selected = request.mandatoryParam(Param.SELECTED); try (DbSession dbSession = dbClient.openSession(false)) { GroupId group = support.findGroup(dbSession, request); userSession.checkPermission(OrganizationPermission.ADMINISTER, group.getOrganizationUuid()); UserMembershipQuery query = UserMembershipQuery.builder() .groupId(group.getId()) .organizationUuid(group.getOrganizationUuid()) .memberSearch(queryString) .membership(getMembership(selected)) .pageIndex(page) .pageSize(pageSize) .build(); int total = dbClient.groupMembershipDao().countMembers(dbSession, query); Paging paging = forPageIndex(page).withPageSize(pageSize).andTotal(total); List<UserMembershipDto> users = dbClient.groupMembershipDao().selectMembers(dbSession, query, paging.offset(), paging.pageSize()); try (JsonWriter json = response.newJsonWriter()) { json.beginObject(); writeMembers(json, users); writePaging(json, paging); json.endObject(); } } }
public int countGroups(DbSession session, GroupMembershipQuery query, Integer userId) { Map<String, Object> params = ImmutableMap.of("query", query, "userId", userId, "organizationUuid", query.organizationUuid()); return mapper(session).countGroups(params); }
@Test public void select_groups() { db.users().insertMember(group1, user1); db.users().insertMember(group2, user1); db.users().insertMember(group3, user1); db.users().insertMember(group2, user2); // user1 is member of 3 groups assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user1.getId(), 0, 10)).hasSize(3); assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user1.getId(), 0, 10)).isEmpty(); // user2 is member of 1 group on 3 assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user2.getId(), 0, 10)).hasSize(1); assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user2.getId(), 0, 10)).hasSize(2); // user3 is member of 0 group assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user3.getId(), 0, 10)).isEmpty(); assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user3.getId(), 0, 10)).hasSize(3); // unknown user is member of 0 group assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), 999, 0, 10)).isEmpty(); assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), 999, 0, 10)).hasSize(3); }
@Test public void count_groups_only_from_given_organization() { OrganizationDto otherOrganization = db.organizations().insert(); GroupDto otherGroup = db.users().insertGroup(otherOrganization, "sonar-administrators-other_orga"); db.users().insertMember(group1, user1); db.users().insertMember(otherGroup, user1); assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user1.getId())).isEqualTo(1); }
@Test public void count_users_by_group() { GroupDto emptyGroup = db.users().insertGroup(organizationDto, "sonar-nobody"); db.users().insertMember(group1, user1); db.users().insertMember(group2, user1); db.users().insertMember(group3, user1); db.users().insertMember(group2, user2); assertThat(underTest.countUsersByGroups(db.getSession(), asList(group1.getId(), group2.getId(), group3.getId(), emptyGroup.getId()))) .containsOnly(entry(group1.getName(), 1), entry(group2.getName(), 2), entry(group3.getName(), 1), entry(emptyGroup.getName(), 0)); assertThat(underTest.countUsersByGroups(db.getSession(), asList(group1.getId(), emptyGroup.getId()))) .containsOnly(entry(group1.getName(), 1), entry(emptyGroup.getName(), 0)); }
private void writeResponse(DbSession dbSession, Request request, Response response, OrganizationDto organization, GroupDto group) { UserMembershipQuery query = UserMembershipQuery.builder() .groupId(group.getId()) .organizationUuid(organization.getUuid()) .membership(UserMembershipQuery.IN) .build(); int membersCount = dbClient.groupMembershipDao().countMembers(dbSession, query); UserGroups.UpdateWsResponse.Builder respBuilder = UserGroups.UpdateWsResponse.newBuilder(); // 'default' is always false as it's not possible to update a default group respBuilder.setGroup(toProtobuf(organization, group, membersCount, false)); writeProtobuf(respBuilder.build(), request, response); }
@Override public void handle(Request request, Response response) throws Exception { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = getOrganization(dbSession, request.param("organization")); UserQuery.Builder userQuery = buildUserQuery(request, organization); SearchOptions searchOptions = buildSearchOptions(request); SearchResult<UserDoc> searchResults = userIndex.search(userQuery.build(), searchOptions); List<String> orderedLogins = searchResults.getDocs().stream().map(UserDoc::login).collect(MoreCollectors.toList()); List<UserDto> users = dbClient.userDao().selectByLogins(dbSession, orderedLogins).stream() .sorted(Ordering.explicit(orderedLogins).onResultOf(UserDto::getLogin)) .collect(MoreCollectors.toList()); Multiset<String> groupCountByLogin = null; if (userSession.hasPermission(OrganizationPermission.ADMINISTER, organization)) { groupCountByLogin = dbClient.groupMembershipDao().countGroupByLoginsAndOrganization(dbSession, orderedLogins, organization.getUuid()); } Common.Paging wsPaging = buildWsPaging(request, searchResults); SearchMembersWsResponse wsResponse = buildResponse(users, wsPaging, groupCountByLogin); writeProtobuf(wsResponse, request, response); } }
private void syncGroups(DbSession dbSession, UserIdentity userIdentity, UserDto userDto) { if (!userIdentity.shouldSyncGroups()) { return; } String userLogin = userDto.getLogin(); Set<String> userGroups = new HashSet<>(dbClient.groupMembershipDao().selectGroupsByLogins(dbSession, singletonList(userLogin)).get(userLogin)); Set<String> identityGroups = userIdentity.getGroups(); LOGGER.debug("List of groups returned by the identity provider '{}'", identityGroups); Collection<String> groupsToAdd = Sets.difference(identityGroups, userGroups); Collection<String> groupsToRemove = Sets.difference(userGroups, identityGroups); Collection<String> allGroups = new ArrayList<>(groupsToAdd); allGroups.addAll(groupsToRemove); DefaultOrganization defaultOrganization = defaultOrganizationProvider.get(); Map<String, GroupDto> groupsByName = dbClient.groupDao().selectByNames(dbSession, defaultOrganization.getUuid(), allGroups) .stream() .collect(uniqueIndex(GroupDto::getName)); addGroups(dbSession, userDto, groupsToAdd, groupsByName); removeGroups(dbSession, userDto, groupsToRemove, groupsByName); }