/* * dbMango * * Copyright 2025 Deutsche Bank AG * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using Blazored.Modal; using Microsoft.Extensions.Configuration.UserSecrets; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Logging; using Rms.Risk.Mango.Interfaces; using Rms.Risk.Mango.Pivot.Core.MongoDb; using Rms.Risk.Mango.Pivot.UI.Services; using Rms.Risk.Mango.Services; using Rms.Risk.Mango.Services.Context; using Rms.Risk.Mango.Services.Logging; using Rms.Risk.Mango.Services.Security; using Rms.Service.Bootstrap; using Rms.Service.Bootstrap.Health; using Rms.Service.Bootstrap.Security; using System.Runtime.CompilerServices; using System.Security.Cryptography.X509Certificates; [assembly: UserSecretsId("BF0D1460-2D1E-40CC-8F10-127369F684FE")] [assembly: InternalsVisibleTo("Tests.Rms.Risk.Mango")] namespace Rms.Risk.Mango; public class Program { private static ILogger? _logger; public static void Main(string[] args) { TaskScheduler.UnobservedTaskException += ( _, a ) => { //HACK: Because of a BUG we ignore all unhandled task exceptions a.SetObserved(); var m = $"Unobserved task exception ignored: {a.Exception.InnerException?.Message ?? a.Exception.Message}"; _logger?.LogError(a.Exception, m); }; AppDomain.CurrentDomain.UnhandledException += ( _, a ) => { var m = $"Unexpected execution error IsTerminating={a.IsTerminating} ExceptionObject=\"{a.ExceptionObject}\""; _logger?.LogError(a.ExceptionObject as Exception, m); }; // Load assembly dynamically if it exists var plugin = PluginSupport.GetPlugin(_logger); var builder = WebApplication.CreateBuilder(args); var options = new ServiceBootstrapOptions { EnableGrpc = false, EnableOidc = false, EnableMTLS = false, AuthorizeBy = AuthorizationType.Skip, EnableOpenIdConnect = true, }; builder.ConfigureStandardEndpoint(options); builder.Services .AddLog4NetRedirection(); MongoDbHelper.RemoteCertificateCheck = (_, s,c,e) => CertificateHelper.CheckClientCertificateChain((X509Certificate2?)s,c,e); IdentityModelEventSource.ShowPII = true; // show strings in error messages builder.Services .ConfigureProtected(builder.Configuration.GetSection("DatabasesConfig")) .ConfigureProtected(builder.Configuration.GetSection("DbMangoSettings")) ; // Add services to the container. builder.Services .AddServerSideBlazor() .AddHubOptions(x=> x.MaximumReceiveMessageSize = 100_000_000) ; builder.Services .TryAddSingleton(); builder.Services.AddBlazoredModal(); if ( plugin != null ) { builder.Services.AddSingleton(plugin); } else { builder.Services .AddSingleton() ; } builder.Services .AddMongoDbAccess() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddScoped() .AddScoped() .AddScoped() .AddSingleton() ; plugin?.ConfigureServices(builder); builder.WebHost .UseStaticWebAssets() .UseKestrel((_, kestrelServerOptions) => { kestrelServerOptions.ConfigureStandardKestrel(builder, options); }); AfhHelpers.Init(); var app = builder.Build(); _logger = app.Services.GetService>(); var settings = app.Services.GetService>(); if (settings?.Value.DefaultTimeout != null ) DatabaseConfigurationService.DefaultTimeout = settings.Value.DefaultTimeout.Value; // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } else { app.UseDeveloperExceptionPage(); } if ( builder.IsHttps() ) app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseStandardEndpoint(options); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); // ----------------------------------------------- run the server --------------------------------------------- StartupHealthCheck.StartupCompleted = true; app.Run(); } }