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.

UserDbTester.java 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  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.user;
  21. import com.google.common.collect.ImmutableSet;
  22. import java.util.Arrays;
  23. import java.util.List;
  24. import java.util.Optional;
  25. import java.util.Set;
  26. import java.util.function.Consumer;
  27. import javax.annotation.CheckForNull;
  28. import javax.annotation.Nullable;
  29. import org.sonar.api.web.UserRole;
  30. import org.sonar.core.util.Uuids;
  31. import org.sonar.core.util.stream.MoreCollectors;
  32. import org.sonar.db.DbClient;
  33. import org.sonar.db.DbTester;
  34. import org.sonar.db.ce.CeTaskMessageType;
  35. import org.sonar.db.component.ComponentDto;
  36. import org.sonar.db.organization.OrganizationDto;
  37. import org.sonar.db.permission.GroupPermissionDto;
  38. import org.sonar.db.permission.OrganizationPermission;
  39. import org.sonar.db.permission.UserPermissionDto;
  40. import org.sonar.db.project.ProjectDto;
  41. import static com.google.common.base.Preconditions.checkArgument;
  42. import static java.lang.String.format;
  43. import static java.util.Arrays.stream;
  44. import static org.apache.commons.lang.math.RandomUtils.nextLong;
  45. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
  46. public class UserDbTester {
  47. private static final Set<String> PUBLIC_PERMISSIONS = ImmutableSet.of(UserRole.USER, UserRole.CODEVIEWER); // FIXME to check with Simon
  48. private final DbTester db;
  49. private final DbClient dbClient;
  50. public UserDbTester(DbTester db) {
  51. this.db = db;
  52. this.dbClient = db.getDbClient();
  53. }
  54. // USERS
  55. public UserDto insertUser() {
  56. return insertUser(UserTesting.newUserDto());
  57. }
  58. public UserDto insertUser(String login) {
  59. UserDto dto = UserTesting.newUserDto().setLogin(login).setActive(true);
  60. return insertUser(dto);
  61. }
  62. @SafeVarargs
  63. public final UserDto insertUser(Consumer<UserDto>... populators) {
  64. UserDto dto = UserTesting.newUserDto().setActive(true);
  65. stream(populators).forEach(p -> p.accept(dto));
  66. return insertUser(dto);
  67. }
  68. @SafeVarargs
  69. public final UserDto insertDisabledUser(Consumer<UserDto>... populators) {
  70. UserDto dto = UserTesting.newDisabledUser();
  71. stream(populators).forEach(p -> p.accept(dto));
  72. return insertUser(dto);
  73. }
  74. public UserDto insertUser(UserDto userDto) {
  75. UserDto updatedUser = dbClient.userDao().insert(db.getSession(), userDto);
  76. db.commit();
  77. return updatedUser;
  78. }
  79. public UserDto makeRoot(UserDto userDto) {
  80. dbClient.userDao().setRoot(db.getSession(), userDto.getLogin(), true);
  81. db.commit();
  82. return dbClient.userDao().selectByLogin(db.getSession(), userDto.getLogin());
  83. }
  84. public UserDto makeNotRoot(UserDto userDto) {
  85. dbClient.userDao().setRoot(db.getSession(), userDto.getLogin(), false);
  86. db.commit();
  87. return dbClient.userDao().selectByLogin(db.getSession(), userDto.getLogin());
  88. }
  89. public UserDto insertAdminByUserPermission(OrganizationDto org) {
  90. UserDto user = insertUser();
  91. insertPermissionOnUser(org, user, ADMINISTER);
  92. return user;
  93. }
  94. public UserDto updateLastConnectionDate(UserDto user, long lastConnectionDate) {
  95. db.getDbClient().userDao().update(db.getSession(), user.setLastConnectionDate(lastConnectionDate));
  96. db.getSession().commit();
  97. return user;
  98. }
  99. public Optional<UserDto> selectUserByLogin(String login) {
  100. return Optional.ofNullable(dbClient.userDao().selectByLogin(db.getSession(), login));
  101. }
  102. public Optional<UserDto> selectUserByEmail(String email) {
  103. List<UserDto> users = dbClient.userDao().selectByEmail(db.getSession(), email);
  104. if (users.size() > 1) {
  105. return Optional.empty();
  106. }
  107. return Optional.of(users.get(0));
  108. }
  109. public Optional<UserDto> selectUserByExternalLoginAndIdentityProvider(String login, String identityProvider) {
  110. return Optional.ofNullable(dbClient.userDao().selectByExternalLoginAndIdentityProvider(db.getSession(), login, identityProvider));
  111. }
  112. // USER SETTINGS
  113. @SafeVarargs
  114. public final UserPropertyDto insertUserSetting(UserDto user, Consumer<UserPropertyDto>... populators) {
  115. UserPropertyDto dto = UserTesting.newUserSettingDto(user);
  116. stream(populators).forEach(p -> p.accept(dto));
  117. dbClient.userPropertiesDao().insertOrUpdate(db.getSession(), dto);
  118. db.commit();
  119. return dto;
  120. }
  121. // GROUPS
  122. public GroupDto insertGroup(OrganizationDto organization, String name) {
  123. GroupDto group = GroupTesting.newGroupDto().setName(name).setOrganizationUuid(organization.getUuid());
  124. return insertGroup(group);
  125. }
  126. /**
  127. * Create group in default organization
  128. */
  129. public GroupDto insertGroup() {
  130. GroupDto group = GroupTesting.newGroupDto().setOrganizationUuid(db.getDefaultOrganization().getUuid());
  131. return insertGroup(group);
  132. }
  133. /**
  134. * Create group in specified organization
  135. */
  136. public GroupDto insertGroup(OrganizationDto organizationDto) {
  137. GroupDto group = GroupTesting.newGroupDto().setOrganizationUuid(organizationDto.getUuid());
  138. return insertGroup(group);
  139. }
  140. public GroupDto insertGroup(GroupDto dto) {
  141. db.getDbClient().groupDao().insert(db.getSession(), dto);
  142. db.commit();
  143. return dto;
  144. }
  145. public GroupDto insertDefaultGroup(GroupDto dto) {
  146. String organizationUuid = dto.getOrganizationUuid();
  147. db.getDbClient().organizationDao().getDefaultGroupUuid(db.getSession(), organizationUuid)
  148. .ifPresent(groupUuid -> {
  149. throw new IllegalArgumentException(format("Organization '%s' has already a default group", organizationUuid));
  150. });
  151. db.getDbClient().groupDao().insert(db.getSession(), dto);
  152. db.getDbClient().organizationDao().setDefaultGroupUuid(db.getSession(), organizationUuid, dto);
  153. db.commit();
  154. return dto;
  155. }
  156. public GroupDto insertDefaultGroup(OrganizationDto organization, String name) {
  157. return insertDefaultGroup(GroupTesting.newGroupDto().setName(name).setOrganizationUuid(organization.getUuid()));
  158. }
  159. public GroupDto insertDefaultGroup(OrganizationDto organization) {
  160. return insertDefaultGroup(GroupTesting.newGroupDto().setOrganizationUuid(organization.getUuid()));
  161. }
  162. @CheckForNull
  163. public GroupDto selectGroupByUuid(String groupUuid) {
  164. return db.getDbClient().groupDao().selectByUuid(db.getSession(), groupUuid);
  165. }
  166. public Optional<GroupDto> selectGroup(OrganizationDto org, String name) {
  167. return db.getDbClient().groupDao().selectByName(db.getSession(), org.getUuid(), name);
  168. }
  169. public List<GroupDto> selectGroups(OrganizationDto org) {
  170. return db.getDbClient().groupDao().selectByOrganizationUuid(db.getSession(), org.getUuid());
  171. }
  172. // GROUP MEMBERSHIP
  173. public UserGroupDto insertMember(GroupDto group, UserDto user) {
  174. UserGroupDto dto = new UserGroupDto().setGroupUuid(group.getUuid()).setUserUuid(user.getUuid());
  175. db.getDbClient().userGroupDao().insert(db.getSession(), dto);
  176. db.commit();
  177. return dto;
  178. }
  179. public void insertMembers(GroupDto group, UserDto... users) {
  180. Arrays.stream(users).forEach(user -> {
  181. UserGroupDto dto = new UserGroupDto().setGroupUuid(group.getUuid()).setUserUuid(user.getUuid());
  182. db.getDbClient().userGroupDao().insert(db.getSession(), dto);
  183. });
  184. db.commit();
  185. }
  186. public List<String> selectGroupUuidsOfUser(UserDto user) {
  187. return db.getDbClient().groupMembershipDao().selectGroupUuidsByUserUuid(db.getSession(), user.getUuid());
  188. }
  189. // GROUP PERMISSIONS
  190. public GroupPermissionDto insertPermissionOnAnyone(OrganizationDto org, String permission) {
  191. GroupPermissionDto dto = new GroupPermissionDto()
  192. .setUuid(Uuids.createFast())
  193. .setOrganizationUuid(org.getUuid())
  194. .setGroupUuid(null)
  195. .setRole(permission);
  196. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto);
  197. db.commit();
  198. return dto;
  199. }
  200. public GroupPermissionDto insertPermissionOnAnyone(OrganizationDto org, OrganizationPermission permission) {
  201. return insertPermissionOnAnyone(org, permission.getKey());
  202. }
  203. public GroupPermissionDto insertPermissionOnGroup(GroupDto group, String permission) {
  204. GroupPermissionDto dto = new GroupPermissionDto()
  205. .setUuid(Uuids.createFast())
  206. .setOrganizationUuid(group.getOrganizationUuid())
  207. .setGroupUuid(group.getUuid())
  208. .setRole(permission);
  209. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto);
  210. db.commit();
  211. return dto;
  212. }
  213. public GroupPermissionDto insertPermissionOnGroup(GroupDto group, OrganizationPermission permission) {
  214. return insertPermissionOnGroup(group, permission.getKey());
  215. }
  216. public void deletePermissionFromGroup(GroupDto group, String permission) {
  217. db.getDbClient().groupPermissionDao().delete(db.getSession(), permission, group.getOrganizationUuid(), group.getUuid(), null);
  218. db.commit();
  219. }
  220. public GroupPermissionDto insertProjectPermissionOnAnyone(String permission, ComponentDto project) {
  221. checkArgument(!project.isPrivate(), "No permission to group AnyOne can be granted on a private project");
  222. checkArgument(!PUBLIC_PERMISSIONS.contains(permission),
  223. "permission %s can't be granted on a public project", permission);
  224. checkArgument(project.getMainBranchProjectUuid() == null, "Permissions can't be granted on branches");
  225. GroupPermissionDto dto = new GroupPermissionDto()
  226. .setUuid(Uuids.createFast())
  227. .setOrganizationUuid(project.getOrganizationUuid())
  228. .setGroupUuid(null)
  229. .setRole(permission)
  230. .setComponentUuid(project.uuid());
  231. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto);
  232. db.commit();
  233. return dto;
  234. }
  235. public void deleteProjectPermissionFromAnyone(ComponentDto project, String permission) {
  236. db.getDbClient().groupPermissionDao().delete(db.getSession(), permission, project.getOrganizationUuid(), null, project.uuid());
  237. db.commit();
  238. }
  239. public GroupPermissionDto insertProjectPermissionOnGroup(GroupDto group, String permission, ComponentDto project) {
  240. checkArgument(group.getOrganizationUuid().equals(project.getOrganizationUuid()), "Different organizations");
  241. checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
  242. "%s can't be granted on a public project", permission);
  243. checkArgument(project.getMainBranchProjectUuid() == null, "Permissions can't be granted on branches");
  244. GroupPermissionDto dto = new GroupPermissionDto()
  245. .setUuid(Uuids.createFast())
  246. .setOrganizationUuid(group.getOrganizationUuid())
  247. .setGroupUuid(group.getUuid())
  248. .setRole(permission)
  249. .setComponentUuid(project.uuid());
  250. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto);
  251. db.commit();
  252. return dto;
  253. }
  254. public List<String> selectGroupPermissions(GroupDto group, @Nullable ComponentDto project) {
  255. if (project == null) {
  256. return db.getDbClient().groupPermissionDao().selectGlobalPermissionsOfGroup(db.getSession(),
  257. group.getOrganizationUuid(), group.getUuid());
  258. }
  259. return db.getDbClient().groupPermissionDao().selectProjectPermissionsOfGroup(db.getSession(),
  260. group.getOrganizationUuid(), group.getUuid(), project.uuid());
  261. }
  262. public List<String> selectAnyonePermissions(OrganizationDto org, @Nullable ComponentDto project) {
  263. if (project == null) {
  264. return db.getDbClient().groupPermissionDao().selectGlobalPermissionsOfGroup(db.getSession(),
  265. org.getUuid(), null);
  266. }
  267. checkArgument(org.getUuid().equals(project.getOrganizationUuid()), "Different organizations");
  268. return db.getDbClient().groupPermissionDao().selectProjectPermissionsOfGroup(db.getSession(), org.getUuid(), null, project.uuid());
  269. }
  270. // USER PERMISSIONS
  271. /**
  272. * Grant permission on default organization
  273. */
  274. public UserPermissionDto insertPermissionOnUser(UserDto user, OrganizationPermission permission) {
  275. return insertPermissionOnUser(db.getDefaultOrganization(), user, permission);
  276. }
  277. /**
  278. * Grant global permission
  279. * @deprecated use {@link #insertPermissionOnUser(OrganizationDto, UserDto, OrganizationPermission)}
  280. */
  281. @Deprecated
  282. public UserPermissionDto insertPermissionOnUser(OrganizationDto org, UserDto user, String permission) {
  283. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), org.getUuid(), permission, user.getUuid(), null);
  284. db.getDbClient().userPermissionDao().insert(db.getSession(), dto);
  285. db.commit();
  286. return dto;
  287. }
  288. /**
  289. * Grant organization permission to user
  290. */
  291. public UserPermissionDto insertPermissionOnUser(OrganizationDto org, UserDto user, OrganizationPermission permission) {
  292. return insertPermissionOnUser(org, user, permission.getKey());
  293. }
  294. public void deletePermissionFromUser(OrganizationDto org, UserDto user, OrganizationPermission permission) {
  295. db.getDbClient().userPermissionDao().deleteGlobalPermission(db.getSession(), user.getUuid(), permission.getKey(), org.getUuid());
  296. db.commit();
  297. }
  298. public void deletePermissionFromUser(ComponentDto project, UserDto user, String permission) {
  299. db.getDbClient().userPermissionDao().deleteProjectPermission(db.getSession(), user.getUuid(), permission, project.uuid());
  300. db.commit();
  301. }
  302. /**
  303. * Grant permission on given project
  304. */
  305. public UserPermissionDto insertProjectPermissionOnUser(UserDto user, String permission, ComponentDto project) {
  306. checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
  307. "%s can't be granted on a public project", permission);
  308. checkArgument(project.getMainBranchProjectUuid() == null, "Permissions can't be granted on branches");
  309. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), project.getOrganizationUuid(), permission, user.getUuid(), project.uuid());
  310. db.getDbClient().userPermissionDao().insert(db.getSession(), dto);
  311. db.commit();
  312. return dto;
  313. }
  314. public List<OrganizationPermission> selectPermissionsOfUser(UserDto user, OrganizationDto organization) {
  315. return toListOfOrganizationPermissions(db.getDbClient().userPermissionDao()
  316. .selectGlobalPermissionsOfUser(db.getSession(), user.getUuid(), organization.getUuid()));
  317. }
  318. public List<String> selectProjectPermissionsOfUser(UserDto user, ComponentDto project) {
  319. return db.getDbClient().userPermissionDao().selectProjectPermissionsOfUser(db.getSession(), user.getUuid(), project.uuid());
  320. }
  321. private static List<OrganizationPermission> toListOfOrganizationPermissions(List<String> keys) {
  322. return keys
  323. .stream()
  324. .map(OrganizationPermission::fromKey)
  325. .collect(MoreCollectors.toList());
  326. }
  327. // USER TOKEN
  328. @SafeVarargs
  329. public final UserTokenDto insertToken(UserDto user, Consumer<UserTokenDto>... populators) {
  330. UserTokenDto dto = UserTokenTesting.newUserToken().setUserUuid(user.getUuid());
  331. stream(populators).forEach(p -> p.accept(dto));
  332. db.getDbClient().userTokenDao().insert(db.getSession(), dto);
  333. db.commit();
  334. return dto;
  335. }
  336. // SESSION TOKENS
  337. @SafeVarargs
  338. public final SessionTokenDto insertSessionToken(UserDto user, Consumer<SessionTokenDto>... populators) {
  339. SessionTokenDto dto = new SessionTokenDto()
  340. .setUserUuid(user.getUuid())
  341. .setExpirationDate(nextLong());
  342. stream(populators).forEach(p -> p.accept(dto));
  343. db.getDbClient().sessionTokensDao().insert(db.getSession(), dto);
  344. db.commit();
  345. return dto;
  346. }
  347. public final UserDismissedMessageDto insertUserDismissedMessage(UserDto userDto, ProjectDto projectDto, CeTaskMessageType messageType) {
  348. UserDismissedMessageDto dto = new UserDismissedMessageDto()
  349. .setUuid(Uuids.create())
  350. .setUserUuid(userDto.getUuid())
  351. .setProjectUuid(projectDto.getUuid())
  352. .setCeMessageType(messageType);
  353. db.getDbClient().userDismissedMessagesDao().insert(db.getSession(), dto);
  354. db.commit();
  355. return dto;
  356. }
  357. }