Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

TemplateUsersActionIT.java 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2023 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.stream.IntStream;
  22. import javax.annotation.Nullable;
  23. import org.junit.Test;
  24. import org.sonar.api.resources.Qualifiers;
  25. import org.sonar.api.resources.ResourceTypes;
  26. import org.sonar.api.server.ws.WebService;
  27. import org.sonar.api.web.UserRole;
  28. import org.sonar.db.component.ResourceTypesRule;
  29. import org.sonar.db.permission.GlobalPermission;
  30. import org.sonar.db.permission.template.PermissionTemplateDto;
  31. import org.sonar.db.permission.template.PermissionTemplateUserDto;
  32. import org.sonar.db.user.UserDto;
  33. import org.sonar.server.exceptions.BadRequestException;
  34. import org.sonar.server.exceptions.ForbiddenException;
  35. import org.sonar.server.exceptions.NotFoundException;
  36. import org.sonar.server.exceptions.UnauthorizedException;
  37. import org.sonar.server.common.avatar.AvatarResolverImpl;
  38. import org.sonar.server.permission.PermissionService;
  39. import org.sonar.server.permission.PermissionServiceImpl;
  40. import org.sonar.server.permission.RequestValidator;
  41. import org.sonar.server.permission.ws.BasePermissionWsIT;
  42. import org.sonar.server.permission.ws.WsParameters;
  43. import org.sonar.server.ws.TestRequest;
  44. import org.sonarqube.ws.Permissions;
  45. import static org.assertj.core.api.Assertions.assertThat;
  46. import static org.assertj.core.api.Assertions.assertThatThrownBy;
  47. import static org.sonar.api.web.UserRole.ADMIN;
  48. import static org.sonar.api.web.UserRole.CODEVIEWER;
  49. import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
  50. import static org.sonar.api.web.UserRole.USER;
  51. import static org.sonar.db.permission.GlobalPermission.SCAN;
  52. import static org.sonar.db.permission.PermissionQuery.DEFAULT_PAGE_SIZE;
  53. import static org.sonar.db.permission.template.PermissionTemplateTesting.newPermissionTemplateUserDto;
  54. import static org.sonar.db.user.UserTesting.newUserDto;
  55. import static org.sonar.test.JsonAssert.assertJson;
  56. import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
  57. import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID;
  58. import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME;
  59. public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersAction> {
  60. private final ResourceTypes resourceTypes = new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT);
  61. private final PermissionService permissionService = new PermissionServiceImpl(resourceTypes);
  62. private final WsParameters wsParameters = new WsParameters(permissionService);
  63. private final RequestValidator requestValidator = new RequestValidator(permissionService);
  64. @Override
  65. protected TemplateUsersAction buildWsAction() {
  66. return new TemplateUsersAction(db.getDbClient(), userSession, newPermissionWsSupport(), new AvatarResolverImpl(), wsParameters, requestValidator);
  67. }
  68. @Test
  69. public void define_template_users() {
  70. WebService.Action action = wsTester.getDef();
  71. assertThat(action).isNotNull();
  72. assertThat(action.key()).isEqualTo("template_users");
  73. assertThat(action.isPost()).isFalse();
  74. assertThat(action.isInternal()).isTrue();
  75. assertThat(action.since()).isEqualTo("5.2");
  76. WebService.Param permissionParam = action.param(PARAM_PERMISSION);
  77. assertThat(permissionParam).isNotNull();
  78. assertThat(permissionParam.isRequired()).isFalse();
  79. }
  80. @Test
  81. public void search_for_users_with_response_example() {
  82. UserDto user1 = insertUser(newUserDto().setLogin("admin").setName("Administrator").setEmail("admin@admin.com"));
  83. UserDto user2 = insertUser(newUserDto().setLogin("george.orwell").setName("George Orwell").setEmail("george.orwell@1984.net"));
  84. PermissionTemplateDto template1 = addTemplate();
  85. addUserToTemplate(newPermissionTemplateUser(CODEVIEWER, template1, user1), template1.getName());
  86. addUserToTemplate(newPermissionTemplateUser(CODEVIEWER, template1, user2), template1.getName());
  87. addUserToTemplate(newPermissionTemplateUser(ADMIN, template1, user2), template1.getName());
  88. loginAsAdmin();
  89. String result = newRequest(null, template1.getUuid()).execute().getInput();
  90. assertJson(result).isSimilarTo(getClass().getResource("template_users-example.json"));
  91. }
  92. @Test
  93. public void search_for_users_by_template_name() {
  94. loginAsAdmin();
  95. UserDto user1 = insertUser(newUserDto().setLogin("login-1").setName("name-1").setEmail("email-1"));
  96. UserDto user2 = insertUser(newUserDto().setLogin("login-2").setName("name-2").setEmail("email-2"));
  97. UserDto user3 = insertUser(newUserDto().setLogin("login-3").setName("name-3").setEmail("email-3"));
  98. PermissionTemplateDto template = addTemplate();
  99. addUserToTemplate(newPermissionTemplateUser(USER, template, user1), template.getName());
  100. addUserToTemplate(newPermissionTemplateUser(USER, template, user2), template.getName());
  101. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user1), template.getName());
  102. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user3), template.getName());
  103. PermissionTemplateDto anotherTemplate = addTemplate();
  104. addUserToTemplate(newPermissionTemplateUser(USER, anotherTemplate, user1), anotherTemplate.getName());
  105. Permissions.UsersWsResponse response = newRequest(null, null)
  106. .setParam(PARAM_TEMPLATE_NAME, template.getName())
  107. .executeProtobuf(Permissions.UsersWsResponse.class);
  108. assertThat(response.getUsersList()).extracting("login").containsExactly("login-1", "login-2", "login-3");
  109. assertThat(response.getUsers(0).getPermissionsList()).containsOnly("issueadmin", "user");
  110. assertThat(response.getUsers(1).getPermissionsList()).containsOnly("user");
  111. assertThat(response.getUsers(2).getPermissionsList()).containsOnly("issueadmin");
  112. }
  113. @Test
  114. public void search_using_text_query() {
  115. loginAsAdmin();
  116. UserDto user1 = insertUser(newUserDto().setLogin("login-1").setName("name-1").setEmail("email-1"));
  117. UserDto user2 = insertUser(newUserDto().setLogin("login-2").setName("name-2").setEmail("email-2"));
  118. UserDto user3 = insertUser(newUserDto().setLogin("login-3").setName("name-3").setEmail("email-3"));
  119. PermissionTemplateDto template = addTemplate();
  120. addUserToTemplate(newPermissionTemplateUser(USER, template, user1), template.getName());
  121. addUserToTemplate(newPermissionTemplateUser(USER, template, user2), template.getName());
  122. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user1), template.getName());
  123. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user3), template.getName());
  124. PermissionTemplateDto anotherTemplate = addTemplate();
  125. addUserToTemplate(newPermissionTemplateUser(USER, anotherTemplate, user1), anotherTemplate.getName());
  126. Permissions.UsersWsResponse response = newRequest(null, null)
  127. .setParam(PARAM_TEMPLATE_NAME, template.getName())
  128. .setParam(WebService.Param.TEXT_QUERY, "ame-1")
  129. .executeProtobuf(Permissions.UsersWsResponse.class);
  130. assertThat(response.getUsersList()).extracting("login").containsOnly("login-1");
  131. }
  132. @Test
  133. public void search_using_text_query_with_email() {
  134. loginAsAdmin();
  135. UserDto user1 = insertUser(newUserDto().setLogin("orange").setName("name-1").setEmail("email-1"));
  136. UserDto user2 = insertUser(newUserDto().setLogin("crANBerry").setName("name-2").setEmail("email-2"));
  137. UserDto user3 = insertUser(newUserDto().setLogin("apple").setName("name-3").setEmail("email-3"));
  138. String templateName = addUsersToSomeTemplate(user1, user2, user3);
  139. Permissions.UsersWsResponse response = newRequest(null, null)
  140. .setParam(PARAM_TEMPLATE_NAME, templateName)
  141. .setParam(WebService.Param.TEXT_QUERY, "ran")
  142. .executeProtobuf(Permissions.UsersWsResponse.class);
  143. assertThat(response.getUsersList()).hasSize(2);
  144. assertThat(response.getUsersList()).extracting("login").containsExactlyInAnyOrder("orange", "crANBerry");
  145. }
  146. @Test
  147. public void search_using_text_query_with_login() {
  148. loginAsAdmin();
  149. UserDto user1 = insertUser(newUserDto().setLogin("login-1").setName("name-1").setEmail("xYZ@1984.com"));
  150. UserDto user2 = insertUser(newUserDto().setLogin("login-2").setName("name-2").setEmail("xyz2@1984.com"));
  151. UserDto user3 = insertUser(newUserDto().setLogin("login-3").setName("name-3").setEmail("hello@1984.com"));
  152. String templateName = addUsersToSomeTemplate(user1, user2, user3);
  153. Permissions.UsersWsResponse response = newRequest(null, null)
  154. .setParam(PARAM_TEMPLATE_NAME, templateName)
  155. .setParam(WebService.Param.TEXT_QUERY, "xyz")
  156. .executeProtobuf(Permissions.UsersWsResponse.class);
  157. assertThat(response.getUsersList()).hasSize(2);
  158. assertThat(response.getUsersList()).extracting("email").containsExactlyInAnyOrder("xYZ@1984.com", "xyz2@1984.com");
  159. }
  160. private String addUsersToSomeTemplate(UserDto user1, UserDto user2, UserDto user3) {
  161. PermissionTemplateDto template = addTemplate();
  162. addUserToTemplate(newPermissionTemplateUser(USER, template, user1), template.getName());
  163. addUserToTemplate(newPermissionTemplateUser(USER, template, user2), template.getName());
  164. addUserToTemplate(newPermissionTemplateUser(USER, template, user3), template.getName());
  165. return template.getName();
  166. }
  167. @Test
  168. public void search_using_permission() {
  169. UserDto user1 = insertUser(newUserDto().setLogin("login-1").setName("name-1").setEmail("email-1"));
  170. UserDto user2 = insertUser(newUserDto().setLogin("login-2").setName("name-2").setEmail("email-2"));
  171. UserDto user3 = insertUser(newUserDto().setLogin("login-3").setName("name-3").setEmail("email-3"));
  172. PermissionTemplateDto template = addTemplate();
  173. addUserToTemplate(newPermissionTemplateUser(USER, template, user1), template.getName());
  174. addUserToTemplate(newPermissionTemplateUser(USER, template, user2), template.getName());
  175. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user1), template.getName());
  176. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user3), template.getName());
  177. PermissionTemplateDto anotherTemplate = addTemplate();
  178. addUserToTemplate(newPermissionTemplateUser(USER, anotherTemplate, user1), anotherTemplate.getName());
  179. loginAsAdmin();
  180. Permissions.UsersWsResponse response = newRequest(USER, template.getUuid())
  181. .executeProtobuf(Permissions.UsersWsResponse.class);
  182. assertThat(response.getUsersList()).extracting("login").containsExactly("login-1", "login-2");
  183. assertThat(response.getUsers(0).getPermissionsList()).containsOnly("issueadmin", "user");
  184. assertThat(response.getUsers(1).getPermissionsList()).containsOnly("user");
  185. }
  186. @Test
  187. public void search_with_pagination() {
  188. UserDto user1 = insertUser(newUserDto().setLogin("login-1").setName("name-1").setEmail("email-1"));
  189. UserDto user2 = insertUser(newUserDto().setLogin("login-2").setName("name-2").setEmail("email-2"));
  190. UserDto user3 = insertUser(newUserDto().setLogin("login-3").setName("name-3").setEmail("email-3"));
  191. PermissionTemplateDto template = addTemplate();
  192. addUserToTemplate(newPermissionTemplateUser(USER, template, user1), template.getName());
  193. addUserToTemplate(newPermissionTemplateUser(USER, template, user2), template.getName());
  194. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user1), template.getName());
  195. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user3), template.getName());
  196. PermissionTemplateDto anotherTemplate = addTemplate();
  197. addUserToTemplate(newPermissionTemplateUser(USER, anotherTemplate, user1), anotherTemplate.getName());
  198. loginAsAdmin();
  199. Permissions.UsersWsResponse response = newRequest(USER, null)
  200. .setParam(PARAM_TEMPLATE_NAME, template.getName())
  201. .setParam(WebService.Param.SELECTED, "all")
  202. .setParam(WebService.Param.PAGE, "2")
  203. .setParam(WebService.Param.PAGE_SIZE, "1")
  204. .executeProtobuf(Permissions.UsersWsResponse.class);
  205. assertThat(response.getUsersList()).extracting("login").containsOnly("login-2");
  206. }
  207. @Test
  208. public void users_are_sorted_by_name() {
  209. UserDto user1 = insertUser(newUserDto().setLogin("login-2").setName("name-2"));
  210. UserDto user2 = insertUser(newUserDto().setLogin("login-3").setName("name-3"));
  211. UserDto user3 = insertUser(newUserDto().setLogin("login-1").setName("name-1"));
  212. PermissionTemplateDto template = addTemplate();
  213. addUserToTemplate(newPermissionTemplateUser(USER, template, user1), template.getName());
  214. addUserToTemplate(newPermissionTemplateUser(USER, template, user2), template.getName());
  215. addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user3), template.getName());
  216. loginAsAdmin();
  217. Permissions.UsersWsResponse response = newRequest(null, null)
  218. .setParam(PARAM_TEMPLATE_NAME, template.getName())
  219. .executeProtobuf(Permissions.UsersWsResponse.class);
  220. assertThat(response.getUsersList()).extracting("login").containsExactly("login-1", "login-2", "login-3");
  221. }
  222. @Test
  223. public void search_ignores_other_template_and_is_ordered_by_users_with_permission_when_many_users() {
  224. PermissionTemplateDto template = addTemplate();
  225. // Add another template having some users with permission to make sure it's correctly ignored
  226. PermissionTemplateDto otherTemplate = db.permissionTemplates().insertTemplate();
  227. IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
  228. UserDto user = db.users().insertUser("User-" + i);
  229. db.permissionTemplates().addUserToTemplate(otherTemplate, user, UserRole.USER);
  230. });
  231. String lastLogin = "User-" + (DEFAULT_PAGE_SIZE + 1);
  232. db.permissionTemplates().addUserToTemplate(template, db.users().selectUserByLogin(lastLogin).get(), UserRole.USER);
  233. loginAsAdmin();
  234. Permissions.UsersWsResponse response = newRequest(null, null)
  235. .setParam(PARAM_TEMPLATE_NAME, template.getName())
  236. .executeProtobuf(Permissions.UsersWsResponse.class);
  237. assertThat(response.getUsersList())
  238. .extracting("login")
  239. .hasSize(DEFAULT_PAGE_SIZE)
  240. .startsWith(lastLogin);
  241. }
  242. @Test
  243. public void fail_if_not_a_project_permission() {
  244. PermissionTemplateDto template = addTemplate();
  245. loginAsAdmin();
  246. assertThatThrownBy(() -> {
  247. newRequest(GlobalPermission.PROVISION_PROJECTS.getKey(), template.getUuid())
  248. .execute();
  249. })
  250. .isInstanceOf(IllegalArgumentException.class);
  251. }
  252. @Test
  253. public void fail_if_no_template_param() {
  254. loginAsAdmin();
  255. assertThatThrownBy(() -> {
  256. newRequest(null, null)
  257. .execute();
  258. })
  259. .isInstanceOf(BadRequestException.class);
  260. }
  261. @Test
  262. public void fail_if_template_does_not_exist() {
  263. loginAsAdmin();
  264. assertThatThrownBy(() -> {
  265. newRequest(null, "unknown-template-uuid")
  266. .execute();
  267. })
  268. .isInstanceOf(NotFoundException.class);
  269. }
  270. @Test
  271. public void fail_if_template_uuid_and_name_provided() {
  272. PermissionTemplateDto template = addTemplate();
  273. loginAsAdmin();
  274. assertThatThrownBy(() -> {
  275. newRequest(null, template.getUuid())
  276. .setParam(PARAM_TEMPLATE_NAME, template.getName())
  277. .execute();
  278. })
  279. .isInstanceOf(BadRequestException.class);
  280. }
  281. @Test
  282. public void fail_if_not_logged_in() {
  283. PermissionTemplateDto template = addTemplate();
  284. userSession.anonymous();
  285. assertThatThrownBy(() -> {
  286. newRequest(null, template.getUuid()).execute();
  287. })
  288. .isInstanceOf(UnauthorizedException.class);
  289. }
  290. @Test
  291. public void fail_if_insufficient_privileges() {
  292. PermissionTemplateDto template = addTemplate();
  293. userSession.logIn().addPermission(SCAN);
  294. assertThatThrownBy(() -> {
  295. newRequest(null, template.getUuid()).execute();
  296. })
  297. .isInstanceOf(ForbiddenException.class);
  298. }
  299. private UserDto insertUser(UserDto userDto) {
  300. db.users().insertUser(userDto);
  301. return userDto;
  302. }
  303. private void addUserToTemplate(PermissionTemplateUserDto dto, String templateName) {
  304. db.getDbClient().permissionTemplateDao().insertUserPermission(db.getSession(), dto.getTemplateUuid(), dto.getUserUuid(),
  305. dto.getPermission(), templateName, dto.getUserLogin());
  306. db.commit();
  307. }
  308. private static PermissionTemplateUserDto newPermissionTemplateUser(String permission, PermissionTemplateDto template, UserDto user) {
  309. return newPermissionTemplateUserDto()
  310. .setPermission(permission)
  311. .setTemplateUuid(template.getUuid())
  312. .setUserUuid(user.getUuid());
  313. }
  314. private TestRequest newRequest(@Nullable String permission, @Nullable String templateUuid) {
  315. TestRequest request = newRequest();
  316. if (permission != null) {
  317. request.setParam(PARAM_PERMISSION, permission);
  318. }
  319. if (templateUuid != null) {
  320. request.setParam(PARAM_TEMPLATE_ID, templateUuid);
  321. }
  322. return request;
  323. }
  324. }