1
0
mirror of https://github.com/bitwarden/server.git synced 2025-07-27 20:41:16 -05:00

[PM-22580] Org/User License Codeownership Move (No logic changes) (#6080)

* Moved license models to billing

* Moved LicensingService to billing

* Moved license command and queries to billing

* Moved LicenseController to billing
This commit is contained in:
Conner Turnbull
2025-07-11 16:41:32 -04:00
committed by GitHub
parent 24b7cc417f
commit 9b65e9f4cc
45 changed files with 111 additions and 86 deletions

View File

@ -8,9 +8,9 @@ using Bit.Admin.Models;
using Bit.Admin.Utilities; using Bit.Admin.Utilities;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Repositories; using Bit.Core.AdminConsole.Repositories;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Models.BitStripe; using Bit.Core.Models.BitStripe;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Platform.Installations; using Bit.Core.Platform.Installations;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services; using Bit.Core.Services;

View File

@ -5,13 +5,13 @@ using Bit.Api.AdminConsole.Models.Request.Organizations;
using Bit.Api.AdminConsole.Models.Response.Organizations; using Bit.Api.AdminConsole.Models.Response.Organizations;
using Bit.Core.AdminConsole.Models.OrganizationConnectionConfigs; using Bit.Core.AdminConsole.Models.OrganizationConnectionConfigs;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationConnections.Interfaces; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationConnections.Interfaces;
using Bit.Core.Billing.Services;
using Bit.Core.Context; using Bit.Core.Context;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.OrganizationConnectionConfigs; using Bit.Core.Models.OrganizationConnectionConfigs;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;

View File

@ -5,6 +5,7 @@ using System.Text.Json.Serialization;
using Bit.Api.Models.Response; using Bit.Api.Models.Response;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Models.Api; using Bit.Core.Models.Api;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
using Bit.Core.Models.StaticStore; using Bit.Core.Models.StaticStore;

View File

@ -5,6 +5,7 @@ using Bit.Api.Models.Response;
using Bit.Api.Utilities; using Bit.Api.Utilities;
using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces; using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces;
using Bit.Core.Billing.Models; using Bit.Core.Billing.Models;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.Services; using Bit.Core.Billing.Services;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;

View File

@ -2,18 +2,18 @@
#nullable disable #nullable disable
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationConnections.Interfaces; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationConnections.Interfaces;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Context; using Bit.Core.Context;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Api.OrganizationLicenses; using Bit.Core.Models.Api.OrganizationLicenses;
using Bit.Core.Models.Business;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace Bit.Api.Controllers; namespace Bit.Api.Billing.Controllers;
[Route("licenses")] [Route("licenses")]
[Authorize("Licensing")] [Authorize("Licensing")]

View File

@ -11,6 +11,8 @@ using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Constants; using Bit.Core.Billing.Constants;
using Bit.Core.Billing.Entities; using Bit.Core.Billing.Entities;
using Bit.Core.Billing.Models; using Bit.Core.Billing.Models;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Billing.Pricing; using Bit.Core.Billing.Pricing;
using Bit.Core.Billing.Repositories; using Bit.Core.Billing.Repositories;
using Bit.Core.Billing.Services; using Bit.Core.Billing.Services;
@ -18,7 +20,6 @@ using Bit.Core.Context;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface; using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services; using Bit.Core.Services;

View File

@ -5,12 +5,12 @@ using Bit.Api.AdminConsole.Models.Response.Organizations;
using Bit.Api.Models.Request; using Bit.Api.Models.Request;
using Bit.Api.Models.Request.Organizations; using Bit.Api.Models.Request.Organizations;
using Bit.Api.Utilities; using Bit.Api.Utilities;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Context; using Bit.Core.Context;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business;
using Bit.Core.Models.OrganizationConnectionConfigs; using Bit.Core.Models.OrganizationConnectionConfigs;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Utilities; using Bit.Core.Utilities;

View File

@ -1,12 +1,12 @@
// FIXME: Update this file to be null safe and then delete the line below // FIXME: Update this file to be null safe and then delete the line below
#nullable disable #nullable disable
using Bit.Core.Billing.Services;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Jobs; using Bit.Core.Jobs;
using Bit.Core.Models.OrganizationConnectionConfigs; using Bit.Core.Models.OrganizationConnectionConfigs;
using Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnterprise.Interfaces; using Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnterprise.Interfaces;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Quartz; using Quartz;

View File

@ -1,5 +1,5 @@
using Bit.Core.Jobs; using Bit.Core.Billing.Services;
using Bit.Core.Services; using Bit.Core.Jobs;
using Quartz; using Quartz;
namespace Bit.Api.Jobs; namespace Bit.Api.Jobs;

View File

@ -1,5 +1,5 @@
using Bit.Core.Jobs; using Bit.Core.Billing.Services;
using Bit.Core.Services; using Bit.Core.Jobs;
using Quartz; using Quartz;
namespace Bit.Api.Jobs; namespace Bit.Api.Jobs;

View File

@ -1,6 +1,7 @@
// FIXME: Update this file to be null safe and then delete the line below // FIXME: Update this file to be null safe and then delete the line below
#nullable disable #nullable disable
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Models.Api; using Bit.Core.Models.Api;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;

View File

@ -4,9 +4,9 @@ using System.Text.Json;
using Bit.Core.Auth.Enums; using Bit.Core.Auth.Enums;
using Bit.Core.Auth.Models; using Bit.Core.Auth.Models;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.Business;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Utilities; using Bit.Core.Utilities;

View File

@ -6,9 +6,9 @@ using Bit.Core.AdminConsole.Enums;
using Bit.Core.AdminConsole.Models.OrganizationConnectionConfigs; using Bit.Core.AdminConsole.Models.OrganizationConnectionConfigs;
using Bit.Core.Auth.Entities; using Bit.Core.Auth.Entities;
using Bit.Core.Auth.Enums; using Bit.Core.Auth.Enums;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.Business;
namespace Bit.Core.Models.Data.Organizations; namespace Bit.Core.Models.Data.Organizations;

View File

@ -4,6 +4,7 @@
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Models.Business; using Bit.Core.AdminConsole.Models.Business;
using Bit.Core.Auth.Enums; using Bit.Core.Auth.Enums;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;

View File

@ -20,7 +20,9 @@ using Bit.Core.Auth.Repositories;
using Bit.Core.Billing.Constants; using Bit.Core.Billing.Constants;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Extensions; using Bit.Core.Billing.Extensions;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.Pricing; using Bit.Core.Billing.Pricing;
using Bit.Core.Billing.Services;
using Bit.Core.Context; using Bit.Core.Context;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;

View File

@ -3,9 +3,9 @@ using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Licenses; using Bit.Core.Billing.Licenses;
using Bit.Core.Billing.Licenses.Extensions; using Bit.Core.Billing.Licenses.Extensions;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.Business;
namespace Bit.Core.AdminConsole.Services; namespace Bit.Core.AdminConsole.Services;

View File

@ -1,6 +1,9 @@
using Bit.Core.Billing.Caches; using Bit.Core.Billing.Caches;
using Bit.Core.Billing.Caches.Implementations; using Bit.Core.Billing.Caches.Implementations;
using Bit.Core.Billing.Licenses.Extensions; using Bit.Core.Billing.Licenses.Extensions;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.SelfHosted;
using Bit.Core.Billing.Payment; using Bit.Core.Billing.Payment;
using Bit.Core.Billing.Pricing; using Bit.Core.Billing.Pricing;
using Bit.Core.Billing.Services; using Bit.Core.Billing.Services;
@ -29,5 +32,13 @@ public static class ServiceCollectionExtensions
services.AddPricingClient(); services.AddPricingClient();
services.AddTransient<IPreviewTaxAmountCommand, PreviewTaxAmountCommand>(); services.AddTransient<IPreviewTaxAmountCommand, PreviewTaxAmountCommand>();
services.AddPaymentOperations(); services.AddPaymentOperations();
services.AddOrganizationLicenseCommandsQueries();
}
private static void AddOrganizationLicenseCommandsQueries(this IServiceCollection services)
{
services.AddScoped<ICloudGetOrganizationLicenseQuery, CloudGetOrganizationLicenseQuery>();
services.AddScoped<ISelfHostedGetOrganizationLicenseQuery, SelfHostedGetOrganizationLicenseQuery>();
services.AddScoped<IUpdateOrganizationLicenseCommand, UpdateOrganizationLicenseCommand>();
} }
} }

View File

@ -1,6 +1,6 @@
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
namespace Bit.Core.Models.Business; namespace Bit.Core.Billing.Models.Business;
public interface ILicense public interface ILicense
{ {

View File

@ -10,11 +10,12 @@ using System.Text.Json.Serialization;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Licenses.Extensions; using Bit.Core.Billing.Licenses.Extensions;
using Bit.Core.Billing.Services;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Services; using Bit.Core.Models.Business;
using Bit.Core.Settings; using Bit.Core.Settings;
namespace Bit.Core.Models.Business; namespace Bit.Core.Billing.Models.Business;
public class OrganizationLicense : ILicense public class OrganizationLicense : ILicense
{ {
@ -54,7 +55,7 @@ public class OrganizationLicense : ILicense
ILicensingService licenseService, int? version = null) ILicensingService licenseService, int? version = null)
{ {
Version = version.GetValueOrDefault(CurrentLicenseFileVersion); // TODO: Remember to change the constant Version = version.GetValueOrDefault(CurrentLicenseFileVersion); // TODO: Remember to change the constant
LicenseType = Enums.LicenseType.Organization; LicenseType = Core.Enums.LicenseType.Organization;
LicenseKey = org.LicenseKey; LicenseKey = org.LicenseKey;
InstallationId = installationId; InstallationId = installationId;
Id = org.Id; Id = org.Id;
@ -124,7 +125,7 @@ public class OrganizationLicense : ILicense
subscriptionInfo.Subscription.PeriodDuration > TimeSpan.FromDays(180)) subscriptionInfo.Subscription.PeriodDuration > TimeSpan.FromDays(180))
{ {
Refresh = DateTime.UtcNow.AddDays(30); Refresh = DateTime.UtcNow.AddDays(30);
Expires = subscriptionInfo.Subscription.PeriodEndDate?.AddDays(Constants Expires = subscriptionInfo.Subscription.PeriodEndDate?.AddDays(Core.Constants
.OrganizationSelfHostSubscriptionGracePeriodDays); .OrganizationSelfHostSubscriptionGracePeriodDays);
ExpirationWithoutGracePeriod = subscriptionInfo.Subscription.PeriodEndDate; ExpirationWithoutGracePeriod = subscriptionInfo.Subscription.PeriodEndDate;
} }
@ -263,7 +264,7 @@ public class OrganizationLicense : ILicense
!p.Name.Equals(nameof(UseAdminSponsoredFamilies)) && !p.Name.Equals(nameof(UseAdminSponsoredFamilies)) &&
!p.Name.Equals(nameof(UseOrganizationDomains))) !p.Name.Equals(nameof(UseOrganizationDomains)))
.OrderBy(p => p.Name) .OrderBy(p => p.Name)
.Select(p => $"{p.Name}:{Utilities.CoreHelpers.FormatLicenseSignatureValue(p.GetValue(this, null))}") .Select(p => $"{p.Name}:{Core.Utilities.CoreHelpers.FormatLicenseSignatureValue(p.GetValue(this, null))}")
.Aggregate((c, n) => $"{c}|{n}"); .Aggregate((c, n) => $"{c}|{n}");
data = $"license:organization|{props}"; data = $"license:organization|{props}";
} }
@ -315,7 +316,7 @@ public class OrganizationLicense : ILicense
} }
var licenseType = claimsPrincipal.GetValue<LicenseType>(nameof(LicenseType)); var licenseType = claimsPrincipal.GetValue<LicenseType>(nameof(LicenseType));
if (licenseType != Enums.LicenseType.Organization) if (licenseType != Core.Enums.LicenseType.Organization)
{ {
errorMessages.AppendLine("Premium licenses cannot be applied to an organization. " + errorMessages.AppendLine("Premium licenses cannot be applied to an organization. " +
"Upload this license from your personal account settings page."); "Upload this license from your personal account settings page.");
@ -396,7 +397,7 @@ public class OrganizationLicense : ILicense
errorMessages.AppendLine("The license does not allow for on-premise hosting of organizations."); errorMessages.AppendLine("The license does not allow for on-premise hosting of organizations.");
} }
if (LicenseType != null && LicenseType != Enums.LicenseType.Organization) if (LicenseType != null && LicenseType != Core.Enums.LicenseType.Organization)
{ {
errorMessages.AppendLine("Premium licenses cannot be applied to an organization. " + errorMessages.AppendLine("Premium licenses cannot be applied to an organization. " +
"Upload this license from your personal account settings page."); "Upload this license from your personal account settings page.");

View File

@ -8,11 +8,12 @@ using System.Security.Cryptography.X509Certificates;
using System.Text; using System.Text;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Bit.Core.Billing.Licenses.Extensions; using Bit.Core.Billing.Licenses.Extensions;
using Bit.Core.Billing.Services;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Services; using Bit.Core.Models.Business;
namespace Bit.Core.Models.Business; namespace Bit.Core.Billing.Models.Business;
public class UserLicense : ILicense public class UserLicense : ILicense
{ {
@ -22,7 +23,7 @@ public class UserLicense : ILicense
public UserLicense(User user, SubscriptionInfo subscriptionInfo, ILicensingService licenseService, public UserLicense(User user, SubscriptionInfo subscriptionInfo, ILicensingService licenseService,
int? version = null) int? version = null)
{ {
LicenseType = Enums.LicenseType.User; LicenseType = Core.Enums.LicenseType.User;
LicenseKey = user.LicenseKey; LicenseKey = user.LicenseKey;
Id = user.Id; Id = user.Id;
Name = user.Name; Name = user.Name;
@ -44,7 +45,7 @@ public class UserLicense : ILicense
public UserLicense(User user, ILicensingService licenseService, int? version = null) public UserLicense(User user, ILicensingService licenseService, int? version = null)
{ {
LicenseType = Enums.LicenseType.User; LicenseType = Core.Enums.LicenseType.User;
LicenseKey = user.LicenseKey; LicenseKey = user.LicenseKey;
Id = user.Id; Id = user.Id;
Name = user.Name; Name = user.Name;
@ -100,7 +101,7 @@ public class UserLicense : ILicense
) )
)) ))
.OrderBy(p => p.Name) .OrderBy(p => p.Name)
.Select(p => $"{p.Name}:{Utilities.CoreHelpers.FormatLicenseSignatureValue(p.GetValue(this, null))}") .Select(p => $"{p.Name}:{Core.Utilities.CoreHelpers.FormatLicenseSignatureValue(p.GetValue(this, null))}")
.Aggregate((c, n) => $"{c}|{n}"); .Aggregate((c, n) => $"{c}|{n}");
data = $"license:user|{props}"; data = $"license:user|{props}";
} }

View File

@ -3,14 +3,16 @@
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Repositories; using Bit.Core.AdminConsole.Repositories;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Billing.Services;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Platform.Installations; using Bit.Core.Platform.Installations;
using Bit.Core.Services; using Bit.Core.Services;
namespace Bit.Core.OrganizationFeatures.OrganizationLicenses; namespace Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses;
public class CloudGetOrganizationLicenseQuery : ICloudGetOrganizationLicenseQuery public class CloudGetOrganizationLicenseQuery : ICloudGetOrganizationLicenseQuery
{ {

View File

@ -1,8 +1,8 @@
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Models.Business;
namespace Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces; namespace Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
public interface ICloudGetOrganizationLicenseQuery public interface ICloudGetOrganizationLicenseQuery
{ {

View File

@ -1,10 +1,10 @@
#nullable enable #nullable enable
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Models.Business; using Bit.Core.Billing.Models.Business;
using Bit.Core.Models.Data.Organizations; using Bit.Core.Models.Data.Organizations;
namespace Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces; namespace Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
public interface IUpdateOrganizationLicenseCommand public interface IUpdateOrganizationLicenseCommand
{ {

View File

@ -2,18 +2,18 @@
#nullable disable #nullable disable
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Context; using Bit.Core.Context;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Api.OrganizationLicenses; using Bit.Core.Models.Api.OrganizationLicenses;
using Bit.Core.Models.Business;
using Bit.Core.Models.OrganizationConnectionConfigs; using Bit.Core.Models.OrganizationConnectionConfigs;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Bit.Core.OrganizationFeatures.OrganizationLicenses; namespace Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.SelfHosted;
public class SelfHostedGetOrganizationLicenseQuery : BaseIdentityClientService, ISelfHostedGetOrganizationLicenseQuery public class SelfHostedGetOrganizationLicenseQuery : BaseIdentityClientService, ISelfHostedGetOrganizationLicenseQuery
{ {

View File

@ -2,15 +2,16 @@
using System.Text.Json; using System.Text.Json;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Billing.Services;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business;
using Bit.Core.Models.Data.Organizations; using Bit.Core.Models.Data.Organizations;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Bit.Core.Utilities; using Bit.Core.Utilities;
namespace Bit.Core.OrganizationFeatures.OrganizationLicenses; namespace Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses;
public class UpdateOrganizationLicenseCommand : IUpdateOrganizationLicenseCommand public class UpdateOrganizationLicenseCommand : IUpdateOrganizationLicenseCommand
{ {

View File

@ -2,10 +2,11 @@
using System.Security.Claims; using System.Security.Claims;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
namespace Bit.Core.Services; namespace Bit.Core.Billing.Services;
public interface ILicensingService public interface ILicensingService
{ {

View File

@ -9,10 +9,12 @@ using System.Text.Json;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Licenses.Models; using Bit.Core.Billing.Licenses.Models;
using Bit.Core.Billing.Licenses.Services; using Bit.Core.Billing.Licenses.Services;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using IdentityModel; using IdentityModel;
@ -21,7 +23,7 @@ using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
namespace Bit.Core.Services; namespace Bit.Core.Billing.Services;
public class LicensingService : ILicensingService public class LicensingService : ILicensingService
{ {
@ -94,7 +96,7 @@ public class LicensingService : ILicensingService
} }
var enabledOrgs = await _organizationRepository.GetManyByEnabledAsync(); var enabledOrgs = await _organizationRepository.GetManyByEnabledAsync();
_logger.LogInformation(Constants.BypassFiltersEventId, null, _logger.LogInformation(Core.Constants.BypassFiltersEventId, null,
"Validating licenses for {NumberOfOrganizations} organizations.", enabledOrgs.Count); "Validating licenses for {NumberOfOrganizations} organizations.", enabledOrgs.Count);
var exceptions = new List<Exception>(); var exceptions = new List<Exception>();
@ -143,7 +145,7 @@ public class LicensingService : ILicensingService
private async Task DisableOrganizationAsync(Organization org, ILicense license, string reason) private async Task DisableOrganizationAsync(Organization org, ILicense license, string reason)
{ {
_logger.LogInformation(Constants.BypassFiltersEventId, null, _logger.LogInformation(Core.Constants.BypassFiltersEventId, null,
"Organization {0} ({1}) has an invalid license and is being disabled. Reason: {2}", "Organization {0} ({1}) has an invalid license and is being disabled. Reason: {2}",
org.Id, org.DisplayName(), reason); org.Id, org.DisplayName(), reason);
org.Enabled = false; org.Enabled = false;
@ -162,7 +164,7 @@ public class LicensingService : ILicensingService
} }
var premiumUsers = await _userRepository.GetManyByPremiumAsync(true); var premiumUsers = await _userRepository.GetManyByPremiumAsync(true);
_logger.LogInformation(Constants.BypassFiltersEventId, null, _logger.LogInformation(Core.Constants.BypassFiltersEventId, null,
"Validating premium for {0} users.", premiumUsers.Count); "Validating premium for {0} users.", premiumUsers.Count);
foreach (var user in premiumUsers) foreach (var user in premiumUsers)
@ -201,7 +203,7 @@ public class LicensingService : ILicensingService
_userCheckCache.Add(user.Id, now); _userCheckCache.Add(user.Id, now);
} }
_logger.LogInformation(Constants.BypassFiltersEventId, null, _logger.LogInformation(Core.Constants.BypassFiltersEventId, null,
"Validating premium license for user {0}({1}).", user.Id, user.Email); "Validating premium license for user {0}({1}).", user.Id, user.Email);
return await ProcessUserValidationAsync(user); return await ProcessUserValidationAsync(user);
} }
@ -233,7 +235,7 @@ public class LicensingService : ILicensingService
private async Task DisablePremiumAsync(User user, ILicense license, string reason) private async Task DisablePremiumAsync(User user, ILicense license, string reason)
{ {
_logger.LogInformation(Constants.BypassFiltersEventId, null, _logger.LogInformation(Core.Constants.BypassFiltersEventId, null,
"User {0}({1}) has an invalid license and premium is being disabled. Reason: {2}", "User {0}({1}) has an invalid license and premium is being disabled. Reason: {2}",
user.Id, user.Email, reason); user.Id, user.Email, reason);

View File

@ -2,13 +2,14 @@
using System.Security.Claims; using System.Security.Claims;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
using Bit.Core.Settings; using Bit.Core.Settings;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
namespace Bit.Core.Services; namespace Bit.Core.Billing.Services;
public class NoopLicensingService : ILicensingService public class NoopLicensingService : ILicensingService
{ {

View File

@ -22,8 +22,6 @@ using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.RestoreUser.v
using Bit.Core.Models.Business.Tokenables; using Bit.Core.Models.Business.Tokenables;
using Bit.Core.OrganizationFeatures.OrganizationCollections; using Bit.Core.OrganizationFeatures.OrganizationCollections;
using Bit.Core.OrganizationFeatures.OrganizationCollections.Interfaces; using Bit.Core.OrganizationFeatures.OrganizationCollections.Interfaces;
using Bit.Core.OrganizationFeatures.OrganizationLicenses;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnterprise; using Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnterprise;
using Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnterprise.Cloud; using Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnterprise.Cloud;
using Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnterprise.Interfaces; using Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnterprise.Interfaces;
@ -56,7 +54,6 @@ public static class OrganizationServiceCollectionExtensions
services.AddOrganizationApiKeyCommandsQueries(); services.AddOrganizationApiKeyCommandsQueries();
services.AddOrganizationCollectionCommands(); services.AddOrganizationCollectionCommands();
services.AddOrganizationGroupCommands(); services.AddOrganizationGroupCommands();
services.AddOrganizationLicenseCommandsQueries();
services.AddOrganizationDomainCommandsQueries(); services.AddOrganizationDomainCommandsQueries();
services.AddOrganizationSignUpCommands(); services.AddOrganizationSignUpCommands();
services.AddOrganizationDeleteCommands(); services.AddOrganizationDeleteCommands();
@ -157,13 +154,6 @@ public static class OrganizationServiceCollectionExtensions
services.AddScoped<IUpdateGroupCommand, UpdateGroupCommand>(); services.AddScoped<IUpdateGroupCommand, UpdateGroupCommand>();
} }
private static void AddOrganizationLicenseCommandsQueries(this IServiceCollection services)
{
services.AddScoped<ICloudGetOrganizationLicenseQuery, CloudGetOrganizationLicenseQuery>();
services.AddScoped<ISelfHostedGetOrganizationLicenseQuery, SelfHostedGetOrganizationLicenseQuery>();
services.AddScoped<IUpdateOrganizationLicenseCommand, UpdateOrganizationLicenseCommand>();
}
private static void AddOrganizationDomainCommandsQueries(this IServiceCollection services) private static void AddOrganizationDomainCommandsQueries(this IServiceCollection services)
{ {
services.AddScoped<ICreateOrganizationDomainCommand, CreateOrganizationDomainCommand>(); services.AddScoped<ICreateOrganizationDomainCommand, CreateOrganizationDomainCommand>();

View File

@ -5,6 +5,7 @@ using System.Security.Claims;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Auth.Enums; using Bit.Core.Auth.Enums;
using Bit.Core.Auth.Models; using Bit.Core.Auth.Models;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;

View File

@ -16,6 +16,7 @@ using Bit.Core.Auth.Models;
using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces; using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces;
using Bit.Core.Billing.Constants; using Bit.Core.Billing.Constants;
using Bit.Core.Billing.Models; using Bit.Core.Billing.Models;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.Models.Sales; using Bit.Core.Billing.Models.Sales;
using Bit.Core.Billing.Services; using Bit.Core.Billing.Services;
using Bit.Core.Billing.Tax.Models; using Bit.Core.Billing.Tax.Models;

View File

@ -3,10 +3,10 @@
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Security.Claims; using System.Security.Claims;
using Bit.Core.AdminConsole.Repositories; using Bit.Core.AdminConsole.Repositories;
using Bit.Core.Billing.Services;
using Bit.Core.Context; using Bit.Core.Context;
using Bit.Core.Identity; using Bit.Core.Identity;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using Duende.IdentityServer.Models; using Duende.IdentityServer.Models;
using IdentityModel; using IdentityModel;

View File

@ -3,6 +3,7 @@
using System.Security.Claims; using System.Security.Claims;
using Bit.Core.AdminConsole.Repositories; using Bit.Core.AdminConsole.Repositories;
using Bit.Core.Billing.Services;
using Bit.Core.Context; using Bit.Core.Context;
using Bit.Core.Identity; using Bit.Core.Identity;
using Bit.Core.Repositories; using Bit.Core.Repositories;

View File

@ -4,14 +4,14 @@ using Bit.Api.AdminConsole.Models.Request.Organizations;
using Bit.Api.AdminConsole.Models.Response.Organizations; using Bit.Api.AdminConsole.Models.Response.Organizations;
using Bit.Core.AdminConsole.Models.OrganizationConnectionConfigs; using Bit.Core.AdminConsole.Models.OrganizationConnectionConfigs;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationConnections.Interfaces; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationConnections.Interfaces;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.Services;
using Bit.Core.Context; using Bit.Core.Context;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business;
using Bit.Core.Models.OrganizationConnectionConfigs; using Bit.Core.Models.OrganizationConnectionConfigs;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.AutoFixture.Attributes;

View File

@ -10,6 +10,7 @@ using Bit.Core.Auth.Enums;
using Bit.Core.Auth.Models.Data; using Bit.Core.Auth.Models.Data;
using Bit.Core.Auth.Repositories; using Bit.Core.Auth.Repositories;
using Bit.Core.Auth.Services; using Bit.Core.Auth.Services;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.Billing.Pricing; using Bit.Core.Billing.Pricing;
using Bit.Core.Billing.Repositories; using Bit.Core.Billing.Repositories;
using Bit.Core.Billing.Services; using Bit.Core.Billing.Services;
@ -19,7 +20,6 @@ using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
using Bit.Core.Models.Data.Organizations.OrganizationUsers; using Bit.Core.Models.Data.Organizations.OrganizationUsers;
using Bit.Core.OrganizationFeatures.OrganizationLicenses.Interfaces;
using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface; using Bit.Core.OrganizationFeatures.OrganizationSubscriptions.Interface;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Services; using Bit.Core.Services;

View File

@ -1,6 +1,6 @@
using System.Text; using System.Text;
using Bit.Api.Utilities; using Bit.Api.Utilities;
using Bit.Core.Models.Business; using Bit.Core.Billing.Models.Business;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using NSubstitute; using NSubstitute;
using Xunit; using Xunit;

View File

@ -5,11 +5,11 @@ using Bit.Core.Auth.Entities;
using Bit.Core.Auth.Enums; using Bit.Core.Auth.Enums;
using Bit.Core.Auth.Models.Data; using Bit.Core.Auth.Models.Data;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.Business;
using Bit.Core.Models.Data.Organizations; using Bit.Core.Models.Data.Organizations;
using Bit.Core.Test.AutoFixture; using Bit.Core.Test.Billing.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.AutoFixture.Attributes;
using Xunit; using Xunit;

View File

@ -1,8 +1,8 @@
using AutoFixture; using AutoFixture;
using Bit.Core.Models.Business; using Bit.Core.Billing.Models.Business;
using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.AutoFixture.Attributes;
namespace Bit.Core.Test.AutoFixture; namespace Bit.Core.Test.Billing.AutoFixture;
public class OrganizationLicenseCustomizeAttribute : BitCustomizeAttribute public class OrganizationLicenseCustomizeAttribute : BitCustomizeAttribute
{ {

View File

@ -1,10 +1,10 @@
using System.Text.Json; using System.Text.Json;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.Business;
namespace Bit.Core.Test.Models.Business; namespace Bit.Core.Test.Billing.Models.Business;
/// <summary> /// <summary>
/// Contains test data for OrganizationLicense tests, including json strings for each OrganizationLicense version. /// Contains test data for OrganizationLicense tests, including json strings for each OrganizationLicense version.

View File

@ -1,11 +1,11 @@
using System.Security.Claims; using System.Security.Claims;
using Bit.Core.Models.Business; using Bit.Core.Billing.Models.Business;
using Bit.Core.Settings; using Bit.Core.Settings;
using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.AutoFixture.Attributes;
using NSubstitute; using NSubstitute;
using Xunit; using Xunit;
namespace Bit.Core.Test.Models.Business; namespace Bit.Core.Test.Billing.Models.Business;
public class OrganizationLicenseTests public class OrganizationLicenseTests
{ {

View File

@ -1,13 +1,16 @@
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.AdminConsole.Entities.Provider; using Bit.Core.AdminConsole.Entities.Provider;
using Bit.Core.AdminConsole.Repositories; using Bit.Core.AdminConsole.Repositories;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses;
using Bit.Core.Billing.Services;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
using Bit.Core.OrganizationFeatures.OrganizationLicenses;
using Bit.Core.Platform.Installations; using Bit.Core.Platform.Installations;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Test.AutoFixture; using Bit.Core.Test.AutoFixture;
using Bit.Core.Test.Billing.AutoFixture;
using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.AutoFixture.Attributes;
using NSubstitute; using NSubstitute;
@ -15,7 +18,7 @@ using NSubstitute.ReturnsExtensions;
using Stripe; using Stripe;
using Xunit; using Xunit;
namespace Bit.Core.Test.OrganizationFeatures.OrganizationLicenses; namespace Bit.Core.Test.Billing.OrganizationFeatures.OrganizationLicenses;
[SubscriptionInfoCustomize] [SubscriptionInfoCustomize]
[OrganizationLicenseCustomize] [OrganizationLicenseCustomize]

View File

@ -1,18 +1,18 @@
using System.Text.Json; using System.Text.Json;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses.SelfHosted;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business;
using Bit.Core.Models.OrganizationConnectionConfigs; using Bit.Core.Models.OrganizationConnectionConfigs;
using Bit.Core.OrganizationFeatures.OrganizationLicenses;
using Bit.Core.Settings; using Bit.Core.Settings;
using Bit.Core.Test.AutoFixture; using Bit.Core.Test.Billing.AutoFixture;
using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.AutoFixture.Attributes;
using Bit.Test.Common.Helpers; using Bit.Test.Common.Helpers;
using Xunit; using Xunit;
namespace Bit.Core.Test.OrganizationFeatures.OrganizationLicenses; namespace Bit.Core.Test.Billing.OrganizationFeatures.OrganizationLicenses;
[SutProviderCustomize] [SutProviderCustomize]
public class SelfHostedGetOrganizationLicenseQueryTests public class SelfHostedGetOrganizationLicenseQueryTests

View File

@ -1,9 +1,10 @@
using System.Security.Claims; using System.Security.Claims;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.OrganizationFeatures.OrganizationLicenses;
using Bit.Core.Billing.Services;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Models.Business;
using Bit.Core.Models.Data.Organizations; using Bit.Core.Models.Data.Organizations;
using Bit.Core.OrganizationFeatures.OrganizationLicenses;
using Bit.Core.Services; using Bit.Core.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture;
@ -13,7 +14,7 @@ using NSubstitute;
using Xunit; using Xunit;
using JsonSerializer = System.Text.Json.JsonSerializer; using JsonSerializer = System.Text.Json.JsonSerializer;
namespace Bit.Core.Test.OrganizationFeatures.OrganizationLicenses; namespace Bit.Core.Test.Billing.OrganizationFeatures.OrganizationLicenses;
[SutProviderCustomize] [SutProviderCustomize]
public class UpdateOrganizationLicenseCommandTests public class UpdateOrganizationLicenseCommandTests

View File

@ -1,15 +1,15 @@
using System.Text.Json; using System.Text.Json;
using AutoFixture; using AutoFixture;
using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Entities;
using Bit.Core.Models.Business; using Bit.Core.Billing.Models.Business;
using Bit.Core.Services; using Bit.Core.Billing.Services;
using Bit.Core.Settings; using Bit.Core.Settings;
using Bit.Core.Test.AutoFixture; using Bit.Core.Test.Billing.AutoFixture;
using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture;
using Bit.Test.Common.AutoFixture.Attributes; using Bit.Test.Common.AutoFixture.Attributes;
using Xunit; using Xunit;
namespace Bit.Core.Test.Services; namespace Bit.Core.Test.Billing.Services;
[SutProviderCustomize] [SutProviderCustomize]
public class LicensingServiceTests public class LicensingServiceTests

View File

@ -11,10 +11,11 @@ using Bit.Core.AdminConsole.Services;
using Bit.Core.Auth.Enums; using Bit.Core.Auth.Enums;
using Bit.Core.Auth.Models; using Bit.Core.Auth.Models;
using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces; using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces;
using Bit.Core.Billing.Models.Business;
using Bit.Core.Billing.Services;
using Bit.Core.Entities; using Bit.Core.Entities;
using Bit.Core.Enums; using Bit.Core.Enums;
using Bit.Core.Exceptions; using Bit.Core.Exceptions;
using Bit.Core.Models.Business;
using Bit.Core.Models.Data.Organizations; using Bit.Core.Models.Data.Organizations;
using Bit.Core.Models.Data.Organizations.OrganizationUsers; using Bit.Core.Models.Data.Organizations.OrganizationUsers;
using Bit.Core.Repositories; using Bit.Core.Repositories;