feat(license): implement Hardware-ID v2, multi-platform Linux support, StateStore LLS2 hardening, and AI Agent docs
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Deploymentcenter.Client;
|
||||
|
||||
public static class LicenseConfig
|
||||
{
|
||||
private static string? _storageDirectoryOverride;
|
||||
private static string? _hardwareIdOverride;
|
||||
|
||||
public static string? HardwareIdOverride
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(_hardwareIdOverride))
|
||||
return _hardwareIdOverride;
|
||||
|
||||
var envHwid = Environment.GetEnvironmentVariable("DEPLOYMENTCENTER_HWID")
|
||||
?? Environment.GetEnvironmentVariable("LICENSELABRADOR_HWID");
|
||||
if (!string.IsNullOrWhiteSpace(envHwid))
|
||||
return envHwid;
|
||||
|
||||
return null;
|
||||
}
|
||||
set => _hardwareIdOverride = value;
|
||||
}
|
||||
|
||||
public static string GetStorageDirectory(string productSlug)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(productSlug))
|
||||
productSlug = "default_app";
|
||||
|
||||
// 1. Explicitly set property
|
||||
if (!string.IsNullOrWhiteSpace(_storageDirectoryOverride))
|
||||
return ValidateNonEmpty(_storageDirectoryOverride!);
|
||||
|
||||
// 2. Environment Variable
|
||||
var envDir = Environment.GetEnvironmentVariable("DEPLOYMENTCENTER_STORAGE_DIR")
|
||||
?? Environment.GetEnvironmentVariable("LICENSELABRADOR_STORAGE_DIR");
|
||||
if (!string.IsNullOrWhiteSpace(envDir))
|
||||
return ValidateNonEmpty(Path.Combine(envDir!, productSlug, "license"));
|
||||
|
||||
// 3. Platform specific resolution
|
||||
if (OperatingSystemHelpers.IsLinux() || OperatingSystemHelpers.IsMacOS())
|
||||
{
|
||||
var xdg = Environment.GetEnvironmentVariable("XDG_CONFIG_HOME");
|
||||
if (!string.IsNullOrWhiteSpace(xdg))
|
||||
return ValidateNonEmpty(Path.Combine(xdg!, productSlug, "license"));
|
||||
|
||||
var home = Environment.GetEnvironmentVariable("HOME");
|
||||
if (!string.IsNullOrWhiteSpace(home))
|
||||
return ValidateNonEmpty(Path.Combine(home!, ".config", productSlug, "license"));
|
||||
}
|
||||
else if (OperatingSystemHelpers.IsWindows())
|
||||
{
|
||||
var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
|
||||
if (!string.IsNullOrWhiteSpace(appData))
|
||||
return ValidateNonEmpty(Path.Combine(appData, productSlug, "license"));
|
||||
}
|
||||
|
||||
// 4. Fallback to AppContext.BaseDirectory
|
||||
var baseDir = AppContext.BaseDirectory;
|
||||
if (!string.IsNullOrWhiteSpace(baseDir))
|
||||
return ValidateNonEmpty(Path.Combine(baseDir, "license"));
|
||||
|
||||
throw new InvalidOperationException("Could not resolve valid non-empty StorageDirectory for licensing.");
|
||||
}
|
||||
|
||||
public static void SetStorageDirectory(string path)
|
||||
{
|
||||
_storageDirectoryOverride = path;
|
||||
}
|
||||
|
||||
private static string ValidateNonEmpty(string path)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(path))
|
||||
throw new InvalidOperationException("StorageDirectory resolved to an empty or invalid path.");
|
||||
return path;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user