using System.IO; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.DataProtection.KeyManagement; using Microsoft.AspNetCore.DataProtection.Repositories; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using PowCapServer; using PowCapServer.Abstractions; namespace Finch.Security; internal class FinchSecurityModule : FinchModule { public override void ConfigureServices(IServiceCollection services, IConfiguration configuration) { IConfigurationSection captchaSection = configuration.GetSection("Finch:Captcha"); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddTransient(); services.Configure(opts => opts.Default = captchaSection.Get() ?? new CaptchaOptions()); services.AddOptions().Bind(captchaSection); services.AddDataProtection(); services.AddSingleton>(s => { ILoggerFactory loggerFactory = s.GetService() ?? NullLoggerFactory.Instance; FinchOptions finchOptions = s.GetService>().Value; string contentRootPath = s.GetService().ContentRootPath; return new ConfigureOptions(options => { string keyPath = Path.GetFullPath(Path.Combine(contentRootPath, finchOptions.DataProtectionStoragePath)); options.XmlRepository = new FileSystemXmlRepository(new DirectoryInfo(keyPath), loggerFactory); }); }); } public override void Configure(IApplicationBuilder app, IEndpointRouteBuilder routes, IServiceProvider serviceProvider) { StaticCaptchaService.Configure(serviceProvider); } }