using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.ResponseCompression; using PrivaPub.ClientModels; using PrivaPub.Extensions; using PrivaPub.Models; using PrivaPub.Services; using PrivaPub.StaticServices; using System.Text.Json.Serialization; using Microsoft.OpenApi; using PrivaPub.Services.ClientToServer.Private; using PrivaPub.Services.ClientToServer.Public; using PrivaPub.Services.Federation; namespace PrivaPub.Middleware { public static class PrivaPubConfigurations { public static IServiceCollection PrivaPubAppSettingsConfiguration(this IServiceCollection service, IConfiguration configuration) { return service .Configure(configuration.GetSection(nameof(MongoSettings))) .Configure(configuration.GetSection(nameof(AppConfiguration))); } public static IServiceCollection PrivaPubWorkersConfiguration(this IServiceCollection service) { return service; //.AddHostedService() //.AddHostedService() //.AddHostedService(); } public static IServiceCollection PrivaPubFederationConfiguration(this IServiceCollection service) { service.AddHttpClient(RemoteActorService.HttpClientName, client => { client.Timeout = TimeSpan.FromSeconds(20); client.DefaultRequestHeaders.UserAgent.ParseAdd($"PrivaPub/{BuildInfo.Ref}"); }); return service .AddSingleton() .AddSingleton() .AddSingleton() .AddTransient() .AddHostedService(); } public static IServiceCollection PrivaPubAuthServicesConfiguration(this IServiceCollection service, IConfiguration configuration) { return service .AddAuthorization(options => { options.AddPolicy(Policies.IsUser, Extensions.Extensions.IsUserPolicy()); options.AddPolicy(Policies.IsAdmin, Extensions.Extensions.IsAdminPolicy()); options.AddPolicy(Policies.IsModerator, Extensions.Extensions.IsModeratorPolicy()); }) .AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddPrivaPubAuth(configuration) .Services .AddSingleton() .AddSingleton(); } public static IServiceCollection PrivaPubInternalizationConfiguration(this IServiceCollection service, IConfiguration configuration) { return service .AddLocalization() .AddSingleton(); } public static IServiceCollection PrivaPubOptimizationConfiguration(this IServiceCollection service) { return service.AddResponseCompression(opts => { opts.Providers.Add(); opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "application/octet-stream" }); }); } public static IServiceCollection PrivaPubDataBaseConfiguration(this IServiceCollection service) { return service.AddSingleton(); } public static IServiceCollection PrivaPubServicesConfiguration(this IServiceCollection service) { return service .AddTransient() .AddTransient() .AddTransient() .AddTransient() .AddTransient() .AddTransient() .AddSingleton() .AddHttpContextAccessor() .AddMemoryCache() .AddSingleton(); } public static IServiceCollection PrivaPubMiddlewareConfiguration(this IServiceCollection service) { return service .AddEndpointsApiExplorer() .AddSwaggerGen(c => { c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Please enter a valid token", Name = "Authorization", Type = SecuritySchemeType.Http, BearerFormat = "JWT", Scheme = "bearer" }); c.AddSecurityRequirement(document => new OpenApiSecurityRequirement { [new OpenApiSecuritySchemeReference("Bearer", document)] = [] }); }) .AddControllers(options => { options.Filters.Add(); }) .AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreReadOnlyFields = false; options.JsonSerializerOptions.IgnoreReadOnlyProperties = false; options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }).Services; } public static IServiceCollection PrivaPubCORSConfiguration(this IServiceCollection service) { return service.AddCors(options => { options.DefaultPolicyName = "DefaultCORS"; options.AddDefaultPolicy(configure => { configure.AllowAnyMethod() .AllowAnyHeader() .AllowAnyOrigin() .AllowAnyMethod() .DisallowCredentials(); }); }); } } }