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 14KB

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