您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

PermissionTemplateDao.java 10.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2020 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.db.permission.template;
  21. import java.util.Collections;
  22. import java.util.Date;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Locale;
  26. import java.util.Map;
  27. import javax.annotation.CheckForNull;
  28. import javax.annotation.Nullable;
  29. import org.apache.ibatis.session.ResultHandler;
  30. import org.apache.ibatis.session.RowBounds;
  31. import org.sonar.api.utils.System2;
  32. import org.sonar.core.util.UuidFactory;
  33. import org.sonar.db.Dao;
  34. import org.sonar.db.DbSession;
  35. import org.sonar.db.permission.CountPerProjectPermission;
  36. import org.sonar.db.permission.PermissionQuery;
  37. import static java.lang.String.format;
  38. import static org.sonar.api.security.DefaultGroups.ANYONE;
  39. import static org.sonar.db.DatabaseUtils.executeLargeInputs;
  40. import static org.sonar.db.DatabaseUtils.executeLargeInputsWithoutOutput;
  41. public class PermissionTemplateDao implements Dao {
  42. private static final String ANYONE_GROUP_PARAMETER = "anyoneGroup";
  43. private final System2 system;
  44. private final UuidFactory uuidFactory;
  45. public PermissionTemplateDao(UuidFactory uuidFactory, System2 system) {
  46. this.uuidFactory = uuidFactory;
  47. this.system = system;
  48. }
  49. /**
  50. * @return a paginated list of user logins.
  51. */
  52. public List<String> selectUserLoginsByQueryAndTemplate(DbSession session, PermissionQuery query, String templateUuid) {
  53. return mapper(session).selectUserLoginsByQueryAndTemplate(query, templateUuid, new RowBounds(query.getPageOffset(), query.getPageSize()));
  54. }
  55. public int countUserLoginsByQueryAndTemplate(DbSession session, PermissionQuery query, String templateUuid) {
  56. return mapper(session).countUserLoginsByQueryAndTemplate(query, templateUuid);
  57. }
  58. public List<PermissionTemplateUserDto> selectUserPermissionsByTemplateIdAndUserLogins(DbSession dbSession, String templateUuid, List<String> logins) {
  59. return executeLargeInputs(logins, l -> mapper(dbSession).selectUserPermissionsByTemplateUuidAndUserLogins(templateUuid, l));
  60. }
  61. public List<PermissionTemplateUserDto> selectUserPermissionsByTemplateId(DbSession dbSession, String templateUuid) {
  62. return mapper(dbSession).selectUserPermissionsByTemplateUuidAndUserLogins(templateUuid, Collections.emptyList());
  63. }
  64. public List<String> selectGroupNamesByQueryAndTemplate(DbSession session, PermissionQuery query, String templateUuid) {
  65. return mapper(session).selectGroupNamesByQueryAndTemplate(templateUuid, query, new RowBounds(query.getPageOffset(), query.getPageSize()));
  66. }
  67. public int countGroupNamesByQueryAndTemplate(DbSession session, PermissionQuery query, String templateUuid) {
  68. return mapper(session).countGroupNamesByQueryAndTemplate(query, templateUuid);
  69. }
  70. public List<PermissionTemplateGroupDto> selectGroupPermissionsByTemplateIdAndGroupNames(DbSession dbSession, String templateUuid, List<String> groups) {
  71. return executeLargeInputs(groups, g -> mapper(dbSession).selectGroupPermissionsByTemplateUuidAndGroupNames(templateUuid, g));
  72. }
  73. public List<PermissionTemplateGroupDto> selectGroupPermissionsByTemplateUuid(DbSession dbSession, String templateUuid) {
  74. return mapper(dbSession).selectGroupPermissionsByTemplateUuidAndGroupNames(templateUuid, Collections.emptyList());
  75. }
  76. /**
  77. * @return {@code true} if template contains groups that are granted with {@code permission}, else {@code false}
  78. */
  79. public boolean hasGroupsWithPermission(DbSession dbSession, String templateUuid, String permission, @Nullable String groupUuid) {
  80. return mapper(dbSession).countGroupsWithPermission(templateUuid, permission, groupUuid) > 0;
  81. }
  82. @CheckForNull
  83. public PermissionTemplateDto selectByUuid(DbSession session, String templateUuid) {
  84. return mapper(session).selectByUuid(templateUuid);
  85. }
  86. public List<PermissionTemplateDto> selectAll(DbSession session, @Nullable String nameMatch) {
  87. String upperCaseNameLikeSql = nameMatch != null ? toUppercaseSqlQuery(nameMatch) : null;
  88. return mapper(session).selectAll(upperCaseNameLikeSql);
  89. }
  90. private static String toUppercaseSqlQuery(String nameMatch) {
  91. String wildcard = "%";
  92. return format("%s%s%s", wildcard, nameMatch.toUpperCase(Locale.ENGLISH), wildcard);
  93. }
  94. public PermissionTemplateDto insert(DbSession session, PermissionTemplateDto dto) {
  95. if (dto.getUuid() == null) {
  96. dto.setUuid(uuidFactory.create());
  97. }
  98. mapper(session).insert(dto);
  99. return dto;
  100. }
  101. /**
  102. * Each row returns a #{@link CountPerProjectPermission}
  103. */
  104. public void usersCountByTemplateUuidAndPermission(DbSession dbSession, List<String> templateUuids, ResultHandler<CountByTemplateAndPermissionDto> resultHandler) {
  105. Map<String, Object> parameters = new HashMap<>(1);
  106. executeLargeInputsWithoutOutput(
  107. templateUuids,
  108. partitionedTemplateUuids -> {
  109. parameters.put("templateUuids", partitionedTemplateUuids);
  110. mapper(dbSession).usersCountByTemplateUuidAndPermission(parameters, resultHandler);
  111. });
  112. }
  113. /**
  114. * Each row returns a #{@link CountPerProjectPermission}
  115. */
  116. public void groupsCountByTemplateUuidAndPermission(DbSession dbSession, List<String> templateUuids, ResultHandler<CountByTemplateAndPermissionDto> resultHandler) {
  117. Map<String, Object> parameters = new HashMap<>(2);
  118. parameters.put(ANYONE_GROUP_PARAMETER, ANYONE);
  119. executeLargeInputsWithoutOutput(
  120. templateUuids,
  121. partitionedTemplateUuids -> {
  122. parameters.put("templateUuids", partitionedTemplateUuids);
  123. mapper(dbSession).groupsCountByTemplateUuidAndPermission(parameters, resultHandler);
  124. });
  125. }
  126. public List<PermissionTemplateGroupDto> selectAllGroupPermissionTemplatesByGroupUuid(DbSession dbSession, String groupUuid) {
  127. return mapper(dbSession).selectAllGroupPermissionTemplatesByGroupUuid(groupUuid);
  128. }
  129. public void deleteByUuid(DbSession session, String templateUuid) {
  130. PermissionTemplateMapper mapper = mapper(session);
  131. mapper.deleteUserPermissionsByTemplateUuid(templateUuid);
  132. mapper.deleteGroupPermissionsByTemplateUuid(templateUuid);
  133. session.getMapper(PermissionTemplateCharacteristicMapper.class).deleteByTemplateUuid(templateUuid);
  134. mapper.deleteByUuid(templateUuid);
  135. }
  136. public PermissionTemplateDto update(DbSession session, PermissionTemplateDto permissionTemplate) {
  137. mapper(session).update(permissionTemplate);
  138. return permissionTemplate;
  139. }
  140. public void insertUserPermission(DbSession session, String templateUuid, String userUuid, String permission) {
  141. PermissionTemplateUserDto permissionTemplateUser = new PermissionTemplateUserDto()
  142. .setUuid(uuidFactory.create())
  143. .setTemplateUuid(templateUuid)
  144. .setUserUuid(userUuid)
  145. .setPermission(permission)
  146. .setCreatedAt(now())
  147. .setUpdatedAt(now());
  148. mapper(session).insertUserPermission(permissionTemplateUser);
  149. session.commit();
  150. }
  151. public void deleteUserPermission(DbSession session, String templateUuid, String userUuid, String permission) {
  152. PermissionTemplateUserDto permissionTemplateUser = new PermissionTemplateUserDto()
  153. .setTemplateUuid(templateUuid)
  154. .setPermission(permission)
  155. .setUserUuid(userUuid);
  156. mapper(session).deleteUserPermission(permissionTemplateUser);
  157. session.commit();
  158. }
  159. public void deleteUserPermissionsByUserUuid(DbSession dbSession, String userUuid) {
  160. mapper(dbSession).deleteUserPermissionsByUserUuid(userUuid);
  161. }
  162. public void insertGroupPermission(DbSession session, String templateUuid, @Nullable String groupUuid, String permission) {
  163. PermissionTemplateGroupDto permissionTemplateGroup = new PermissionTemplateGroupDto()
  164. .setUuid(uuidFactory.create())
  165. .setTemplateUuid(templateUuid)
  166. .setPermission(permission)
  167. .setGroupUuid(groupUuid)
  168. .setCreatedAt(now())
  169. .setUpdatedAt(now());
  170. mapper(session).insertGroupPermission(permissionTemplateGroup);
  171. }
  172. public void insertGroupPermission(DbSession session, PermissionTemplateGroupDto permissionTemplateGroup) {
  173. mapper(session).insertGroupPermission(permissionTemplateGroup);
  174. }
  175. public void deleteGroupPermission(DbSession session, String templateUuid, @Nullable String groupUuid, String permission) {
  176. PermissionTemplateGroupDto permissionTemplateGroup = new PermissionTemplateGroupDto()
  177. .setTemplateUuid(templateUuid)
  178. .setPermission(permission)
  179. .setGroupUuid(groupUuid);
  180. mapper(session).deleteGroupPermission(permissionTemplateGroup);
  181. session.commit();
  182. }
  183. public PermissionTemplateDto selectByName(DbSession dbSession, String name) {
  184. return mapper(dbSession).selectByName(name.toUpperCase(Locale.ENGLISH));
  185. }
  186. public List<String> selectPotentialPermissionsByUserUuidAndTemplateUuid(DbSession dbSession, @Nullable String currentUserUuid, String templateUuid) {
  187. return mapper(dbSession).selectPotentialPermissionsByUserUuidAndTemplateUuid(currentUserUuid, templateUuid);
  188. }
  189. /**
  190. * Remove a group from all templates (used when removing a group)
  191. */
  192. public void deleteByGroup(DbSession session, String groupUuid) {
  193. session.getMapper(PermissionTemplateMapper.class).deleteByGroupUuid(groupUuid);
  194. }
  195. private Date now() {
  196. return new Date(system.now());
  197. }
  198. private static PermissionTemplateMapper mapper(DbSession session) {
  199. return session.getMapper(PermissionTemplateMapper.class);
  200. }
  201. }