123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- /*
- * 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.permission;
-
- import com.google.common.base.Predicate;
- import com.google.common.collect.Iterables;
- import java.util.Collection;
- import java.util.List;
- import javax.annotation.Nonnull;
- import javax.annotation.Nullable;
- import org.apache.commons.lang.StringUtils;
- import org.sonar.api.security.DefaultGroups;
- import org.sonar.api.server.ServerSide;
- import org.sonar.api.utils.Paging;
- import org.sonar.core.permission.GroupWithPermission;
- import org.sonar.core.permission.UserWithPermission;
- import org.sonar.db.DbClient;
- import org.sonar.db.DbSession;
- import org.sonar.db.component.ResourceDao;
- import org.sonar.db.component.ResourceDto;
- import org.sonar.db.component.ResourceQuery;
- import org.sonar.db.permission.GroupWithPermissionDto;
- import org.sonar.db.permission.PermissionDao;
- import org.sonar.db.permission.PermissionQuery;
- import org.sonar.db.permission.PermissionTemplateDao;
- import org.sonar.db.permission.PermissionTemplateDto;
- import org.sonar.db.permission.UserWithPermissionDto;
- import org.sonar.server.exceptions.NotFoundException;
-
- import static com.google.common.collect.Lists.newArrayList;
-
- @ServerSide
- public class PermissionFinder {
-
- private final DbClient dbClient;
-
- private final PermissionDao permissionDao;
- private final ResourceDao resourceDao;
- private final PermissionTemplateDao permissionTemplateDao;
-
- public PermissionFinder(DbClient dbClient) {
- this.dbClient = dbClient;
- this.resourceDao = dbClient.resourceDao();
- this.permissionDao = dbClient.permissionDao();
- this.permissionTemplateDao = dbClient.permissionTemplateDao();
- }
-
- public UserWithPermissionQueryResult findUsersWithPermission(PermissionQuery query) {
- Long componentId = componentId(query.component());
- int limit = query.pageSize();
- DbSession dbSession = dbClient.openSession(false);
- try {
- int total = permissionDao.countUsers(dbSession, query, componentId);
- return toUserQueryResult(permissionDao.selectUsers(dbSession, query, componentId, offset(query), limit), total);
- } finally {
- dbClient.closeSession(dbSession);
- }
- }
-
- public UserWithPermissionQueryResult findUsersWithPermissionTemplate(PermissionQuery query) {
- Long permissionTemplateId = templateId(query.template());
- int limit = query.pageSize();
- DbSession dbSession = dbClient.openSession(false);
- try {
- int total = permissionTemplateDao.countUsers(dbSession, query, permissionTemplateId);
- return toUserQueryResult(permissionTemplateDao.selectUsers(dbSession, query, permissionTemplateId, offset(query), limit), total);
- } finally {
- dbClient.closeSession(dbSession);
- }
- }
-
- /**
- * Paging for groups search is done in Java in order to correctly handle the 'Anyone' group
- */
- public GroupWithPermissionQueryResult findGroupsWithPermission(PermissionQuery query) {
- Long componentId = componentId(query.component());
- DbSession dbSession = dbClient.openSession(false);
- try {
- return toGroupQueryResult(permissionDao.selectGroups(dbSession, query, componentId), query);
- } finally {
- dbClient.closeSession(dbSession);
- }
- }
-
- /**
- * Paging for groups search is done in Java in order to correctly handle the 'Anyone' group
- */
- public GroupWithPermissionQueryResult findGroupsWithPermissionTemplate(PermissionQuery query) {
- Long permissionTemplateId = templateId(query.template());
- DbSession dbSession = dbClient.openSession(false);
- try {
- return toGroupQueryResult(permissionTemplateDao.selectGroups(dbSession, query, permissionTemplateId), query);
- } finally {
- dbClient.closeSession(dbSession);
- }
- }
-
- private static UserWithPermissionQueryResult toUserQueryResult(List<UserWithPermissionDto> dtos, int total) {
- return new UserWithPermissionQueryResult(toUserWithPermissionList(dtos), total);
- }
-
- private static List<UserWithPermission> toUserWithPermissionList(List<UserWithPermissionDto> dtos) {
- List<UserWithPermission> users = newArrayList();
- for (UserWithPermissionDto dto : dtos) {
- users.add(dto.toUserWithPermission());
- }
- return users;
- }
-
- @Nullable
- private Long componentId(@Nullable String componentKey) {
- if (componentKey == null) {
- return null;
- } else {
- ResourceDto resourceDto = resourceDao.selectResource(ResourceQuery.create().setKey(componentKey));
- if (resourceDto == null) {
- throw new NotFoundException(String.format("Component '%s' does not exist", componentKey));
- }
- return resourceDto.getId();
- }
- }
-
- private GroupWithPermissionQueryResult toGroupQueryResult(List<GroupWithPermissionDto> dtos, PermissionQuery query) {
- addAnyoneGroup(dtos, query);
- List<GroupWithPermissionDto> filteredDtos = filterMembership(dtos, query);
-
- Paging paging = Paging.create(query.pageSize(), query.pageIndex(), filteredDtos.size());
- List<GroupWithPermission> pagedGroups = pagedGroups(filteredDtos, paging);
- return new GroupWithPermissionQueryResult(pagedGroups, filteredDtos.size());
- }
-
- private Long templateId(String templateKey) {
- PermissionTemplateDto dto = permissionTemplateDao.selectTemplateByKey(templateKey);
- if (dto == null) {
- throw new NotFoundException(String.format("Template '%s' does not exist", templateKey));
- }
- return dto.getId();
- }
-
- private static int offset(PermissionQuery query) {
- int pageSize = query.pageSize();
- int pageIndex = query.pageIndex();
- return (pageIndex - 1) * pageSize;
- }
-
- private List<GroupWithPermissionDto> filterMembership(List<GroupWithPermissionDto> dtos, PermissionQuery query) {
- return newArrayList(Iterables.filter(dtos, new GroupWithPermissionMatchQuery(query)));
- }
-
- /**
- * As the anyone group does not exists in db, it's not returned when it has not the permission.
- * We have to manually add it at the begin of the list, if it matched the search text
- */
- private void addAnyoneGroup(List<GroupWithPermissionDto> groups, PermissionQuery query) {
- boolean hasAnyoneGroup = Iterables.any(groups, IsAnyoneGroup.INSTANCE);
- if (!hasAnyoneGroup && (query.search() == null || StringUtils.containsIgnoreCase(DefaultGroups.ANYONE, query.search()))) {
- groups.add(0, new GroupWithPermissionDto().setName(DefaultGroups.ANYONE));
- }
- }
-
- private static List<GroupWithPermission> pagedGroups(Collection<GroupWithPermissionDto> dtos, Paging paging) {
- List<GroupWithPermission> groups = newArrayList();
- int index = 0;
- for (GroupWithPermissionDto dto : dtos) {
- if (index >= paging.offset() && groups.size() < paging.pageSize()) {
- groups.add(dto.toGroupWithPermission());
- } else if (groups.size() >= paging.pageSize()) {
- break;
- }
- index++;
- }
- return groups;
- }
-
- private static class GroupWithPermissionMatchQuery implements Predicate<GroupWithPermissionDto> {
- private final PermissionQuery query;
-
- public GroupWithPermissionMatchQuery(PermissionQuery query) {
- this.query = query;
- }
-
- @Override
- public boolean apply(@Nonnull GroupWithPermissionDto dto) {
- if (PermissionQuery.IN.equals(query.membership())) {
- return dto.getPermission() != null;
- } else if (PermissionQuery.OUT.equals(query.membership())) {
- return dto.getPermission() == null;
- }
- return true;
- }
- }
-
- private enum IsAnyoneGroup implements Predicate<GroupWithPermissionDto> {
- INSTANCE;
-
- @Override
- public boolean apply(@Nonnull GroupWithPermissionDto group) {
- return group.getName().equals(DefaultGroups.ANYONE);
- }
- }
- }
|