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.

PermissionTemplateDaoTest.java 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  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.template;
  21. import java.util.ArrayList;
  22. import java.util.Date;
  23. import java.util.List;
  24. import org.junit.Before;
  25. import org.junit.Rule;
  26. import org.junit.Test;
  27. import org.junit.rules.ExpectedException;
  28. import org.sonar.api.utils.System2;
  29. import org.sonar.api.web.UserRole;
  30. import org.sonar.core.util.UuidFactory;
  31. import org.sonar.core.util.UuidFactoryFast;
  32. import org.sonar.db.DbSession;
  33. import org.sonar.db.DbTester;
  34. import org.sonar.db.user.GroupDto;
  35. import org.sonar.db.user.UserDto;
  36. import static java.util.Arrays.asList;
  37. import static org.assertj.core.api.Assertions.assertThat;
  38. import static org.assertj.core.api.Assertions.tuple;
  39. import static org.mockito.Mockito.mock;
  40. import static org.mockito.Mockito.when;
  41. import static org.sonar.api.web.UserRole.ADMIN;
  42. import static org.sonar.api.web.UserRole.CODEVIEWER;
  43. import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
  44. import static org.sonar.api.web.UserRole.USER;
  45. import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION;
  46. import static org.sonar.db.permission.template.PermissionTemplateTesting.newPermissionTemplateDto;
  47. import static org.sonar.db.user.GroupTesting.newGroupDto;
  48. public class PermissionTemplateDaoTest {
  49. private static final Date PAST = new Date(100_000_000_000L);
  50. private static final Date NOW = new Date(500_000_000_000L);
  51. @Rule
  52. public ExpectedException expectedException = ExpectedException.none();
  53. @Rule
  54. public DbTester db = DbTester.create();
  55. private System2 system2 = mock(System2.class);
  56. private DbSession dbSession = db.getSession();
  57. private PermissionTemplateDbTester templateDb = db.permissionTemplates();
  58. private UuidFactory uuidFactory = UuidFactoryFast.getInstance();
  59. private PermissionTemplateDao underTest = new PermissionTemplateDao(uuidFactory, system2);
  60. @Before
  61. public void setUp() {
  62. when(system2.now()).thenReturn(NOW.getTime());
  63. }
  64. @Test
  65. public void create_permission_template() {
  66. PermissionTemplateDto permissionTemplate = underTest.insert(db.getSession(), newPermissionTemplateDto()
  67. .setUuid("ABCD")
  68. .setName("my template")
  69. .setDescription("my description")
  70. .setKeyPattern("myregexp")
  71. .setCreatedAt(PAST)
  72. .setUpdatedAt(NOW));
  73. db.commit();
  74. assertThat(underTest.selectByUuid(db.getSession(), permissionTemplate.getUuid()))
  75. .extracting(PermissionTemplateDto::getUuid, PermissionTemplateDto::getName, PermissionTemplateDto::getDescription, PermissionTemplateDto::getKeyPattern,
  76. PermissionTemplateDto::getCreatedAt, PermissionTemplateDto::getUpdatedAt)
  77. .containsOnly("ABCD", "my template", "my description", "myregexp", PAST, NOW);
  78. }
  79. @Test
  80. public void select_permission_template_by_uuid() {
  81. templateDb.insertTemplate(newPermissionTemplateDto()
  82. .setUuid("ABCD")
  83. .setName("my template")
  84. .setDescription("my description")
  85. .setKeyPattern("myregexp"));
  86. assertThat(underTest.selectByUuid(db.getSession(), "ABCD"))
  87. .extracting(PermissionTemplateDto::getUuid, PermissionTemplateDto::getName, PermissionTemplateDto::getDescription, PermissionTemplateDto::getKeyPattern)
  88. .containsOnly("ABCD", "my template", "my description", "myregexp");
  89. }
  90. @Test
  91. public void selectAll_without_name_filtering() {
  92. templateDb.insertTemplate(newPermissionTemplateDto()
  93. .setUuid("tpl1")
  94. .setName("template1")
  95. .setDescription("description1"));
  96. templateDb.insertTemplate(newPermissionTemplateDto()
  97. .setUuid("tpl2")
  98. .setName("template2")
  99. .setDescription("description2"));
  100. templateDb.insertTemplate(newPermissionTemplateDto()
  101. .setUuid("tpl3")
  102. .setName("template3")
  103. .setDescription("description3"));
  104. assertThat(underTest.selectAll(dbSession, null))
  105. .extracting(PermissionTemplateDto::getUuid, PermissionTemplateDto::getName, PermissionTemplateDto::getDescription)
  106. .containsOnly(
  107. tuple("tpl1", "template1", "description1"),
  108. tuple("tpl2", "template2", "description2"),
  109. tuple("tpl3", "template3", "description3"));
  110. }
  111. @Test
  112. public void selectAll_with_name_filtering() {
  113. PermissionTemplateDto t1InOrg1 = templateDb.insertTemplate(newPermissionTemplateDto().setName("aBcDeF"));
  114. PermissionTemplateDto t2InOrg1 = templateDb.insertTemplate(newPermissionTemplateDto().setName("cdefgh"));
  115. PermissionTemplateDto t3InOrg1 = templateDb.insertTemplate(newPermissionTemplateDto().setName("hijkl"));
  116. assertThat(underTest.selectAll(dbSession, "def")).extracting(PermissionTemplateDto::getUuid).containsExactly(t1InOrg1.getUuid(), t2InOrg1.getUuid());
  117. assertThat(underTest.selectAll(dbSession, "missing")).isEmpty();
  118. }
  119. @Test
  120. public void should_update_permission_template() {
  121. PermissionTemplateDto permissionTemplateDto = templateDb.insertTemplate(newPermissionTemplateDto()
  122. .setUuid("ABCD")
  123. .setName("name")
  124. .setDescription("description")
  125. .setKeyPattern("regexp")
  126. .setCreatedAt(PAST)
  127. .setUpdatedAt(PAST));
  128. underTest.update(dbSession, permissionTemplateDto
  129. .setName("new_name")
  130. .setDescription("new_description")
  131. .setKeyPattern("new_regexp")
  132. .setUpdatedAt(NOW)
  133. // Invariant fields, should not be updated
  134. .setUuid("ABCD")
  135. .setCreatedAt(NOW));
  136. db.commit();
  137. assertThat(underTest.selectByUuid(db.getSession(), "ABCD"))
  138. .extracting(PermissionTemplateDto::getUuid, PermissionTemplateDto::getName, PermissionTemplateDto::getDescription, PermissionTemplateDto::getKeyPattern,
  139. PermissionTemplateDto::getCreatedAt, PermissionTemplateDto::getUpdatedAt)
  140. .containsOnly("ABCD", "new_name", "new_description", "new_regexp", PAST, NOW);
  141. }
  142. @Test
  143. public void delete_permission_template() {
  144. UserDto user1 = db.users().insertUser();
  145. UserDto user2 = db.users().insertUser();
  146. GroupDto group1 = db.users().insertGroup();
  147. GroupDto group2 = db.users().insertGroup();
  148. PermissionTemplateDto permissionTemplate1 = templateDb.insertTemplate();
  149. PermissionTemplateDto permissionTemplate2 = templateDb.insertTemplate();
  150. templateDb.addUserToTemplate(permissionTemplate1, user1, "user");
  151. templateDb.addUserToTemplate(permissionTemplate1, user2, "user");
  152. templateDb.addUserToTemplate(permissionTemplate1, user2, "admin");
  153. templateDb.addUserToTemplate(permissionTemplate2, user2, "admin");
  154. templateDb.addGroupToTemplate(permissionTemplate1, group1, "user");
  155. templateDb.addGroupToTemplate(permissionTemplate1, group2, "user");
  156. templateDb.addAnyoneToTemplate(permissionTemplate1, "admin");
  157. templateDb.addAnyoneToTemplate(permissionTemplate2, "admin");
  158. templateDb.addProjectCreatorToTemplate(permissionTemplate1.getUuid(), "user");
  159. templateDb.addProjectCreatorToTemplate(permissionTemplate2.getUuid(), "user");
  160. underTest.deleteByUuid(dbSession, permissionTemplate1.getUuid());
  161. dbSession.commit();
  162. assertThat(underTest.selectAll(db.getSession(), null))
  163. .extracting(PermissionTemplateDto::getUuid)
  164. .containsOnly(permissionTemplate2.getUuid());
  165. assertThat(db.getDbClient().permissionTemplateDao().selectUserPermissionsByTemplateId(db.getSession(), permissionTemplate1.getUuid())).isEmpty();
  166. assertThat(db.getDbClient().permissionTemplateDao().selectUserPermissionsByTemplateId(db.getSession(), permissionTemplate2.getUuid())).hasSize(1);
  167. assertThat(db.getDbClient().permissionTemplateDao().selectGroupPermissionsByTemplateUuid(db.getSession(), permissionTemplate1.getUuid())).isEmpty();
  168. assertThat(db.getDbClient().permissionTemplateDao().selectGroupPermissionsByTemplateUuid(db.getSession(), permissionTemplate2.getUuid())).hasSize(1);
  169. assertThat(db.getDbClient().permissionTemplateCharacteristicDao().selectByTemplateUuids(db.getSession(), asList(permissionTemplate1.getUuid(), permissionTemplate2.getUuid())))
  170. .extracting(PermissionTemplateCharacteristicDto::getTemplateUuid)
  171. .containsOnly(permissionTemplate2.getUuid());
  172. }
  173. @Test
  174. public void add_user_permission_to_template() {
  175. PermissionTemplateDto permissionTemplate = templateDb.insertTemplate();
  176. UserDto user = db.users().insertUser();
  177. underTest.insertUserPermission(dbSession, permissionTemplate.getUuid(), user.getUuid(), "user");
  178. assertThat(db.getDbClient().permissionTemplateDao().selectUserPermissionsByTemplateId(db.getSession(), permissionTemplate.getUuid()))
  179. .extracting(PermissionTemplateUserDto::getTemplateUuid, PermissionTemplateUserDto::getUserUuid, PermissionTemplateUserDto::getPermission,
  180. PermissionTemplateUserDto::getCreatedAt,
  181. PermissionTemplateUserDto::getUpdatedAt)
  182. .containsOnly(tuple(permissionTemplate.getUuid(), user.getUuid(), "user", NOW, NOW));
  183. }
  184. @Test
  185. public void remove_user_permission_from_template() {
  186. PermissionTemplateDto permissionTemplate = templateDb.insertTemplate();
  187. UserDto user1 = db.users().insertUser();
  188. UserDto user2 = db.users().insertUser();
  189. templateDb.addUserToTemplate(permissionTemplate, user1, "user");
  190. templateDb.addUserToTemplate(permissionTemplate, user1, "admin");
  191. templateDb.addUserToTemplate(permissionTemplate, user2, "user");
  192. underTest.deleteUserPermission(dbSession, permissionTemplate.getUuid(), user1.getUuid(), "user");
  193. assertThat(db.getDbClient().permissionTemplateDao().selectUserPermissionsByTemplateId(db.getSession(), permissionTemplate.getUuid()))
  194. .extracting(PermissionTemplateUserDto::getUserUuid, PermissionTemplateUserDto::getPermission)
  195. .containsOnly(tuple(user1.getUuid(), "admin"), tuple(user2.getUuid(), "user"));
  196. }
  197. @Test
  198. public void add_group_permission_to_template() {
  199. PermissionTemplateDto permissionTemplate = templateDb.insertTemplate();
  200. GroupDto group = db.users().insertGroup();
  201. underTest.insertGroupPermission(dbSession, permissionTemplate.getUuid(), group.getUuid(), "user");
  202. dbSession.commit();
  203. assertThat(db.getDbClient().permissionTemplateDao().selectGroupPermissionsByTemplateUuid(db.getSession(), permissionTemplate.getUuid()))
  204. .extracting(PermissionTemplateGroupDto::getTemplateUuid, PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getPermission,
  205. PermissionTemplateGroupDto::getCreatedAt,
  206. PermissionTemplateGroupDto::getUpdatedAt)
  207. .containsOnly(tuple(permissionTemplate.getUuid(), group.getUuid(), "user", NOW, NOW));
  208. }
  209. @Test
  210. public void remove_by_group() {
  211. PermissionTemplateDto permissionTemplate = templateDb.insertTemplate();
  212. GroupDto group1 = db.users().insertGroup();
  213. GroupDto group2 = db.users().insertGroup();
  214. templateDb.addGroupToTemplate(permissionTemplate, group1, "user");
  215. templateDb.addGroupToTemplate(permissionTemplate, group1, "admin");
  216. templateDb.addGroupToTemplate(permissionTemplate, group2, "user");
  217. underTest.deleteByGroup(db.getSession(), group1.getUuid());
  218. db.getSession().commit();
  219. assertThat(db.getDbClient().permissionTemplateDao().selectGroupPermissionsByTemplateUuid(db.getSession(), permissionTemplate.getUuid()))
  220. .extracting(PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getPermission)
  221. .containsOnly(tuple(group2.getUuid(), "user"));
  222. }
  223. @Test
  224. public void add_group_permission_to_anyone() {
  225. PermissionTemplateDto permissionTemplate = templateDb.insertTemplate();
  226. underTest.insertGroupPermission(dbSession, permissionTemplate.getUuid(), null, "user");
  227. dbSession.commit();
  228. assertThat(db.getDbClient().permissionTemplateDao().selectGroupPermissionsByTemplateUuid(db.getSession(), permissionTemplate.getUuid()))
  229. .extracting(PermissionTemplateGroupDto::getTemplateUuid, PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getGroupName,
  230. PermissionTemplateGroupDto::getPermission)
  231. .containsOnly(tuple(permissionTemplate.getUuid(), "Anyone", "Anyone", "user"));
  232. }
  233. @Test
  234. public void group_count_by_template_and_permission() {
  235. PermissionTemplateDto template1 = templateDb.insertTemplate();
  236. PermissionTemplateDto template2 = templateDb.insertTemplate();
  237. PermissionTemplateDto template3 = templateDb.insertTemplate();
  238. PermissionTemplateDto template4 = templateDb.insertTemplate();
  239. GroupDto group1 = db.users().insertGroup(newGroupDto());
  240. GroupDto group2 = db.users().insertGroup(newGroupDto());
  241. GroupDto group3 = db.users().insertGroup(newGroupDto());
  242. templateDb.addGroupToTemplate(template1.getUuid(), group1.getUuid(), CODEVIEWER);
  243. templateDb.addGroupToTemplate(template1.getUuid(), group2.getUuid(), CODEVIEWER);
  244. templateDb.addGroupToTemplate(template1.getUuid(), group3.getUuid(), CODEVIEWER);
  245. templateDb.addGroupToTemplate(template1.getUuid(), null, CODEVIEWER);
  246. templateDb.addGroupToTemplate(template1.getUuid(), group1.getUuid(), ADMIN);
  247. templateDb.addGroupToTemplate(template2.getUuid(), group1.getUuid(), ADMIN);
  248. templateDb.addGroupToTemplate(template4.getUuid(), group1.getUuid(), ISSUE_ADMIN);
  249. final List<CountByTemplateAndPermissionDto> result = new ArrayList<>();
  250. underTest.groupsCountByTemplateUuidAndPermission(dbSession, asList(template1.getUuid(), template2.getUuid(), template3.getUuid()),
  251. context -> result.add(context.getResultObject()));
  252. assertThat(result).extracting(CountByTemplateAndPermissionDto::getPermission, CountByTemplateAndPermissionDto::getTemplateUuid, CountByTemplateAndPermissionDto::getCount)
  253. .containsOnly(tuple(ADMIN, template1.getUuid(), 1), tuple(CODEVIEWER, template1.getUuid(), 4), tuple(ADMIN, template2.getUuid(), 1));
  254. }
  255. @Test
  256. public void user_count_by_template_and_permission() {
  257. PermissionTemplateDto template1 = templateDb.insertTemplate();
  258. PermissionTemplateDto template2 = templateDb.insertTemplate();
  259. PermissionTemplateDto template3 = templateDb.insertTemplate();
  260. PermissionTemplateDto anotherTemplate = templateDb.insertTemplate();
  261. UserDto user1 = db.users().insertUser();
  262. UserDto user2 = db.users().insertUser();
  263. UserDto user3 = db.users().insertUser();
  264. templateDb.addUserToTemplate(template1.getUuid(), user1.getUuid(), ADMIN);
  265. templateDb.addUserToTemplate(template1.getUuid(), user2.getUuid(), ADMIN);
  266. templateDb.addUserToTemplate(template1.getUuid(), user3.getUuid(), ADMIN);
  267. templateDb.addUserToTemplate(template1.getUuid(), user1.getUuid(), USER);
  268. templateDb.addUserToTemplate(template2.getUuid(), user1.getUuid(), USER);
  269. templateDb.addUserToTemplate(anotherTemplate.getUuid(), user1.getUuid(), ISSUE_ADMIN);
  270. final List<CountByTemplateAndPermissionDto> result = new ArrayList<>();
  271. underTest.usersCountByTemplateUuidAndPermission(dbSession, asList(template1.getUuid(), template2.getUuid(), template3.getUuid()),
  272. context -> result.add(context.getResultObject()));
  273. assertThat(result)
  274. .extracting(CountByTemplateAndPermissionDto::getPermission, CountByTemplateAndPermissionDto::getTemplateUuid, CountByTemplateAndPermissionDto::getCount)
  275. .containsExactlyInAnyOrder(
  276. tuple(ADMIN, template1.getUuid(), 3),
  277. tuple(USER, template1.getUuid(), 1),
  278. tuple(USER, template2.getUuid(), 1));
  279. }
  280. @Test
  281. public void selectPotentialPermissions_with_unknown_template_and_no_user() {
  282. List<String> result = underTest.selectPotentialPermissionsByUserUuidAndTemplateUuid(dbSession, null, "42");
  283. assertThat(result).isEmpty();
  284. }
  285. @Test
  286. public void selectPotentialPermissions_with_empty_template_and_new_user() {
  287. UserDto user = db.users().insertUser();
  288. PermissionTemplateDto template = templateDb.insertTemplate();
  289. List<String> result = underTest.selectPotentialPermissionsByUserUuidAndTemplateUuid(dbSession, user.getUuid(), template.getUuid());
  290. assertThat(result).isEmpty();
  291. }
  292. @Test
  293. public void selectPotentialPermission_with_template_users_groups_and_project_creator() {
  294. UserDto user = db.users().insertUser();
  295. GroupDto group = db.users().insertGroup(newGroupDto());
  296. db.users().insertMember(group, user);
  297. PermissionTemplateDto template = templateDb.insertTemplate();
  298. templateDb.addProjectCreatorToTemplate(template.getUuid(), SCAN_EXECUTION);
  299. templateDb.addProjectCreatorToTemplate(template.getUuid(), UserRole.ADMIN);
  300. templateDb.addUserToTemplate(template.getUuid(), user.getUuid(), UserRole.USER);
  301. templateDb.addUserToTemplate(template.getUuid(), user.getUuid(), UserRole.ADMIN);
  302. templateDb.addGroupToTemplate(template.getUuid(), group.getUuid(), UserRole.CODEVIEWER);
  303. templateDb.addGroupToTemplate(template.getUuid(), group.getUuid(), UserRole.ADMIN);
  304. templateDb.addGroupToTemplate(template.getUuid(), null, UserRole.ISSUE_ADMIN);
  305. List<String> resultWithUser = underTest.selectPotentialPermissionsByUserUuidAndTemplateUuid(dbSession, user.getUuid(), template.getUuid());
  306. List<String> resultWithoutUser = underTest.selectPotentialPermissionsByUserUuidAndTemplateUuid(dbSession, null, template.getUuid());
  307. assertThat(resultWithUser).containsOnlyOnce(SCAN_EXECUTION, UserRole.ADMIN, UserRole.USER, UserRole.CODEVIEWER, UserRole.ISSUE_ADMIN);
  308. // only permission from anyone group
  309. assertThat(resultWithoutUser).containsOnly(UserRole.ISSUE_ADMIN);
  310. }
  311. @Test
  312. public void selectAllGroupPermissionTemplatesByGroupUuid() {
  313. PermissionTemplateDto permissionTemplate = templateDb.insertTemplate();
  314. GroupDto group1 = db.users().insertGroup();
  315. GroupDto group2 = db.users().insertGroup();
  316. templateDb.addGroupToTemplate(permissionTemplate, group1, "user");
  317. templateDb.addGroupToTemplate(permissionTemplate, group1, "admin");
  318. templateDb.addGroupToTemplate(permissionTemplate, group2, "user");
  319. assertThat(db.getDbClient().permissionTemplateDao().selectAllGroupPermissionTemplatesByGroupUuid(db.getSession(), group1.getUuid()))
  320. .extracting(PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getPermission)
  321. .containsOnly(tuple(group1.getUuid(), "user"), tuple(group1.getUuid(), "admin"));
  322. }
  323. @Test
  324. public void delete_user_permissions_by_user_uuid() {
  325. UserDto user = db.users().insertUser();
  326. UserDto anotherUser = db.users().insertUser();
  327. PermissionTemplateDto template = db.permissionTemplates().insertTemplate();
  328. String permission = "PERMISSION";
  329. db.permissionTemplates().addUserToTemplate(template.getUuid(), user.getUuid(), permission);
  330. db.permissionTemplates().addUserToTemplate(template.getUuid(), anotherUser.getUuid(), permission);
  331. underTest.deleteUserPermissionsByUserUuid(dbSession, user.getUuid());
  332. db.commit();
  333. assertThat(db.select("select template_uuid as \"templateUuid\", user_uuid as \"userUuid\", permission_reference as \"permission\" from perm_templates_users"))
  334. .extracting((row) -> row.get("templateUuid"), (row) -> row.get("userUuid"), (row) -> row.get("permission"))
  335. .containsOnly(tuple(template.getUuid(), anotherUser.getUuid(), permission));
  336. }
  337. }