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.

GroupPermissionDaoTest.java 45KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2021 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.Collection;
  23. import java.util.Collections;
  24. import java.util.List;
  25. import java.util.Random;
  26. import java.util.stream.IntStream;
  27. import java.util.stream.Stream;
  28. import org.junit.Rule;
  29. import org.junit.Test;
  30. import org.sonar.api.utils.System2;
  31. import org.sonar.api.web.UserRole;
  32. import org.sonar.core.util.stream.MoreCollectors;
  33. import org.sonar.db.DbSession;
  34. import org.sonar.db.DbTester;
  35. import org.sonar.db.component.ComponentDto;
  36. import org.sonar.db.component.ComponentTesting;
  37. import org.sonar.db.user.GroupDto;
  38. import static java.util.Arrays.asList;
  39. import static java.util.Collections.singletonList;
  40. import static org.assertj.core.api.Assertions.assertThat;
  41. import static org.assertj.core.api.Assertions.tuple;
  42. import static org.sonar.api.security.DefaultGroups.ANYONE;
  43. import static org.sonar.api.web.UserRole.ADMIN;
  44. import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
  45. import static org.sonar.api.web.UserRole.USER;
  46. import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION;
  47. import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
  48. import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
  49. import static org.sonar.db.permission.GlobalPermission.SCAN;
  50. import static org.sonar.db.permission.PermissionQuery.DEFAULT_PAGE_SIZE;
  51. public class GroupPermissionDaoTest {
  52. private static final String ANYONE_UUID = "Anyone";
  53. private static final String MISSING_UUID = "-1";
  54. @Rule
  55. public DbTester db = DbTester.create(System2.INSTANCE);
  56. private final DbSession dbSession = db.getSession();
  57. private final GroupPermissionDao underTest = new GroupPermissionDao();
  58. @Test
  59. public void group_count_by_permission_and_component_id_on_private_projects() {
  60. GroupDto group1 = db.users().insertGroup();
  61. GroupDto group2 = db.users().insertGroup();
  62. GroupDto group3 = db.users().insertGroup();
  63. ComponentDto project1 = db.components().insertPrivateProject();
  64. ComponentDto project2 = db.components().insertPrivateProject();
  65. ComponentDto project3 = db.components().insertPrivateProject();
  66. db.users().insertProjectPermissionOnGroup(group1, ISSUE_ADMIN, project1);
  67. db.users().insertProjectPermissionOnGroup(group1, ADMIN, project2);
  68. db.users().insertProjectPermissionOnGroup(group2, ADMIN, project2);
  69. db.users().insertProjectPermissionOnGroup(group3, ADMIN, project2);
  70. db.users().insertProjectPermissionOnGroup(group1, USER, project2);
  71. db.users().insertProjectPermissionOnGroup(group1, USER, project3);
  72. final List<CountPerProjectPermission> result = new ArrayList<>();
  73. underTest.groupsCountByComponentUuidAndPermission(dbSession, asList(project2.uuid(), project3.uuid(), "789"),
  74. context -> result.add(context.getResultObject()));
  75. assertThat(result).hasSize(3);
  76. assertThat(result).extracting("permission").containsOnly(ADMIN, USER);
  77. assertThat(result).extracting("componentUuid").containsOnly(project2.uuid(), project3.uuid());
  78. assertThat(result).extracting("count").containsOnly(3, 1);
  79. }
  80. @Test
  81. public void group_count_by_permission_and_component_id_on_public_projects() {
  82. GroupDto group1 = db.users().insertGroup();
  83. GroupDto group2 = db.users().insertGroup();
  84. GroupDto group3 = db.users().insertGroup();
  85. ComponentDto project1 = db.components().insertPublicProject();
  86. ComponentDto project2 = db.components().insertPublicProject();
  87. ComponentDto project3 = db.components().insertPublicProject();
  88. db.users().insertProjectPermissionOnGroup(group1, "p1", project1);
  89. db.users().insertProjectPermissionOnGroup(group1, "p2", project2);
  90. db.users().insertProjectPermissionOnGroup(group2, "p2", project2);
  91. db.users().insertProjectPermissionOnGroup(group3, "p2", project2);
  92. // anyone group
  93. db.users().insertProjectPermissionOnAnyone("p2", project2);
  94. db.users().insertProjectPermissionOnGroup(group1, "p3", project2);
  95. db.users().insertProjectPermissionOnGroup(group1, "p3", project3);
  96. final List<CountPerProjectPermission> result = new ArrayList<>();
  97. underTest.groupsCountByComponentUuidAndPermission(dbSession, asList(project2.uuid(), project3.uuid(), "789"),
  98. context -> result.add(context.getResultObject()));
  99. assertThat(result).hasSize(3);
  100. assertThat(result).extracting("permission").containsOnly("p2", "p3");
  101. assertThat(result).extracting("componentUuid").containsOnly(project2.uuid(), project3.uuid());
  102. assertThat(result).extracting("count").containsOnly(4, 1);
  103. }
  104. @Test
  105. public void selectGroupNamesByQuery_is_ordered_by_permissions_then_by_group_names() {
  106. GroupDto group2 = db.users().insertGroup("Group-2");
  107. GroupDto group3 = db.users().insertGroup("Group-3");
  108. GroupDto group1 = db.users().insertGroup("Group-1");
  109. db.users().insertPermissionOnAnyone(SCAN);
  110. db.users().insertPermissionOnGroup(group3, SCAN);
  111. assertThat(underTest.selectGroupNamesByQuery(dbSession, newQuery().build()))
  112. .containsExactly(ANYONE, group3.getName(), group1.getName(), group2.getName());
  113. }
  114. @Test
  115. public void selectGroupNamesByQuery_is_ordered_by_permissions_then_by_group_when_many_groups_for_global_permissions() {
  116. ComponentDto project = db.components().insertPrivateProject();
  117. IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
  118. GroupDto group = db.users().insertGroup("Group-" + i);
  119. // Add permission on project to be sure projects are excluded
  120. db.users().insertProjectPermissionOnGroup(group, SCAN.getKey(), project);
  121. });
  122. String lastGroupName = "Group-" + (DEFAULT_PAGE_SIZE + 1);
  123. db.users().insertPermissionOnGroup(db.users().selectGroup(lastGroupName).get(), SCAN);
  124. assertThat(underTest.selectGroupNamesByQuery(dbSession, newQuery().build()))
  125. .hasSize(DEFAULT_PAGE_SIZE)
  126. .startsWith(ANYONE, lastGroupName, "Group-1");
  127. }
  128. @Test
  129. public void selectGroupNamesByQuery_is_ordered_by_global_permissions_then_by_group_when_many_groups_for_project_permissions() {
  130. IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
  131. GroupDto group = db.users().insertGroup("Group-" + i);
  132. // Add global permission to be sure they are excluded
  133. db.users().insertPermissionOnGroup(group, SCAN.getKey());
  134. });
  135. ComponentDto project = db.components().insertPrivateProject();
  136. String lastGroupName = "Group-" + (DEFAULT_PAGE_SIZE + 1);
  137. db.users().insertProjectPermissionOnGroup(db.users().selectGroup(lastGroupName).get(), SCAN.getKey(), project);
  138. assertThat(underTest.selectGroupNamesByQuery(dbSession, newQuery()
  139. .setComponent(project)
  140. .build()))
  141. .hasSize(DEFAULT_PAGE_SIZE)
  142. .startsWith(ANYONE, lastGroupName, "Group-1");
  143. }
  144. @Test
  145. public void countGroupsByQuery() {
  146. GroupDto group1 = db.users().insertGroup("Group-1");
  147. db.users().insertGroup("Group-2");
  148. db.users().insertGroup("Group-3");
  149. db.users().insertPermissionOnAnyone(SCAN);
  150. db.users().insertPermissionOnGroup(group1, PROVISION_PROJECTS);
  151. assertThat(underTest.countGroupsByQuery(dbSession,
  152. newQuery().build())).isEqualTo(4);
  153. assertThat(underTest.countGroupsByQuery(dbSession,
  154. newQuery().setPermission(PROVISION_PROJECTS.getKey()).build())).isEqualTo(1);
  155. assertThat(underTest.countGroupsByQuery(dbSession,
  156. newQuery().withAtLeastOnePermission().build())).isEqualTo(2);
  157. assertThat(underTest.countGroupsByQuery(dbSession,
  158. newQuery().setSearchQuery("Group-").build())).isEqualTo(3);
  159. assertThat(underTest.countGroupsByQuery(dbSession,
  160. newQuery().setSearchQuery("Any").build())).isEqualTo(1);
  161. }
  162. @Test
  163. public void selectGroupNamesByQuery_with_global_permission() {
  164. GroupDto group1 = db.users().insertGroup("Group-1");
  165. GroupDto group2 = db.users().insertGroup("Group-2");
  166. GroupDto group3 = db.users().insertGroup("Group-3");
  167. ComponentDto project = db.components().insertPrivateProject();
  168. db.users().insertPermissionOnAnyone(SCAN);
  169. db.users().insertPermissionOnAnyone(PROVISION_PROJECTS);
  170. db.users().insertPermissionOnGroup(group1, SCAN);
  171. db.users().insertPermissionOnGroup(group3, ADMINISTER);
  172. db.users().insertProjectPermissionOnGroup(group2, UserRole.ADMIN, project);
  173. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  174. newQuery().setPermission(SCAN.getKey()).build())).containsExactly(ANYONE, group1.getName());
  175. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  176. newQuery().setPermission(ADMINISTER.getKey()).build())).containsExactly(group3.getName());
  177. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  178. newQuery().setPermission(PROVISION_PROJECTS.getKey()).build())).containsExactly(ANYONE);
  179. }
  180. @Test
  181. public void select_groups_by_query_with_project_permissions_on_public_projects() {
  182. GroupDto group1 = db.users().insertGroup();
  183. GroupDto group2 = db.users().insertGroup();
  184. GroupDto group3 = db.users().insertGroup();
  185. ComponentDto project = db.components().insertPublicProject();
  186. ComponentDto anotherProject = db.components().insertPublicProject();
  187. db.users().insertProjectPermissionOnGroup(group1, "p1", project);
  188. db.users().insertProjectPermissionOnGroup(group1, "p2", project);
  189. db.users().insertProjectPermissionOnAnyone("p3", project);
  190. db.users().insertProjectPermissionOnGroup(group1, "p4", anotherProject);
  191. db.users().insertProjectPermissionOnAnyone("p4", anotherProject);
  192. db.users().insertProjectPermissionOnGroup(group3, "p1", anotherProject);
  193. db.users().insertPermissionOnGroup(group2, "p5");
  194. PermissionQuery.Builder builderOnComponent = newQuery()
  195. .setComponent(project);
  196. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  197. builderOnComponent.withAtLeastOnePermission().build())).containsOnlyOnce(group1.getName());
  198. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  199. builderOnComponent.setPermission("p1").build())).containsOnlyOnce(group1.getName());
  200. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  201. builderOnComponent.setPermission("p3").build())).containsOnlyOnce(ANYONE);
  202. }
  203. @Test
  204. public void select_groups_by_query_with_project_permissions_on_private_projects() {
  205. GroupDto group1 = db.users().insertGroup();
  206. GroupDto group2 = db.users().insertGroup();
  207. GroupDto group3 = db.users().insertGroup();
  208. ComponentDto project = db.components().insertPrivateProject();
  209. ComponentDto anotherProject = db.components().insertPrivateProject();
  210. db.users().insertProjectPermissionOnGroup(group1, SCAN.getKey(), project);
  211. db.users().insertProjectPermissionOnGroup(group1, PROVISION_PROJECTS.getKey(), project);
  212. db.users().insertProjectPermissionOnGroup(group1, ADMIN, anotherProject);
  213. db.users().insertProjectPermissionOnGroup(group3, UserRole.SCAN, anotherProject);
  214. db.users().insertPermissionOnGroup(group2, SCAN);
  215. PermissionQuery.Builder builderOnComponent = newQuery()
  216. .setComponent(project);
  217. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  218. builderOnComponent.withAtLeastOnePermission().build())).containsOnlyOnce(group1.getName());
  219. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  220. builderOnComponent.setPermission(SCAN_EXECUTION).build())).containsOnlyOnce(group1.getName());
  221. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  222. builderOnComponent.setPermission(USER).build())).isEmpty();
  223. }
  224. @Test
  225. public void selectGroupNamesByQuery_is_paginated() {
  226. IntStream.rangeClosed(0, 9).forEach(i -> db.users().insertGroup(i + "-name"));
  227. List<String> groupNames = underTest.selectGroupNamesByQuery(dbSession,
  228. newQuery().setPageIndex(2).setPageSize(3).build());
  229. assertThat(groupNames).containsExactly("3-name", "4-name", "5-name");
  230. }
  231. @Test
  232. public void selectGroupNamesByQuery_with_search_query() {
  233. GroupDto group = db.users().insertGroup("group-anyone");
  234. db.users().insertGroup("unknown");
  235. db.users().insertPermissionOnGroup(group, SCAN);
  236. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  237. newQuery().setSearchQuery("any").build())).containsOnlyOnce(ANYONE, group.getName());
  238. }
  239. @Test
  240. public void selectGroupNamesByQuery_does_not_return_anyone_when_group_roles_is_empty() {
  241. GroupDto group = db.users().insertGroup();
  242. assertThat(underTest.selectGroupNamesByQuery(dbSession,
  243. newQuery().build()))
  244. .doesNotContain(ANYONE)
  245. .containsExactly(group.getName());
  246. }
  247. @Test
  248. public void selectByGroupUuids_on_global_permissions() {
  249. GroupDto group1 = db.users().insertGroup("Group-1");
  250. db.users().insertPermissionOnGroup(group1, SCAN);
  251. GroupDto group2 = db.users().insertGroup("Group-2");
  252. ComponentDto project = db.components().insertPrivateProject();
  253. db.users().insertProjectPermissionOnGroup(group2, UserRole.ADMIN, project);
  254. GroupDto group3 = db.users().insertGroup("Group-3");
  255. db.users().insertPermissionOnGroup(group3, ADMINISTER);
  256. // Anyone
  257. db.users().insertPermissionOnAnyone(SCAN);
  258. db.users().insertPermissionOnAnyone(PROVISION_PROJECTS);
  259. assertThat(underTest.selectByGroupUuids(dbSession, asList(group1.getUuid()), null))
  260. .extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getComponentUuid)
  261. .containsOnly(tuple(group1.getUuid(), SCAN_EXECUTION, null));
  262. assertThat(underTest.selectByGroupUuids(dbSession, asList(group2.getUuid()), null)).isEmpty();
  263. assertThat(underTest.selectByGroupUuids(dbSession, asList(group3.getUuid()), null))
  264. .extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getComponentUuid)
  265. .containsOnly(tuple(group3.getUuid(), ADMINISTER.getKey(), null));
  266. assertThat(underTest.selectByGroupUuids(dbSession, asList(ANYONE_UUID), null))
  267. .extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getComponentUuid)
  268. .containsOnly(
  269. tuple(ANYONE_UUID, SCAN.getKey(), null),
  270. tuple(ANYONE_UUID, PROVISION_PROJECTS.getKey(), null));
  271. assertThat(underTest.selectByGroupUuids(dbSession, asList(group1.getUuid(), group2.getUuid(), ANYONE_UUID), null)).hasSize(3);
  272. assertThat(underTest.selectByGroupUuids(dbSession, asList(MISSING_UUID), null)).isEmpty();
  273. assertThat(underTest.selectByGroupUuids(dbSession, Collections.emptyList(), null)).isEmpty();
  274. }
  275. @Test
  276. public void selectByGroupUuids_on_public_projects() {
  277. GroupDto group1 = db.users().insertGroup("Group-1");
  278. db.users().insertPermissionOnGroup(group1, "p1");
  279. GroupDto group2 = db.users().insertGroup("Group-2");
  280. ComponentDto project = db.components().insertPublicProject();
  281. db.users().insertProjectPermissionOnGroup(group2, "p2", project);
  282. GroupDto group3 = db.users().insertGroup("Group-3");
  283. db.users().insertProjectPermissionOnGroup(group3, "p2", project);
  284. // Anyone group
  285. db.users().insertPermissionOnAnyone("p3");
  286. db.users().insertProjectPermissionOnAnyone("p4", project);
  287. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group1.getUuid()), project.uuid())).isEmpty();
  288. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group2.getUuid()), project.uuid()))
  289. .extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getComponentUuid)
  290. .containsOnly(tuple(group2.getUuid(), "p2", project.uuid()));
  291. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group3.getUuid()), project.uuid()))
  292. .extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getComponentUuid)
  293. .containsOnly(tuple(group3.getUuid(), "p2", project.uuid()));
  294. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(ANYONE_UUID), project.uuid()))
  295. .extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getComponentUuid)
  296. .containsOnly(tuple(ANYONE_UUID, "p4", project.uuid()));
  297. assertThat(underTest.selectByGroupUuids(dbSession, asList(group1.getUuid(), group2.getUuid(), ANYONE_UUID), project.uuid())).hasSize(2);
  298. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(MISSING_UUID), project.uuid())).isEmpty();
  299. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group1.getUuid()), "123")).isEmpty();
  300. assertThat(underTest.selectByGroupUuids(dbSession, Collections.emptyList(), project.uuid())).isEmpty();
  301. }
  302. @Test
  303. public void selectByGroupUuids_on_private_projects() {
  304. GroupDto group1 = db.users().insertGroup("Group-1");
  305. db.users().insertPermissionOnGroup(group1, PROVISION_PROJECTS);
  306. GroupDto group2 = db.users().insertGroup("Group-2");
  307. ComponentDto project = db.components().insertPrivateProject();
  308. db.users().insertProjectPermissionOnGroup(group2, USER, project);
  309. GroupDto group3 = db.users().insertGroup("Group-3");
  310. db.users().insertProjectPermissionOnGroup(group3, USER, project);
  311. // Anyone group
  312. db.users().insertPermissionOnAnyone(SCAN);
  313. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group1.getUuid()), project.uuid())).isEmpty();
  314. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group2.getUuid()), project.uuid()))
  315. .extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getComponentUuid)
  316. .containsOnly(tuple(group2.getUuid(), USER, project.uuid()));
  317. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group3.getUuid()), project.uuid()))
  318. .extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getComponentUuid)
  319. .containsOnly(tuple(group3.getUuid(), USER, project.uuid()));
  320. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(ANYONE_UUID), project.uuid()))
  321. .isEmpty();
  322. assertThat(underTest.selectByGroupUuids(dbSession, asList(group1.getUuid(), group2.getUuid(), ANYONE_UUID), project.uuid())).hasSize(1);
  323. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(MISSING_UUID), project.uuid())).isEmpty();
  324. assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group1.getUuid()), "123")).isEmpty();
  325. assertThat(underTest.selectByGroupUuids(dbSession, Collections.emptyList(), project.uuid())).isEmpty();
  326. }
  327. @Test
  328. public void selectGlobalPermissionsOfGroup() {
  329. GroupDto group1 = db.users().insertGroup("group1");
  330. GroupDto group2 = db.users().insertGroup("group2");
  331. ComponentDto project = db.components().insertPublicProject();
  332. db.users().insertPermissionOnAnyone("perm1");
  333. db.users().insertPermissionOnGroup(group1, "perm2");
  334. db.users().insertPermissionOnGroup(group1, "perm3");
  335. db.users().insertPermissionOnGroup(group2, "perm4");
  336. db.users().insertProjectPermissionOnGroup(group1, "perm5", project);
  337. db.users().insertProjectPermissionOnAnyone("perm6", project);
  338. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group1.getUuid())).containsOnly("perm2", "perm3");
  339. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group2.getUuid())).containsOnly("perm4");
  340. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, null)).containsOnly("perm1");
  341. }
  342. @Test
  343. public void selectProjectPermissionsOfGroup_on_public_project() {
  344. GroupDto group1 = db.users().insertGroup("group1");
  345. ComponentDto project1 = db.components().insertPublicProject();
  346. ComponentDto project2 = db.components().insertPublicProject();
  347. db.users().insertPermissionOnAnyone("perm1");
  348. db.users().insertPermissionOnGroup(group1, "perm2");
  349. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  350. db.users().insertProjectPermissionOnGroup(group1, "perm4", project1);
  351. db.users().insertProjectPermissionOnGroup(group1, "perm5", project2);
  352. db.users().insertProjectPermissionOnAnyone("perm6", project1);
  353. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project1.uuid()))
  354. .containsOnly("perm3", "perm4");
  355. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project2.uuid()))
  356. .containsOnly("perm5");
  357. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project1.uuid()))
  358. .containsOnly("perm6");
  359. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project2.uuid()))
  360. .isEmpty();
  361. }
  362. @Test
  363. public void selectProjectPermissionsOfGroup_on_private_project() {
  364. GroupDto group1 = db.users().insertGroup("group1");
  365. ComponentDto project1 = db.components().insertPrivateProject();
  366. ComponentDto project2 = db.components().insertPrivateProject();
  367. db.users().insertPermissionOnAnyone("perm1");
  368. db.users().insertPermissionOnGroup(group1, "perm2");
  369. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  370. db.users().insertProjectPermissionOnGroup(group1, "perm4", project1);
  371. db.users().insertProjectPermissionOnGroup(group1, "perm5", project2);
  372. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project1.uuid()))
  373. .containsOnly("perm3", "perm4");
  374. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project2.uuid()))
  375. .containsOnly("perm5");
  376. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project1.uuid()))
  377. .isEmpty();
  378. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project2.uuid()))
  379. .isEmpty();
  380. }
  381. @Test
  382. public void selectAllPermissionsByGroupUuid_on_public_project() {
  383. GroupDto group1 = db.users().insertGroup("group1");
  384. ComponentDto project1 = db.components().insertPublicProject();
  385. ComponentDto project2 = db.components().insertPublicProject();
  386. db.users().insertPermissionOnAnyone("perm1");
  387. db.users().insertPermissionOnGroup(group1, "perm2");
  388. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  389. db.users().insertProjectPermissionOnGroup(group1, "perm4", project1);
  390. db.users().insertProjectPermissionOnGroup(group1, "perm5", project2);
  391. db.users().insertProjectPermissionOnAnyone("perm6", project1);
  392. List<GroupPermissionDto> result = new ArrayList<>();
  393. underTest.selectAllPermissionsByGroupUuid(dbSession, group1.getUuid(), context -> result.add(context.getResultObject()));
  394. assertThat(result).extracting(GroupPermissionDto::getComponentUuid, GroupPermissionDto::getRole).containsOnly(
  395. tuple(null, "perm2"),
  396. tuple(project1.uuid(), "perm3"), tuple(project1.uuid(), "perm4"), tuple(project2.uuid(), "perm5"));
  397. }
  398. @Test
  399. public void selectAllPermissionsByGroupUuid_on_private_project() {
  400. GroupDto group1 = db.users().insertGroup("group1");
  401. ComponentDto project1 = db.components().insertPrivateProject();
  402. ComponentDto project2 = db.components().insertPrivateProject();
  403. db.users().insertPermissionOnAnyone("perm1");
  404. db.users().insertPermissionOnGroup(group1, "perm2");
  405. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  406. db.users().insertProjectPermissionOnGroup(group1, "perm4", project1);
  407. db.users().insertProjectPermissionOnGroup(group1, "perm5", project2);
  408. List<GroupPermissionDto> result = new ArrayList<>();
  409. underTest.selectAllPermissionsByGroupUuid(dbSession, group1.getUuid(), context -> result.add(context.getResultObject()));
  410. assertThat(result).extracting(GroupPermissionDto::getComponentUuid, GroupPermissionDto::getRole).containsOnly(
  411. tuple(null, "perm2"),
  412. tuple(project1.uuid(), "perm3"), tuple(project1.uuid(), "perm4"), tuple(project2.uuid(), "perm5"));
  413. }
  414. @Test
  415. public void selectGroupUuidsWithPermissionOnProjectBut_returns_empty_if_project_does_not_exist() {
  416. ComponentDto project = randomPublicOrPrivateProject();
  417. GroupDto group = db.users().insertGroup();
  418. db.users().insertProjectPermissionOnGroup(group, "foo", project);
  419. assertThat(underTest.selectGroupUuidsWithPermissionOnProjectBut(dbSession, "1234", UserRole.USER))
  420. .isEmpty();
  421. }
  422. @Test
  423. public void selectGroupUuidsWithPermissionOnProjectBut_returns_only_groups_of_project_which_do_not_have_permission() {
  424. ComponentDto project = randomPublicOrPrivateProject();
  425. GroupDto group1 = db.users().insertGroup();
  426. GroupDto group2 = db.users().insertGroup();
  427. db.users().insertProjectPermissionOnGroup(group1, "p1", project);
  428. db.users().insertProjectPermissionOnGroup(group2, "p2", project);
  429. assertThat(underTest.selectGroupUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p2"))
  430. .containsOnly(group1.getUuid());
  431. assertThat(underTest.selectGroupUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p1"))
  432. .containsOnly(group2.getUuid());
  433. assertThat(underTest.selectGroupUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p3"))
  434. .containsOnly(group1.getUuid(), group2.getUuid());
  435. }
  436. @Test
  437. public void selectGroupUuidsWithPermissionOnProjectBut_does_not_returns_group_AnyOne_of_project_when_it_does_not_have_permission() {
  438. ComponentDto project = db.components().insertPublicProject();
  439. GroupDto group1 = db.users().insertGroup();
  440. GroupDto group2 = db.users().insertGroup();
  441. db.users().insertProjectPermissionOnGroup(group1, "p1", project);
  442. db.users().insertProjectPermissionOnGroup(group2, "p2", project);
  443. db.users().insertProjectPermissionOnAnyone("p2", project);
  444. assertThat(underTest.selectGroupUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p2"))
  445. .containsOnly(group1.getUuid());
  446. assertThat(underTest.selectGroupUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p1"))
  447. .containsOnly(group2.getUuid());
  448. }
  449. @Test
  450. public void selectGroupUuidsWithPermissionOnProjectBut_does_not_return_groups_which_have_no_permission_at_all_on_specified_project() {
  451. ComponentDto project = randomPublicOrPrivateProject();
  452. GroupDto group1 = db.users().insertGroup();
  453. GroupDto group2 = db.users().insertGroup();
  454. GroupDto group3 = db.users().insertGroup();
  455. db.users().insertProjectPermissionOnGroup(group1, "p1", project);
  456. db.users().insertProjectPermissionOnGroup(group2, "p2", project);
  457. assertThat(underTest.selectGroupUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p2"))
  458. .containsOnly(group1.getUuid());
  459. assertThat(underTest.selectGroupUuidsWithPermissionOnProjectBut(dbSession, project.uuid(), "p1"))
  460. .containsOnly(group2.getUuid());
  461. }
  462. @Test
  463. public void deleteByRootComponentUuid_on_private_project() {
  464. GroupDto group1 = db.users().insertGroup();
  465. GroupDto group2 = db.users().insertGroup();
  466. ComponentDto project1 = db.components().insertPrivateProject();
  467. ComponentDto project2 = db.components().insertPrivateProject();
  468. db.users().insertPermissionOnGroup(group1, "perm1");
  469. db.users().insertProjectPermissionOnGroup(group1, "perm2", project1);
  470. db.users().insertProjectPermissionOnGroup(group2, "perm3", project2);
  471. underTest.deleteByRootComponentUuid(dbSession, project1.uuid());
  472. dbSession.commit();
  473. assertThat(db.countSql("select count(uuid) from group_roles where component_uuid='" + project1.uuid() + "'")).isZero();
  474. assertThat(db.countRowsOfTable("group_roles")).isEqualTo(2);
  475. }
  476. @Test
  477. public void deleteByRootComponentUuid_on_public_project() {
  478. GroupDto group1 = db.users().insertGroup();
  479. GroupDto group2 = db.users().insertGroup();
  480. ComponentDto project1 = db.components().insertPublicProject();
  481. ComponentDto project2 = db.components().insertPublicProject();
  482. db.users().insertPermissionOnGroup(group1, "perm1");
  483. db.users().insertProjectPermissionOnGroup(group1, "perm2", project1);
  484. db.users().insertProjectPermissionOnGroup(group2, "perm3", project2);
  485. db.users().insertProjectPermissionOnAnyone("perm4", project1);
  486. db.users().insertProjectPermissionOnAnyone("perm5", project2);
  487. underTest.deleteByRootComponentUuid(dbSession, project1.uuid());
  488. dbSession.commit();
  489. assertThat(db.countSql("select count(uuid) from group_roles where component_uuid='" + project1.uuid() + "'")).isZero();
  490. assertThat(db.countRowsOfTable("group_roles")).isEqualTo(3);
  491. }
  492. @Test
  493. public void delete_global_permission_from_group_on_public_project() {
  494. GroupDto group1 = db.users().insertGroup();
  495. ComponentDto project1 = db.components().insertPublicProject();
  496. db.users().insertPermissionOnAnyone("perm1");
  497. db.users().insertPermissionOnGroup(group1, "perm2");
  498. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  499. db.users().insertProjectPermissionOnAnyone("perm4", project1);
  500. underTest.delete(dbSession, "perm2", group1.getUuid(), null);
  501. dbSession.commit();
  502. assertThatNoPermission("perm2");
  503. assertThat(db.countRowsOfTable("group_roles")).isEqualTo(3);
  504. }
  505. @Test
  506. public void delete_global_permission_from_group_on_private_project() {
  507. GroupDto group1 = db.users().insertGroup();
  508. ComponentDto project1 = db.components().insertPrivateProject();
  509. db.users().insertPermissionOnAnyone("perm1");
  510. db.users().insertPermissionOnGroup(group1, "perm2");
  511. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  512. underTest.delete(dbSession, "perm2", group1.getUuid(), null);
  513. dbSession.commit();
  514. assertThatNoPermission("perm2");
  515. assertThat(db.countRowsOfTable("group_roles")).isEqualTo(2);
  516. }
  517. @Test
  518. public void delete_global_permission_from_anyone_on_public_project() {
  519. GroupDto group1 = db.users().insertGroup();
  520. ComponentDto project1 = db.components().insertPublicProject();
  521. db.users().insertPermissionOnAnyone("perm1");
  522. db.users().insertPermissionOnGroup(group1, "perm2");
  523. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  524. db.users().insertProjectPermissionOnAnyone("perm4", project1);
  525. underTest.delete(dbSession, "perm1", null, null);
  526. dbSession.commit();
  527. assertThatNoPermission("perm1");
  528. assertThat(db.countRowsOfTable("group_roles")).isEqualTo(3);
  529. }
  530. @Test
  531. public void delete_project_permission_from_group_on_private_project() {
  532. GroupDto group1 = db.users().insertGroup();
  533. ComponentDto project1 = db.components().insertPrivateProject();
  534. db.users().insertPermissionOnAnyone("perm1");
  535. db.users().insertPermissionOnGroup(group1, "perm2");
  536. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  537. underTest.delete(dbSession, "perm3", group1.getUuid(), project1.uuid());
  538. dbSession.commit();
  539. assertThatNoPermission("perm3");
  540. assertThat(db.countRowsOfTable("group_roles")).isEqualTo(2);
  541. }
  542. @Test
  543. public void delete_project_permission_from_group_on_public_project() {
  544. GroupDto group1 = db.users().insertGroup();
  545. ComponentDto project1 = db.components().insertPublicProject();
  546. db.users().insertPermissionOnAnyone("perm1");
  547. db.users().insertPermissionOnGroup(group1, "perm2");
  548. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  549. db.users().insertProjectPermissionOnAnyone("perm4", project1);
  550. underTest.delete(dbSession, "perm3", group1.getUuid(), project1.uuid());
  551. dbSession.commit();
  552. assertThatNoPermission("perm3");
  553. assertThat(db.countRowsOfTable("group_roles")).isEqualTo(3);
  554. }
  555. @Test
  556. public void delete_project_permission_from_anybody_on_private_project() {
  557. GroupDto group1 = db.users().insertGroup();
  558. ComponentDto project1 = db.components().insertPublicProject();
  559. db.users().insertPermissionOnAnyone("perm1");
  560. db.users().insertPermissionOnGroup(group1, "perm2");
  561. db.users().insertProjectPermissionOnGroup(group1, "perm3", project1);
  562. db.users().insertProjectPermissionOnAnyone("perm4", project1);
  563. underTest.delete(dbSession, "perm4", null, project1.uuid());
  564. dbSession.commit();
  565. assertThatNoPermission("perm4");
  566. assertThat(db.countRowsOfTable("group_roles")).isEqualTo(3);
  567. }
  568. @Test
  569. public void deleteByRootComponentUuidAndGroupUuid_deletes_all_permissions_of_group_AnyOne_of_specified_component_if_groupUuid_is_null() {
  570. ComponentDto project = db.components().insertPublicProject();
  571. GroupDto group = db.users().insertGroup();
  572. db.users().insertProjectPermissionOnAnyone("p1", project);
  573. db.users().insertProjectPermissionOnGroup(group, "p2", project);
  574. db.users().insertPermissionOnAnyone("p3");
  575. db.users().insertPermissionOnGroup(group, "p4");
  576. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project.uuid()))
  577. .containsOnly("p1");
  578. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group.getUuid(), project.uuid()))
  579. .containsOnly("p2");
  580. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, null))
  581. .containsOnly("p3");
  582. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group.getUuid()))
  583. .containsOnly("p4");
  584. int deletedCount = underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, project.uuid(), null);
  585. assertThat(deletedCount).isEqualTo(1);
  586. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project.uuid()))
  587. .isEmpty();
  588. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group.getUuid(), project.uuid()))
  589. .containsOnly("p2");
  590. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, null))
  591. .containsOnly("p3");
  592. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group.getUuid()))
  593. .containsOnly("p4");
  594. }
  595. @Test
  596. public void deleteByRootComponentUuidAndGroupUuid_deletes_all_permissions_of_specified_group_of_specified_component_if_groupUuid_is_non_null() {
  597. ComponentDto project = db.components().insertPublicProject();
  598. GroupDto group1 = db.users().insertGroup();
  599. GroupDto group2 = db.users().insertGroup();
  600. db.users().insertProjectPermissionOnAnyone("p1", project);
  601. db.users().insertProjectPermissionOnGroup(group1, "p2", project);
  602. db.users().insertProjectPermissionOnGroup(group2, "p3", project);
  603. db.users().insertProjectPermissionOnGroup(group2, "p4", project);
  604. db.users().insertPermissionOnAnyone("p5");
  605. db.users().insertPermissionOnGroup(group1, "p6");
  606. db.users().insertPermissionOnGroup(group2, "p7");
  607. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project.uuid()))
  608. .containsOnly("p1");
  609. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project.uuid()))
  610. .containsOnly("p2");
  611. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group2.getUuid(), project.uuid()))
  612. .containsOnly("p3", "p4");
  613. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, null))
  614. .containsOnly("p5");
  615. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group1.getUuid()))
  616. .containsOnly("p6");
  617. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group2.getUuid()))
  618. .containsOnly("p7");
  619. int deletedCount = underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, project.uuid(), group1.getUuid());
  620. assertThat(deletedCount).isEqualTo(1);
  621. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project.uuid()))
  622. .containsOnly("p1");
  623. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project.uuid()))
  624. .isEmpty();
  625. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group2.getUuid(), project.uuid()))
  626. .containsOnly("p3", "p4");
  627. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group1.getUuid()))
  628. .containsOnly("p6");
  629. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group2.getUuid()))
  630. .containsOnly("p7");
  631. deletedCount = underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, project.uuid(), group2.getUuid());
  632. assertThat(deletedCount).isEqualTo(2);
  633. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project.uuid()))
  634. .containsOnly("p1");
  635. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project.uuid()))
  636. .isEmpty();
  637. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group2.getUuid(), project.uuid()))
  638. .isEmpty();
  639. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group1.getUuid()))
  640. .containsOnly("p6");
  641. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group2.getUuid()))
  642. .containsOnly("p7");
  643. }
  644. @Test
  645. public void deleteByRootComponentUuidAndGroupUuid_has_no_effect_if_component_does_not_exist() {
  646. GroupDto group = db.users().insertGroup();
  647. assertThat(underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, "1234", null)).isZero();
  648. assertThat(underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, "1234", group.getUuid())).isZero();
  649. }
  650. @Test
  651. public void deleteByRootComponentUuidAndGroupUuid_has_no_effect_if_component_has_no_group_permission_at_all() {
  652. ComponentDto project = randomPublicOrPrivateProject();
  653. GroupDto group = db.users().insertGroup();
  654. assertThat(underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, project.uuid(), null)).isZero();
  655. assertThat(underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, project.uuid(), group.getUuid())).isZero();
  656. }
  657. @Test
  658. public void deleteByRootComponentUuidAndGroupUuid_has_no_effect_if_group_does_not_exist() {
  659. ComponentDto project = randomPublicOrPrivateProject();
  660. assertThat(underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, project.uuid(), "5678")).isZero();
  661. }
  662. @Test
  663. public void deleteByRootComponentUuidAndGroupUuid_has_no_effect_if_component_has_no_group_permission_for_group_AnyOne() {
  664. ComponentDto project = db.components().insertPrivateProject();
  665. GroupDto group1 = db.users().insertGroup();
  666. db.users().insertProjectPermissionOnGroup(group1, "p1", project);
  667. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project.uuid()))
  668. .isEmpty();
  669. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project.uuid()))
  670. .containsOnly("p1");
  671. db.users().insertPermissionOnAnyone("p2");
  672. db.users().insertPermissionOnGroup(group1, "p3");
  673. int deletedCount = underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, project.uuid(), null);
  674. assertThat(deletedCount).isZero();
  675. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, null, project.uuid()))
  676. .isEmpty();
  677. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project.uuid()))
  678. .containsOnly("p1");
  679. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, null))
  680. .containsOnly("p2");
  681. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group1.getUuid()))
  682. .containsOnly("p3");
  683. }
  684. @Test
  685. public void deleteByRootComponentUuidAndGroupUuid_has_no_effect_if_component_has_no_group_permission_for_specified_group() {
  686. ComponentDto project = db.components().insertPrivateProject();
  687. GroupDto group1 = db.users().insertGroup();
  688. GroupDto group2 = db.users().insertGroup();
  689. db.users().insertProjectPermissionOnGroup(group1, "p1", project);
  690. db.users().insertPermissionOnAnyone("p2");
  691. db.users().insertPermissionOnGroup(group1, "p3");
  692. int deletedCount = underTest.deleteByRootComponentUuidAndGroupUuid(dbSession, project.uuid(), group2.getUuid());
  693. assertThat(deletedCount).isZero();
  694. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group1.getUuid(), project.uuid()))
  695. .containsOnly("p1");
  696. assertThat(underTest.selectProjectPermissionsOfGroup(dbSession, group2.getUuid(), project.uuid()))
  697. .isEmpty();
  698. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, null))
  699. .containsOnly("p2");
  700. assertThat(underTest.selectGlobalPermissionsOfGroup(dbSession, group1.getUuid()))
  701. .containsOnly("p3");
  702. }
  703. @Test
  704. public void deleteByRootComponentUuidAndPermission_deletes_all_rows_for_specified_role_of_specified_component() {
  705. ComponentDto project = db.components().insertPublicProject();
  706. GroupDto group = db.users().insertGroup();
  707. Stream.of("p1", "p2").forEach(permission -> {
  708. db.users().insertPermissionOnAnyone(permission);
  709. db.users().insertPermissionOnGroup(group, permission);
  710. db.users().insertProjectPermissionOnGroup(group, permission, project);
  711. db.users().insertProjectPermissionOnAnyone(permission, project);
  712. });
  713. assertThat(getGlobalPermissionsForAnyone()).containsOnly("p1", "p2");
  714. assertThat(getGlobalPermissionsForGroup(group)).containsOnly("p1", "p2");
  715. assertThat(getProjectPermissionsForAnyOne(project)).containsOnly("p1", "p2");
  716. assertThat(getProjectPermissionsForGroup(project, group)).containsOnly("p1", "p2");
  717. int deletedRows = underTest.deleteByRootComponentUuidAndPermission(dbSession, project.uuid(), "p1");
  718. assertThat(deletedRows).isEqualTo(2);
  719. assertThat(getGlobalPermissionsForAnyone()).containsOnly("p1", "p2");
  720. assertThat(getGlobalPermissionsForGroup(group)).containsOnly("p1", "p2");
  721. assertThat(getProjectPermissionsForAnyOne(project)).containsOnly("p2");
  722. assertThat(getProjectPermissionsForGroup(project, group)).containsOnly("p2");
  723. deletedRows = underTest.deleteByRootComponentUuidAndPermission(dbSession, project.uuid(), "p2");
  724. assertThat(deletedRows).isEqualTo(2);
  725. assertThat(getGlobalPermissionsForAnyone()).containsOnly("p1", "p2");
  726. assertThat(getGlobalPermissionsForGroup(group)).containsOnly("p1", "p2");
  727. assertThat(getProjectPermissionsForAnyOne(project)).isEmpty();
  728. assertThat(getProjectPermissionsForGroup(project, group)).isEmpty();
  729. }
  730. @Test
  731. public void deleteByRootComponentUuidAndPermission_has_no_effect_if_component_has_no_group_permission_at_all() {
  732. GroupDto group = db.users().insertGroup();
  733. ComponentDto project = randomPublicOrPrivateProject();
  734. db.users().insertPermissionOnAnyone("p1");
  735. db.users().insertPermissionOnGroup(group, "p1");
  736. assertThat(underTest.deleteByRootComponentUuidAndPermission(dbSession, project.uuid(), "p1")).isZero();
  737. assertThat(getGlobalPermissionsForAnyone()).containsOnly("p1");
  738. assertThat(getGlobalPermissionsForGroup(group)).containsOnly("p1");
  739. assertThat(getProjectPermissionsForAnyOne(project)).isEmpty();
  740. assertThat(getProjectPermissionsForGroup(project, group)).isEmpty();
  741. }
  742. @Test
  743. public void deleteByRootComponentUuidAndPermission_has_no_effect_if_component_does_not_exist() {
  744. ComponentDto project = db.components().insertPublicProject();
  745. GroupDto group = db.users().insertGroup();
  746. db.users().insertPermissionOnAnyone("p1");
  747. db.users().insertPermissionOnGroup(group, "p1");
  748. db.users().insertProjectPermissionOnGroup(group, "p1", project);
  749. db.users().insertProjectPermissionOnAnyone("p1", project);
  750. assertThat(underTest.deleteByRootComponentUuidAndPermission(dbSession, "1324", "p1")).isZero();
  751. assertThat(getGlobalPermissionsForAnyone()).containsOnly("p1");
  752. assertThat(getGlobalPermissionsForGroup(group)).containsOnly("p1");
  753. assertThat(getProjectPermissionsForAnyOne(project)).containsOnly("p1");
  754. assertThat(getProjectPermissionsForGroup(project, group)).containsOnly("p1");
  755. }
  756. @Test
  757. public void deleteByRootComponentUuidAndPermission_has_no_effect_if_component_does_not_have_specified_permission() {
  758. GroupDto group = db.users().insertGroup();
  759. ComponentDto project = randomPublicOrPrivateProject();
  760. db.users().insertPermissionOnAnyone("p1");
  761. db.users().insertPermissionOnGroup(group, "p1");
  762. assertThat(underTest.deleteByRootComponentUuidAndPermission(dbSession, project.uuid(), "p1")).isZero();
  763. }
  764. private Collection<String> getGlobalPermissionsForAnyone() {
  765. return getPermissions("group_uuid is null and component_uuid is null");
  766. }
  767. private Collection<String> getGlobalPermissionsForGroup(GroupDto groupDto) {
  768. return getPermissions("group_uuid = '" + groupDto.getUuid() + "' and component_uuid is null");
  769. }
  770. private Collection<String> getProjectPermissionsForAnyOne(ComponentDto project) {
  771. return getPermissions("group_uuid is null and component_uuid = '" + project.uuid() + "'");
  772. }
  773. private Collection<String> getProjectPermissionsForGroup(ComponentDto project, GroupDto group) {
  774. return getPermissions("group_uuid = '" + group.getUuid() + "' and component_uuid = '" + project.uuid() + "'");
  775. }
  776. private Collection<String> getPermissions(String whereClauses) {
  777. return db
  778. .select(dbSession, "select role from group_roles where " + whereClauses)
  779. .stream()
  780. .flatMap(map -> map.entrySet().stream())
  781. .map(entry -> (String) entry.getValue())
  782. .collect(MoreCollectors.toList());
  783. }
  784. private ComponentDto randomPublicOrPrivateProject() {
  785. return new Random().nextBoolean() ? db.components().insertPublicProject() : db.components().insertPrivateProject();
  786. }
  787. private PermissionQuery.Builder newQuery() {
  788. return PermissionQuery.builder();
  789. }
  790. private void assertThatNoPermission(String permission) {
  791. assertThat(db.countSql("select count(uuid) from group_roles where role='" + permission + "'")).isZero();
  792. }
  793. }