mirror of
https://github.com/bitwarden/server.git
synced 2024-11-25 12:45:18 +01:00
PM-5340 - Fix bug where new enterprise orgs without an SSO config couldn't invite new users as I was missing null SSO config handling. (#3593)
This commit is contained in:
parent
4d14e5a789
commit
c2d36cb28b
@ -1118,7 +1118,7 @@ public class OrganizationService : IOrganizationService
|
|||||||
|
|
||||||
// Determine if org has SSO enabled and if user is required to login with SSO
|
// Determine if org has SSO enabled and if user is required to login with SSO
|
||||||
// Note: we only want to call the DB after checking if the org can use SSO per plan and if they have any policies enabled.
|
// Note: we only want to call the DB after checking if the org can use SSO per plan and if they have any policies enabled.
|
||||||
var orgSsoEnabled = organization.UseSso && (await _ssoConfigRepository.GetByOrganizationIdAsync(organization.Id)).Enabled;
|
var orgSsoEnabled = organization.UseSso && (await _ssoConfigRepository.GetByOrganizationIdAsync(organization.Id))?.Enabled == true;
|
||||||
// Even though the require SSO policy can be turned on regardless of SSO being enabled, for this logic, we only
|
// Even though the require SSO policy can be turned on regardless of SSO being enabled, for this logic, we only
|
||||||
// need to check the policy if the org has SSO enabled.
|
// need to check the policy if the org has SSO enabled.
|
||||||
var orgSsoLoginRequiredPolicyEnabled = orgSsoEnabled &&
|
var orgSsoLoginRequiredPolicyEnabled = orgSsoEnabled &&
|
||||||
|
@ -432,6 +432,55 @@ public class OrganizationServiceTests
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[OrganizationInviteCustomize, BitAutoData]
|
||||||
|
public async Task InviteUser_SsoOrgWithNullSsoConfig_Passes(Organization organization, OrganizationUser invitor,
|
||||||
|
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.Owner)] OrganizationUser owner,
|
||||||
|
OrganizationUserInvite invite, SutProvider<OrganizationService> sutProvider)
|
||||||
|
{
|
||||||
|
// Setup FakeDataProtectorTokenFactory for creating new tokens - this must come first in order to avoid resetting mocks
|
||||||
|
sutProvider.SetDependency(_orgUserInviteTokenDataFactory, "orgUserInviteTokenDataFactory");
|
||||||
|
sutProvider.Create();
|
||||||
|
|
||||||
|
// Org must be able to use SSO to trigger this proper test case as we currently only call to retrieve
|
||||||
|
// an org's SSO config if the org can use SSO
|
||||||
|
organization.UseSso = true;
|
||||||
|
|
||||||
|
// Return null for sso config
|
||||||
|
sutProvider.GetDependency<ISsoConfigRepository>().GetByOrganizationIdAsync(organization.Id).ReturnsNull();
|
||||||
|
|
||||||
|
sutProvider.GetDependency<IOrganizationRepository>().GetByIdAsync(organization.Id).Returns(organization);
|
||||||
|
sutProvider.GetDependency<ICurrentContext>().OrganizationOwner(organization.Id).Returns(true);
|
||||||
|
sutProvider.GetDependency<ICurrentContext>().ManageUsers(organization.Id).Returns(true);
|
||||||
|
var organizationUserRepository = sutProvider.GetDependency<IOrganizationUserRepository>();
|
||||||
|
organizationUserRepository.GetManyByOrganizationAsync(organization.Id, OrganizationUserType.Owner)
|
||||||
|
.Returns(new[] { owner });
|
||||||
|
|
||||||
|
// Must set guids in order for dictionary of guids to not throw aggregate exceptions
|
||||||
|
SetupOrgUserRepositoryCreateManyAsyncMock(organizationUserRepository);
|
||||||
|
|
||||||
|
// Mock tokenable factory to return a token that expires in 5 days
|
||||||
|
sutProvider.GetDependency<IOrgUserInviteTokenableFactory>()
|
||||||
|
.CreateToken(Arg.Any<OrganizationUser>())
|
||||||
|
.Returns(
|
||||||
|
info => new OrgUserInviteTokenable(info.Arg<OrganizationUser>())
|
||||||
|
{
|
||||||
|
ExpirationDate = DateTime.UtcNow.Add(TimeSpan.FromDays(5))
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
await sutProvider.Sut.InviteUsersAsync(organization.Id, invitor.UserId, new (OrganizationUserInvite, string)[] { (invite, null) });
|
||||||
|
|
||||||
|
await sutProvider.GetDependency<IMailService>().Received(1)
|
||||||
|
.SendOrganizationInviteEmailsAsync(Arg.Is<OrganizationInvitesInfo>(info =>
|
||||||
|
info.OrgUserTokenPairs.Count() == invite.Emails.Distinct().Count() &&
|
||||||
|
info.IsFreeOrg == (organization.PlanType == PlanType.Free) &&
|
||||||
|
info.OrganizationName == organization.Name));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[OrganizationInviteCustomize(
|
[OrganizationInviteCustomize(
|
||||||
InviteeUserType = OrganizationUserType.Admin,
|
InviteeUserType = OrganizationUserType.Admin,
|
||||||
|
Loading…
Reference in New Issue
Block a user