feat(license): implement Hardware-ID v2, multi-platform Linux support, StateStore LLS2 hardening, and AI Agent docs

This commit is contained in:
Deploymentcenter Bot
2026-08-06 11:39:21 +02:00
parent e9dbe793e2
commit 70b35f7b8b
16 changed files with 1602 additions and 41 deletions
@@ -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;
}
}