You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UserPermissionDaoTest.java 33KB

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