diff options
11 files changed, 18 insertions, 424 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/authentication/UserRegistrarImpl.java b/server/sonar-server/src/main/java/org/sonar/server/authentication/UserRegistrarImpl.java index 59ff1b4aecd..62008a956ef 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/authentication/UserRegistrarImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/authentication/UserRegistrarImpl.java @@ -63,7 +63,6 @@ import static java.lang.String.format; import static java.util.Collections.singletonList; import static java.util.Objects.requireNonNull; import static org.sonar.core.util.stream.MoreCollectors.uniqueIndex; -import static org.sonar.server.authentication.UserRegistration.UpdateLoginStrategy; public class UserRegistrarImpl implements UserRegistrar { @@ -209,16 +208,20 @@ public class UserRegistrarImpl implements UserRegistrar { if (personalOrganizationUuid == null) { return; } + Optional<OrganizationDto> personalOrganization = dbClient.organizationDao().selectByUuid(dbSession, personalOrganizationUuid); - checkState(personalOrganization.isPresent(), - "Cannot find personal organization uuid '%s' for user '%s'", personalOrganizationUuid, user.getLogin()); - UpdateLoginStrategy updateLoginStrategy = authenticatorParameters.getUpdateLoginStrategy(); + + personalOrganization.ifPresent(organizationDto -> updateOrganizationKey(dbSession, user, authenticatorParameters, newLogin, organizationDto)); + } + + private void updateOrganizationKey(DbSession dbSession, UserDto user, UserRegistration authenticatorParameters, @Nullable String newLogin, OrganizationDto personalOrganization) { + UserRegistration.UpdateLoginStrategy updateLoginStrategy = authenticatorParameters.getUpdateLoginStrategy(); switch (updateLoginStrategy) { case ALLOW: - organizationUpdater.updateOrganizationKey(dbSession, personalOrganization.get(), requireNonNull(newLogin, "new login cannot be null")); + organizationUpdater.updateOrganizationKey(dbSession, personalOrganization, requireNonNull(newLogin, "new login cannot be null")); return; case WARN: - throw new UpdateLoginRedirectionException(authenticatorParameters.getUserIdentity(), authenticatorParameters.getProvider(), user, personalOrganization.get()); + throw new UpdateLoginRedirectionException(authenticatorParameters.getUserIdentity(), authenticatorParameters.getProvider(), user, personalOrganization); default: throw new IllegalStateException(format("Unknown strategy %s", updateLoginStrategy)); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdater.java b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdater.java index 4712f580a15..5bc4e3b6675 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdater.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdater.java @@ -19,7 +19,6 @@ */ package org.sonar.server.organization; -import java.util.Optional; import java.util.function.Consumer; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -36,7 +35,6 @@ public interface OrganizationUpdater { String OWNERS_GROUP_DESCRIPTION = "Owners of organization"; String PERM_TEMPLATE_NAME = "Default template"; String PERM_TEMPLATE_DESCRIPTION_PATTERN = "Default permission template of organization %s"; - String PERSONAL_ORGANIZATION_DESCRIPTION_PATTERN = "%s's personal organization"; /** * Create a new non guarded organization with the specified properties and of which the specified user will assign @@ -75,51 +73,6 @@ public interface OrganizationUpdater { OrganizationDto create(DbSession dbSession, UserDto userCreator, NewOrganization newOrganization, Consumer<OrganizationDto> beforeCommit) throws KeyConflictException; /** - * Create a new guarded organization which details are based on the login of the specified User. - * <p> - * This method does several operations at once: - * <ol> - * <li> - * create a guarded organization with the details computed from user's details: - * <ul> - * <li>key: generated from the user's login</li> - * <li>name: the user's name if set, otherwise the user's login</li> - * <li>description: {@link #PERSONAL_ORGANIZATION_DESCRIPTION_PATTERN "[name]'s personal organization"} where name - * is user name (when non null and non empty) or login</li> - * <li>url and avatar: null</li> - * </ul> - * </li> - * <li>create a group called {@link DefaultGroupCreatorImpl#DEFAULT_GROUP_NAME members} with browse permissions</li> - * <li>make the specified user a member of this group</li> - * <li>give all organization wide permissions to the user</li> - * <li>create a default template for the organization - * <ul> - * <li>name is {@link #PERM_TEMPLATE_NAME Default template}</li> - * <li>description follows pattern {@link #PERM_TEMPLATE_DESCRIPTION_PATTERN} based on the organization name</li> - * </ul> - * </li> - * <li>this permission template defines the specified permissions (which effectively makes projects public and - * automatically adds new projects to the user's favorites): - * <ul> - * <li>project creator : {@link UserRole#ADMIN ADMIN}</li> - * <li>project creator : {@link UserRole#ISSUE_ADMIN ISSUE_ADMIN}</li> - * <li>project creator : {@link UserRole#SECURITYHOTSPOT_ADMIN SECURITYHOTSPOT_ADMIN}</li> - * <li>project creator : {@link UserRole#SCAN SCAN}</li> - * <li>group {@link DefaultGroupCreatorImpl#DEFAULT_GROUP_NAME members} : {@link UserRole#USER USER}</li> - * <li>group {@link DefaultGroupCreatorImpl#DEFAULT_GROUP_NAME members} : {@link UserRole#CODEVIEWER CODEVIEWER}</li> - * </ul> - * </li> - * </ol> - * </p> - * - * @return the created organization or empty if feature is disabled - * - * @throws IllegalArgumentException if any field of {@code newOrganization} is invalid according to {@link OrganizationValidation} - * @throws IllegalStateException if an organization with the key generated from the login already exists - */ - Optional<OrganizationDto> createForUser(DbSession dbSession, UserDto newUser); - - /** * Update the personal organization key of a user. * No update will be performed if generated key match the same key as existing one. * diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java index b8d82a462bb..38f4a3c1a17 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/OrganizationUpdaterImpl.java @@ -24,12 +24,9 @@ import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.function.Consumer; import javax.annotation.Nullable; -import org.sonar.api.config.Configuration; import org.sonar.api.utils.System2; -import org.sonar.core.config.CorePropertyDefinitions; import org.sonar.core.util.UuidFactory; import org.sonar.db.DbClient; import org.sonar.db.DbSession; @@ -38,8 +35,6 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationMemberDto; import org.sonar.db.permission.GroupPermissionDto; import org.sonar.db.permission.OrganizationPermission; -import org.sonar.db.permission.UserPermissionDto; -import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto; import org.sonar.db.permission.template.PermissionTemplateDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualityprofile.DefaultQProfileDto; @@ -65,7 +60,6 @@ import static org.sonar.api.web.UserRole.USER; import static org.sonar.core.util.stream.MoreCollectors.uniqueIndex; import static org.sonar.db.organization.OrganizationDto.Subscription.FREE; import static org.sonar.db.permission.OrganizationPermission.SCAN; -import static org.sonar.server.organization.OrganizationUpdater.NewOrganization.newOrganizationBuilder; public class OrganizationUpdaterImpl implements OrganizationUpdater { @@ -73,20 +67,18 @@ public class OrganizationUpdaterImpl implements OrganizationUpdater { private final System2 system2; private final UuidFactory uuidFactory; private final OrganizationValidation organizationValidation; - private final Configuration config; private final BuiltInQProfileRepository builtInQProfileRepository; private final DefaultGroupCreator defaultGroupCreator; private final UserIndexer userIndexer; private final PermissionService permissionService; public OrganizationUpdaterImpl(DbClient dbClient, System2 system2, UuidFactory uuidFactory, - OrganizationValidation organizationValidation, Configuration config, UserIndexer userIndexer, + OrganizationValidation organizationValidation, UserIndexer userIndexer, BuiltInQProfileRepository builtInQProfileRepository, DefaultGroupCreator defaultGroupCreator, PermissionService permissionService) { this.dbClient = dbClient; this.system2 = system2; this.uuidFactory = uuidFactory; this.organizationValidation = organizationValidation; - this.config = config; this.userIndexer = userIndexer; this.builtInQProfileRepository = builtInQProfileRepository; this.defaultGroupCreator = defaultGroupCreator; @@ -123,43 +115,6 @@ public class OrganizationUpdaterImpl implements OrganizationUpdater { } @Override - public Optional<OrganizationDto> createForUser(DbSession dbSession, UserDto newUser) { - if (!isCreatePersonalOrgEnabled()) { - return Optional.empty(); - } - - String nameOrLogin = nameOrLogin(newUser); - NewOrganization newOrganization = newOrganizationBuilder() - .setKey(organizationValidation.generateKeyFrom(newUser.getLogin())) - .setName(toName(nameOrLogin)) - .setDescription(format(PERSONAL_ORGANIZATION_DESCRIPTION_PATTERN, nameOrLogin)) - .build(); - checkKey(dbSession, newOrganization.getKey()); - - QualityGateDto builtInQualityGate = dbClient.qualityGateDao().selectBuiltIn(dbSession); - OrganizationDto organization = insertOrganization(dbSession, newOrganization, builtInQualityGate, - dto -> dto.setGuarded(true)); - dbClient.userDao().update(dbSession, newUser.setOrganizationUuid(organization.getUuid())); - insertOrganizationMember(dbSession, organization, newUser.getId()); - GroupDto defaultGroup = defaultGroupCreator.create(dbSession, organization.getUuid()); - dbClient.qualityGateDao().associate(dbSession, uuidFactory.create(), organization, builtInQualityGate); - permissionService.getAllOrganizationPermissions() - .forEach(p -> insertUserPermissions(dbSession, newUser, organization, p)); - insertPersonalOrgDefaultTemplate(dbSession, organization, defaultGroup); - try (DbSession batchDbSession = dbClient.openSession(true)) { - insertQualityProfiles(dbSession, batchDbSession, organization); - addCurrentUserToGroup(dbSession, defaultGroup, newUser.getId()); - - batchDbSession.commit(); - - // Elasticsearch is updated when DB session is committed - userIndexer.commitAndIndex(dbSession, newUser); - - return Optional.of(organization); - } - } - - @Override public void updateOrganizationKey(DbSession dbSession, OrganizationDto organization, String newKey) { String sanitizedKey = organizationValidation.generateKeyFrom(newKey); if (organization.getKey().equals(sanitizedKey)) { @@ -174,25 +129,6 @@ public class OrganizationUpdaterImpl implements OrganizationUpdater { "Can't create organization with key '%s' because an organization with this key already exists", key); } - private static String nameOrLogin(UserDto newUser) { - String name = newUser.getName(); - if (name == null || name.isEmpty()) { - return newUser.getLogin(); - } - return name; - } - - private String toName(String login) { - String name = login.substring(0, Math.min(login.length(), OrganizationValidation.NAME_MAX_LENGTH)); - // should not happen has login can't be less than 2 chars, but we call it for safety - organizationValidation.checkName(name); - return name; - } - - private boolean isCreatePersonalOrgEnabled() { - return config.getBoolean(CorePropertyDefinitions.ORGANIZATIONS_CREATE_PERSONAL_ORG).orElse(false); - } - private void validate(NewOrganization newOrganization) { requireNonNull(newOrganization, "newOrganization can't be null"); organizationValidation.checkName(newOrganization.getName()); @@ -246,43 +182,6 @@ public class OrganizationUpdaterImpl implements OrganizationUpdater { new DefaultTemplates().setProjectUuid(permissionTemplateDto.getUuid())); } - private void insertPersonalOrgDefaultTemplate(DbSession dbSession, OrganizationDto organizationDto, GroupDto defaultGroup) { - long now = system2.now(); - Date dateNow = new Date(now); - PermissionTemplateDto permissionTemplateDto = dbClient.permissionTemplateDao().insert( - dbSession, - new PermissionTemplateDto() - .setOrganizationUuid(organizationDto.getUuid()) - .setUuid(uuidFactory.create()) - .setName("Default template") - .setDescription(format(PERM_TEMPLATE_DESCRIPTION_PATTERN, organizationDto.getName())) - .setCreatedAt(dateNow) - .setUpdatedAt(dateNow)); - - insertProjectCreatorPermission(dbSession, permissionTemplateDto, ADMIN, now); - insertProjectCreatorPermission(dbSession, permissionTemplateDto, SCAN.getKey(), now); - insertGroupPermission(dbSession, permissionTemplateDto, USER, defaultGroup); - insertGroupPermission(dbSession, permissionTemplateDto, CODEVIEWER, defaultGroup); - insertGroupPermission(dbSession, permissionTemplateDto, ISSUE_ADMIN, defaultGroup); - insertGroupPermission(dbSession, permissionTemplateDto, SECURITYHOTSPOT_ADMIN, defaultGroup); - - dbClient.organizationDao().setDefaultTemplates( - dbSession, - organizationDto.getUuid(), - new DefaultTemplates().setProjectUuid(permissionTemplateDto.getUuid())); - } - - private void insertProjectCreatorPermission(DbSession dbSession, PermissionTemplateDto permissionTemplateDto, String permission, long now) { - dbClient.permissionTemplateCharacteristicDao().insert( - dbSession, - new PermissionTemplateCharacteristicDto() - .setTemplateId(permissionTemplateDto.getId()) - .setWithProjectCreator(true) - .setPermission(permission) - .setCreatedAt(now) - .setUpdatedAt(now)); - } - private void insertGroupPermission(DbSession dbSession, PermissionTemplateDto template, String permission, @Nullable GroupDto group) { dbClient.permissionTemplateDao().insertGroupPermission(dbSession, template.getId(), group == null ? null : group.getId(), permission); } @@ -337,12 +236,6 @@ public class OrganizationUpdaterImpl implements OrganizationUpdater { .setRole(permission.getKey())); } - private void insertUserPermissions(DbSession dbSession, UserDto userDto, OrganizationDto organization, OrganizationPermission permission) { - dbClient.userPermissionDao().insert( - dbSession, - new UserPermissionDto(organization.getUuid(), permission.getKey(), userDto.getId(), null)); - } - private void addCurrentUserToGroup(DbSession dbSession, GroupDto group, int createUserId) { dbClient.userGroupDao().insert( dbSession, diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/UserUpdater.java b/server/sonar-server/src/main/java/org/sonar/server/user/UserUpdater.java index f85f3ce7ef3..bf54d87f49e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/UserUpdater.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/UserUpdater.java @@ -433,7 +433,7 @@ public class UserUpdater { } else { addUserToDefaultOrganizationAndDefaultGroup(dbSession, userDto); } - organizationUpdater.createForUser(dbSession, userDto); + return res; } diff --git a/server/sonar-server/src/test/java/org/sonar/server/authentication/UserRegistrarImplOrgMembershipSyncTest.java b/server/sonar-server/src/test/java/org/sonar/server/authentication/UserRegistrarImplOrgMembershipSyncTest.java index cfb39c95859..f8a299a80bf 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/authentication/UserRegistrarImplOrgMembershipSyncTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/authentication/UserRegistrarImplOrgMembershipSyncTest.java @@ -115,7 +115,7 @@ public class UserRegistrarImplOrgMembershipSyncTest { private UserRegistrarImpl underTest = new UserRegistrarImpl(db.getDbClient(), userUpdater, defaultOrganizationProvider, organizationFlags, new OrganizationUpdaterImpl(db.getDbClient(), mock(System2.class), UuidFactoryFast.getInstance(), - new OrganizationValidationImpl(), settings.asConfig(), null, null, null, permissionService), + new OrganizationValidationImpl(), null, null, null, permissionService), defaultGroupFinder, new MemberUpdater(db.getDbClient(), defaultGroupFinder, userIndexer)); @Test diff --git a/server/sonar-server/src/test/java/org/sonar/server/authentication/UserRegistrarImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/authentication/UserRegistrarImplTest.java index 32f6851b8e7..2b6d540f9cb 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/authentication/UserRegistrarImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/authentication/UserRegistrarImplTest.java @@ -119,7 +119,7 @@ public class UserRegistrarImplTest { private UserRegistrarImpl underTest = new UserRegistrarImpl(db.getDbClient(), userUpdater, defaultOrganizationProvider, organizationFlags, new OrganizationUpdaterImpl(db.getDbClient(), mock(System2.class), UuidFactoryFast.getInstance(), - new OrganizationValidationImpl(), settings.asConfig(), null, null, null, permissionService), + new OrganizationValidationImpl(), null, null, null, permissionService), defaultGroupFinder, new MemberUpdater(db.getDbClient(), defaultGroupFinder, userIndexer)); @Test @@ -654,28 +654,6 @@ public class UserRegistrarImplTest { } @Test - public void fail_to_authenticate_existing_user_when_personal_org_does_not_exist() { - organizationFlags.setEnabled(true); - db.users().insertUser(u -> u - .setLogin("Old login") - .setExternalId(USER_IDENTITY.getProviderId()) - .setExternalLogin("old identity") - .setExternalIdentityProvider(IDENTITY_PROVIDER.getKey()) - .setOrganizationUuid("unknown")); - - expectedException.expect(IllegalStateException.class); - expectedException.expectMessage("Cannot find personal organization uuid 'unknown' for user 'Old login'"); - - underTest.register(UserRegistration.builder() - .setUserIdentity(USER_IDENTITY) - .setProvider(IDENTITY_PROVIDER) - .setSource(Source.local(BASIC)) - .setExistingEmailStrategy(ExistingEmailStrategy.FORBID) - .setUpdateLoginStrategy(UpdateLoginStrategy.ALLOW) - .build()); - } - - @Test public void authenticate_existing_disabled_user() { organizationFlags.setEnabled(true); db.users().insertUser(u -> u diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java index 77a858eb9a7..75720a17016 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/OrganizationUpdaterImplTest.java @@ -109,7 +109,6 @@ public class OrganizationUpdaterImplTest { private DbClient dbClient = db.getDbClient(); private UuidFactory uuidFactory = new SequenceUuidFactory(); private OrganizationValidation organizationValidation = mock(OrganizationValidation.class); - private MapSettings settings = new MapSettings(); private UserIndexer userIndexer = new UserIndexer(dbClient, es.client()); private UserIndex userIndex = new UserIndex(es.client(), system2); private DefaultGroupCreator defaultGroupCreator = new DefaultGroupCreatorImpl(dbClient); @@ -117,7 +116,7 @@ public class OrganizationUpdaterImplTest { private ResourceTypes resourceTypes = new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT); private PermissionService permissionService = new PermissionServiceImpl(resourceTypes); - private OrganizationUpdaterImpl underTest = new OrganizationUpdaterImpl(dbClient, system2, uuidFactory, organizationValidation, settings.asConfig(), userIndexer, + private OrganizationUpdaterImpl underTest = new OrganizationUpdaterImpl(dbClient, system2, uuidFactory, organizationValidation, userIndexer, builtInQProfileRepositoryRule, defaultGroupCreator, permissionService); @Test @@ -348,182 +347,6 @@ public class OrganizationUpdaterImplTest { } @Test - public void createForUser_creates_guarded_organization_with_key_name_and_description_generated_from_user_login_and_name_and_associated_to_user() { - UserDto user = db.users().insertUser(A_LOGIN); - when(organizationValidation.generateKeyFrom(A_LOGIN)).thenReturn(SLUG_OF_A_LOGIN); - enableCreatePersonalOrg(true); - builtInQProfileRepositoryRule.initialize(); - db.qualityGates().insertBuiltInQualityGate(); - - underTest.createForUser(dbSession, user); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, SLUG_OF_A_LOGIN).get(); - assertThat(organization.getUuid()).isNotEmpty(); - assertThat(organization.getKey()).isEqualTo(SLUG_OF_A_LOGIN); - assertThat(organization.getName()).isEqualTo(user.getName()); - assertThat(organization.getDescription()).isEqualTo(user.getName() + "'s personal organization"); - assertThat(organization.getUrl()).isNull(); - assertThat(organization.getAvatarUrl()).isNull(); - assertThat(organization.isGuarded()).isTrue(); - assertThat(organization.getSubscription()).isEqualTo(Subscription.FREE); - assertThat(organization.getCreatedAt()).isEqualTo(A_DATE); - assertThat(organization.getUpdatedAt()).isEqualTo(A_DATE); - - assertThat(db.getDbClient().userDao().selectByUuid(dbSession, user.getUuid()).getOrganizationUuid()).isEqualTo(organization.getUuid()); - } - - @Test - public void createForUser_fails_with_ISE_if_organization_with_slug_of_login_already_exists() { - UserDto user = db.users().insertUser(A_LOGIN); - when(organizationValidation.generateKeyFrom(A_LOGIN)).thenReturn(SLUG_OF_A_LOGIN); - db.organizations().insertForKey(SLUG_OF_A_LOGIN); - enableCreatePersonalOrg(true); - - expectedException.expect(IllegalStateException.class); - expectedException.expectMessage("Can't create organization with key '" + SLUG_OF_A_LOGIN + "' " + - "because an organization with this key already exists"); - - underTest.createForUser(dbSession, user); - } - - @Test - public void createForUser_gives_all_permissions_for_new_organization_to_current_user() { - UserDto user = db.users().insertUser(dto -> dto.setLogin(A_LOGIN).setName(A_NAME)); - when(organizationValidation.generateKeyFrom(A_LOGIN)).thenReturn(SLUG_OF_A_LOGIN); - enableCreatePersonalOrg(true); - builtInQProfileRepositoryRule.initialize(); - db.qualityGates().insertBuiltInQualityGate(); - - underTest.createForUser(dbSession, user); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, SLUG_OF_A_LOGIN).get(); - assertThat(dbClient.userPermissionDao().selectGlobalPermissionsOfUser(dbSession, user.getId(), organization.getUuid())) - .containsOnly(GlobalPermissions.ALL.toArray(new String[GlobalPermissions.ALL.size()])); - } - - @Test - public void createForUser_creates_members_group_and_add_current_user_to_it() { - UserDto user = db.users().insertUser(dto -> dto.setLogin(A_LOGIN).setName(A_NAME)); - when(organizationValidation.generateKeyFrom(A_LOGIN)).thenReturn(SLUG_OF_A_LOGIN); - enableCreatePersonalOrg(true); - builtInQProfileRepositoryRule.initialize(); - db.qualityGates().insertBuiltInQualityGate(); - - underTest.createForUser(dbSession, user); - - verifyMembersGroup(user, SLUG_OF_A_LOGIN); - } - - @Test - public void createForUser_creates_default_template_for_new_organization() { - UserDto user = db.users().insertUser(dto -> dto.setLogin(A_LOGIN).setName(A_NAME)); - when(organizationValidation.generateKeyFrom(A_LOGIN)).thenReturn(SLUG_OF_A_LOGIN); - enableCreatePersonalOrg(true); - builtInQProfileRepositoryRule.initialize(); - db.qualityGates().insertBuiltInQualityGate(); - - underTest.createForUser(dbSession, user); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, SLUG_OF_A_LOGIN).get(); - int defaultGroupId = dbClient.organizationDao().getDefaultGroupId(dbSession, organization.getUuid()).get(); - PermissionTemplateDto defaultTemplate = dbClient.permissionTemplateDao().selectByName(dbSession, organization.getUuid(), "default template"); - assertThat(defaultTemplate.getName()).isEqualTo("Default template"); - assertThat(defaultTemplate.getDescription()).isEqualTo("Default permission template of organization " + A_NAME); - DefaultTemplates defaultTemplates = dbClient.organizationDao().getDefaultTemplates(dbSession, organization.getUuid()).get(); - assertThat(defaultTemplates.getProjectUuid()).isEqualTo(defaultTemplate.getUuid()); - assertThat(defaultTemplates.getApplicationsUuid()).isNull(); - assertThat(dbClient.permissionTemplateDao().selectGroupPermissionsByTemplateId(dbSession, defaultTemplate.getId())) - .extracting(PermissionTemplateGroupDto::getGroupId, PermissionTemplateGroupDto::getPermission) - .containsOnly( - tuple(defaultGroupId, UserRole.USER), - tuple(defaultGroupId, UserRole.CODEVIEWER), - tuple(defaultGroupId, UserRole.ISSUE_ADMIN), - tuple(defaultGroupId, UserRole.SECURITYHOTSPOT_ADMIN)); - assertThat(dbClient.permissionTemplateCharacteristicDao().selectByTemplateIds(dbSession, Collections.singletonList(defaultTemplate.getId()))) - .extracting(PermissionTemplateCharacteristicDto::getWithProjectCreator, PermissionTemplateCharacteristicDto::getPermission) - .containsOnly( - tuple(true, UserRole.ADMIN), - tuple(true, GlobalPermissions.SCAN_EXECUTION)); - } - - @Test - public void createForUser_add_current_user_as_member_of_organization() { - UserDto user = db.users().insertUser(dto -> dto.setLogin(A_LOGIN).setName(A_NAME)); - when(organizationValidation.generateKeyFrom(A_LOGIN)).thenReturn(SLUG_OF_A_LOGIN); - enableCreatePersonalOrg(true); - builtInQProfileRepositoryRule.initialize(); - db.qualityGates().insertBuiltInQualityGate(); - - underTest.createForUser(dbSession, user); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, SLUG_OF_A_LOGIN).get(); - assertThat(dbClient.organizationMemberDao().select(dbSession, organization.getUuid(), user.getId())).isPresent(); - } - - @Test - public void createForUser_associates_to_built_in_quality_profiles() { - UserDto user = db.users().insertUser(A_LOGIN); - when(organizationValidation.generateKeyFrom(A_LOGIN)).thenReturn(SLUG_OF_A_LOGIN); - enableCreatePersonalOrg(true); - db.qualityGates().insertBuiltInQualityGate(); - BuiltInQProfile builtIn1 = builtInQProfileRepositoryRule.add(newLanguage("foo"), "qp1"); - BuiltInQProfile builtIn2 = builtInQProfileRepositoryRule.add(newLanguage("foo"), "qp2"); - builtInQProfileRepositoryRule.initialize(); - insertRulesProfile(builtIn1); - insertRulesProfile(builtIn2); - - underTest.createForUser(dbSession, user); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, SLUG_OF_A_LOGIN).get(); - List<QProfileDto> profiles = dbClient.qualityProfileDao().selectOrderedByOrganizationUuid(dbSession, organization); - assertThat(profiles).extracting(p -> new QProfileName(p.getLanguage(), p.getName())).containsExactlyInAnyOrder( - builtIn1.getQProfileName(), builtIn2.getQProfileName()); - } - - @Test - public void createForUser_associates_to_built_in_quality_gate() { - QualityGateDto builtInQualityGate = db.qualityGates().insertBuiltInQualityGate(); - UserDto user = db.users().insertUser(A_LOGIN); - when(organizationValidation.generateKeyFrom(A_LOGIN)).thenReturn(SLUG_OF_A_LOGIN); - enableCreatePersonalOrg(true); - builtInQProfileRepositoryRule.initialize(); - - underTest.createForUser(dbSession, user); - - OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, SLUG_OF_A_LOGIN).get(); - assertThat(dbClient.qualityGateDao().selectDefault(dbSession, organization).getUuid()).isEqualTo(builtInQualityGate.getUuid()); - } - - @Test - public void createForUser_has_no_effect_if_setting_for_feature_is_not_set() { - checkSizeOfTables(); - - underTest.createForUser(null /* argument is not even read */, null /* argument is not even read */); - - checkSizeOfTables(); - } - - @Test - public void createForUser_has_no_effect_if_setting_for_feature_is_disabled() { - enableCreatePersonalOrg(false); - - checkSizeOfTables(); - - underTest.createForUser(null /* argument is not even read */, null /* argument is not even read */); - - checkSizeOfTables(); - } - - private void checkSizeOfTables() { - assertThat(db.countRowsOfTable("organizations")).isEqualTo(1); - assertThat(db.countRowsOfTable("groups")).isEqualTo(0); - assertThat(db.countRowsOfTable("groups_users")).isEqualTo(0); - assertThat(db.countRowsOfTable("permission_templates")).isEqualTo(0); - assertThat(db.countRowsOfTable("perm_templates_users")).isEqualTo(0); - assertThat(db.countRowsOfTable("perm_templates_groups")).isEqualTo(0); - } - - @Test public void update_personal_organization() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("old login")); when(organizationValidation.generateKeyFrom("new_login")).thenReturn("new_login"); @@ -557,10 +380,6 @@ public class OrganizationUpdaterImplTest { underTest.updateOrganizationKey(dbSession, organization, "new_login"); } - private void enableCreatePersonalOrg(boolean flag) { - settings.setProperty(CorePropertyDefinitions.ORGANIZATIONS_CREATE_PERSONAL_ORG, flag); - } - private void verifyGroupOwners(UserDto user, String organizationKey, String organizationName) { OrganizationDto organization = dbClient.organizationDao().selectByKey(dbSession, organizationKey).get(); Optional<GroupDto> groupOpt = dbClient.groupDao().selectByName(dbSession, organization.getUuid(), "Owners"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java index de8573516a2..93f3479c185 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java @@ -81,9 +81,9 @@ import static org.sonar.core.config.CorePropertyDefinitions.ORGANIZATIONS_ANYONE import static org.sonar.server.organization.ws.OrganizationsWsSupport.PARAM_NAME; import static org.sonar.server.organization.ws.OrganizationsWsTestSupport.STRING_257_CHARS_LONG; import static org.sonar.server.organization.ws.OrganizationsWsTestSupport.STRING_65_CHARS_LONG; -import static org.sonar.server.user.index.UserIndexDefinition.TYPE_USER; import static org.sonar.server.user.index.UserIndexDefinition.FIELD_ORGANIZATION_UUIDS; import static org.sonar.server.user.index.UserIndexDefinition.FIELD_UUID; +import static org.sonar.server.user.index.UserIndexDefinition.TYPE_USER; import static org.sonar.test.JsonAssert.assertJson; public class CreateActionTest { @@ -108,9 +108,8 @@ public class CreateActionTest { private UserIndexer userIndexer = new UserIndexer(dbClient, es.client()); private ResourceTypes resourceTypes = new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT); private PermissionService permissionService = new PermissionServiceImpl(resourceTypes); - private OrganizationUpdater organizationUpdater = new OrganizationUpdaterImpl(dbClient, system2, UuidFactoryFast.getInstance(), organizationValidation, settings.asConfig(), - userIndexer, - mock(BuiltInQProfileRepository.class), new DefaultGroupCreatorImpl(dbClient), permissionService); + private OrganizationUpdater organizationUpdater = new OrganizationUpdaterImpl(dbClient, system2, UuidFactoryFast.getInstance(), organizationValidation, + userIndexer, mock(BuiltInQProfileRepository.class), new DefaultGroupCreatorImpl(dbClient), permissionService); private TestOrganizationFlags organizationFlags = TestOrganizationFlags.standalone().setEnabled(true); private OrganizationAlmBinding organizationAlmBinding = mock(OrganizationAlmBinding.class); diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/UserUpdaterCreateTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/UserUpdaterCreateTest.java index 4b5e8c53f39..af9a0eca653 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/UserUpdaterCreateTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/UserUpdaterCreateTest.java @@ -55,8 +55,6 @@ import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.data.MapEntry.entry; import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.sonar.db.user.UserTesting.newLocalUser; @@ -633,21 +631,6 @@ public class UserUpdaterCreateTest { } @Test - public void create_personal_organization_when_creating_user() { - createDefaultGroup(); - - UserDto dto = underTest.createAndCommit(db.getSession(), NewUser.builder() - .setLogin("user") - .setName("User") - .setEmail("user@mail.com") - .setPassword("PASSWORD") - .build(), u -> { - }); - - verify(organizationUpdater).createForUser(any(DbSession.class), eq(dto)); - } - - @Test public void add_user_as_member_of_default_organization_when_creating_user_and_organizations_are_disabled() { createDefaultGroup(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java index 8aeaf3c7403..3cf1855426d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java @@ -25,13 +25,11 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.mockito.ArgumentCaptor; import org.sonar.api.config.internal.MapSettings; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; import org.sonar.api.utils.internal.AlwaysIncreasingSystem2; import org.sonar.core.config.CorePropertyDefinitions; -import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; @@ -60,9 +58,7 @@ import static java.util.Optional.ofNullable; import static org.assertj.core.api.Assertions.assertThat; import static org.elasticsearch.index.query.QueryBuilders.boolQuery; import static org.elasticsearch.index.query.QueryBuilders.termQuery; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; import static org.sonar.db.user.UserTesting.newUserDto; import static org.sonar.server.user.index.UserIndexDefinition.FIELD_EMAIL; import static org.sonar.server.user.index.UserIndexDefinition.FIELD_LOGIN; @@ -136,20 +132,6 @@ public class CreateActionTest { } @Test - public void create_user_calls_create_personal_organization_if_personal_organizations_are_enabled() { - logInAsSystemAdministrator(); - enableCreatePersonalOrg(true); - assertACallToOrganizationCreationWhenUserIsCreated(); - } - - @Test - public void create_user_calls_create_personal_organization_if_personal_organizations_are_disabled() { - logInAsSystemAdministrator(); - enableCreatePersonalOrg(false); - assertACallToOrganizationCreationWhenUserIsCreated(); - } - - @Test public void create_user_associates_him_to_default_organization() { logInAsSystemAdministrator(); enableCreatePersonalOrg(true); @@ -398,21 +380,6 @@ public class CreateActionTest { .build()); } - private void assertACallToOrganizationCreationWhenUserIsCreated() { - call(CreateRequest.builder() - .setLogin("john") - .setName("John") - .setPassword("1234") - .build()); - - Optional<UserDto> dbUser = db.users().selectUserByLogin("john"); - assertThat(dbUser).isPresent(); - - ArgumentCaptor<UserDto> userCaptor = ArgumentCaptor.forClass(UserDto.class); - verify(organizationUpdater).createForUser(any(DbSession.class), userCaptor.capture()); - assertThat(userCaptor.getValue().getId()).isEqualTo(dbUser.get().getId()); - } - private void logInAsSystemAdministrator() { userSessionRule.logIn().setSystemAdministrator(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateLoginActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateLoginActionTest.java index 782a680c38f..c7f89fc8e42 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateLoginActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateLoginActionTest.java @@ -61,9 +61,8 @@ public class UpdateLoginActionTest { @Rule public ExpectedException expectedException = ExpectedException.none(); - private MapSettings settings = new MapSettings(); private OrganizationUpdater organizationUpdater = new OrganizationUpdaterImpl(db.getDbClient(), mock(System2.class), UuidFactoryFast.getInstance(), - new OrganizationValidationImpl(), settings.asConfig(), null, null, null, null); + new OrganizationValidationImpl(), null, null, null, null); private WsActionTester ws = new WsActionTester(new UpdateLoginAction(db.getDbClient(), userSession, new UserUpdater(system2, mock(NewUserNotifier.class), db.getDbClient(), new UserIndexer(db.getDbClient(), es.client()), |