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

UserPermissionDaoTest.java 33KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  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;
  21. import java.util.ArrayList;
  22. import java.util.Arrays;
  23. import java.util.Collection;
  24. import java.util.List;
  25. import java.util.Random;
  26. import java.util.function.Consumer;
  27. import java.util.stream.IntStream;
  28. import org.assertj.core.groups.Tuple;
  29. import org.junit.Rule;
  30. import org.junit.Test;
  31. import org.sonar.api.utils.System2;
  32. import org.sonar.api.web.UserRole;
  33. import org.sonar.core.util.Uuids;
  34. import org.sonar.db.DbSession;
  35. import org.sonar.db.DbTester;
  36. import org.sonar.db.component.ComponentDto;
  37. import org.sonar.db.user.UserDto;
  38. import static java.util.Arrays.asList;
  39. import static java.util.Arrays.stream;
  40. import static java.util.Collections.emptyList;
  41. import static java.util.Collections.singletonList;
  42. import static org.assertj.core.api.Assertions.assertThat;
  43. import static org.assertj.core.api.Assertions.tuple;
  44. import static org.sonar.api.web.UserRole.ADMIN;
  45. import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
  46. import static org.sonar.api.web.UserRole.USER;
  47. import static org.sonar.core.permission.GlobalPermissions.PROVISIONING;
  48. import static org.sonar.core.permission.GlobalPermissions.QUALITY_PROFILE_ADMIN;
  49. import static org.sonar.core.permission.GlobalPermissions.SYSTEM_ADMIN;
  50. import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
  51. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
  52. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_GATES;
  53. import static org.sonar.db.permission.OrganizationPermission.PROVISION_PROJECTS;
  54. import static org.sonar.db.permission.OrganizationPermission.SCAN;
  55. import static org.sonar.db.permission.PermissionQuery.DEFAULT_PAGE_SIZE;
  56. public class UserPermissionDaoTest {
  57. @Rule
  58. public DbTester db = DbTester.create(System2.INSTANCE);
  59. private DbSession dbSession = db.getSession();
  60. private UserPermissionDao underTest = new UserPermissionDao();
  61. @Test
  62. public void select_global_permissions() {
  63. UserDto user1 = insertUser(u -> u.setLogin("login1").setName("Marius").setEmail("email1@email.com"));
  64. UserDto user2 = insertUser(u -> u.setLogin("login2").setName("Marie").setEmail("email2@email.com"));
  65. UserDto user3 = insertUser(u -> u.setLogin("zanother").setName("Zoe").setEmail("zanother3@another.com"));
  66. ComponentDto project = db.components().insertPrivateProject();
  67. UserPermissionDto global1 = addGlobalPermission(SYSTEM_ADMIN, user1);
  68. UserPermissionDto global2 = addGlobalPermission(SYSTEM_ADMIN, user2);
  69. UserPermissionDto global3 = addGlobalPermission(PROVISIONING, user2);
  70. UserPermissionDto project1Perm = addProjectPermission(USER, user3, project);
  71. // global permissions of users who has at least one global permission, ordered by user name then permission
  72. PermissionQuery query = PermissionQuery.builder().withAtLeastOnePermission().build();
  73. expectPermissions(query, asList(user2.getUuid(), user1.getUuid()), global2, global3, global1);
  74. // default query returns all users, whatever their permissions nor organizations
  75. // (that's a non-sense, but still this is required for api/permissions/groups
  76. // when filtering users by name)
  77. query = PermissionQuery.builder().build();
  78. expectPermissions(query, asList(user2.getUuid(), user1.getUuid(), user3.getUuid()), global2, global3, global1, project1Perm);
  79. // global permissions "admin"
  80. query = PermissionQuery.builder().setPermission(SYSTEM_ADMIN).build();
  81. expectPermissions(query, asList(user2.getUuid(), user1.getUuid()), global2, global1);
  82. // empty if nobody has the specified global permission
  83. query = PermissionQuery.builder().setPermission("missing").build();
  84. expectPermissions(query, emptyList());
  85. // search by user name (matches 2 users)
  86. query = PermissionQuery.builder().withAtLeastOnePermission().setSearchQuery("mari").build();
  87. expectPermissions(query, asList(user2.getUuid(), user1.getUuid()), global2, global3, global1);
  88. // search by user login
  89. query = PermissionQuery.builder().withAtLeastOnePermission().setSearchQuery("ogin2").build();
  90. expectPermissions(query, singletonList(user2.getUuid()), global2, global3);
  91. // search by user email
  92. query = PermissionQuery.builder().withAtLeastOnePermission().setSearchQuery("mail2").build();
  93. expectPermissions(query, singletonList(user2.getUuid()), global2, global3);
  94. // search by user name (matches 2 users) and global permission
  95. query = PermissionQuery.builder().setSearchQuery("Mari").setPermission(PROVISIONING).build();
  96. expectPermissions(query, singletonList(user2.getUuid()), global3);
  97. // search by user name (no match)
  98. query = PermissionQuery.builder().setSearchQuery("Unknown").build();
  99. expectPermissions(query, emptyList());
  100. }
  101. @Test
  102. public void select_project_permissions() {
  103. UserDto user1 = insertUser(u -> u.setLogin("login1").setName("Marius").setEmail("email1@email.com"));
  104. UserDto user2 = insertUser(u -> u.setLogin("login2").setName("Marie").setEmail("email2@email.com"));
  105. UserDto user3 = insertUser(u -> u.setLogin("zanother").setName("Zoe").setEmail("zanother3@another.com"));
  106. addGlobalPermission(SYSTEM_ADMIN, user1);
  107. ComponentDto project1 = db.components().insertPrivateProject();
  108. ComponentDto project2 = db.components().insertPrivateProject();
  109. UserPermissionDto perm1 = addProjectPermission(USER, user1, project1);
  110. UserPermissionDto perm2 = addProjectPermission(ISSUE_ADMIN, user1, project1);
  111. UserPermissionDto perm3 = addProjectPermission(ISSUE_ADMIN, user2, project1);
  112. addProjectPermission(ISSUE_ADMIN, user3, project2);
  113. // project permissions of users who has at least one permission on this project
  114. PermissionQuery query = PermissionQuery.builder().withAtLeastOnePermission().setComponent(project1).build();
  115. expectPermissions(query, asList(user2.getUuid(), user1.getUuid()), perm3, perm2, perm1);
  116. // empty if nobody has the specified global permission
  117. query = PermissionQuery.builder().setPermission("missing").setComponent(project1).build();
  118. expectPermissions(query, emptyList());
  119. // search by user name (matches 2 users), users with at least one permission
  120. query = PermissionQuery.builder().setSearchQuery("Mari").withAtLeastOnePermission().setComponent(project1).build();
  121. expectPermissions(query, asList(user2.getUuid(), user1.getUuid()), perm3, perm2, perm1);
  122. // search by user name (matches 2 users) and project permission
  123. query = PermissionQuery.builder().setSearchQuery("Mari").setPermission(ISSUE_ADMIN).setComponent(project1).build();
  124. expectPermissions(query, asList(user2.getUuid(), user1.getUuid()), perm3, perm2);
  125. // search by user name (no match)
  126. query = PermissionQuery.builder().setSearchQuery("Unknown").setComponent(project1).build();
  127. expectPermissions(query, emptyList());
  128. // permissions of unknown project
  129. query = PermissionQuery.builder().setComponent(newPrivateProjectDto(db.getDefaultOrganization())).withAtLeastOnePermission().build();
  130. expectPermissions(query, emptyList());
  131. }
  132. @Test
  133. public void selectUserUuidsByQuery_is_ordering_by_users_having_permissions_first_then_by_name_lowercase() {
  134. UserDto user1 = insertUser(u -> u.setLogin("login1").setName("Z").setEmail("email1@email.com"));
  135. UserDto user2 = insertUser(u -> u.setLogin("login2").setName("A").setEmail("email2@email.com"));
  136. UserDto user3 = insertUser(u -> u.setLogin("login3").setName("Z").setEmail("zanother3@another.com"));
  137. UserDto user4 = insertUser(u -> u.setLogin("login4").setName("A").setEmail("zanother3@another.com"));
  138. addGlobalPermission(SYSTEM_ADMIN, user1);
  139. addGlobalPermission(QUALITY_PROFILE_ADMIN, user2);
  140. PermissionQuery query = PermissionQuery.builder().build();
  141. assertThat(underTest.selectUserUuidsByQueryAndScope(dbSession, query))
  142. .containsExactly(user2.getUuid(), user1.getUuid(), user4.getUuid(), user3.getUuid());
  143. }
  144. @Test
  145. public void selectUserUuidsByQuery_is_ordering_by_users_having_permissions_first_then_by_name_lowercase_when_high_number_of_users_for_global_permissions() {
  146. ComponentDto project = db.components().insertPrivateProject();
  147. IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
  148. UserDto user = insertUser(u -> u.setLogin("login" + i).setName("" + i));
  149. // Add permission on project to be sure projects are excluded
  150. db.users().insertProjectPermissionOnUser(user, SCAN.getKey(), project);
  151. });
  152. String lastLogin = "login" + (DEFAULT_PAGE_SIZE + 1);
  153. UserDto lastUser = db.getDbClient().userDao().selectByLogin(dbSession, lastLogin);
  154. addGlobalPermission(SYSTEM_ADMIN, lastUser);
  155. PermissionQuery query = PermissionQuery.builder().build();
  156. assertThat(underTest.selectUserUuidsByQueryAndScope(dbSession, query))
  157. .hasSize(DEFAULT_PAGE_SIZE)
  158. .startsWith(lastUser.getUuid());
  159. }
  160. @Test
  161. public void selectUserUuidsByQuery_is_ordering_by_users_having_permissions_first_then_by_name_lowercase_when_high_number_of_users_for_project_permissions() {
  162. IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
  163. UserDto user = insertUser(u -> u.setLogin("login" + i).setName("" + i));
  164. // Add global permission to be sure they are excluded
  165. addGlobalPermission(SYSTEM_ADMIN, user);
  166. });
  167. String lastLogin = "login" + (DEFAULT_PAGE_SIZE + 1);
  168. UserDto lastUser = db.getDbClient().userDao().selectByLogin(dbSession, lastLogin);
  169. ComponentDto project = db.components().insertPrivateProject();
  170. db.users().insertProjectPermissionOnUser(lastUser, SCAN.getKey(), project);
  171. PermissionQuery query = PermissionQuery.builder()
  172. .setComponent(project)
  173. .build();
  174. assertThat(underTest.selectUserUuidsByQueryAndScope(dbSession, query))
  175. .hasSize(DEFAULT_PAGE_SIZE)
  176. .startsWith(lastUser.getUuid());
  177. }
  178. @Test
  179. public void selectUserUuidsByQuery_is_not_ordering_by_number_of_permissions() {
  180. UserDto user1 = insertUser(u -> u.setLogin("login1").setName("Z").setEmail("email1@email.com"));
  181. UserDto user2 = insertUser(u -> u.setLogin("login2").setName("A").setEmail("email2@email.com"));
  182. addGlobalPermission(SYSTEM_ADMIN, user1);
  183. ComponentDto project1 = db.components().insertPrivateProject();
  184. addProjectPermission(USER, user2, project1);
  185. addProjectPermission(USER, user1, project1);
  186. addProjectPermission(ADMIN, user1, project1);
  187. PermissionQuery query = PermissionQuery.builder().build();
  188. // Even if user1 has 3 permissions, the name is used to order
  189. assertThat(underTest.selectUserUuidsByQuery(dbSession, query))
  190. .containsExactly(user2.getUuid(), user1.getUuid());
  191. }
  192. @Test
  193. public void countUsersByProjectPermission() {
  194. UserDto user1 = insertUser();
  195. UserDto user2 = insertUser();
  196. ComponentDto project1 = db.components().insertPrivateProject();
  197. ComponentDto project2 = db.components().insertPrivateProject();
  198. addGlobalPermission(SYSTEM_ADMIN, user1);
  199. addProjectPermission(USER, user1, project1);
  200. addProjectPermission(ISSUE_ADMIN, user1, project1);
  201. addProjectPermission(ISSUE_ADMIN, user2, project1);
  202. addProjectPermission(ISSUE_ADMIN, user2, project2);
  203. // no projects -> return empty list
  204. assertThat(underTest.countUsersByProjectPermission(dbSession, emptyList())).isEmpty();
  205. // one project
  206. expectCount(singletonList(project1.uuid()),
  207. new CountPerProjectPermission(project1.uuid(), USER, 1),
  208. new CountPerProjectPermission(project1.uuid(), ISSUE_ADMIN, 2));
  209. // multiple projects
  210. expectCount(asList(project1.uuid(), project2.uuid(), "invalid"),
  211. new CountPerProjectPermission(project1.uuid(), USER, 1),
  212. new CountPerProjectPermission(project1.uuid(), ISSUE_ADMIN, 2),
  213. new CountPerProjectPermission(project2.uuid(), ISSUE_ADMIN, 1));
  214. }
  215. @Test
  216. public void selectUserUuidsByQuery() {
  217. UserDto user1 = insertUser(u -> u.setLogin("login1").setName("Marius").setEmail("email1@email.com"));
  218. UserDto user2 = insertUser(u -> u.setLogin("login2").setName("Marie").setEmail("email2@email.com"));
  219. ComponentDto project1 = db.components().insertPrivateProject();
  220. ComponentDto project2 = db.components().insertPrivateProject();
  221. addProjectPermission(USER, user1, project1);
  222. addProjectPermission(USER, user2, project1);
  223. addProjectPermission(ISSUE_ADMIN, user2, project1);
  224. // logins are ordered by user name: user2 ("Marie") then user1 ("Marius")
  225. PermissionQuery query = PermissionQuery.builder().setComponent(project1).withAtLeastOnePermission().build();
  226. assertThat(underTest.selectUserUuidsByQuery(dbSession, query)).containsExactly(user2.getUuid(), user1.getUuid());
  227. query = PermissionQuery.builder().setComponent(project2).withAtLeastOnePermission().build();
  228. assertThat(underTest.selectUserUuidsByQuery(dbSession, query)).isEmpty();
  229. // on a project without permissions
  230. query = PermissionQuery.builder().setComponent(newPrivateProjectDto(db.getDefaultOrganization())).withAtLeastOnePermission().build();
  231. assertThat(underTest.selectUserUuidsByQuery(dbSession, query)).isEmpty();
  232. // search all users whose name matches "mar", whatever the permissions
  233. query = PermissionQuery.builder().setSearchQuery("mar").build();
  234. assertThat(underTest.selectUserUuidsByQuery(dbSession, query)).containsExactly(user2.getUuid(), user1.getUuid());
  235. // search all users whose name matches "mariu", whatever the permissions
  236. query = PermissionQuery.builder().setSearchQuery("mariu").build();
  237. assertThat(underTest.selectUserUuidsByQuery(dbSession, query)).containsExactly(user1.getUuid());
  238. // search all users whose name matches "mariu", whatever the permissions
  239. query = PermissionQuery.builder().setSearchQuery("mariu").setComponent(project1).build();
  240. assertThat(underTest.selectUserUuidsByQuery(dbSession, query)).containsExactly(user1.getUuid());
  241. }
  242. @Test
  243. public void selectUserUuidsByQueryAndScope_with_organization_scope() {
  244. UserDto user1 = insertUser(u -> u.setLogin("login1").setName("Marius").setEmail("email1@email.com"));
  245. UserDto user2 = insertUser(u -> u.setLogin("login2").setName("Marie").setEmail("email2@email.com"));
  246. ComponentDto project1 = db.components().insertPrivateProject();
  247. ComponentDto project2 = db.components().insertPrivateProject();
  248. addProjectPermission(USER, user1, project1);
  249. addGlobalPermission(PROVISIONING, user1);
  250. addProjectPermission(ISSUE_ADMIN, user2, project2);
  251. PermissionQuery query = PermissionQuery.builder().build();
  252. List<String> result = underTest.selectUserUuidsByQueryAndScope(dbSession, query);
  253. // users with any kind of global permissions are first on the list and then sorted by name
  254. assertThat(result).containsExactly(user1.getUuid(), user2.getUuid());
  255. }
  256. @Test
  257. public void selectUserUuidsByQueryAndScope_with_project_scope() {
  258. UserDto user1 = insertUser(u -> u.setLogin("login1").setName("Marius").setEmail("email1@email.com"));
  259. UserDto user2 = insertUser(u -> u.setLogin("login2").setName("Marie").setEmail("email2@email.com"));
  260. ComponentDto project1 = db.components().insertPrivateProject();
  261. ComponentDto project2 = db.components().insertPrivateProject();
  262. addProjectPermission(USER, user1, project1);
  263. addGlobalPermission(PROVISIONING, user1);
  264. addProjectPermission(ISSUE_ADMIN, user2, project2);
  265. PermissionQuery query = PermissionQuery.builder()
  266. .setComponent(project1)
  267. .build();
  268. List<String> result = underTest.selectUserUuidsByQueryAndScope(dbSession, query);
  269. // users with any this projects permissions are first on the list and then sorted by name
  270. assertThat(result).containsExactly(user1.getUuid(), user2.getUuid());
  271. }
  272. @Test
  273. public void selectUserUuidsByQuery_is_paginated() {
  274. List<String> userUuids = new ArrayList<>();
  275. for (int i = 0; i < 10; i++) {
  276. String name = "user-" + i;
  277. UserDto user = insertUser(u -> u.setName(name));
  278. addGlobalPermission(PROVISIONING, user);
  279. addGlobalPermission(SYSTEM_ADMIN, user);
  280. userUuids.add(user.getUuid());
  281. }
  282. assertThat(underTest.selectUserUuidsByQuery(dbSession, PermissionQuery.builder()
  283. .setPageSize(3).setPageIndex(1).build()))
  284. .containsExactly(userUuids.get(0), userUuids.get(1), userUuids.get(2));
  285. assertThat(underTest.selectUserUuidsByQuery(dbSession, PermissionQuery.builder()
  286. .setPageSize(2).setPageIndex(3).build()))
  287. .containsExactly(userUuids.get(4), userUuids.get(5));
  288. assertThat(underTest.selectUserUuidsByQuery(dbSession, PermissionQuery.builder()
  289. .setPageSize(50).setPageIndex(1).build()))
  290. .hasSize(10);
  291. }
  292. @Test
  293. public void selectUserUuidsByQuery_is_sorted_by_insensitive_name() {
  294. UserDto user1 = insertUser(u -> u.setName("user1"));
  295. addGlobalPermission(PROVISIONING, user1);
  296. UserDto user3 = insertUser(u -> u.setName("user3"));
  297. addGlobalPermission(SYSTEM_ADMIN, user3);
  298. UserDto user2 = insertUser(u -> u.setName("User2"));
  299. addGlobalPermission(PROVISIONING, user2);
  300. assertThat(underTest.selectUserUuidsByQuery(dbSession, PermissionQuery.builder().build()))
  301. .containsExactly(user1.getUuid(), user2.getUuid(), user3.getUuid());
  302. }
  303. @Test
  304. public void deleteGlobalPermission() {
  305. UserDto user1 = insertUser();
  306. UserDto user2 = insertUser();
  307. ComponentDto project1 = db.components().insertPrivateProject();
  308. ComponentDto project2 = db.components().insertPrivateProject();
  309. addGlobalPermission("perm1", user1);
  310. addGlobalPermission("perm2", user1);
  311. addProjectPermission("perm1", user1, project1);
  312. addProjectPermission("perm3", user2, project1);
  313. addProjectPermission("perm4", user2, project2);
  314. // user2 does not have global permissions -> do nothing
  315. underTest.deleteGlobalPermission(dbSession, user2.getUuid(), "perm1");
  316. assertThat(db.countRowsOfTable(dbSession, "user_roles")).isEqualTo(5);
  317. // global permission is not granted -> do nothing
  318. underTest.deleteGlobalPermission(dbSession, user1.getUuid(), "notGranted");
  319. assertThat(db.countRowsOfTable(dbSession, "user_roles")).isEqualTo(5);
  320. // permission is on project -> do nothing
  321. underTest.deleteGlobalPermission(dbSession, user1.getUuid(), "perm3");
  322. assertThat(db.countRowsOfTable(dbSession, "user_roles")).isEqualTo(5);
  323. // global permission exists -> delete it, but not the project permission with the same name !
  324. underTest.deleteGlobalPermission(dbSession, user1.getUuid(), "perm1");
  325. assertThat(db.countSql(dbSession, "select count(uuid) from user_roles where role='perm1' and component_uuid is null")).isEqualTo(0);
  326. assertThat(db.countRowsOfTable(dbSession, "user_roles")).isEqualTo(4);
  327. }
  328. @Test
  329. public void deleteProjectPermission() {
  330. UserDto user1 = insertUser();
  331. UserDto user2 = insertUser();
  332. ComponentDto project1 = db.components().insertPrivateProject();
  333. ComponentDto project2 = db.components().insertPrivateProject();
  334. addGlobalPermission("perm", user1);
  335. addProjectPermission("perm", user1, project1);
  336. addProjectPermission("perm", user1, project2);
  337. addProjectPermission("perm", user2, project1);
  338. // no such provision -> ignore
  339. underTest.deleteProjectPermission(dbSession, user1.getUuid(), "anotherPerm", project1.uuid());
  340. assertThat(db.countRowsOfTable(dbSession, "user_roles")).isEqualTo(4);
  341. underTest.deleteProjectPermission(dbSession, user1.getUuid(), "perm", project1.uuid());
  342. assertThatProjectPermissionDoesNotExist(user1, "perm", project1);
  343. assertThat(db.countRowsOfTable(dbSession, "user_roles")).isEqualTo(3);
  344. }
  345. @Test
  346. public void deleteProjectPermissions() {
  347. UserDto user1 = insertUser();
  348. UserDto user2 = insertUser();
  349. ComponentDto project1 = db.components().insertPrivateProject();
  350. ComponentDto project2 = db.components().insertPrivateProject();
  351. addGlobalPermission("perm", user1);
  352. addProjectPermission("perm", user1, project1);
  353. addProjectPermission("perm", user2, project1);
  354. addProjectPermission("perm", user1, project2);
  355. underTest.deleteProjectPermissions(dbSession, project1.uuid());
  356. assertThat(db.countRowsOfTable(dbSession, "user_roles")).isEqualTo(2);
  357. assertThatProjectHasNoPermissions(project1);
  358. }
  359. @Test
  360. public void selectGlobalPermissionsOfUser() {
  361. UserDto user1 = insertUser();
  362. UserDto user2 = insertUser();
  363. UserDto user3 = insertUser();
  364. ComponentDto project = db.components().insertPrivateProject();
  365. addGlobalPermission("perm1", user1);
  366. addGlobalPermission("perm2", user2);
  367. addGlobalPermission("perm3", user1);
  368. addProjectPermission("perm4", user1, project);
  369. addProjectPermission("perm5", user2, project);
  370. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user1.getUuid())).containsOnly("perm1", "perm3");
  371. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user2.getUuid())).containsOnly("perm2");
  372. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user3.getUuid())).isEmpty();
  373. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, "unknown")).isEmpty();
  374. }
  375. @Test
  376. public void selectProjectPermissionsOfUser() {
  377. UserDto user1 = insertUser();
  378. UserDto user2 = insertUser();
  379. ComponentDto project1 = db.components().insertPrivateProject();
  380. ComponentDto project2 = db.components().insertPrivateProject();
  381. ComponentDto project3 = db.components().insertPrivateProject();
  382. addGlobalPermission("perm1", user1);
  383. addProjectPermission("perm2", user1, project1);
  384. addProjectPermission("perm3", user1, project1);
  385. addProjectPermission("perm4", user1, project2);
  386. addProjectPermission("perm5", user2, project1);
  387. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getUuid(), project1.uuid())).containsOnly("perm2", "perm3");
  388. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getUuid(), project2.uuid())).containsOnly("perm4");
  389. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getUuid(), project3.uuid())).isEmpty();
  390. }
  391. @Test
  392. public void selectGroupUuidsWithPermissionOnProjectBut_returns_empty_if_project_does_not_exist() {
  393. ComponentDto project = randomPublicOrPrivateProject();
  394. UserDto user = insertUser();
  395. db.users().insertProjectPermissionOnUser(user, "foo", project);
  396. assertThat(underTest.selectUserUuidsWithPermissionOnProjectBut(dbSession, "1234", UserRole.USER))
  397. .isEmpty();
  398. }
  399. @Test
  400. public void selectGroupUuidsWithPermissionOnProjectBut_returns_only_users_of_projects_which_do_not_have_permission() {
  401. ComponentDto project = randomPublicOrPrivateProject();
  402. UserDto user1 = insertUser();
  403. UserDto user2 = insertUser();
  404. db.users().insertProjectPermissionOnUser(user1, "p1", project);
  405. db.users().insertProjectPermissionOnUser(user2, "p2", project);
  406. assertThat(underTest.selectUserUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p2"))
  407. .containsOnly(user1.getUuid());
  408. assertThat(underTest.selectUserUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p1"))
  409. .containsOnly(user2.getUuid());
  410. assertThat(underTest.selectUserUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p3"))
  411. .containsOnly(user1.getUuid(), user2.getUuid());
  412. }
  413. @Test
  414. public void selectGroupUuidsWithPermissionOnProjectBut_does_not_return_groups_which_have_no_permission_at_all_on_specified_project() {
  415. ComponentDto project = randomPublicOrPrivateProject();
  416. UserDto user1 = insertUser();
  417. UserDto user2 = insertUser();
  418. db.users().insertProjectPermissionOnUser(user1, "p1", project);
  419. db.users().insertProjectPermissionOnUser(user2, "p2", project);
  420. assertThat(underTest.selectUserUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p2"))
  421. .containsOnly(user1.getUuid());
  422. assertThat(underTest.selectUserUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p1"))
  423. .containsOnly(user2.getUuid());
  424. }
  425. @Test
  426. public void deleteByUserId() {
  427. UserDto user1 = insertUser();
  428. UserDto user2 = insertUser();
  429. ComponentDto project = db.components().insertPrivateProject();
  430. db.users().insertPermissionOnUser(user1, SCAN);
  431. db.users().insertPermissionOnUser(user1, ADMINISTER);
  432. db.users().insertProjectPermissionOnUser(user1, ADMINISTER_QUALITY_GATES.getKey(), project);
  433. db.users().insertPermissionOnUser(user2, SCAN);
  434. db.users().insertProjectPermissionOnUser(user2, ADMINISTER_QUALITY_GATES.getKey(), project);
  435. underTest.deleteByUserUuid(dbSession, user1.getUuid());
  436. dbSession.commit();
  437. assertThat(db.select("select user_uuid as \"userUuid\", component_uuid as \"projectUuid\", role as \"permission\" from user_roles"))
  438. .extracting((row) -> row.get("userUuid"), (row) -> row.get("projectUuid"), (row) -> row.get("permission"))
  439. .containsOnly(tuple(user2.getUuid(), null, SCAN.getKey()), tuple(user2.getUuid(), project.uuid(), ADMINISTER_QUALITY_GATES.getKey()));
  440. }
  441. @Test
  442. public void deleteProjectPermissionOfAnyUser_has_no_effect_if_specified_component_does_not_exist() {
  443. UserDto user = insertUser();
  444. db.users().insertPermissionOnUser(user, SCAN);
  445. int deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, "124", SCAN.getKey());
  446. assertThat(deletedCount).isEqualTo(0);
  447. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user.getUuid())).containsOnly(SCAN.getKey());
  448. }
  449. @Test
  450. public void deleteProjectPermissionOfAnyUser_has_no_effect_if_specified_component_has_no_permission_at_all() {
  451. UserDto user = insertUser();
  452. db.users().insertPermissionOnUser(user, SCAN);
  453. ComponentDto project = randomPublicOrPrivateProject();
  454. int deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, project.uuid(), SCAN.getKey());
  455. assertThat(deletedCount).isEqualTo(0);
  456. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user.getUuid())).containsOnly(SCAN.getKey());
  457. }
  458. @Test
  459. public void deleteProjectPermissionOfAnyUser_has_no_effect_if_specified_component_does_not_have_specified_permission() {
  460. UserDto user = insertUser();
  461. db.users().insertPermissionOnUser(user, SCAN);
  462. ComponentDto project = randomPublicOrPrivateProject();
  463. db.users().insertProjectPermissionOnUser(user, SCAN.getKey(), project);
  464. int deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, project.uuid(), "p1");
  465. assertThat(deletedCount).isEqualTo(0);
  466. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user.getUuid())).containsOnly(SCAN.getKey());
  467. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user.getUuid(), project.uuid())).containsOnly(SCAN.getKey());
  468. }
  469. @Test
  470. public void deleteProjectPermissionOfAnyUser_deletes_specified_permission_for_any_user_on_the_specified_component() {
  471. UserDto user1 = insertUser();
  472. UserDto user2 = insertUser();
  473. db.users().insertPermissionOnUser(user1, SCAN);
  474. db.users().insertPermissionOnUser(user2, SCAN);
  475. ComponentDto project1 = randomPublicOrPrivateProject();
  476. ComponentDto project2 = randomPublicOrPrivateProject();
  477. db.users().insertProjectPermissionOnUser(user1, SCAN.getKey(), project1);
  478. db.users().insertProjectPermissionOnUser(user2, SCAN.getKey(), project1);
  479. db.users().insertProjectPermissionOnUser(user1, SCAN.getKey(), project2);
  480. db.users().insertProjectPermissionOnUser(user2, SCAN.getKey(), project2);
  481. db.users().insertProjectPermissionOnUser(user2, PROVISION_PROJECTS.getKey(), project2);
  482. int deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, project1.uuid(), SCAN.getKey());
  483. assertThat(deletedCount).isEqualTo(2);
  484. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user1.getUuid())).containsOnly(SCAN.getKey());
  485. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user2.getUuid())).containsOnly(SCAN.getKey());
  486. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getUuid(), project1.uuid())).isEmpty();
  487. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user2.getUuid(), project1.uuid())).isEmpty();
  488. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getUuid(), project2.uuid())).containsOnly(SCAN.getKey());
  489. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user2.getUuid(), project2.uuid())).containsOnly(SCAN.getKey(), PROVISION_PROJECTS.getKey());
  490. deletedCount = underTest.deleteProjectPermissionOfAnyUser(dbSession, project2.uuid(), SCAN.getKey());
  491. assertThat(deletedCount).isEqualTo(2);
  492. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user1.getUuid())).containsOnly(SCAN.getKey());
  493. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user2.getUuid())).containsOnly(SCAN.getKey());
  494. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getUuid(), project1.uuid())).isEmpty();
  495. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user2.getUuid(), project1.uuid())).isEmpty();
  496. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user1.getUuid(), project2.uuid())).containsOnly();
  497. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user2.getUuid(), project2.uuid())).containsOnly(PROVISION_PROJECTS.getKey());
  498. }
  499. private ComponentDto randomPublicOrPrivateProject() {
  500. return new Random().nextBoolean() ? db.components().insertPrivateProject() : db.components().insertPublicProject();
  501. }
  502. private UserDto insertUser(Consumer<UserDto> populateUserDto) {
  503. UserDto user = db.users().insertUser(populateUserDto);
  504. return user;
  505. }
  506. private UserDto insertUser() {
  507. UserDto user = db.users().insertUser();
  508. return user;
  509. }
  510. private void expectCount(List<String> projectUuids, CountPerProjectPermission... expected) {
  511. List<CountPerProjectPermission> got = underTest.countUsersByProjectPermission(dbSession, projectUuids);
  512. assertThat(got).hasSize(expected.length);
  513. for (CountPerProjectPermission expect : expected) {
  514. boolean found = got.stream().anyMatch(b -> b.getPermission().equals(expect.getPermission()) &&
  515. b.getCount() == expect.getCount() &&
  516. b.getComponentUuid().equals(expect.getComponentUuid()));
  517. assertThat(found).isTrue();
  518. }
  519. }
  520. private void expectPermissions(PermissionQuery query, Collection<String> expectedUserUuids, UserPermissionDto... expectedPermissions) {
  521. assertThat(underTest.selectUserUuidsByQuery(dbSession, query)).containsExactly(expectedUserUuids.toArray(new String[0]));
  522. List<UserPermissionDto> currentPermissions = underTest.selectUserPermissionsByQuery(dbSession, query, expectedUserUuids);
  523. assertThat(currentPermissions).hasSize(expectedPermissions.length);
  524. Tuple[] expectedPermissionsAsTuple = Arrays.stream(expectedPermissions)
  525. .map(expectedPermission -> tuple(expectedPermission.getUserUuid(), expectedPermission.getPermission(), expectedPermission.getComponentUuid()))
  526. .toArray(Tuple[]::new);
  527. assertThat(currentPermissions)
  528. .extracting(UserPermissionDto::getUserUuid, UserPermissionDto::getPermission, UserPermissionDto::getComponentUuid)
  529. .containsOnly(expectedPermissionsAsTuple);
  530. // test method "countUsers()"
  531. long distinctUsers = stream(expectedPermissions).map(UserPermissionDto::getUserUuid).distinct().count();
  532. assertThat((long) underTest.countUsersByQuery(dbSession, query)).isEqualTo(distinctUsers);
  533. }
  534. private UserPermissionDto addGlobalPermission(String permission, UserDto user) {
  535. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), null);
  536. underTest.insert(dbSession, dto);
  537. db.commit();
  538. return dto;
  539. }
  540. private UserPermissionDto addProjectPermission(String permission, UserDto user, ComponentDto project) {
  541. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), project.uuid());
  542. underTest.insert(dbSession, dto);
  543. db.commit();
  544. return dto;
  545. }
  546. private void assertThatProjectPermissionDoesNotExist(UserDto user, String permission, ComponentDto project) {
  547. assertThat(db.countSql(dbSession, "select count(uuid) from user_roles where role='" + permission + "' and user_uuid='" + user.getUuid()
  548. + "' and component_uuid='" + project.uuid() + "'"))
  549. .isEqualTo(0);
  550. }
  551. private void assertThatProjectHasNoPermissions(ComponentDto project) {
  552. assertThat(db.countSql(dbSession, "select count(uuid) from user_roles where component_uuid='" + project.uuid() + "'")).isEqualTo(0);
  553. }
  554. private void assertGlobalPermissionsOfUser(UserDto user, OrganizationPermission... permissions) {
  555. assertThat(underTest.selectGlobalPermissionsOfUser(dbSession, user.getUuid()).stream()
  556. .map(OrganizationPermission::fromKey))
  557. .containsOnly(permissions);
  558. }
  559. private void assertProjectPermissionsOfUser(UserDto user, ComponentDto project, String... permissions) {
  560. assertThat(underTest.selectProjectPermissionsOfUser(dbSession, user.getUuid(), project.uuid())).containsOnly(permissions);
  561. }
  562. }