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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2021 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.security.DefaultGroups;
  30. import org.sonar.api.web.UserRole;
  31. import org.sonar.core.util.Uuids;
  32. import org.sonar.core.util.stream.MoreCollectors;
  33. import org.sonar.db.DbClient;
  34. import org.sonar.db.DbTester;
  35. import org.sonar.db.ce.CeTaskMessageType;
  36. import org.sonar.db.component.ComponentDto;
  37. import org.sonar.db.permission.GlobalPermission;
  38. import org.sonar.db.permission.GroupPermissionDto;
  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.util.Arrays.stream;
  43. import static org.apache.commons.lang.math.RandomUtils.nextLong;
  44. import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
  45. import static org.sonar.db.user.GroupTesting.newGroupDto;
  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() {
  90. UserDto user = insertUser();
  91. insertPermissionOnUser(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(String name) {
  123. GroupDto group = newGroupDto().setName(name);
  124. return insertGroup(group);
  125. }
  126. public GroupDto insertGroup() {
  127. GroupDto group = newGroupDto();
  128. return insertGroup(group);
  129. }
  130. public GroupDto insertGroup(GroupDto dto) {
  131. db.getDbClient().groupDao().insert(db.getSession(), dto);
  132. db.commit();
  133. return dto;
  134. }
  135. public GroupDto insertDefaultGroup() {
  136. GroupDto dto = db.getDbClient().groupDao().insert(db.getSession(), newGroupDto().setName(DefaultGroups.USERS).setDescription("Users"));
  137. db.commit();
  138. return dto;
  139. }
  140. @CheckForNull
  141. public GroupDto selectGroupByUuid(String groupUuid) {
  142. return db.getDbClient().groupDao().selectByUuid(db.getSession(), groupUuid);
  143. }
  144. public Optional<GroupDto> selectGroup(String name) {
  145. return db.getDbClient().groupDao().selectByName(db.getSession(), name);
  146. }
  147. // GROUP MEMBERSHIP
  148. public UserGroupDto insertMember(GroupDto group, UserDto user) {
  149. UserGroupDto dto = new UserGroupDto().setGroupUuid(group.getUuid()).setUserUuid(user.getUuid());
  150. db.getDbClient().userGroupDao().insert(db.getSession(), dto);
  151. db.commit();
  152. return dto;
  153. }
  154. public void insertMembers(GroupDto group, UserDto... users) {
  155. Arrays.stream(users).forEach(user -> {
  156. UserGroupDto dto = new UserGroupDto().setGroupUuid(group.getUuid()).setUserUuid(user.getUuid());
  157. db.getDbClient().userGroupDao().insert(db.getSession(), dto);
  158. });
  159. db.commit();
  160. }
  161. public List<String> selectGroupUuidsOfUser(UserDto user) {
  162. return db.getDbClient().groupMembershipDao().selectGroupUuidsByUserUuid(db.getSession(), user.getUuid());
  163. }
  164. // GROUP PERMISSIONS
  165. public GroupPermissionDto insertPermissionOnAnyone(String permission) {
  166. GroupPermissionDto dto = new GroupPermissionDto()
  167. .setUuid(Uuids.createFast())
  168. .setGroupUuid(null)
  169. .setRole(permission);
  170. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto);
  171. db.commit();
  172. return dto;
  173. }
  174. public GroupPermissionDto insertPermissionOnAnyone(GlobalPermission permission) {
  175. return insertPermissionOnAnyone(permission.getKey());
  176. }
  177. public GroupPermissionDto insertPermissionOnGroup(GroupDto group, String permission) {
  178. GroupPermissionDto dto = new GroupPermissionDto()
  179. .setUuid(Uuids.createFast())
  180. .setGroupUuid(group.getUuid())
  181. .setRole(permission);
  182. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto);
  183. db.commit();
  184. return dto;
  185. }
  186. public GroupPermissionDto insertPermissionOnGroup(GroupDto group, GlobalPermission permission) {
  187. return insertPermissionOnGroup(group, permission.getKey());
  188. }
  189. public void deletePermissionFromGroup(GroupDto group, String permission) {
  190. db.getDbClient().groupPermissionDao().delete(db.getSession(), permission, group.getUuid(), null);
  191. db.commit();
  192. }
  193. public GroupPermissionDto insertProjectPermissionOnAnyone(String permission, ComponentDto project) {
  194. checkArgument(!project.isPrivate(), "No permission to group AnyOne can be granted on a private project");
  195. checkArgument(!PUBLIC_PERMISSIONS.contains(permission),
  196. "permission %s can't be granted on a public project", permission);
  197. checkArgument(project.getMainBranchProjectUuid() == null, "Permissions can't be granted on branches");
  198. GroupPermissionDto dto = new GroupPermissionDto()
  199. .setUuid(Uuids.createFast())
  200. .setGroupUuid(null)
  201. .setRole(permission)
  202. .setComponentUuid(project.uuid());
  203. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto);
  204. db.commit();
  205. return dto;
  206. }
  207. public void deleteProjectPermissionFromAnyone(ComponentDto project, String permission) {
  208. db.getDbClient().groupPermissionDao().delete(db.getSession(), permission, null, project.uuid());
  209. db.commit();
  210. }
  211. public GroupPermissionDto insertProjectPermissionOnGroup(GroupDto group, String permission, ComponentDto project) {
  212. checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
  213. "%s can't be granted on a public project", permission);
  214. checkArgument(project.getMainBranchProjectUuid() == null, "Permissions can't be granted on branches");
  215. GroupPermissionDto dto = new GroupPermissionDto()
  216. .setUuid(Uuids.createFast())
  217. .setGroupUuid(group.getUuid())
  218. .setRole(permission)
  219. .setComponentUuid(project.uuid());
  220. db.getDbClient().groupPermissionDao().insert(db.getSession(), dto);
  221. db.commit();
  222. return dto;
  223. }
  224. public List<String> selectGroupPermissions(GroupDto group, @Nullable ComponentDto project) {
  225. if (project == null) {
  226. return db.getDbClient().groupPermissionDao().selectGlobalPermissionsOfGroup(db.getSession(), group.getUuid());
  227. }
  228. return db.getDbClient().groupPermissionDao().selectProjectPermissionsOfGroup(db.getSession(), group.getUuid(), project.uuid());
  229. }
  230. public List<String> selectAnyonePermissions(@Nullable ComponentDto project) {
  231. if (project == null) {
  232. return db.getDbClient().groupPermissionDao().selectGlobalPermissionsOfGroup(db.getSession(), null);
  233. }
  234. return db.getDbClient().groupPermissionDao().selectProjectPermissionsOfGroup(db.getSession(), null, project.uuid());
  235. }
  236. // USER PERMISSIONS
  237. /**
  238. * Grant permission
  239. */
  240. public UserPermissionDto insertPermissionOnUser(UserDto user, GlobalPermission permission) {
  241. return insertPermissionOnUser(user, permission.getKey());
  242. }
  243. /**
  244. * Grant global permission
  245. * @deprecated use {@link #insertPermissionOnUser(UserDto, GlobalPermission)}
  246. */
  247. @Deprecated
  248. public UserPermissionDto insertPermissionOnUser(UserDto user, String permission) {
  249. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), null);
  250. db.getDbClient().userPermissionDao().insert(db.getSession(), dto);
  251. db.commit();
  252. return dto;
  253. }
  254. public void deletePermissionFromUser(UserDto user, GlobalPermission permission) {
  255. db.getDbClient().userPermissionDao().deleteGlobalPermission(db.getSession(), user.getUuid(), permission.getKey());
  256. db.commit();
  257. }
  258. public void deletePermissionFromUser(ComponentDto project, UserDto user, String permission) {
  259. db.getDbClient().userPermissionDao().deleteProjectPermission(db.getSession(), user.getUuid(), permission, project.uuid());
  260. db.commit();
  261. }
  262. /**
  263. * Grant permission on given project
  264. */
  265. public UserPermissionDto insertProjectPermissionOnUser(UserDto user, String permission, ComponentDto project) {
  266. checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
  267. "%s can't be granted on a public project", permission);
  268. checkArgument(project.getMainBranchProjectUuid() == null, "Permissions can't be granted on branches");
  269. UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), project.uuid());
  270. db.getDbClient().userPermissionDao().insert(db.getSession(), dto);
  271. db.commit();
  272. return dto;
  273. }
  274. public List<GlobalPermission> selectPermissionsOfUser(UserDto user) {
  275. return toListOfGlobalPermissions(db.getDbClient().userPermissionDao()
  276. .selectGlobalPermissionsOfUser(db.getSession(), user.getUuid()));
  277. }
  278. public List<String> selectProjectPermissionsOfUser(UserDto user, ComponentDto project) {
  279. return db.getDbClient().userPermissionDao().selectProjectPermissionsOfUser(db.getSession(), user.getUuid(), project.uuid());
  280. }
  281. private static List<GlobalPermission> toListOfGlobalPermissions(List<String> keys) {
  282. return keys
  283. .stream()
  284. .map(GlobalPermission::fromKey)
  285. .collect(MoreCollectors.toList());
  286. }
  287. // USER TOKEN
  288. @SafeVarargs
  289. public final UserTokenDto insertToken(UserDto user, Consumer<UserTokenDto>... populators) {
  290. UserTokenDto dto = UserTokenTesting.newUserToken().setUserUuid(user.getUuid());
  291. stream(populators).forEach(p -> p.accept(dto));
  292. db.getDbClient().userTokenDao().insert(db.getSession(), dto);
  293. db.commit();
  294. return dto;
  295. }
  296. // SESSION TOKENS
  297. @SafeVarargs
  298. public final SessionTokenDto insertSessionToken(UserDto user, Consumer<SessionTokenDto>... populators) {
  299. SessionTokenDto dto = new SessionTokenDto()
  300. .setUserUuid(user.getUuid())
  301. .setExpirationDate(nextLong());
  302. stream(populators).forEach(p -> p.accept(dto));
  303. db.getDbClient().sessionTokensDao().insert(db.getSession(), dto);
  304. db.commit();
  305. return dto;
  306. }
  307. public final UserDismissedMessageDto insertUserDismissedMessage(UserDto userDto, ProjectDto projectDto, CeTaskMessageType messageType) {
  308. UserDismissedMessageDto dto = new UserDismissedMessageDto()
  309. .setUuid(Uuids.create())
  310. .setUserUuid(userDto.getUuid())
  311. .setProjectUuid(projectDto.getUuid())
  312. .setCeMessageType(messageType);
  313. db.getDbClient().userDismissedMessagesDao().insert(db.getSession(), dto);
  314. db.commit();
  315. return dto;
  316. }
  317. }