Files
git.stella-ops.org/src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Analysis/ServiceCollectionExtensions.cs
master 7f7eb8b228 Complete batch 012 (golden set diff) and 013 (advisory chat), fix build errors
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>
2026-01-11 10:09:07 +02:00

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;
}
}