Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

UserDbTester.java 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2023 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.user;
  21. import java.util.Arrays;
  22. import java.util.List;
  23. import java.util.Optional;
  24. import java.util.Set;
  25. import java.util.function.Consumer;
  26. import java.util.stream.Collectors;
  27. import javax.annotation.CheckForNull;
  28. import javax.annotation.Nullable;
  29. import org.sonar.api.resources.Qualifiers;
  30. import org.sonar.api.security.DefaultGroups;
  31. import org.sonar.api.web.UserRole;
  32. import org.sonar.core.util.Uuids;
  33. import org.sonar.db.DbClient;
  34. import org.sonar.db.DbTester;
  35. import org.sonar.db.ce.CeTaskMessageType;
  36. import org.sonar.db.component.BranchDto;
  37. import org.sonar.db.component.ComponentDto;
  38. import org.sonar.db.entity.EntityDto;
  39. import org.sonar.db.permission.GlobalPermission;
  40. import org.sonar.db.permission.GroupPermissionDto;
  41. import org.sonar.db.permission.UserPermissionDto;
  42. import org.sonar.db.project.ProjectDto;
  43. import org.sonar.db.scim.ScimGroupDto;
  44. import org.sonar.db.scim.ScimUserDto;
  45. import static com.google.common.base.Preconditions.checkArgument;
  46. import static java.util.Arrays.stream;
  47. import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
  48. import static org.apache.commons.lang.math.RandomUtils.nextLong;
  49. import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
  50. import static org.sonar.db.user.GroupTesting.newGroupDto;
  51. public class UserDbTester {
  52. private static final Set<String> PUBLIC_PERMISSIONS = Set.of(UserRole.USER, UserRole.CODEVIEWER);
  53. public static final String PERMISSIONS_CANT_BE_GRANTED_ON_BRANCHES = "Permissions can't be granted on branches";
  54. private final DbTester db;
  55. private final DbClient dbClient;
  56. public UserDbTester(DbTester db) {
  57. this.db = db;
  58. this.dbClient = db.getDbClient();
  59. }
  60. // USERS
  61. public UserDto insertUser() {
  62. return insertUser(UserTesting.newUserDto());
  63. }
  64. public UserDto insertUser(String login) {
  65. UserDto dto = UserTesting.newUserDto().setLogin(login).setActive(true);
  66. return insertUser(dto);
  67. }
  68. @SafeVarargs
  69. public final UserDto insertUser(Consumer<UserDto>... populators) {
  70. UserDto dto = UserTesting.newUserDto().setActive(true);
  71. stream(populators).forEach(p -> p.accept(dto));
  72. return insertUser(dto);
  73. }
  74. public ScimUserDto insertScimUser(UserDto userDto) {
  75. ScimUserDto scimUserDto = dbClient.scimUserDao().enableScimForUser(db.getSession(), userDto.getUuid());
  76. db.commit();
  77. return scimUserDto;
  78. }
  79. @SafeVarargs
  80. public final UserDto insertDisabledUser(Consumer<UserDto>... populators) {
  81. UserDto dto = UserTesting.newDisabledUser();
  82. stream(populators).forEach(p -> p.accept(dto));
  83. return insertUser(dto);
  84. }
  85. public UserDto insertUser(UserDto userDto) {
  86. UserDto updatedUser = dbClient.userDao().insert(db.getSession(), userDto);
  87. db.commit();
  88. return updatedUser;
  89. }
  90. public ScimUserDto enableScimForUser(UserDto userDto) {
  91. ScimUserDto scimUSerDto = db.getDbClient().scimUserDao().enableScimForUser(db.getSession(), userDto.getUuid());
  92. db.commit();
  93. return scimUSerDto;
  94. }
  95. public UserDto insertAdminByUserPermission() {
  96. UserDto user = insertUser();
  97. insertGlobalPermissionOnUser(user, ADMINISTER);
  98. return user;
  99. }
  100. public UserDto updateLastConnectionDate(UserDto user, long lastConnectionDate) {
  101. db.getDbClient().userDao().update(db.getSession(), user.setLastConnectionDate(lastConnectionDate));
  102. db.getSession().commit();
  103. return user;
  104. }
  105. public UserDto updateSonarLintLastConnectionDate(UserDto user, long sonarLintLastConnectionDate) {
  106. db.getDbClient().userDao().update(db.getSession(), user.setLastSonarlintConnectionDate(sonarLintLastConnectionDate));
  107. db.getSession().commit();
  108. return user;
  109. }
  110. public Optional<UserDto> selectUserByLogin(String login) {
  111. return Optional.ofNullable(dbClient.userDao().selectByLogin(db.getSession(), login));
  112. }
  113. public Optional<UserDto> selectUserByEmail(String email) {
  114. List<UserDto> users = dbClient.userDao().selectByEmail(db.getSession(), email);
  115. if (users.size() > 1) {
  116. return Optional.empty();
  117. }
  118. return Optional.of(users.get(0));
  119. }
  120. public Optional<UserDto> selectUserByExternalIdAndIdentityProvider(String externalId, String identityProvider) {
  121. return Optional.ofNullable(dbClient.userDao().selectByExternalIdAndIdentityProvider(db.getSession(), externalId, identityProvider));
  122. }
  123. // GROUPS
  124. public GroupDto insertGroup(String name) {
  125. GroupDto group = newGroupDto().setName(name);
  126. return insertGroup(group);
  127. }
  128. @SafeVarargs
  129. public final GroupDto insertGroup(Consumer<GroupDto>... populators) {
  130. GroupDto group = newGroupDto();
  131. stream(populators).forEach(p -> p.accept(group));
  132. return insertGroup(group);
  133. }
  134. public GroupDto insertGroup(GroupDto dto) {
  135. db.getDbClient().groupDao().insert(db.getSession(), dto);
  136. db.commit();
  137. return dto;
  138. }
  139. public void markGroupAsGithubManaged(String groupUuid) {
  140. db.getDbClient().externalGroupDao().insert(db.getSession(), new ExternalGroupDto(groupUuid, randomAlphanumeric(20), "github"));
  141. db.commit();
  142. }
  143. public ExternalGroupDto insertExternalGroup(ExternalGroupDto dto) {
  144. db.getDbClient().externalGroupDao().insert(db.getSession(), dto);
  145. db.commit();
  146. return dto;
  147. }
  148. public ScimGroupDto insertScimGroup(GroupDto dto) {
  149. ScimGroupDto result = db.getDbClient().scimGroupDao().enableScimForGroup(db.getSession(), dto.getUuid());
  150. db.commit();
  151. return result;
  152. }
  153. public GroupDto insertDefaultGroup() {
  154. GroupDto dto = db.getDbClient().groupDao().insert(db.getSession(), newGroupDto().setName(DefaultGroups.USERS).setDescription("Users"));
  155. db.commit();
  156. return dto;
  157. }
  158. @CheckForNull
  159. public GroupDto selectGroupByUuid(String groupUuid) {
  160. return db.getDbClient().groupDao().selectByUuid(db.getSession(), groupUuid);
  161. }
  162. public Optional<GroupDto> selectGroup(String name) {
  163. return db.getDbClient().groupDao().selectByName(db.getSession(), name);
  164. }
  165. public int countAllGroups() {
  166. return db.getDbClient().groupDao().countByQuery(db.getSession(), new GroupQuery(null, null));
  167. }
  168. public Optional<ExternalGroupDto> selectExternalGroupByGroupUuid(String groupUuid) {
  169. return db.getDbClient().externalGroupDao().selectByGroupUuid(db.getSession(), groupUuid);
  170. }
  171. // GROUP MEMBERSHIP
  172. public UserGroupDto insertMember(GroupDto group, UserDto user) {
  173. UserGroupDto dto = new UserGroupDto().setGroupUuid(group.getUuid()).setUserUuid(user.getUuid());
  174. db.getDbClient().userGroupDao().insert(db.getSession(), dto, group.getName(), user.getLogin());
  175. db.commit();
  176. return dto;
  177. }
  178. public void insertMembers(GroupDto group, UserDto... users) {
  179. Arrays.stream(users).forEach(user -> {
  180. UserGroupDto dto = new UserGroupDto().setGroupUuid(group.getUuid()).setUserUuid(user.getUuid());
  181. db.getDbClient().userGroupDao().insert(db.getSession(), dto, group.getName(), user.getLogin());
  182. });
  183. db.commit();
  184. }
  185. public List<UserDto> findMembers(GroupDto group) {
  186. Set<String> userUuidsInGroup = db.getDbClient().userGroupDao().selectUserUuidsInGroup(db.getSession(), group.getUuid());
  187. return db.getDbClient().userDao().selectByUuids(db.getSession(), userUuidsInGroup);
  188. }
  189. public List<String> selectGroupUuidsOfUser(UserDto user) {
  190. return db.getDbClient().groupMembershipDao().selectGroupUuidsByUserUuid(db.getSession(), user.getUuid());
  191. }
  192. // GROUP PERMISSIONS
  193. public GroupPermissionDto insertPermissionOnAnyone(String permission) {
  194. GroupPermissionDto dto = new GroupPermissionDto()
  195. .setUuid(Uuids.createFast())
  196. .setGroupUuid(null)
  197. .setRole(permission);
  198. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto, null, null);
  199. db.commit();
  200. return dto;
  201. }
  202. public GroupPermissionDto insertPermissionOnAnyone(GlobalPermission permission) {
  203. return insertPermissionOnAnyone(permission.getKey());
  204. }
  205. public GroupPermissionDto insertPermissionOnGroup(GroupDto group, String permission) {
  206. GroupPermissionDto dto = new GroupPermissionDto()
  207. .setUuid(Uuids.createFast())
  208. .setGroupUuid(group.getUuid())
  209. .setRole(permission);
  210. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto, (EntityDto) null, null);
  211. db.commit();
  212. return dto;
  213. }
  214. public GroupPermissionDto insertPermissionOnGroup(GroupDto group, GlobalPermission permission) {
  215. return insertPermissionOnGroup(group, permission.getKey());
  216. }
  217. public GroupPermissionDto insertProjectPermissionOnAnyone(String permission, ComponentDto project) {
  218. checkArgument(!project.isPrivate(), "No permission to group AnyOne can be granted on a private project");
  219. checkArgument(!PUBLIC_PERMISSIONS.contains(permission),
  220. "permission %s can't be granted on a public project", permission);
  221. Optional<BranchDto> branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), project.branchUuid());
  222. // I don't know if this check is worth it
  223. branchDto.ifPresent(dto -> checkArgument(dto.isMain(), PERMISSIONS_CANT_BE_GRANTED_ON_BRANCHES));
  224. GroupPermissionDto dto = new GroupPermissionDto()
  225. .setUuid(Uuids.createFast())
  226. .setGroupUuid(null)
  227. .setRole(permission)
  228. .setEntityUuid(project.uuid())
  229. .setEntityName(project.name());
  230. // TODO, will be removed later
  231. ProjectDto projectDto = new ProjectDto();
  232. projectDto.setQualifier(project.qualifier());
  233. projectDto.setKey(project.getKey());
  234. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto, projectDto, null);
  235. db.commit();
  236. return dto;
  237. }
  238. public GroupPermissionDto insertEntityPermissionOnAnyone(String permission, EntityDto entity) {
  239. checkArgument(!entity.isPrivate(), "No permission to group AnyOne can be granted on a private entity");
  240. checkArgument(!PUBLIC_PERMISSIONS.contains(permission),
  241. "permission %s can't be granted on a public entity", permission);
  242. GroupPermissionDto dto = new GroupPermissionDto()
  243. .setUuid(Uuids.createFast())
  244. .setGroupUuid(null)
  245. .setRole(permission)
  246. .setEntityUuid(entity.getUuid())
  247. .setEntityName(entity.getName());
  248. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto, entity, null);
  249. db.commit();
  250. return dto;
  251. }
  252. public void deleteProjectPermissionFromAnyone(EntityDto entity, String permission) {
  253. db.getDbClient().groupPermissionDao().delete(db.getSession(), permission, null, null, entity);
  254. db.commit();
  255. }
  256. public GroupPermissionDto insertProjectPermissionOnGroup(GroupDto group, String permission, ComponentDto project) {
  257. checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
  258. "%s can't be granted on a public project", permission);
  259. Optional<BranchDto> branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), project.branchUuid());
  260. // I don't know if this check is worth it
  261. branchDto.ifPresent(dto -> checkArgument(dto.isMain(), PERMISSIONS_CANT_BE_GRANTED_ON_BRANCHES));
  262. GroupPermissionDto dto = new GroupPermissionDto()
  263. .setUuid(Uuids.createFast())
  264. .setGroupUuid(group.getUuid())
  265. .setGroupName(group.getName())
  266. .setRole(permission)
  267. .setEntityUuid(project.uuid())
  268. .setEntityName(project.name());
  269. // TODO, will be removed later
  270. ProjectDto projectDto = new ProjectDto();
  271. projectDto.setQualifier(project.qualifier());
  272. projectDto.setKey(project.getKey());
  273. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto, projectDto, null);
  274. db.commit();
  275. return dto;
  276. }
  277. public GroupPermissionDto insertEntityPermissionOnGroup(GroupDto group, String permission, EntityDto entity) {
  278. checkArgument(entity.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
  279. "%s can't be granted on a public entity (project or portfolio)", permission);
  280. Optional<BranchDto> branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), entity.getUuid());
  281. // I don't know if this check is worth it
  282. branchDto.ifPresent(dto -> checkArgument(dto.isMain(), PERMISSIONS_CANT_BE_GRANTED_ON_BRANCHES));
  283. GroupPermissionDto dto = new GroupPermissionDto()
  284. .setUuid(Uuids.createFast())
  285. .setGroupUuid(group.getUuid())
  286. .setGroupName(group.getName())
  287. .setRole(permission)
  288. .setEntityUuid(entity.getUuid())
  289. .setEntityName(entity.getName());
  290. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto, entity, null);
  291. db.commit();
  292. return dto;
  293. }
  294. public List<String> selectGroupPermissions(GroupDto group, @Nullable EntityDto entity) {
  295. if (entity == null) {
  296. return db.getDbClient().groupPermissionDao().selectGlobalPermissionsOfGroup(db.getSession(), group.getUuid());
  297. }
  298. return db.getDbClient().groupPermissionDao().selectEntityPermissionsOfGroup(db.getSession(), group.getUuid(), entity.getUuid());
  299. }
  300. public List<String> selectAnyonePermissions(@Nullable String entityUuid) {
  301. if (entityUuid == null) {
  302. return db.getDbClient().groupPermissionDao().selectGlobalPermissionsOfGroup(db.getSession(), null);
  303. }
  304. return db.getDbClient().groupPermissionDao().selectEntityPermissionsOfGroup(db.getSession(), null, entityUuid);
  305. }
  306. // USER PERMISSIONS
  307. /**
  308. * Grant global permission
  309. */
  310. public UserPermissionDto insertGlobalPermissionOnUser(UserDto user, GlobalPermission permission) {
  311. return insertPermissionOnUser(user, permission.getKey());
  312. }
  313. /**
  314. * Grant permission
  315. */
  316. public UserPermissionDto insertPermissionOnUser(UserDto user, String permission) {
  317. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), null);
  318. db.getDbClient().userPermissionDao().insert(db.getSession(), dto, (EntityDto) null, user, null);
  319. db.commit();
  320. return dto;
  321. }
  322. public void deletePermissionFromUser(UserDto user, GlobalPermission permission) {
  323. db.getDbClient().userPermissionDao().deleteGlobalPermission(db.getSession(), user, permission.getKey());
  324. db.commit();
  325. }
  326. public void deletePermissionFromUser(EntityDto project, UserDto user, String permission) {
  327. db.getDbClient().userPermissionDao().deleteEntityPermission(db.getSession(), user, permission, project);
  328. db.commit();
  329. }
  330. /**
  331. * Grant permission on given project
  332. */
  333. public UserPermissionDto insertProjectPermissionOnUser(UserDto user, String permission, ComponentDto project) {
  334. checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
  335. "%s can't be granted on a public project", permission);
  336. EntityDto entityDto;
  337. if (project.qualifier().equals(Qualifiers.VIEW) || project.qualifier().equals(Qualifiers.SUBVIEW)) {
  338. entityDto = db.getDbClient().portfolioDao().selectByUuid(db.getSession(), project.uuid())
  339. .orElseThrow();
  340. } else {
  341. BranchDto branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), project.branchUuid())
  342. .orElseThrow();
  343. // I don't know if this check is worth it
  344. checkArgument(branchDto.isMain(), PERMISSIONS_CANT_BE_GRANTED_ON_BRANCHES);
  345. entityDto = dbClient.projectDao().selectByBranchUuid(db.getSession(), branchDto.getUuid())
  346. .orElseThrow();
  347. }
  348. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), entityDto.getUuid());
  349. db.getDbClient().userPermissionDao().insert(db.getSession(), dto, entityDto, user, null);
  350. db.commit();
  351. return dto;
  352. }
  353. public UserPermissionDto insertProjectPermissionOnUser(UserDto user, String permission, EntityDto project) {
  354. checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
  355. "%s can't be granted on a public project", permission);
  356. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), project.getUuid());
  357. db.getDbClient().userPermissionDao().insert(db.getSession(), dto, project, user, null);
  358. db.commit();
  359. return dto;
  360. }
  361. public List<GlobalPermission> selectPermissionsOfUser(UserDto user) {
  362. return toListOfGlobalPermissions(db.getDbClient().userPermissionDao()
  363. .selectGlobalPermissionsOfUser(db.getSession(), user.getUuid()));
  364. }
  365. public List<String> selectEntityPermissionOfUser(UserDto user, String entityUuid) {
  366. return db.getDbClient().userPermissionDao().selectEntityPermissionsOfUser(db.getSession(), user.getUuid(), entityUuid);
  367. }
  368. private static List<GlobalPermission> toListOfGlobalPermissions(List<String> keys) {
  369. return keys
  370. .stream()
  371. .map(GlobalPermission::fromKey)
  372. .toList();
  373. }
  374. // USER TOKEN
  375. @SafeVarargs
  376. public final UserTokenDto insertToken(UserDto user, Consumer<UserTokenDto>... populators) {
  377. UserTokenDto dto = UserTokenTesting.newUserToken().setUserUuid(user.getUuid());
  378. stream(populators).forEach(p -> p.accept(dto));
  379. db.getDbClient().userTokenDao().insert(db.getSession(), dto, user.getLogin());
  380. db.commit();
  381. return dto;
  382. }
  383. // PROJECT ANALYSIS TOKEN
  384. @SafeVarargs
  385. public final UserTokenDto insertProjectAnalysisToken(UserDto user, Consumer<UserTokenDto>... populators) {
  386. UserTokenDto dto = UserTokenTesting.newProjectAnalysisToken().setUserUuid(user.getUuid());
  387. stream(populators).forEach(p -> p.accept(dto));
  388. db.getDbClient().userTokenDao().insert(db.getSession(), dto, user.getLogin());
  389. db.commit();
  390. return dto;
  391. }
  392. // SESSION TOKENS
  393. @SafeVarargs
  394. public final SessionTokenDto insertSessionToken(UserDto user, Consumer<SessionTokenDto>... populators) {
  395. SessionTokenDto dto = new SessionTokenDto()
  396. .setUserUuid(user.getUuid())
  397. .setExpirationDate(nextLong());
  398. stream(populators).forEach(p -> p.accept(dto));
  399. db.getDbClient().sessionTokensDao().insert(db.getSession(), dto);
  400. db.commit();
  401. return dto;
  402. }
  403. public final UserDismissedMessageDto insertUserDismissedMessage(UserDto userDto, ProjectDto projectDto, CeTaskMessageType messageType) {
  404. UserDismissedMessageDto dto = new UserDismissedMessageDto()
  405. .setUuid(Uuids.create())
  406. .setUserUuid(userDto.getUuid())
  407. .setProjectUuid(projectDto.getUuid())
  408. .setCeMessageType(messageType);
  409. db.getDbClient().userDismissedMessagesDao().insert(db.getSession(), dto);
  410. db.commit();
  411. return dto;
  412. }
  413. }