1
0
mirror of https://github.com/bitwarden/server.git synced 2025-05-22 12:04:27 -05:00

Extracted the core logic of GetDataBytes to be shared between both files

This commit is contained in:
Conner Turnbull 2025-05-20 15:39:53 -04:00
parent 7132ae5973
commit 5e87a23d89
No known key found for this signature in database
5 changed files with 41 additions and 55 deletions

View File

@ -1,7 +1,11 @@
using System.Security.Claims;
using System.Reflection;
using System.Security.Claims;
using System.Text;
using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Licenses.Attributes;
using Bit.Core.Models.Business;
using Bit.Core.Utilities;
namespace Bit.Core.Billing.Licenses.Extensions;
@ -76,6 +80,34 @@ public static class LicenseExtensions
return expirationDate;
}
public static byte[] GetDataBytesWithAttributes(this ILicense license, bool forHash = false)
{
var props = license.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p =>
{
var versionAttr = p.GetCustomAttribute<LicenseVersionAttribute>();
if (versionAttr is null || versionAttr.Version > license.Version)
{
return false;
}
var ignoreAttr = p.GetCustomAttribute<LicenseIgnoreAttribute>();
if (ignoreAttr is null)
{
return true;
}
return forHash && ignoreAttr.IncludeInHash;
})
.OrderBy(p => p.Name)
.Select(p => $"{p.Name}:{CoreHelpers.FormatLicenseSignatureValue(p.GetValue(license, null))}")
.Aggregate((c, n) => $"{c}|{n}");
var data = $"license:{license.LicenseType.ToString().ToLowerInvariant()}|{props}";
return Encoding.UTF8.GetBytes(data);
}
public static T GetValue<T>(this ClaimsPrincipal principal, string claimType)
{
var claim = principal.FindFirst(claimType);

View File

@ -43,7 +43,7 @@ public abstract class BaseLicense : ILicense
public string Signature { get; set; }
[LicenseIgnore]
public LicenseType? LicenseType { get; set; }
public LicenseType LicenseType { get; set; }
[LicenseIgnore]
public string Token { get; set; }

View File

@ -1,9 +1,11 @@
using System.Security.Cryptography.X509Certificates;
using Bit.Core.Enums;
namespace Bit.Core.Models.Business;
public interface ILicense
{
LicenseType LicenseType { get; set; }
string LicenseKey { get; set; }
int Version { get; set; }
DateTime Issued { get; set; }

View File

@ -1,5 +1,4 @@
using System.Reflection;
using System.Security.Claims;
using System.Security.Claims;
using System.Text;
using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Enums;
@ -258,30 +257,7 @@ public class OrganizationLicense : BaseLicense
throw new NotSupportedException($"Version {Version} is not supported.");
}
var props = GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p =>
{
var versionAttr = p.GetCustomAttribute<LicenseVersionAttribute>();
if (versionAttr is null || versionAttr.Version > Version)
{
return false;
}
var ignoreAttr = p.GetCustomAttribute<LicenseIgnoreAttribute>();
if (ignoreAttr is null)
{
return true;
}
return forHash && ignoreAttr.IncludeInHash;
})
.OrderBy(p => p.Name)
.Select(p => $"{p.Name}:{Utilities.CoreHelpers.FormatLicenseSignatureValue(p.GetValue(this, null))}")
.Aggregate((c, n) => $"{c}|{n}");
var data = $"license:organization|{props}";
return Encoding.UTF8.GetBytes(data);
return this.GetDataBytesWithAttributes(forHash);
}
public bool CanUse(
@ -397,7 +373,7 @@ public class OrganizationLicense : BaseLicense
errorMessages.AppendLine("The license does not allow for on-premise hosting of organizations.");
}
if (LicenseType != null && LicenseType != Enums.LicenseType.Organization)
if (LicenseType != LicenseType.Organization)
{
errorMessages.AppendLine("Premium licenses cannot be applied to an organization. " +
"Upload this license from your personal account settings page.");

View File

@ -1,5 +1,4 @@
using System.Reflection;
using System.Security.Claims;
using System.Security.Claims;
using System.Text;
using Bit.Core.Billing.Licenses.Attributes;
using Bit.Core.Billing.Licenses.Extensions;
@ -71,30 +70,7 @@ public class UserLicense : BaseLicense
throw new NotSupportedException($"Version {Version} is not supported.");
}
var props = GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p =>
{
var versionAttr = p.GetCustomAttribute<LicenseVersionAttribute>();
if (versionAttr is null || versionAttr.Version > Version)
{
return false;
}
var ignoreAttr = p.GetCustomAttribute<LicenseIgnoreAttribute>();
if (ignoreAttr is null)
{
return true;
}
return forHash && ignoreAttr.IncludeInHash;
})
.OrderBy(p => p.Name)
.Select(p => $"{p.Name}:{Utilities.CoreHelpers.FormatLicenseSignatureValue(p.GetValue(this, null))}")
.Aggregate((c, n) => $"{c}|{n}");
var data = $"license:user|{props}";
return Encoding.UTF8.GetBytes(data);
return this.GetDataBytesWithAttributes(forHash);
}
public bool CanUse(User user, ClaimsPrincipal claimsPrincipal, out string exception)