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.

SearchTemplatesActionIT.java 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2024 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.server.permission.ws.template;
  21. import java.util.Date;
  22. import javax.annotation.Nullable;
  23. import org.junit.Before;
  24. import org.junit.Test;
  25. import org.sonar.api.resources.Qualifiers;
  26. import org.sonar.api.web.UserRole;
  27. import org.sonar.core.util.Uuids;
  28. import org.sonar.db.DbClient;
  29. import org.sonar.db.DbSession;
  30. import org.sonar.db.component.ResourceTypesRule;
  31. import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto;
  32. import org.sonar.db.permission.template.PermissionTemplateDto;
  33. import org.sonar.db.user.GroupDto;
  34. import org.sonar.db.user.UserDto;
  35. import org.sonar.server.exceptions.UnauthorizedException;
  36. import org.sonar.server.l18n.I18nRule;
  37. import org.sonar.server.common.permission.DefaultTemplatesResolver;
  38. import org.sonar.server.common.permission.DefaultTemplatesResolverImpl;
  39. import org.sonar.server.permission.PermissionService;
  40. import org.sonar.server.permission.PermissionServiceImpl;
  41. import org.sonar.server.permission.ws.BasePermissionWsIT;
  42. import org.sonar.server.ws.TestRequest;
  43. import org.sonar.server.ws.WsActionTester;
  44. import static org.assertj.core.api.Assertions.assertThat;
  45. import static org.assertj.core.api.Assertions.assertThatThrownBy;
  46. import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY;
  47. import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01;
  48. import static org.sonar.core.util.Uuids.UUID_EXAMPLE_02;
  49. import static org.sonar.core.util.Uuids.UUID_EXAMPLE_10;
  50. import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
  51. import static org.sonar.db.permission.template.PermissionTemplateTesting.newPermissionTemplateDto;
  52. import static org.sonar.test.JsonAssert.assertJson;
  53. public class SearchTemplatesActionIT extends BasePermissionWsIT<SearchTemplatesAction> {
  54. private I18nRule i18n = new I18nRule();
  55. private DbClient dbClient = db.getDbClient();
  56. private DbSession dbSession = db.getSession();
  57. private ResourceTypesRule resourceTypesWithViews = new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT, Qualifiers.VIEW, Qualifiers.APP);
  58. private ResourceTypesRule resourceTypesWithoutViews = new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT);
  59. private PermissionService permissionServiceWithViews = new PermissionServiceImpl(resourceTypesWithViews);
  60. private PermissionService permissionServiceWithoutViews = new PermissionServiceImpl(resourceTypesWithoutViews);
  61. private DefaultTemplatesResolver defaultTemplatesResolverWithViews = new DefaultTemplatesResolverImpl(dbClient, resourceTypesWithViews);
  62. private WsActionTester underTestWithoutViews;
  63. @Override
  64. protected SearchTemplatesAction buildWsAction() {
  65. return new SearchTemplatesAction(dbClient, userSession, i18n, defaultTemplatesResolverWithViews, permissionServiceWithViews);
  66. }
  67. @Before
  68. public void setUp() {
  69. DefaultTemplatesResolver defaultTemplatesResolverWithViews = new DefaultTemplatesResolverImpl(dbClient, resourceTypesWithoutViews);
  70. underTestWithoutViews = new WsActionTester(
  71. new SearchTemplatesAction(dbClient, userSession, i18n, defaultTemplatesResolverWithViews, permissionServiceWithoutViews));
  72. i18n.setProjectPermissions();
  73. userSession.logIn().addPermission(ADMINISTER);
  74. }
  75. @Test
  76. public void search_project_permissions_without_views() {
  77. PermissionTemplateDto projectTemplate = insertProjectTemplate();
  78. UserDto user1 = db.users().insertUser();
  79. UserDto user2 = db.users().insertUser();
  80. UserDto user3 = db.users().insertUser();
  81. GroupDto group1 = db.users().insertGroup();
  82. GroupDto group2 = db.users().insertGroup();
  83. GroupDto group3 = db.users().insertGroup();
  84. addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user1.getLogin());
  85. addUserToTemplate(projectTemplate.getUuid(), user2.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user2.getLogin());
  86. addUserToTemplate(projectTemplate.getUuid(), user3.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user3.getLogin());
  87. addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), UserRole.CODEVIEWER, projectTemplate.getName(), user1.getLogin());
  88. addGroupToTemplate(projectTemplate.getUuid(), group1.getUuid(), UserRole.ADMIN, projectTemplate.getName(), group1.getName());
  89. addPermissionTemplateWithProjectCreator(projectTemplate.getUuid(), UserRole.ADMIN, projectTemplate.getName());
  90. db.permissionTemplates().setDefaultTemplates(projectTemplate, null, null);
  91. String result = newRequest(underTestWithoutViews).execute().getInput();
  92. assertJson(result)
  93. .withStrictArrayOrder()
  94. .isSimilarTo(getClass().getResource("search_templates-example-without-views.json"));
  95. }
  96. @Test
  97. public void search_project_permissions_with_views() {
  98. PermissionTemplateDto projectTemplate = insertProjectTemplate();
  99. PermissionTemplateDto portfoliosTemplate = insertPortfoliosTemplate();
  100. PermissionTemplateDto applicationsTemplate = insertApplicationsTemplate();
  101. UserDto user1 = db.users().insertUser();
  102. UserDto user2 = db.users().insertUser();
  103. UserDto user3 = db.users().insertUser();
  104. GroupDto group1 = db.users().insertGroup();
  105. GroupDto group2 = db.users().insertGroup();
  106. GroupDto group3 = db.users().insertGroup();
  107. addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user1.getLogin());
  108. addUserToTemplate(projectTemplate.getUuid(), user2.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user2.getLogin());
  109. addUserToTemplate(projectTemplate.getUuid(), user3.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user3.getLogin());
  110. addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), UserRole.CODEVIEWER, projectTemplate.getName(), user1.getLogin());
  111. addGroupToTemplate(projectTemplate.getUuid(), group1.getUuid(), UserRole.ADMIN, projectTemplate.getName(), group1.getName());
  112. addPermissionTemplateWithProjectCreator(projectTemplate.getUuid(), UserRole.ADMIN, projectTemplate.getName());
  113. addUserToTemplate(portfoliosTemplate.getUuid(), user1.getUuid(), UserRole.USER, portfoliosTemplate.getName(), user1.getLogin());
  114. addUserToTemplate(portfoliosTemplate.getUuid(), user2.getUuid(), UserRole.USER, portfoliosTemplate.getName(), user2.getLogin());
  115. addGroupToTemplate(portfoliosTemplate.getUuid(), group1.getUuid(), UserRole.ISSUE_ADMIN, portfoliosTemplate.getName(), group1.getName());
  116. addGroupToTemplate(portfoliosTemplate.getUuid(), group2.getUuid(), UserRole.ISSUE_ADMIN, portfoliosTemplate.getName(), group2.getName());
  117. addGroupToTemplate(portfoliosTemplate.getUuid(), group3.getUuid(), UserRole.ISSUE_ADMIN, portfoliosTemplate.getName(), group3.getName());
  118. db.permissionTemplates().setDefaultTemplates(projectTemplate, applicationsTemplate, portfoliosTemplate);
  119. String result = newRequest().execute().getInput();
  120. assertJson(result)
  121. .withStrictArrayOrder()
  122. .isSimilarTo(getClass().getResource("search_templates-example-with-views.json"));
  123. }
  124. @Test
  125. public void empty_result() {
  126. db.permissionTemplates().setDefaultTemplates("AU-Tpxb--iU5OvuD2FLy", "AU-Tpxb--iU5OvuD2FLz", "AU-TpxcA-iU5OvuD2FLx");
  127. String result = newRequest(wsTester).execute().getInput();
  128. assertJson(result)
  129. .withStrictArrayOrder()
  130. .ignoreFields("permissions")
  131. .isSimilarTo("{" +
  132. " \"permissionTemplates\": []," +
  133. " \"defaultTemplates\": [" +
  134. " {" +
  135. " \"templateId\": \"AU-Tpxb--iU5OvuD2FLy\"," +
  136. " \"qualifier\": \"TRK\"" +
  137. " }," +
  138. " {" +
  139. " \"templateId\": \"AU-Tpxb--iU5OvuD2FLz\"," +
  140. " \"qualifier\": \"APP\"" +
  141. " }," +
  142. " {" +
  143. " \"templateId\": \"AU-TpxcA-iU5OvuD2FLx\"," +
  144. " \"qualifier\": \"VW\"" +
  145. " }" +
  146. " ]" +
  147. "}");
  148. }
  149. @Test
  150. public void empty_result_without_views() {
  151. db.permissionTemplates().setDefaultTemplates("AU-Tpxb--iU5OvuD2FLy", "AU-TpxcA-iU5OvuD2FLz", "AU-TpxcA-iU5OvuD2FLx");
  152. String result = newRequest(underTestWithoutViews).execute().getInput();
  153. assertJson(result)
  154. .withStrictArrayOrder()
  155. .ignoreFields("permissions")
  156. .isSimilarTo("{" +
  157. " \"permissionTemplates\": []," +
  158. " \"defaultTemplates\": [" +
  159. " {" +
  160. " \"templateId\": \"AU-Tpxb--iU5OvuD2FLy\"," +
  161. " \"qualifier\": \"TRK\"" +
  162. " }" +
  163. " ]" +
  164. "}");
  165. }
  166. @Test
  167. public void search_by_name() {
  168. db.permissionTemplates().setDefaultTemplates(db.permissionTemplates().insertTemplate(), null, null);
  169. insertProjectTemplate();
  170. insertPortfoliosTemplate();
  171. String result = newRequest(wsTester)
  172. .setParam(TEXT_QUERY, "portfolio")
  173. .execute()
  174. .getInput();
  175. assertThat(result).contains("Default template for Portfolios")
  176. .doesNotContain("projects")
  177. .doesNotContain("developers");
  178. }
  179. @Test
  180. public void fail_if_not_logged_in() {
  181. assertThatThrownBy(() -> {
  182. userSession.anonymous();
  183. newRequest().execute();
  184. })
  185. .isInstanceOf(UnauthorizedException.class);
  186. }
  187. @Test
  188. public void display_all_project_permissions() {
  189. db.permissionTemplates().setDefaultTemplates(db.permissionTemplates().insertTemplate(), null, null);
  190. String result = newRequest(underTestWithoutViews).execute().getInput();
  191. assertJson(result)
  192. .withStrictArrayOrder()
  193. .ignoreFields("defaultTemplates", "permissionTemplates")
  194. .isSimilarTo(
  195. "{" +
  196. " \"permissions\": [" +
  197. " {" +
  198. " \"key\": \"admin\"," +
  199. " \"name\": \"Administer\"," +
  200. " \"description\": \"Ability to access project settings and perform administration tasks. (Users will also need \\\"Browse\\\" permission)\"" +
  201. " }," +
  202. " {" +
  203. " \"key\": \"codeviewer\"," +
  204. " \"name\": \"See Source Code\"," +
  205. " \"description\": \"Ability to view the project\\u0027s source code. (Users will also need \\\"Browse\\\" permission)\"" +
  206. " }," +
  207. " {" +
  208. " \"key\": \"issueadmin\"," +
  209. " \"name\": \"Administer Issues\"," +
  210. " \"description\": \"Grants the permission to perform advanced editing on issues: marking an issue False Positive / Won\\u0027t Fix or changing an Issue\\u0027s severity. (Users will also need \\\"Browse\\\" permission)\""
  211. +
  212. " }," +
  213. " {" +
  214. " \"key\": \"securityhotspotadmin\"," +
  215. " \"name\": \"Administer Security Hotspots\"," +
  216. " \"description\": \"Detect a Vulnerability from a \\\"Security Hotspot\\\". Reject, clear, accept, reopen a \\\"Security Hotspot\\\" (users also need \\\"Browse\\\" permissions).\""
  217. +
  218. " }," +
  219. " {" +
  220. " \"key\": \"scan\"," +
  221. " \"name\": \"Execute Analysis\"," +
  222. " \"description\": \"Ability to execute analyses, and to get all settings required to perform the analysis, even the secured ones like the scm account password, the jira account password, and so on.\""
  223. +
  224. " }," +
  225. " {" +
  226. " \"key\": \"user\"," +
  227. " \"name\": \"Browse\"," +
  228. " \"description\": \"Ability to access a project, browse its measures, and create/edit issues for it.\"" +
  229. " }" +
  230. " ]" +
  231. "}");
  232. }
  233. @Test
  234. public void display_all_project_permissions_with_views() {
  235. db.permissionTemplates().setDefaultTemplates(db.permissionTemplates().insertTemplate(), null, null);
  236. String result = newRequest().execute().getInput();
  237. assertJson(result)
  238. .withStrictArrayOrder()
  239. .ignoreFields("defaultTemplates", "permissionTemplates")
  240. .isSimilarTo(
  241. "{" +
  242. " \"permissions\": [" +
  243. " {" +
  244. " \"key\": \"admin\"," +
  245. " \"name\": \"Administer\"," +
  246. " \"description\": \"Ability to access project settings and perform administration tasks. (Users will also need \\\"Browse\\\" permission)\"" +
  247. " }," +
  248. " {" +
  249. " \"key\": \"codeviewer\"," +
  250. " \"name\": \"See Source Code\"," +
  251. " \"description\": \"Ability to view the project\\u0027s source code. (Users will also need \\\"Browse\\\" permission)\"" +
  252. " }," +
  253. " {" +
  254. " \"key\": \"issueadmin\"," +
  255. " \"name\": \"Administer Issues\"," +
  256. " \"description\": \"Grants the permission to perform advanced editing on issues: marking an issue False Positive / Won\\u0027t Fix or changing an Issue\\u0027s severity. (Users will also need \\\"Browse\\\" permission)\""
  257. +
  258. " }," +
  259. " {" +
  260. " \"key\": \"securityhotspotadmin\"," +
  261. " \"name\": \"Administer Security Hotspots\"," +
  262. " \"description\": \"Detect a Vulnerability from a \\\"Security Hotspot\\\". Reject, clear, accept, reopen a \\\"Security Hotspot\\\" (users also need \\\"Browse\\\" permissions).\""
  263. +
  264. " }," +
  265. " {" +
  266. " \"key\": \"scan\"," +
  267. " \"name\": \"Execute Analysis\"," +
  268. " \"description\": \"Ability to execute analyses, and to get all settings required to perform the analysis, even the secured ones like the scm account password, the jira account password, and so on.\""
  269. +
  270. " }," +
  271. " {" +
  272. " \"key\": \"user\"," +
  273. " \"name\": \"Browse\"," +
  274. " \"description\": \"Ability to access a project, browse its measures, and create/edit issues for it.\"" +
  275. " }" +
  276. " ]" +
  277. "}");
  278. }
  279. private PermissionTemplateDto insertProjectTemplate() {
  280. return insertProjectTemplate(UUID_EXAMPLE_01);
  281. }
  282. private PermissionTemplateDto insertProjectTemplate(String uuid) {
  283. return insertTemplate(newPermissionTemplateDto()
  284. .setUuid(uuid)
  285. .setName("Default template for Projects")
  286. .setDescription("Template for new projects")
  287. .setKeyPattern(null)
  288. .setCreatedAt(new Date(1_000_000_000_000L))
  289. .setUpdatedAt(new Date(1_000_000_000_000L)));
  290. }
  291. private PermissionTemplateDto insertPortfoliosTemplate() {
  292. return insertTemplate(newPermissionTemplateDto()
  293. .setUuid(UUID_EXAMPLE_02)
  294. .setName("Default template for Portfolios")
  295. .setDescription("Template for new portfolios")
  296. .setKeyPattern(".*sonar.views.*")
  297. .setCreatedAt(new Date(1_000_000_000_000L))
  298. .setUpdatedAt(new Date(1_100_000_000_000L)));
  299. }
  300. private PermissionTemplateDto insertApplicationsTemplate() {
  301. return insertTemplate(newPermissionTemplateDto()
  302. .setUuid(UUID_EXAMPLE_10)
  303. .setName("Default template for Applications")
  304. .setDescription("Template for new applications")
  305. .setKeyPattern(".*sonar.views.*")
  306. .setCreatedAt(new Date(1_000_000_000_000L))
  307. .setUpdatedAt(new Date(1_100_000_000_000L)));
  308. }
  309. private PermissionTemplateDto insertTemplate(PermissionTemplateDto template) {
  310. PermissionTemplateDto insert = dbClient.permissionTemplateDao().insert(db.getSession(), template);
  311. db.getSession().commit();
  312. return insert;
  313. }
  314. private void addGroupToTemplate(String templateUuid, @Nullable String groupUuid, String permission, String templateName, String groupName) {
  315. dbClient.permissionTemplateDao().insertGroupPermission(db.getSession(), templateUuid, groupUuid, permission, templateName, groupName);
  316. db.getSession().commit();
  317. }
  318. private void addUserToTemplate(String templateUuid, String userId, String permission, String templateName, String userLogin) {
  319. dbClient.permissionTemplateDao().insertUserPermission(db.getSession(), templateUuid, userId, permission, templateName, userLogin);
  320. db.getSession().commit();
  321. }
  322. private void addPermissionTemplateWithProjectCreator(String templateUuid, String permission, String templateName) {
  323. dbClient.permissionTemplateCharacteristicDao().insert(dbSession, new PermissionTemplateCharacteristicDto()
  324. .setUuid(Uuids.createFast())
  325. .setWithProjectCreator(true)
  326. .setTemplateUuid(templateUuid)
  327. .setPermission(permission)
  328. .setCreatedAt(1_000_000_000L)
  329. .setUpdatedAt(2_000_000_000L),
  330. templateName);
  331. db.commit();
  332. }
  333. private TestRequest newRequest(WsActionTester underTest) {
  334. return underTest.newRequest().setMethod("POST");
  335. }
  336. }