mirror of
https://github.com/bitwarden/server.git
synced 2024-11-22 12:15:36 +01:00
Check canScale when scaling for sso (#1661)
* Check canScale when scaling for sso * PR review Use AutoAddSeats to add seats in a consistent way. This requires moving user check out of that method. * User logic moved out of method
This commit is contained in:
parent
c5d5601464
commit
8f0115e62f
@ -483,12 +483,7 @@ namespace Bit.Sso.Controllers
|
|||||||
throw new Exception("Cannot autoscale on self-hosted instance.");
|
throw new Exception("Cannot autoscale on self-hosted instance.");
|
||||||
}
|
}
|
||||||
|
|
||||||
var paymentIntentClientSecret = await _organizationService.AdjustSeatsAsync(orgId, 1, prorationDate);
|
await _organizationService.AutoAddSeatsAsync(organization, 1, prorationDate);
|
||||||
organization = await _organizationRepository.GetByIdAsync(orgId);
|
|
||||||
if (!string.IsNullOrEmpty(paymentIntentClientSecret))
|
|
||||||
{
|
|
||||||
throw new Exception("Stripe payment required client-side confirmation.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,7 @@ namespace Bit.Core.Services
|
|||||||
Task<Tuple<bool, string>> UpgradePlanAsync(Guid organizationId, OrganizationUpgrade upgrade);
|
Task<Tuple<bool, string>> UpgradePlanAsync(Guid organizationId, OrganizationUpgrade upgrade);
|
||||||
Task<string> AdjustStorageAsync(Guid organizationId, short storageAdjustmentGb);
|
Task<string> AdjustStorageAsync(Guid organizationId, short storageAdjustmentGb);
|
||||||
Task UpdateSubscription(Guid organizationId, int seatAdjustment, int? maxAutoscaleSeats);
|
Task UpdateSubscription(Guid organizationId, int seatAdjustment, int? maxAutoscaleSeats);
|
||||||
|
Task AutoAddSeatsAsync(Organization organization, int seatsToAdd, DateTime? prorationDate = null);
|
||||||
Task<string> AdjustSeatsAsync(Guid organizationId, int seatAdjustment, DateTime? prorationDate = null);
|
Task<string> AdjustSeatsAsync(Guid organizationId, int seatAdjustment, DateTime? prorationDate = null);
|
||||||
Task VerifyBankAsync(Guid organizationId, int amount1, int amount2);
|
Task VerifyBankAsync(Guid organizationId, int amount1, int amount2);
|
||||||
Task<Tuple<Organization, OrganizationUser>> SignUpAsync(OrganizationSignup organizationSignup, bool provider = false);
|
Task<Tuple<Organization, OrganizationUser>> SignUpAsync(OrganizationSignup organizationSignup, bool provider = false);
|
||||||
|
@ -1074,7 +1074,7 @@ namespace Bit.Core.Services
|
|||||||
|
|
||||||
if (newSeatsRequired > 0)
|
if (newSeatsRequired > 0)
|
||||||
{
|
{
|
||||||
var (canScale, failureReason) = await CanScaleAsync(organization, newSeatsRequired);
|
var (canScale, failureReason) = CanScale(organization, newSeatsRequired);
|
||||||
if (!canScale)
|
if (!canScale)
|
||||||
{
|
{
|
||||||
throw new BadRequestException(failureReason);
|
throw new BadRequestException(failureReason);
|
||||||
@ -1160,6 +1160,11 @@ namespace Bit.Core.Services
|
|||||||
await _organizationUserRepository.CreateAsync(orgUser, collections);
|
await _organizationUserRepository.CreateAsync(orgUser, collections);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!await _currentContext.ManageUsers(organization.Id))
|
||||||
|
{
|
||||||
|
throw new BadRequestException("Cannot add seats. Cannot manage organization users.");
|
||||||
|
}
|
||||||
|
|
||||||
await AutoAddSeatsAsync(organization, newSeatsRequired, prorationDate);
|
await AutoAddSeatsAsync(organization, newSeatsRequired, prorationDate);
|
||||||
await SendInvitesAsync(orgUsers, organization);
|
await SendInvitesAsync(orgUsers, organization);
|
||||||
await _eventService.LogOrganizationUserEventsAsync(events);
|
await _eventService.LogOrganizationUserEventsAsync(events);
|
||||||
@ -1454,7 +1459,8 @@ namespace Bit.Core.Services
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task<(bool canScale, string failureReason)> CanScaleAsync(Organization organization, int seatsToAdd)
|
internal (bool canScale, string failureReason) CanScale(Organization organization,
|
||||||
|
int seatsToAdd)
|
||||||
{
|
{
|
||||||
var failureReason = "";
|
var failureReason = "";
|
||||||
if (_globalSettings.SelfHosted)
|
if (_globalSettings.SelfHosted)
|
||||||
@ -1463,12 +1469,6 @@ namespace Bit.Core.Services
|
|||||||
return (false, failureReason);
|
return (false, failureReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!await _currentContext.ManageUsers(organization.Id))
|
|
||||||
{
|
|
||||||
failureReason = "Cannot manage organization users.";
|
|
||||||
return (false, failureReason);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (seatsToAdd < 1)
|
if (seatsToAdd < 1)
|
||||||
{
|
{
|
||||||
return (true, failureReason);
|
return (true, failureReason);
|
||||||
@ -1484,14 +1484,14 @@ namespace Bit.Core.Services
|
|||||||
return (true, failureReason);
|
return (true, failureReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AutoAddSeatsAsync(Organization organization, int seatsToAdd, DateTime? prorationDate = null)
|
public async Task AutoAddSeatsAsync(Organization organization, int seatsToAdd, DateTime? prorationDate = null)
|
||||||
{
|
{
|
||||||
if (seatsToAdd < 1 || !organization.Seats.HasValue)
|
if (seatsToAdd < 1 || !organization.Seats.HasValue)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var (canScale, failureMessage) = await CanScaleAsync(organization, seatsToAdd);
|
var (canScale, failureMessage) = CanScale(organization, seatsToAdd);
|
||||||
if (!canScale)
|
if (!canScale)
|
||||||
{
|
{
|
||||||
throw new BadRequestException(failureMessage);
|
throw new BadRequestException(failureMessage);
|
||||||
|
@ -868,7 +868,7 @@ namespace Bit.Core.Test.Services
|
|||||||
organization.MaxAutoscaleSeats = maxAutoscaleSeats;
|
organization.MaxAutoscaleSeats = maxAutoscaleSeats;
|
||||||
sutProvider.GetDependency<ICurrentContext>().ManageUsers(organization.Id).Returns(true);
|
sutProvider.GetDependency<ICurrentContext>().ManageUsers(organization.Id).Returns(true);
|
||||||
|
|
||||||
var (result, failureMessage) = await sutProvider.Sut.CanScaleAsync(organization, seatsToAdd);
|
var (result, failureMessage) = sutProvider.Sut.CanScale(organization, seatsToAdd);
|
||||||
|
|
||||||
if (expectedFailureMessage == string.Empty)
|
if (expectedFailureMessage == string.Empty)
|
||||||
{
|
{
|
||||||
@ -886,23 +886,10 @@ namespace Bit.Core.Test.Services
|
|||||||
SutProvider<OrganizationService> sutProvider)
|
SutProvider<OrganizationService> sutProvider)
|
||||||
{
|
{
|
||||||
sutProvider.GetDependency<IGlobalSettings>().SelfHosted.Returns(true);
|
sutProvider.GetDependency<IGlobalSettings>().SelfHosted.Returns(true);
|
||||||
var (result, failureMessage) = await sutProvider.Sut.CanScaleAsync(organization, 10);
|
var (result, failureMessage) = sutProvider.Sut.CanScale(organization, 10);
|
||||||
|
|
||||||
Assert.False(result);
|
Assert.False(result);
|
||||||
Assert.Contains("Cannot autoscale on self-hosted instance", failureMessage);
|
Assert.Contains("Cannot autoscale on self-hosted instance", failureMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Theory, PaidOrganizationAutoData]
|
|
||||||
public async Task CanScale_FailsIfCannotManageUsers(Organization organization,
|
|
||||||
SutProvider<OrganizationService> sutProvider)
|
|
||||||
{
|
|
||||||
organization.MaxAutoscaleSeats = null;
|
|
||||||
sutProvider.GetDependency<ICurrentContext>().ManageUsers(organization.Id).Returns(false);
|
|
||||||
|
|
||||||
var (result, failureMessage) = await sutProvider.Sut.CanScaleAsync(organization, 10);
|
|
||||||
|
|
||||||
Assert.False(result);
|
|
||||||
Assert.Contains("Cannot manage organization users", failureMessage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user