using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace MachineGuard;
///
/// Metodi di estensione per la registrazione di MachineGuard nel container DI.
///
public static class MachineGuardExtensions
{
///
/// Registra il servizio nel container DI.
///
/// Se MachineGuard:Enabled è false in appsettings, viene registrato
/// un guard no-op che approva sempre la verifica (utile per sviluppo/CI).
/// Su piattaforme non-Windows, DPAPI non è disponibile e il guard viene disabilitato automaticamente.
///
///
public static IServiceCollection AddMachineGuard(
this IServiceCollection services,
IConfiguration configuration)
{
services.Configure(
configuration.GetSection(MachineGuardOptions.SectionName));
services.AddSingleton(sp =>
{
var loggerFactory = sp.GetRequiredService();
var logger = loggerFactory.CreateLogger("MachineGuard.Startup");
#if DEBUG
// In build Debug la protezione è sempre disabilitata — nessuna configurazione richiesta.
logger.LogInformation(
"MachineGuard: build DEBUG — protezione machine-binding disabilitata automaticamente.");
return new NullMachineGuard();
#else
// In build Release la protezione è sempre attiva.
// Può essere disabilitata esplicitamente via MachineGuard:Enabled = false
// (utile per ambienti Linux/Docker o casi eccezionali).
var options = sp.GetRequiredService>();
if (!options.Value.Enabled)
{
logger.LogWarning(
"MachineGuard: protezione machine-binding DISABILITATA via configurazione. " +
"Impostare MachineGuard:Enabled = true in produzione.");
return new NullMachineGuard();
}
if (!OperatingSystem.IsWindows())
{
logger.LogWarning(
"MachineGuard: DPAPI non è disponibile su piattaforme non-Windows. " +
"La protezione machine-binding è bypassata automaticamente.");
return new NullMachineGuard();
}
return CreateWindowsGuard(sp, options);
#endif
});
return services;
}
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
private static IMachineGuard CreateWindowsGuard(
IServiceProvider sp,
IOptions options)
{
var logger = sp.GetRequiredService>();
return new DpapiMachineGuard(options, logger);
}
}