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.

AuthorizationDaoTest.java 55KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142
  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.Collection;
  22. import java.util.Collections;
  23. import java.util.List;
  24. import java.util.Random;
  25. import java.util.Set;
  26. import java.util.function.Consumer;
  27. import java.util.stream.Collectors;
  28. import java.util.stream.IntStream;
  29. import org.junit.Before;
  30. import org.junit.Rule;
  31. import org.junit.Test;
  32. import org.sonar.api.utils.System2;
  33. import org.sonar.api.web.UserRole;
  34. import org.sonar.core.util.Uuids;
  35. import org.sonar.core.util.stream.MoreCollectors;
  36. import org.sonar.db.DbSession;
  37. import org.sonar.db.DbTester;
  38. import org.sonar.db.EmailSubscriberDto;
  39. import org.sonar.db.component.BranchType;
  40. import org.sonar.db.component.ComponentDto;
  41. import org.sonar.db.user.GroupDto;
  42. import org.sonar.db.user.UserDto;
  43. import static com.google.common.collect.Sets.newHashSet;
  44. import static java.util.Collections.singleton;
  45. import static org.assertj.core.api.Assertions.assertThat;
  46. import static org.sonar.core.permission.GlobalPermissions.QUALITY_PROFILE_ADMIN;
  47. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
  48. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES;
  49. import static org.sonar.db.permission.OrganizationPermission.PROVISION_PROJECTS;
  50. public class AuthorizationDaoTest {
  51. private static final String PROJECT_UUID = "uuid";
  52. private static final int MISSING_ID = -1;
  53. private static final String MISSING_UUID = "unknown";
  54. private static final String A_PERMISSION = "a-permission";
  55. private static final String DOES_NOT_EXIST = "does-not-exist";
  56. @Rule
  57. public DbTester db = DbTester.create(System2.INSTANCE);
  58. private final Random random = new Random();
  59. private DbSession dbSession = db.getSession();
  60. private AuthorizationDao underTest = new AuthorizationDao();
  61. private UserDto user;
  62. private GroupDto group1;
  63. private GroupDto group2;
  64. private Set<String> randomPublicProjectUuids;
  65. private Set<String> randomPrivateProjectUuids;
  66. private Set<String> randomExistingUserUuids;
  67. private String randomPermission = "p" + random.nextInt();
  68. @Before
  69. public void setUp() {
  70. user = db.users().insertUser();
  71. group1 = db.users().insertGroup("group1");
  72. group2 = db.users().insertGroup("group2");
  73. randomExistingUserUuids = IntStream.range(0, 1 + Math.abs(random.nextInt(5)))
  74. .mapToObj(i -> db.users().insertUser().getUuid())
  75. .collect(MoreCollectors.toSet());
  76. randomPublicProjectUuids = IntStream.range(0, 1 + Math.abs(random.nextInt(5)))
  77. .mapToObj(i -> db.components().insertPublicProject().uuid())
  78. .collect(MoreCollectors.toSet());
  79. randomPrivateProjectUuids = IntStream.range(0, 1 + Math.abs(random.nextInt(5)))
  80. .mapToObj(i -> db.components().insertPrivateProject().uuid())
  81. .collect(MoreCollectors.toSet());
  82. }
  83. /**
  84. * Union of the permissions granted to:
  85. * - the user
  86. * - the groups which user is member
  87. * - anyone
  88. */
  89. @Test
  90. public void selectOrganizationPermissions_for_logged_in_user() {
  91. ComponentDto project = db.components().insertPrivateProject();
  92. db.users().insertMember(group1, user);
  93. db.users().insertPermissionOnUser(user, "perm1");
  94. db.users().insertProjectPermissionOnUser(user, "perm42", project);
  95. db.users().insertPermissionOnGroup(group1, "perm2");
  96. db.users().insertPermissionOnAnyone("perm3");
  97. // ignored permissions, user is not member of this group
  98. db.users().insertPermissionOnGroup(group2, "ignored");
  99. Set<String> permissions = underTest.selectGlobalPermissions(dbSession, user.getUuid());
  100. assertThat(permissions).containsOnly("perm1", "perm2", "perm3");
  101. }
  102. @Test
  103. public void countUsersWithGlobalPermissionExcludingGroup() {
  104. // users with global permission "perm1" :
  105. // - "u1" and "u2" through group "g1"
  106. // - "u1" and "u3" through group "g2"
  107. // - "u4"
  108. UserDto user1 = db.users().insertUser();
  109. UserDto user2 = db.users().insertUser();
  110. UserDto user3 = db.users().insertUser();
  111. UserDto user4 = db.users().insertUser();
  112. UserDto user5 = db.users().insertUser();
  113. GroupDto group1 = db.users().insertGroup("g1");
  114. db.users().insertPermissionOnGroup(group1, "perm1");
  115. db.users().insertPermissionOnGroup(group1, "perm2");
  116. db.users().insertMember(group1, user1);
  117. db.users().insertMember(group1, user2);
  118. GroupDto group2 = db.users().insertGroup("g2");
  119. db.users().insertPermissionOnGroup(group2, "perm1");
  120. db.users().insertPermissionOnGroup(group2, "perm2");
  121. db.users().insertMember(group2, user1);
  122. db.users().insertMember(group2, user3);
  123. // group3 has the permission "perm1" but has no users
  124. GroupDto group3 = db.users().insertGroup("g3");
  125. db.users().insertPermissionOnGroup(group3, "perm1");
  126. db.users().insertPermissionOnUser(user4, "perm1");
  127. db.users().insertPermissionOnUser(user4, "perm2");
  128. db.users().insertPermissionOnAnyone("perm1");
  129. // excluding group "g1" -> remain u1, u3 and u4
  130. assertThat(underTest.countUsersWithGlobalPermissionExcludingGroup(db.getSession(),
  131. "perm1", group1.getUuid())).isEqualTo(3);
  132. // excluding group "g2" -> remain u1, u2 and u4
  133. assertThat(underTest.countUsersWithGlobalPermissionExcludingGroup(db.getSession(),
  134. "perm1", group2.getUuid())).isEqualTo(3);
  135. // excluding group "g3" -> remain u1, u2, u3 and u4
  136. assertThat(underTest.countUsersWithGlobalPermissionExcludingGroup(db.getSession(),
  137. "perm1", group3.getUuid())).isEqualTo(4);
  138. // nobody has the permission
  139. assertThat(underTest.countUsersWithGlobalPermissionExcludingGroup(db.getSession(),
  140. "missingPermission", group1.getUuid())).isEqualTo(0);
  141. }
  142. @Test
  143. public void countUsersWithGlobalPermissionExcludingUser() {
  144. // group g1 has the permission p1 and has members user1 and user2
  145. // user3 has the permission
  146. UserDto user1 = db.users().insertUser();
  147. UserDto user2 = db.users().insertUser();
  148. UserDto user3 = db.users().insertUser();
  149. GroupDto group1 = db.users().insertGroup("g1");
  150. db.users().insertPermissionOnGroup(group1, "p1");
  151. db.users().insertPermissionOnGroup(group1, "p2");
  152. db.users().insertMember(group1, user1);
  153. db.users().insertMember(group1, user2);
  154. db.users().insertPermissionOnUser(user3, "p1");
  155. db.users().insertPermissionOnAnyone("p1");
  156. // excluding user1 -> remain user2 and user3
  157. assertThat(underTest.countUsersWithGlobalPermissionExcludingUser(db.getSession(),
  158. "p1", user1.getUuid())).isEqualTo(2);
  159. // excluding user3 -> remain the members of group g1
  160. assertThat(underTest.countUsersWithGlobalPermissionExcludingUser(db.getSession(),
  161. "p1", user3.getUuid())).isEqualTo(2);
  162. // excluding unknown user
  163. assertThat(underTest.countUsersWithGlobalPermissionExcludingUser(db.getSession(),
  164. "p1", "-1")).isEqualTo(3);
  165. // nobody has the permission
  166. assertThat(underTest.countUsersWithGlobalPermissionExcludingUser(db.getSession(),
  167. "missingPermission", user1.getUuid())).isEqualTo(0);
  168. }
  169. @Test
  170. public void selectUserUuidsWithGlobalPermission() {
  171. // group g1 has the permission p1 and has members user1 and user2
  172. // user3 has the permission
  173. UserDto user1 = db.users().insertUser();
  174. UserDto user2 = db.users().insertUser();
  175. UserDto user3 = db.users().insertUser();
  176. GroupDto group1 = db.users().insertGroup();
  177. db.users().insertPermissionOnGroup(group1, ADMINISTER);
  178. db.users().insertPermissionOnGroup(group1, PROVISION_PROJECTS);
  179. db.users().insertMember(group1, user1);
  180. db.users().insertMember(group1, user2);
  181. db.users().insertPermissionOnUser(user3, ADMINISTER);
  182. db.users().insertPermissionOnAnyone(ADMINISTER);
  183. assertThat(underTest.selectUserUuidsWithGlobalPermission(db.getSession(), ADMINISTER.getKey()))
  184. .containsExactlyInAnyOrder(user1.getUuid(), user2.getUuid(), user3.getUuid());
  185. assertThat(underTest.selectUserUuidsWithGlobalPermission(db.getSession(), PROVISION_PROJECTS.getKey()))
  186. .containsExactlyInAnyOrder(user1.getUuid(), user2.getUuid());
  187. }
  188. @Test
  189. public void keepAuthorizedProjectUuids_returns_empty_for_group_AnyOne_if_project_set_is_empty_on_public_project() {
  190. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, Collections.emptySet(), null, UserRole.USER))
  191. .isEmpty();
  192. }
  193. @Test
  194. public void keepAuthorizedProjectUuids_returns_empty_for_user_if_project_set_is_empty_on_public_project() {
  195. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, Collections.emptySet(), user.getUuid(), UserRole.USER))
  196. .isEmpty();
  197. }
  198. @Test
  199. public void keepAuthorizedProjectUuids_returns_empty_for_group_AnyOne_for_non_existent_projects() {
  200. Set<String> randomNonProjectsSet = IntStream.range(0, 1 + Math.abs(random.nextInt(5)))
  201. .mapToObj(i -> Integer.toString(3_562 + i))
  202. .collect(MoreCollectors.toSet());
  203. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomNonProjectsSet, null, UserRole.USER))
  204. .isEmpty();
  205. }
  206. @Test
  207. public void keepAuthorizedProjectUuids_returns_empty_for_user_for_non_existent_projects() {
  208. Set<String> randomNonProjectsSet = IntStream.range(0, 1 + Math.abs(random.nextInt(5)))
  209. .mapToObj(i -> Integer.toString(9_666 + i))
  210. .collect(MoreCollectors.toSet());
  211. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomNonProjectsSet, user.getUuid(), UserRole.USER))
  212. .isEmpty();
  213. }
  214. @Test
  215. public void keepAuthorizedProjectUuids_returns_any_public_project_for_group_AnyOne_without_any_permission_in_DB_and_permission_USER() {
  216. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPublicProjectUuids, null, UserRole.USER))
  217. .containsAll(randomPublicProjectUuids);
  218. }
  219. @Test
  220. public void keepAuthorizedProjectUuids_returns_any_public_project_for_user_without_any_permission_in_DB_and_permission_USER() {
  221. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPublicProjectUuids, user.getUuid(), UserRole.USER))
  222. .containsAll(randomPublicProjectUuids);
  223. }
  224. @Test
  225. public void keepAuthorizedProjectUuids_returns_any_public_project_for_group_AnyOne_without_any_permission_in_DB_and_permission_CODEVIEWER() {
  226. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPublicProjectUuids, null, UserRole.CODEVIEWER))
  227. .containsAll(randomPublicProjectUuids);
  228. }
  229. @Test
  230. public void keepAuthorizedProjectUuids_returns_any_public_project_for_user_without_any_permission_in_DB_and_permission_CODEVIEWER() {
  231. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPublicProjectUuids, user.getUuid(), UserRole.CODEVIEWER))
  232. .containsAll(randomPublicProjectUuids);
  233. }
  234. @Test
  235. public void keepAuthorizedProjectUuids_returns_empty_for_other_permission_for_group_AnyOne_on_public_project_without_any_permission_in_DB() {
  236. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPublicProjectUuids, null, randomPermission))
  237. .isEmpty();
  238. }
  239. @Test
  240. public void keepAuthorizedProjectUuids_returns_empty_for_any_permission_for_user_on_public_project_without_any_permission_in_DB() {
  241. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPublicProjectUuids, user.getUuid(), randomPermission))
  242. .isEmpty();
  243. }
  244. @Test
  245. public void keepAuthorizedProjectUuids_returns_public_project_if_user_is_granted_project_permission_directly() {
  246. ComponentDto project = db.components().insertPublicProject();
  247. ComponentDto otherProject = db.components().insertPublicProject();
  248. UserDto otherUser = db.users().insertUser();
  249. db.users().insertProjectPermissionOnUser(user, randomPermission, project);
  250. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), otherUser.getUuid(), randomPermission))
  251. .isEmpty();
  252. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(otherProject.uuid()), user.getUuid(), randomPermission))
  253. .isEmpty();
  254. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), user.getUuid(), randomPermission))
  255. .containsOnly(project.uuid());
  256. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), user.getUuid(), "another perm"))
  257. .isEmpty();
  258. }
  259. @Test
  260. public void keepAuthorizedProjectUuids_returns_public_project_if_user_is_granted_project_permission_by_group() {
  261. ComponentDto project = db.components().insertPublicProject();
  262. ComponentDto otherProject = db.components().insertPublicProject();
  263. UserDto otherUser = db.users().insertUser();
  264. db.users().insertMember(group1, user);
  265. db.users().insertProjectPermissionOnGroup(group1, randomPermission, project);
  266. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), user.getUuid(), randomPermission))
  267. .containsOnly(project.uuid());
  268. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(otherProject.uuid()), user.getUuid(), randomPermission))
  269. .isEmpty();
  270. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), otherUser.getUuid(), randomPermission))
  271. .isEmpty();
  272. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), user.getUuid(), "another perm"))
  273. .isEmpty();
  274. }
  275. @Test
  276. public void keepAuthorizedProjectUuids_returns_public_project_if_group_AnyOne_is_granted_project_permission_directly() {
  277. ComponentDto project = db.components().insertPublicProject();
  278. ComponentDto otherProject = db.components().insertPublicProject();
  279. db.users().insertProjectPermissionOnAnyone(randomPermission, project);
  280. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), null, randomPermission))
  281. .containsOnly(project.uuid());
  282. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), null, "another perm"))
  283. .isEmpty();
  284. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(otherProject.uuid()), null, randomPermission))
  285. .isEmpty();
  286. }
  287. @Test
  288. public void keepAuthorizedProjectUuids_returns_empty_for_user_on_private_project_without_any_permission_in_DB_and_permission_USER() {
  289. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPrivateProjectUuids, user.getUuid(), UserRole.USER))
  290. .isEmpty();
  291. }
  292. @Test
  293. public void keepAuthorizedProjectUuids_returns_empty_for_group_AnyOne_on_private_project_without_any_permission_in_DB_and_permission_USER() {
  294. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPrivateProjectUuids, null, UserRole.USER))
  295. .isEmpty();
  296. }
  297. @Test
  298. public void keepAuthorizedProjectUuids_returns_empty_for_user_on_private_project_without_any_permission_in_DB_and_permission_CODEVIEWER() {
  299. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPrivateProjectUuids, user.getUuid(), UserRole.CODEVIEWER))
  300. .isEmpty();
  301. }
  302. @Test
  303. public void keepAuthorizedProjectUuids_returns_empty_for_group_AnyOne_on_private_project_without_any_permission_in_DB_and_permission_CODEVIEWER() {
  304. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPrivateProjectUuids, null, UserRole.CODEVIEWER))
  305. .isEmpty();
  306. }
  307. @Test
  308. public void keepAuthorizedProjectUuids_returns_empty_for_user_and_any_permission_on_private_project_without_any_permission_in_DB() {
  309. PermissionsTestHelper.ALL_PERMISSIONS
  310. .forEach(perm -> {
  311. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPrivateProjectUuids, user.getUuid(), perm))
  312. .isEmpty();
  313. });
  314. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPrivateProjectUuids, user.getUuid(), randomPermission))
  315. .isEmpty();
  316. }
  317. @Test
  318. public void keepAuthorizedProjectUuids_returns_empty_for_group_AnyOne_and_any_permission_on_private_project_without_any_permission_in_DB() {
  319. PermissionsTestHelper.ALL_PERMISSIONS
  320. .forEach(perm -> {
  321. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPrivateProjectUuids, null, perm))
  322. .isEmpty();
  323. });
  324. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, randomPrivateProjectUuids, null, randomPermission))
  325. .isEmpty();
  326. }
  327. @Test
  328. public void keepAuthorizedProjectUuids_returns_private_project_if_user_is_granted_project_permission_directly() {
  329. ComponentDto project = db.components().insertPrivateProject();
  330. ComponentDto otherProject = db.components().insertPrivateProject();
  331. UserDto otherUser = db.users().insertUser();
  332. db.users().insertProjectPermissionOnUser(user, randomPermission, project);
  333. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), user.getUuid(), randomPermission))
  334. .containsOnly(project.uuid());
  335. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), user.getUuid(), "another perm"))
  336. .isEmpty();
  337. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(otherProject.uuid()), user.getUuid(), randomPermission))
  338. .isEmpty();
  339. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), otherUser.getUuid(), randomPermission))
  340. .isEmpty();
  341. }
  342. @Test
  343. public void keepAuthorizedProjectUuids_returns_private_project_if_user_is_granted_project_permission_by_group() {
  344. ComponentDto project = db.components().insertPrivateProject();
  345. ComponentDto otherProject = db.components().insertPrivateProject();
  346. UserDto otherUser = db.users().insertUser();
  347. db.users().insertMember(group1, user);
  348. db.users().insertProjectPermissionOnGroup(group1, randomPermission, project);
  349. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), user.getUuid(), randomPermission))
  350. .containsOnly(project.uuid());
  351. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), user.getUuid(), "another perm"))
  352. .isEmpty();
  353. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(otherProject.uuid()), user.getUuid(), randomPermission))
  354. .isEmpty();
  355. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, singleton(project.uuid()), otherUser.getUuid(), randomPermission))
  356. .isEmpty();
  357. }
  358. @Test
  359. public void user_should_be_authorized() {
  360. ComponentDto project1 = db.components().insertPrivateProject();
  361. ComponentDto project2 = db.components().insertPrivateProject();
  362. ComponentDto project3 = db.components().insertPrivateProject();
  363. UserDto user = db.users().insertUser("u1");
  364. GroupDto group = db.users().insertGroup();
  365. db.users().insertProjectPermissionOnUser(user, UserRole.USER, project2);
  366. db.users().insertProjectPermissionOnUser(user, UserRole.USER, project3);
  367. db.users().insertMember(group, user);
  368. db.users().insertProjectPermissionOnGroup(group, UserRole.USER, project1);
  369. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(project2.uuid(), project3.uuid()), user.getUuid(), UserRole.USER))
  370. .containsOnly(project2.uuid(), project3.uuid());
  371. // user does not have the role "admin"
  372. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(project2.uuid()), user.getUuid(), UserRole.ADMIN))
  373. .isEmpty();
  374. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, Collections.emptySet(), user.getUuid(), UserRole.ADMIN))
  375. .isEmpty();
  376. }
  377. @Test
  378. public void group_should_be_authorized() {
  379. ComponentDto project1 = db.components().insertPrivateProject();
  380. ComponentDto project2 = db.components().insertPrivateProject();
  381. ComponentDto project3 = db.components().insertPrivateProject();
  382. UserDto user1 = db.users().insertUser("u1");
  383. GroupDto group = db.users().insertGroup();
  384. db.users().insertMembers(group, user1);
  385. db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project1);
  386. db.users().insertProjectPermissionOnGroup(group, UserRole.USER, project2);
  387. db.users().insertProjectPermissionOnGroup(group, UserRole.USER, project3);
  388. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(project2.uuid(), project3.uuid()), user1.getUuid(), UserRole.USER))
  389. .containsOnly(project2.uuid(), project3.uuid());
  390. // group does not have the role "admin"
  391. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(project2.uuid(), project3.uuid()), user1.getUuid(), UserRole.ADMIN))
  392. .isEmpty();
  393. }
  394. @Test
  395. public void anonymous_should_be_authorized() {
  396. ComponentDto project1 = db.components().insertPublicProject();
  397. ComponentDto project2 = db.components().insertPublicProject();
  398. UserDto user1 = db.users().insertUser("u1");
  399. GroupDto group = db.users().insertGroup();
  400. db.users().insertMembers(group, user1);
  401. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(project1.uuid(), project2.uuid()), null, UserRole.USER))
  402. .containsOnly(project1.uuid(), project2.uuid());
  403. // group does not have the role "admin"
  404. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(project1.uuid()), null, "admin"))
  405. .isEmpty();
  406. }
  407. @Test
  408. public void keepAuthorizedProjectUuids_should_be_able_to_handle_lots_of_projects() {
  409. List<ComponentDto> projects = IntStream.range(0, 2000).mapToObj(i -> db.components().insertPublicProject()).collect(Collectors.toList());
  410. Collection<String> uuids = projects.stream().map(ComponentDto::uuid).collect(Collectors.toSet());
  411. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, uuids, null, UserRole.USER))
  412. .containsOnly(uuids.toArray(new String[0]));
  413. }
  414. @Test
  415. public void keepAuthorizedUsersForRoleAndProject_returns_empty_if_user_set_is_empty_on_public_project() {
  416. ComponentDto project = db.components().insertPublicProject();
  417. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, Collections.emptySet(), UserRole.USER, project.uuid()))
  418. .isEmpty();
  419. }
  420. @Test
  421. public void keepAuthorizedUsersForRoleAndProject_returns_empty_for_non_existent_users() {
  422. ComponentDto project = random.nextBoolean() ? db.components().insertPublicProject() : db.components().insertPrivateProject();
  423. Set<String> randomNonExistingUserUuidsSet = IntStream.range(0, 1 + Math.abs(random.nextInt(5)))
  424. .mapToObj(i -> Uuids.createFast())
  425. .collect(MoreCollectors.toSet());
  426. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, randomNonExistingUserUuidsSet, UserRole.USER, project.uuid()))
  427. .isEmpty();
  428. }
  429. @Test
  430. public void keepAuthorizedUsersForRoleAndProject_returns_any_users_for_public_project_without_any_permission_in_DB_and_permission_USER() {
  431. ComponentDto project = db.components().insertPublicProject();
  432. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, randomExistingUserUuids, UserRole.USER, project.uuid()))
  433. .containsAll(randomExistingUserUuids);
  434. }
  435. @Test
  436. public void keepAuthorizedUsersForRoleAndProject_returns_any_users_for_public_project_without_any_permission_in_DB_and_permission_CODEVIEWER() {
  437. ComponentDto project = db.components().insertPublicProject();
  438. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, randomExistingUserUuids, UserRole.CODEVIEWER, project.uuid()))
  439. .containsAll(randomExistingUserUuids);
  440. }
  441. @Test
  442. public void keepAuthorizedUsersForRoleAndProject_returns_empty_for_any_users_on_public_project_without_any_permission_in_DB() {
  443. ComponentDto project = db.components().insertPublicProject();
  444. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, randomExistingUserUuids, randomPermission, project.uuid()))
  445. .isEmpty();
  446. }
  447. @Test
  448. public void keepAuthorizedUsersForRoleAndProject_returns_user_if_granted_project_permission_directly_on_public_project() {
  449. ComponentDto project = db.components().insertPublicProject();
  450. ComponentDto otherProject = db.components().insertPublicProject();
  451. UserDto otherUser = db.users().insertUser();
  452. db.users().insertProjectPermissionOnUser(user, randomPermission, project);
  453. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, project.uuid()))
  454. .containsOnly(user.getUuid());
  455. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), "another perm", project.uuid()))
  456. .isEmpty();
  457. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(otherUser.getUuid()), randomPermission, project.uuid()))
  458. .isEmpty();
  459. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, otherProject.uuid()))
  460. .isEmpty();
  461. }
  462. @Test
  463. public void keepAuthorizedUsersForRoleAndProject_returns_user_if_granted_project_permission_by_group_on_public_project() {
  464. ComponentDto project = db.components().insertPublicProject();
  465. ComponentDto otherProject = db.components().insertPublicProject();
  466. UserDto otherUser = db.users().insertUser();
  467. db.users().insertMember(group1, user);
  468. db.users().insertProjectPermissionOnGroup(group1, randomPermission, project);
  469. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, project.uuid()))
  470. .containsOnly(user.getUuid());
  471. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), "another perm", project.uuid()))
  472. .isEmpty();
  473. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, otherProject.uuid()))
  474. .isEmpty();
  475. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(otherUser.getUuid()), randomPermission, project.uuid()))
  476. .isEmpty();
  477. }
  478. @Test
  479. public void keepAuthorizedUsersForRoleAndProject_does_not_return_user_if_granted_project_permission_by_AnyOne_on_public_project() {
  480. ComponentDto project = db.components().insertPublicProject();
  481. ComponentDto otherProject = db.components().insertPublicProject();
  482. UserDto otherUser = db.users().insertUser();
  483. db.users().insertProjectPermissionOnAnyone(randomPermission, project);
  484. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, project.uuid()))
  485. .isEmpty();
  486. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), "another perm", project.uuid()))
  487. .isEmpty();
  488. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, otherProject.uuid()))
  489. .isEmpty();
  490. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(otherUser.getUuid()), randomPermission, project.uuid()))
  491. .isEmpty();
  492. }
  493. @Test
  494. public void keepAuthorizedUsersForRoleAndProject_returns_empty_for_any_user_on_private_project_without_any_permission_in_DB_and_permission_USER() {
  495. ComponentDto project = db.components().insertPrivateProject();
  496. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, randomExistingUserUuids, UserRole.USER, project.uuid()))
  497. .isEmpty();
  498. }
  499. @Test
  500. public void keepAuthorizedUsersForRoleAndProject_returns_empty_for_any_user_on_private_project_without_any_permission_in_DB_and_permission_CODEVIEWER() {
  501. ComponentDto project = db.components().insertPrivateProject();
  502. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, randomExistingUserUuids, UserRole.CODEVIEWER, project.uuid()))
  503. .isEmpty();
  504. }
  505. @Test
  506. public void keepAuthorizedUsersForRoleAndProject_returns_empty_for_any_users_and_any_permission_on_private_project_without_any_permission_in_DB() {
  507. ComponentDto project = db.components().insertPrivateProject();
  508. PermissionsTestHelper.ALL_PERMISSIONS
  509. .forEach(perm -> {
  510. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, randomExistingUserUuids, perm, project.uuid()))
  511. .isEmpty();
  512. });
  513. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, randomExistingUserUuids, randomPermission, project.uuid()))
  514. .isEmpty();
  515. }
  516. @Test
  517. public void keepAuthorizedUsersForRoleAndProject_returns_user_if_granted_project_permission_directly_on_private_project() {
  518. ComponentDto project = db.components().insertPrivateProject();
  519. ComponentDto otherProject = db.components().insertPublicProject();
  520. UserDto otherUser = db.users().insertUser();
  521. db.users().insertProjectPermissionOnUser(user, randomPermission, project);
  522. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, project.uuid()))
  523. .containsOnly(user.getUuid());
  524. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), "another perm", project.uuid()))
  525. .isEmpty();
  526. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(otherUser.getUuid()), randomPermission, project.uuid()))
  527. .isEmpty();
  528. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, otherProject.uuid()))
  529. .isEmpty();
  530. }
  531. @Test
  532. public void keepAuthorizedUsersForRoleAndProject_returns_user_if_granted_project_permission_by_group_on_private_project() {
  533. ComponentDto project = db.components().insertPrivateProject();
  534. ComponentDto otherProject = db.components().insertPublicProject();
  535. UserDto otherUser = db.users().insertUser();
  536. db.users().insertMember(group1, user);
  537. db.users().insertProjectPermissionOnGroup(group1, randomPermission, project);
  538. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, project.uuid()))
  539. .containsOnly(user.getUuid());
  540. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), "another perm", project.uuid()))
  541. .isEmpty();
  542. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(user.getUuid()), randomPermission, otherProject.uuid()))
  543. .isEmpty();
  544. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession, singleton(otherUser.getUuid()), randomPermission, project.uuid()))
  545. .isEmpty();
  546. }
  547. @Test
  548. public void keep_authorized_users_returns_empty_list_for_role_and_project_for_anonymous() {
  549. ComponentDto project1 = db.components().insertPrivateProject();
  550. ComponentDto project2 = db.components().insertPrivateProject();
  551. ComponentDto project3 = db.components().insertPrivateProject();
  552. UserDto user1 = db.users().insertUser("u1");
  553. UserDto user2 = db.users().insertUser("u2");
  554. UserDto user3 = db.users().insertUser("u3");
  555. GroupDto group1 = db.users().insertGroup();
  556. GroupDto group2 = db.users().insertGroup();
  557. db.users().insertMembers(group1, user1, user2);
  558. db.users().insertMembers(group2, user3);
  559. db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project1);
  560. db.users().insertProjectPermissionOnUser(user2, UserRole.USER, project1);
  561. db.users().insertProjectPermissionOnUser(user3, UserRole.USER, project1);
  562. db.users().insertProjectPermissionOnGroup(group2, UserRole.USER, project3);
  563. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession,
  564. // Only 100 and 101 has 'user' role on project
  565. newHashSet(user1.getUuid(), user2.getUuid(), user3.getUuid()), "user", PROJECT_UUID)).isEmpty();
  566. }
  567. @Test
  568. public void keepAuthorizedUsersForRoleAndProject_should_be_able_to_handle_lots_of_users() {
  569. List<UserDto> users = IntStream.range(0, 2000).mapToObj(i -> db.users().insertUser()).collect(Collectors.toList());
  570. assertThat(underTest.keepAuthorizedUsersForRoleAndProject(dbSession,
  571. users.stream().map(UserDto::getUuid).collect(Collectors.toSet()), "user", PROJECT_UUID)).isEmpty();
  572. }
  573. @Test
  574. public void countUsersWithGlobalPermissionExcludingGroupMember() {
  575. // u1 has the direct permission, u2 and u3 have the permission through their group
  576. UserDto u1 = db.users().insertUser();
  577. db.users().insertPermissionOnUser(u1, A_PERMISSION);
  578. db.users().insertPermissionOnGroup(group1, A_PERMISSION);
  579. db.users().insertPermissionOnGroup(group1, "another-permission");
  580. UserDto u2 = db.users().insertUser();
  581. db.users().insertMember(group1, u2);
  582. UserDto u3 = db.users().insertUser();
  583. db.users().insertMember(group1, u3);
  584. // excluding u2 membership --> remain u1 and u3
  585. int count = underTest.countUsersWithGlobalPermissionExcludingGroupMember(dbSession, A_PERMISSION, group1.getUuid(), u2.getUuid());
  586. assertThat(count).isEqualTo(2);
  587. // excluding unknown memberships
  588. count = underTest.countUsersWithGlobalPermissionExcludingGroupMember(dbSession, A_PERMISSION, group1.getUuid(), MISSING_UUID);
  589. assertThat(count).isEqualTo(3);
  590. count = underTest.countUsersWithGlobalPermissionExcludingGroupMember(dbSession, A_PERMISSION, MISSING_UUID, u2.getUuid());
  591. assertThat(count).isEqualTo(3);
  592. // another permission
  593. count = underTest.countUsersWithGlobalPermissionExcludingGroupMember(dbSession, DOES_NOT_EXIST, group1.getUuid(), u2.getUuid());
  594. assertThat(count).isEqualTo(0);
  595. }
  596. @Test
  597. public void countUsersWithGlobalPermissionExcludingUserPermission() {
  598. // u1 and u2 have the direct permission, u3 has the permission through his group
  599. UserDto u1 = db.users().insertUser();
  600. db.users().insertPermissionOnUser(u1, A_PERMISSION);
  601. UserDto u2 = db.users().insertUser();
  602. db.users().insertPermissionOnUser(u2, A_PERMISSION);
  603. db.users().insertPermissionOnGroup(group1, A_PERMISSION);
  604. UserDto u3 = db.users().insertUser();
  605. db.users().insertMember(group1, u3);
  606. // excluding u2 permission --> remain u1 and u3
  607. int count = underTest.countUsersWithGlobalPermissionExcludingUserPermission(dbSession, A_PERMISSION, u2.getUuid());
  608. assertThat(count).isEqualTo(2);
  609. // excluding unknown user
  610. count = underTest.countUsersWithGlobalPermissionExcludingUserPermission(dbSession, A_PERMISSION, MISSING_UUID);
  611. assertThat(count).isEqualTo(3);
  612. // another permission
  613. count = underTest.countUsersWithGlobalPermissionExcludingUserPermission(dbSession, DOES_NOT_EXIST, u2.getUuid());
  614. assertThat(count).isEqualTo(0);
  615. }
  616. @Test
  617. public void selectProjectPermissionsOfAnonymous_returns_permissions_of_anonymous_user_on_specified_public_project() {
  618. ComponentDto project = db.components().insertPublicProject();
  619. db.users().insertProjectPermissionOnAnyone("p1", project);
  620. db.users().insertProjectPermissionOnUser(db.users().insertUser(), "p2", project);
  621. ComponentDto otherProject = db.components().insertPublicProject();
  622. db.users().insertProjectPermissionOnAnyone("p3", otherProject);
  623. assertThat(underTest.selectProjectPermissionsOfAnonymous(dbSession, project.uuid())).containsOnly("p1");
  624. }
  625. @Test
  626. public void selectProjectPermissionsOfAnonymous_returns_empty_set_when_project_does_not_exist() {
  627. assertThat(underTest.selectProjectPermissionsOfAnonymous(dbSession, "does_not_exist")).isEmpty();
  628. }
  629. @Test
  630. public void selectProjectPermissions_returns_empty_set_when_logged_in_user_and_project_does_not_exist() {
  631. assertThat(underTest.selectProjectPermissions(dbSession, "does_not_exist", user.getUuid())).isEmpty();
  632. }
  633. @Test
  634. public void selectProjectPermissions_returns_permissions_of_logged_in_user_on_specified_public_project_through_anonymous_permissions() {
  635. ComponentDto project = db.components().insertPublicProject();
  636. db.users().insertProjectPermissionOnAnyone("p1", project);
  637. db.users().insertProjectPermissionOnAnyone("p2", project);
  638. assertThat(underTest.selectProjectPermissions(dbSession, project.uuid(), user.getUuid())).containsOnly("p1", "p2");
  639. }
  640. @Test
  641. public void selectProjectPermissions_returns_permissions_of_logged_in_user_on_specified_project() {
  642. ComponentDto project = db.components().insertPrivateProject();
  643. db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
  644. db.users().insertProjectPermissionOnUser(db.users().insertUser(), UserRole.ISSUE_ADMIN, project);
  645. assertThat(underTest.selectProjectPermissions(dbSession, project.uuid(), user.getUuid())).containsOnly(UserRole.CODEVIEWER);
  646. }
  647. @Test
  648. public void selectProjectPermissions_returns_permissions_of_logged_in_user_on_specified_project_through_group_membership() {
  649. ComponentDto project = db.components().insertPrivateProject();
  650. db.users().insertProjectPermissionOnGroup(group1, UserRole.CODEVIEWER, project);
  651. db.users().insertProjectPermissionOnGroup(group2, UserRole.ISSUE_ADMIN, project);
  652. db.users().insertMember(group1, user);
  653. assertThat(underTest.selectProjectPermissions(dbSession, project.uuid(), user.getUuid())).containsOnly(UserRole.CODEVIEWER);
  654. }
  655. @Test
  656. public void selectProjectPermissions_returns_permissions_of_logged_in_user_on_specified_private_project_through_all_possible_configurations() {
  657. ComponentDto project = db.components().insertPrivateProject();
  658. db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
  659. db.users().insertProjectPermissionOnGroup(group1, UserRole.USER, project);
  660. db.users().insertMember(group1, user);
  661. assertThat(underTest.selectProjectPermissions(dbSession, project.uuid(), user.getUuid())).containsOnly(UserRole.CODEVIEWER, UserRole.USER);
  662. }
  663. @Test
  664. public void selectProjectPermissions_returns_permissions_of_logged_in_user_on_specified_public_project_through_all_possible_configurations() {
  665. ComponentDto project = db.components().insertPublicProject();
  666. db.users().insertProjectPermissionOnUser(user, "p1", project);
  667. db.users().insertProjectPermissionOnAnyone("p2", project);
  668. db.users().insertProjectPermissionOnGroup(group1, "p3", project);
  669. db.users().insertMember(group1, user);
  670. assertThat(underTest.selectProjectPermissions(dbSession, project.uuid(), user.getUuid())).containsOnly("p1", "p2", "p3");
  671. }
  672. @Test
  673. public void keepAuthorizedProjectUuids_filters_projects_authorized_to_logged_in_user_by_direct_permission() {
  674. ComponentDto privateProject = db.components().insertPrivateProject();
  675. ComponentDto publicProject = db.components().insertPublicProject();
  676. UserDto user = db.users().insertUser();
  677. db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, privateProject);
  678. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(privateProject.uuid(), publicProject.uuid()), user.getUuid(), UserRole.ADMIN))
  679. .containsOnly(privateProject.uuid());
  680. // user does not have the permission "issueadmin"
  681. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(privateProject.uuid(), publicProject.uuid()), user.getUuid(), UserRole.ISSUE_ADMIN))
  682. .isEmpty();
  683. }
  684. @Test
  685. public void keepAuthorizedProjectUuids_filters_projects_authorized_to_logged_in_user_by_group_permission() {
  686. ComponentDto privateProject = db.components().insertPrivateProject();
  687. ComponentDto publicProject = db.components().insertPublicProject();
  688. UserDto user = db.users().insertUser();
  689. GroupDto group = db.users().insertGroup();
  690. db.users().insertMember(group, user);
  691. db.users().insertProjectPermissionOnGroup(group, UserRole.ADMIN, privateProject);
  692. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(privateProject.uuid(), publicProject.uuid()), user.getUuid(), UserRole.ADMIN))
  693. .containsOnly(privateProject.uuid());
  694. // user does not have the permission "issueadmin"
  695. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(privateProject.uuid(), publicProject.uuid()), user.getUuid(), UserRole.ISSUE_ADMIN))
  696. .isEmpty();
  697. }
  698. @Test
  699. public void keepAuthorizedProjectUuids_returns_empty_list_if_input_is_empty() {
  700. ComponentDto publicProject = db.components().insertPublicProject();
  701. UserDto user = db.users().insertUser();
  702. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, Collections.emptySet(), user.getUuid(), UserRole.USER))
  703. .isEmpty();
  704. // projects do not exist
  705. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet("does_not_exist"), user.getUuid(), UserRole.USER))
  706. .isEmpty();
  707. }
  708. @Test
  709. public void keepAuthorizedProjectUuids_returns_empty_list_if_input_does_not_reference_existing_projects() {
  710. ComponentDto publicProject = db.components().insertPublicProject();
  711. UserDto user = db.users().insertUser();
  712. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet("does_not_exist"), user.getUuid(), UserRole.USER))
  713. .isEmpty();
  714. }
  715. @Test
  716. public void keepAuthorizedProjectUuids_returns_public_projects_if_permission_USER_or_CODEVIEWER() {
  717. ComponentDto publicProject = db.components().insertPublicProject();
  718. UserDto user = db.users().insertUser();
  719. // logged-in user
  720. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(publicProject.uuid()), user.getUuid(), UserRole.CODEVIEWER))
  721. .containsOnly(publicProject.uuid());
  722. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(publicProject.uuid()), user.getUuid(), UserRole.USER))
  723. .containsOnly(publicProject.uuid());
  724. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(publicProject.uuid()), user.getUuid(), UserRole.ADMIN))
  725. .isEmpty();
  726. // anonymous
  727. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(publicProject.uuid()), null, UserRole.CODEVIEWER))
  728. .containsOnly(publicProject.uuid());
  729. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(publicProject.uuid()), null, UserRole.USER))
  730. .containsOnly(publicProject.uuid());
  731. assertThat(underTest.keepAuthorizedProjectUuids(dbSession, newHashSet(publicProject.uuid()), null, UserRole.ADMIN))
  732. .isEmpty();
  733. }
  734. @Test
  735. public void selectQualityProfileAdministratorLogins_return_users_with_quality_profile_administrator_permission() {
  736. UserDto user1 = db.users().insertUser(withEmail("user1"));
  737. db.users().insertPermissionOnUser(user1, ADMINISTER_QUALITY_PROFILES);
  738. UserDto user2 = db.users().insertUser(withEmail("user2"));
  739. db.users().insertPermissionOnUser(user2, ADMINISTER_QUALITY_PROFILES);
  740. Set<EmailSubscriberDto> subscribers = underTest.selectQualityProfileAdministratorLogins(dbSession);
  741. assertThat(subscribers).containsOnly(globalEmailSubscriberOf(user1), globalEmailSubscriberOf(user2));
  742. }
  743. @Test
  744. public void selectQualityProfileAdministratorLogins_return_users_within_quality_profile_administrator_group() {
  745. GroupDto qualityProfileAdministratorGroup1 = db.users().insertGroup();
  746. db.users().insertPermissionOnGroup(qualityProfileAdministratorGroup1, ADMINISTER_QUALITY_PROFILES);
  747. UserDto user1 = db.users().insertUser(withEmail("user1"));
  748. db.users().insertMember(qualityProfileAdministratorGroup1, user1);
  749. GroupDto qualityProfileAdministratorGroup2 = db.users().insertGroup();
  750. db.users().insertPermissionOnGroup(qualityProfileAdministratorGroup2, ADMINISTER_QUALITY_PROFILES);
  751. UserDto user2 = db.users().insertUser(withEmail("user2"));
  752. db.users().insertMember(qualityProfileAdministratorGroup2, user2);
  753. Set<EmailSubscriberDto> subscribers = underTest.selectQualityProfileAdministratorLogins(dbSession);
  754. assertThat(subscribers).containsOnly(globalEmailSubscriberOf(user1), globalEmailSubscriberOf(user2));
  755. }
  756. @Test
  757. public void selectQualityProfileAdministratorLogins_does_not_return_non_quality_profile_administrator() {
  758. UserDto user1 = db.users().insertUser(withEmail("user1"));
  759. db.users().insertPermissionOnUser(user1, ADMINISTER);
  760. db.users().insertUser(withoutEmail("user2"));
  761. Set<EmailSubscriberDto> subscribers = underTest.selectQualityProfileAdministratorLogins(dbSession);
  762. assertThat(subscribers).isEmpty();
  763. }
  764. @Test
  765. public void selectQualityProfileAdministratorLogins_does_not_return_quality_profile_administrator_without_email() {
  766. UserDto user1NoEmail = db.users().insertUser(withoutEmail("user1NoEmail"));
  767. db.users().insertPermissionOnUser(user1NoEmail, ADMINISTER_QUALITY_PROFILES);
  768. UserDto user1WithEmail = db.users().insertUser(withEmail("user1WithEmail"));
  769. db.users().insertPermissionOnUser(user1WithEmail, ADMINISTER_QUALITY_PROFILES);
  770. GroupDto qualityProfileAdministratorGroup1 = db.users().insertGroup();
  771. db.users().insertPermissionOnGroup(qualityProfileAdministratorGroup1, ADMINISTER_QUALITY_PROFILES);
  772. UserDto user2NoEmail = db.users().insertUser(withoutEmail("user2NoEmail"));
  773. db.users().insertMember(qualityProfileAdministratorGroup1, user2NoEmail);
  774. UserDto user2WithEmail = db.users().insertUser(withEmail("user2WithEmail"));
  775. db.users().insertMember(qualityProfileAdministratorGroup1, user2WithEmail);
  776. GroupDto qualityProfileAdministratorGroup2 = db.users().insertGroup();
  777. db.users().insertPermissionOnGroup(qualityProfileAdministratorGroup2, ADMINISTER_QUALITY_PROFILES);
  778. UserDto user3NoEmail = db.users().insertUser(withoutEmail("user3NoEmail"));
  779. db.users().insertMember(qualityProfileAdministratorGroup2, user3NoEmail);
  780. UserDto user3WithEmail = db.users().insertUser(withEmail("user3WithEmail"));
  781. db.users().insertMember(qualityProfileAdministratorGroup2, user3WithEmail);
  782. UserDto user4NoEmail = db.users().insertUser(withoutEmail("user4NoEmail"));
  783. db.users().insertPermissionOnUser(user4NoEmail, ADMINISTER_QUALITY_PROFILES);
  784. UserDto user4WithEmail = db.users().insertUser(withEmail("user4WithEmail"));
  785. db.users().insertPermissionOnUser(user4WithEmail, ADMINISTER_QUALITY_PROFILES);
  786. UserDto user5NoEmail = db.users().insertUser(withoutEmail("user5NoEmail"));
  787. db.users().insertPermissionOnUser(user5NoEmail, ADMINISTER_QUALITY_PROFILES);
  788. UserDto user5WithEmail = db.users().insertUser(withEmail("user5WithEmail"));
  789. db.users().insertPermissionOnUser(user5WithEmail, ADMINISTER_QUALITY_PROFILES);
  790. db.users().insertUser(withoutEmail("user6NoEmail"));
  791. db.users().insertUser(withEmail("user6WithEmail"));
  792. Set<EmailSubscriberDto> subscribers = underTest.selectQualityProfileAdministratorLogins(dbSession);
  793. assertThat(subscribers)
  794. .containsOnly(
  795. globalEmailSubscriberOf(user1WithEmail),
  796. globalEmailSubscriberOf(user2WithEmail),
  797. globalEmailSubscriberOf(user3WithEmail),
  798. globalEmailSubscriberOf(user4WithEmail),
  799. globalEmailSubscriberOf(user5WithEmail));
  800. }
  801. @Test
  802. public void selectGlobalAdministerEmailSubscribers_returns_only_global_administers() {
  803. UserDto user1 = db.users().insertUser(withEmail("user1"));
  804. db.users().insertPermissionOnUser(user1, ADMINISTER);
  805. UserDto user2 = db.users().insertUser(withEmail("user2"));
  806. db.users().insertPermissionOnUser(user2, ADMINISTER);
  807. // user3 is global administer via a group
  808. GroupDto administratorGroup2 = db.users().insertGroup();
  809. db.users().insertPermissionOnGroup(administratorGroup2, ADMINISTER);
  810. UserDto user3 = db.users().insertUser(withEmail("user3"));
  811. db.users().insertMember(administratorGroup2, user3);
  812. // user4 has another global permission via a group
  813. GroupDto administratorGroup3 = db.users().insertGroup();
  814. db.users().insertPermissionOnGroup(administratorGroup3, QUALITY_PROFILE_ADMIN);
  815. UserDto user4 = db.users().insertUser(withEmail("user4"));
  816. db.users().insertMember(administratorGroup3, user4);
  817. ComponentDto project = db.components().insertPrivateProject();
  818. // user5 is only project level administer
  819. UserDto user5 = db.users().insertUser(withEmail("user5"));
  820. // db.users().insertPermissionOnUser(user5, ADMINISTER);
  821. db.users().insertProjectPermissionOnUser(user5, "admin", project);
  822. // user6 has other global permission
  823. UserDto user6 = db.users().insertUser(withEmail("user6"));
  824. db.users().insertPermissionOnUser(user6, ADMINISTER_QUALITY_PROFILES);
  825. // user7 has no permission
  826. db.users().insertUser(withEmail("user7"));
  827. Set<EmailSubscriberDto> subscribers = underTest.selectGlobalAdministerEmailSubscribers(dbSession);
  828. assertThat(subscribers).containsOnly(
  829. globalEmailSubscriberOf(user1),
  830. globalEmailSubscriberOf(user2),
  831. globalEmailSubscriberOf(user3));
  832. }
  833. @Test
  834. public void selectGlobalAdministerEmailSubscribers_ignores_global_administers_without_email() {
  835. // user1 and user1NoEmail are global administers
  836. UserDto user1 = db.users().insertUser(withEmail("user1"));
  837. db.users().insertPermissionOnUser(user1, ADMINISTER);
  838. UserDto user1NoEmail = db.users().insertUser(withoutEmail("user1NoEmail"));
  839. db.users().insertPermissionOnUser(user1NoEmail, ADMINISTER);
  840. // user2 and user2NoEmail are global administers
  841. UserDto user2 = db.users().insertUser(withEmail("user2"));
  842. db.users().insertPermissionOnUser(user2, ADMINISTER);
  843. UserDto user2NoEmail = db.users().insertUser(withoutEmail("user2NoEmail"));
  844. db.users().insertPermissionOnUser(user2NoEmail, ADMINISTER);
  845. // user3 and user3NoEmail are global administer via a group
  846. GroupDto administratorGroup2 = db.users().insertGroup();
  847. db.users().insertPermissionOnGroup(administratorGroup2, ADMINISTER);
  848. UserDto user3 = db.users().insertUser(withEmail("user3"));
  849. db.users().insertMember(administratorGroup2, user3);
  850. UserDto user3NoEmail = db.users().insertUser(withoutEmail("user3NoEmail"));
  851. db.users().insertMember(administratorGroup2, user3NoEmail);
  852. Set<EmailSubscriberDto> subscribers = underTest.selectGlobalAdministerEmailSubscribers(dbSession);
  853. assertThat(subscribers).containsOnly(
  854. globalEmailSubscriberOf(user1),
  855. globalEmailSubscriberOf(user2),
  856. globalEmailSubscriberOf(user3));
  857. }
  858. @Test
  859. public void keepAuthorizedLoginsOnProject_return_correct_users_on_public_project() {
  860. ComponentDto project = db.components().insertPublicProject();
  861. UserDto user1 = db.users().insertUser();
  862. // admin with "direct" ADMIN role
  863. UserDto admin1 = db.users().insertUser();
  864. db.users().insertProjectPermissionOnUser(admin1, UserRole.ADMIN, project);
  865. // admin2 with ADMIN role through group
  866. UserDto admin2 = db.users().insertUser();
  867. GroupDto adminGroup = db.users().insertGroup("ADMIN");
  868. db.users().insertMember(adminGroup, admin2);
  869. db.users().insertProjectPermissionOnGroup(adminGroup, UserRole.ADMIN, project);
  870. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, newHashSet(user1.getLogin()), project.getKey(), UserRole.USER))
  871. .containsOnly(user1.getLogin());
  872. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, newHashSet(user1.getLogin(), admin1.getLogin(), admin2.getLogin()), project.getKey(), UserRole.USER))
  873. .containsOnly(user1.getLogin(), admin1.getLogin(), admin2.getLogin());
  874. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, newHashSet(user1.getLogin(), admin1.getLogin(), admin2.getLogin()), project.getKey(), UserRole.ADMIN))
  875. .containsOnly(admin1.getLogin(), admin2.getLogin());
  876. }
  877. @Test
  878. public void keepAuthorizedLoginsOnProject_return_correct_users_on_private_project() {
  879. ComponentDto project = db.components().insertPrivateProject();
  880. GroupDto userGroup = db.users().insertGroup("USERS");
  881. GroupDto adminGroup = db.users().insertGroup("ADMIN");
  882. db.users().insertProjectPermissionOnGroup(userGroup, UserRole.USER, project);
  883. db.users().insertProjectPermissionOnGroup(adminGroup, UserRole.ADMIN, project);
  884. // admin with "direct" ADMIN role
  885. UserDto admin1 = db.users().insertUser();
  886. db.users().insertProjectPermissionOnUser(admin1, UserRole.ADMIN, project);
  887. // admin2 with ADMIN role through group
  888. UserDto admin2 = db.users().insertUser();
  889. db.users().insertMember(adminGroup, admin2);
  890. // user1 with "direct" USER role
  891. UserDto user1 = db.users().insertUser();
  892. db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project);
  893. // user2 with USER role through group
  894. UserDto user2 = db.users().insertUser();
  895. db.users().insertMember(userGroup, user2);
  896. // user without role
  897. UserDto userWithNoRole = db.users().insertUser();
  898. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, newHashSet(userWithNoRole.getLogin()), project.getKey(), UserRole.USER))
  899. .isEmpty();
  900. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, newHashSet(user1.getLogin()), project.getKey(), UserRole.USER))
  901. .containsOnly(user1.getLogin());
  902. Set<String> allLogins = newHashSet(admin1.getLogin(), admin2.getLogin(), user1.getLogin(), user2.getLogin(), userWithNoRole.getLogin());
  903. // Admin does not have the USER permission set
  904. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, allLogins, project.getKey(), UserRole.USER))
  905. .containsOnly(user1.getLogin(), user2.getLogin());
  906. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, allLogins, project.getKey(), UserRole.ADMIN))
  907. .containsOnly(admin1.getLogin(), admin2.getLogin());
  908. }
  909. @Test
  910. public void keepAuthorizedLoginsOnProject_return_correct_users_on_branch() {
  911. ComponentDto project = db.components().insertPrivateProject();
  912. ComponentDto branch = db.components().insertProjectBranch(project, c -> c.setBranchType(BranchType.BRANCH));
  913. GroupDto userGroup = db.users().insertGroup("USERS");
  914. GroupDto adminGroup = db.users().insertGroup("ADMIN");
  915. db.users().insertProjectPermissionOnGroup(userGroup, UserRole.USER, project);
  916. db.users().insertProjectPermissionOnGroup(adminGroup, UserRole.ADMIN, project);
  917. // admin with "direct" ADMIN role
  918. UserDto admin1 = db.users().insertUser();
  919. db.users().insertProjectPermissionOnUser(admin1, UserRole.ADMIN, project);
  920. // admin2 with ADMIN role through group
  921. UserDto admin2 = db.users().insertUser();
  922. db.users().insertMember(adminGroup, admin2);
  923. // user1 with "direct" USER role
  924. UserDto user1 = db.users().insertUser();
  925. db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project);
  926. // user2 with USER role through group
  927. UserDto user2 = db.users().insertUser();
  928. db.users().insertMember(userGroup, user2);
  929. // user without role
  930. UserDto userWithNoRole = db.users().insertUser();
  931. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, newHashSet(userWithNoRole.getLogin()), branch.getKey(), UserRole.USER))
  932. .isEmpty();
  933. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, newHashSet(user1.getLogin()), branch.getKey(), UserRole.USER))
  934. .containsOnly(user1.getLogin());
  935. Set<String> allLogins = newHashSet(admin1.getLogin(), admin2.getLogin(), user1.getLogin(), user2.getLogin(), userWithNoRole.getLogin());
  936. // Admin does not have the USER permission set
  937. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, allLogins, branch.getKey(), UserRole.USER))
  938. .containsOnly(user1.getLogin(), user2.getLogin());
  939. assertThat(underTest.keepAuthorizedLoginsOnProject(dbSession, allLogins, branch.getKey(), UserRole.ADMIN))
  940. .containsOnly(admin1.getLogin(), admin2.getLogin());
  941. }
  942. private static EmailSubscriberDto globalEmailSubscriberOf(UserDto userDto) {
  943. return EmailSubscriberDto.create(userDto.getLogin(), true, emailOf(userDto));
  944. }
  945. private static Consumer<UserDto> withEmail(String login) {
  946. return t -> t.setLogin(login).setEmail(emailOf(t));
  947. }
  948. private static String emailOf(UserDto t) {
  949. return t.getLogin() + "@foo";
  950. }
  951. private static Consumer<UserDto> withoutEmail(String login) {
  952. return t -> t.setLogin(login).setEmail(null);
  953. }
  954. }