Sprints completed: - SPRINT_20260110_012_* (golden set diff layer - 10 sprints) - SPRINT_20260110_013_* (advisory chat - 4 sprints) Build fixes applied: - Fix namespace conflicts with Microsoft.Extensions.Options.Options.Create - Fix VexDecisionReachabilityIntegrationTests API drift (major rewrite) - Fix VexSchemaValidationTests FluentAssertions method name - Fix FixChainGateIntegrationTests ambiguous type references - Fix AdvisoryAI test files required properties and namespace aliases - Add stub types for CveMappingController (ICveSymbolMappingService) - Fix VerdictBuilderService static context issue Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
108 lines
4.4 KiB
C#
108 lines
4.4 KiB
C#
// Licensed under AGPL-3.0-or-later. Copyright (C) 2026 StellaOps Contributors.
|
|
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
|
|
namespace StellaOps.BinaryIndex.Analysis;
|
|
|
|
/// <summary>
|
|
/// Extension methods for registering analysis services.
|
|
/// </summary>
|
|
public static class ServiceCollectionExtensions
|
|
{
|
|
/// <summary>
|
|
/// Adds golden set analysis pipeline services.
|
|
/// </summary>
|
|
/// <param name="services">Service collection.</param>
|
|
/// <param name="configuration">Configuration for options binding.</param>
|
|
/// <returns>Service collection for chaining.</returns>
|
|
public static IServiceCollection AddGoldenSetAnalysis(
|
|
this IServiceCollection services,
|
|
IConfiguration? configuration = null)
|
|
{
|
|
// Register options
|
|
if (configuration is not null)
|
|
{
|
|
services.Configure<FingerprintExtractionOptions>(
|
|
configuration.GetSection("BinaryIndex:Analysis:Fingerprinting"));
|
|
services.Configure<SignatureMatchOptions>(
|
|
configuration.GetSection("BinaryIndex:Analysis:Matching"));
|
|
services.Configure<ReachabilityOptions>(
|
|
configuration.GetSection("BinaryIndex:Analysis:Reachability"));
|
|
services.Configure<AnalysisPipelineOptions>(
|
|
configuration.GetSection("BinaryIndex:Analysis"));
|
|
}
|
|
else
|
|
{
|
|
// Register default options
|
|
services.Configure<FingerprintExtractionOptions>(_ => { });
|
|
services.Configure<SignatureMatchOptions>(_ => { });
|
|
services.Configure<ReachabilityOptions>(_ => { });
|
|
services.Configure<AnalysisPipelineOptions>(_ => { });
|
|
}
|
|
|
|
// Register core services
|
|
services.AddSingleton<ISignatureIndexFactory, SignatureIndexFactory>();
|
|
services.AddSingleton<ISignatureMatcher, SignatureMatcher>();
|
|
services.AddSingleton<ITaintGateExtractor, TaintGateExtractor>();
|
|
|
|
// Register stub implementations (to be replaced with real implementations)
|
|
services.AddSingleton<IFingerprintExtractor, FingerprintExtractor>();
|
|
services.AddSingleton<IReachabilityAnalyzer, ReachabilityAnalyzer>();
|
|
|
|
// Register null reachability service (for testing/standalone use)
|
|
// Real implementation should be registered via AddReachGraphIntegration
|
|
services.TryAddSingleton<IBinaryReachabilityService, NullBinaryReachabilityService>();
|
|
|
|
// Register pipeline
|
|
services.AddSingleton<IGoldenSetAnalysisPipeline, GoldenSetAnalysisPipeline>();
|
|
|
|
return services;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Registers a custom IBinaryReachabilityService implementation.
|
|
/// Use this to provide real ReachGraph integration.
|
|
/// </summary>
|
|
/// <typeparam name="TImplementation">Implementation type.</typeparam>
|
|
/// <param name="services">Service collection.</param>
|
|
/// <returns>Service collection for chaining.</returns>
|
|
public static IServiceCollection AddBinaryReachabilityService<TImplementation>(
|
|
this IServiceCollection services)
|
|
where TImplementation : class, IBinaryReachabilityService
|
|
{
|
|
// Remove any existing registration
|
|
var descriptor = services.FirstOrDefault(d => d.ServiceType == typeof(IBinaryReachabilityService));
|
|
if (descriptor is not null)
|
|
{
|
|
services.Remove(descriptor);
|
|
}
|
|
|
|
services.AddSingleton<IBinaryReachabilityService, TImplementation>();
|
|
return services;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Registers a custom IBinaryReachabilityService instance.
|
|
/// Use this to provide real ReachGraph integration via factory.
|
|
/// </summary>
|
|
/// <param name="services">Service collection.</param>
|
|
/// <param name="factory">Factory to create the service.</param>
|
|
/// <returns>Service collection for chaining.</returns>
|
|
public static IServiceCollection AddBinaryReachabilityService(
|
|
this IServiceCollection services,
|
|
Func<IServiceProvider, IBinaryReachabilityService> factory)
|
|
{
|
|
// Remove any existing registration
|
|
var descriptor = services.FirstOrDefault(d => d.ServiceType == typeof(IBinaryReachabilityService));
|
|
if (descriptor is not null)
|
|
{
|
|
services.Remove(descriptor);
|
|
}
|
|
|
|
services.AddSingleton(factory);
|
|
return services;
|
|
}
|
|
}
|