using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace StellaOps.Scanner.Storage.Oci; public static class ServiceCollectionExtensions { public static IServiceCollection AddOciImageInspector( this IServiceCollection services, Action configure) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configure); services.AddOptions().Configure(configure); RegisterInspectorServices(services); return services; } public static IServiceCollection AddOciImageInspector( this IServiceCollection services, IConfiguration configuration) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(configuration); services.AddOptions().Bind(configuration); RegisterInspectorServices(services); return services; } private static void RegisterInspectorServices(IServiceCollection services) { services.TryAddSingleton(TimeProvider.System); services.AddHttpClient(OciImageInspector.HttpClientName) .ConfigurePrimaryHttpMessageHandler(sp => { var options = sp.GetRequiredService>().Value; if (!options.AllowInsecure) { return new HttpClientHandler(); } return new HttpClientHandler { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }; }); services.TryAddSingleton(sp => { var options = sp.GetRequiredService>().Value; return new OciImageInspector( sp.GetRequiredService(), options, sp.GetRequiredService>(), sp.GetRequiredService()); }); } }