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.

SearchTemplatesActionTest.java 17KB

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