From 8ca3f602e21603583de6f2b0a66294b88a0a08fa Mon Sep 17 00:00:00 2001 From: Paul Johnson Date: Mon, 23 Nov 2020 12:04:40 +0000 Subject: [PATCH] Further cleanup of AddUmbracoCore IUmbracoBootPermissionChecker is irrelevant in .net core as there's no concept of full trust Allow container to create DbProviderFactoryCreator with a factory method. --- .../Runtime/CoreRuntime.cs | 17 ++- .../Builder/UmbracoBuilderExtensions.cs | 119 ++++++------------ 2 files changed, 48 insertions(+), 88 deletions(-) diff --git a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs index 67fd358a8a..dfcbaa4c6b 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs @@ -13,7 +13,6 @@ namespace Umbraco.Core.Runtime private readonly ILogger _logger; private readonly ComponentCollection _components; - private readonly IUmbracoBootPermissionChecker _umbracoBootPermissionChecker; private readonly IApplicationShutdownRegistry _applicationShutdownRegistry; private readonly IProfilingLogger _profilingLogger; private readonly IMainDom _mainDom; @@ -23,7 +22,6 @@ namespace Umbraco.Core.Runtime ILogger logger, IRuntimeState state, ComponentCollection components, - IUmbracoBootPermissionChecker umbracoBootPermissionChecker, IApplicationShutdownRegistry applicationShutdownRegistry, IProfilingLogger profilingLogger, IMainDom mainDom, @@ -32,7 +30,6 @@ namespace Umbraco.Core.Runtime State = state; _logger = logger; _components = components; - _umbracoBootPermissionChecker = umbracoBootPermissionChecker; _applicationShutdownRegistry = applicationShutdownRegistry; _profilingLogger = profilingLogger; _mainDom = mainDom; @@ -42,14 +39,22 @@ namespace Umbraco.Core.Runtime public void Start() { + AppDomain.CurrentDomain.UnhandledException += (_, args) => + { + var exception = (Exception)args.ExceptionObject; + var isTerminating = args.IsTerminating; // always true? + + var msg = "Unhandled exception in AppDomain"; + if (isTerminating) msg += " (terminating)"; + msg += "."; + _logger.LogError(exception, msg); + }; + DetermineRuntimeLevel(); if (State.Level <= RuntimeLevel.BootFailed) throw new InvalidOperationException($"Cannot start the runtime if the runtime level is less than or equal to {RuntimeLevel.BootFailed}"); - // throws if not full-trust - _umbracoBootPermissionChecker.ThrowIfNotPermissions(); - var hostingEnvironmentLifetime = _applicationShutdownRegistry; if (hostingEnvironmentLifetime == null) throw new InvalidOperationException($"An instance of {typeof(IApplicationShutdownRegistry)} could not be resolved from the container, ensure that one if registered in your runtime before calling {nameof(IRuntime)}.{nameof(Start)}"); diff --git a/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs index b54558174f..a123664f60 100644 --- a/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs @@ -87,45 +87,17 @@ namespace Umbraco.Web.Common.Builder options.Cookie.Name = "UMB_SESSION"; options.Cookie.HttpOnly = true; }); - - var syntaxProviders = new List(); - var insertProviders = new List(); - var databaseCreators = new List(); - + // Add supported databases - builder.Services.AddUmbracoSqlCeSupport(syntaxProviders, insertProviders, databaseCreators); - builder.Services.AddUmbracoSqlServerSupport(syntaxProviders, insertProviders, databaseCreators); + builder.AddUmbracoSqlCeSupport(); + builder.AddUmbracoSqlServerSupport(); - builder.Services.AddUnique(factory => factory.GetRequiredService().RuntimeCache); - builder.Services.AddUnique(factory => factory.GetRequiredService().RequestCache); - - var dbProviderFactoryCreator = new DbProviderFactoryCreator( + builder.Services.AddSingleton(factory => new DbProviderFactoryCreator( DbProviderFactories.GetFactory, - syntaxProviders, - insertProviders, - databaseCreators); - - builder.Services.AddSingleton(dbProviderFactoryCreator); - - builder.Services.AddUnique(); - - var profiler = UmbracoCoreServiceCollectionExtensions.GetWebProfiler(builder.Config); - builder.Services.AddUnique(profiler); - - builder.Services.AddUnique(); - builder.Services.AddUnique(builder.TypeLoader); - builder.Services.AddUnique(); - - builder.Services.AddUnique(); - builder.Services.AddUnique(factory => factory.GetRequiredService().SqlContext); - builder.Services.AddUnique(factory => factory.GetRequiredService().BulkSqlInsertProvider); - - builder.Services.AddUnique(); - - builder.Services.AddUnique(dbProviderFactoryCreator); - builder.Services.AddUnique(); - builder.Services.AddUnique(); - builder.Services.AddUnique(); + factory.GetServices(), + factory.GetServices(), + factory.GetServices() + )); builder.Services.AddUnique(factory => { @@ -135,32 +107,31 @@ namespace Umbraco.Web.Common.Builder var dbCreator = factory.GetRequiredService(); var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + var loggerFactory = factory.GetRequiredService(); return globalSettings.MainDomLock.Equals("SqlMainDomLock") || isWindows == false - ? (IMainDomLock)new SqlMainDomLock(builder.BuilderLoggerFactory.CreateLogger(), builder.BuilderLoggerFactory, globalSettings, connectionStrings, dbCreator, hostingEnvironment) - : new MainDomSemaphoreLock(builder.BuilderLoggerFactory.CreateLogger(), hostingEnvironment); + ? (IMainDomLock)new SqlMainDomLock(loggerFactory.CreateLogger(), loggerFactory, globalSettings, connectionStrings, dbCreator, hostingEnvironment) + : new MainDomSemaphoreLock(loggerFactory.CreateLogger(), hostingEnvironment); }); + var profiler = UmbracoCoreServiceCollectionExtensions.GetWebProfiler(builder.Config); + builder.Services.AddUnique(profiler); + builder.Services.AddUnique(); + builder.Services.AddUnique(factory => factory.GetRequiredService().RuntimeCache); + builder.Services.AddUnique(factory => factory.GetRequiredService().RequestCache); + builder.Services.AddUnique(); + builder.Services.AddUnique(); + builder.Services.AddUnique(); + builder.Services.AddUnique(factory => factory.GetRequiredService().CreateDatabase()); + builder.Services.AddUnique(factory => factory.GetRequiredService().SqlContext); + builder.Services.AddUnique(); + builder.Services.AddUnique(); + builder.Services.AddUnique(); + builder.Services.AddUnique(); builder.Services.AddUnique(); - builder.Services.AddUnique(new UmbracoCoreServiceCollectionExtensions.AspNetCoreBootPermissionsChecker()); - builder.AddComposers(); - - var exceptionLogger = builder.BuilderLoggerFactory.CreateLogger(); - - // This probably shouldn't live here. - AppDomain.CurrentDomain.UnhandledException += (_, args) => - { - var exception = (Exception)args.ExceptionObject; - var isTerminating = args.IsTerminating; // always true? - - var msg = "Unhandled exception in AppDomain"; - if (isTerminating) msg += " (terminating)"; - msg += "."; - exceptionLogger.LogError(exception, msg); - }; - + return builder; } @@ -292,11 +263,7 @@ namespace Umbraco.Web.Common.Builder /// /// Adds SqlCe support for Umbraco /// - private static void AddUmbracoSqlCeSupport( - this IServiceCollection services, - ICollection syntaxProviders, - ICollection insertProviders, - ICollection databaseCreators) + private static IUmbracoBuilder AddUmbracoSqlCeSupport(this IUmbracoBuilder builder) { try { @@ -312,13 +279,9 @@ namespace Umbraco.Web.Common.Builder if (!(sqlCeSyntaxProviderType is null || sqlCeBulkSqlInsertProviderType is null || sqlCeEmbeddedDatabaseCreatorType is null)) { - services.AddSingleton(typeof(ISqlSyntaxProvider), sqlCeSyntaxProviderType); - services.AddSingleton(typeof(IBulkSqlInsertProvider), sqlCeBulkSqlInsertProviderType); - services.AddSingleton(typeof(IEmbeddedDatabaseCreator), sqlCeEmbeddedDatabaseCreatorType); - - syntaxProviders.Add((ISqlSyntaxProvider)Activator.CreateInstance(sqlCeSyntaxProviderType)); - insertProviders.Add((IBulkSqlInsertProvider)Activator.CreateInstance(sqlCeBulkSqlInsertProviderType)); - databaseCreators.Add((IEmbeddedDatabaseCreator)Activator.CreateInstance(sqlCeEmbeddedDatabaseCreatorType)); + builder.Services.AddSingleton(typeof(ISqlSyntaxProvider), sqlCeSyntaxProviderType); + builder.Services.AddSingleton(typeof(IBulkSqlInsertProvider), sqlCeBulkSqlInsertProviderType); + builder.Services.AddSingleton(typeof(IEmbeddedDatabaseCreator), sqlCeEmbeddedDatabaseCreatorType); } var sqlCeAssembly = Assembly.LoadFrom(Path.Combine(binFolder, "System.Data.SqlServerCe.dll")); @@ -334,30 +297,22 @@ namespace Umbraco.Web.Common.Builder { // Ignore if SqlCE is not available } + + return builder; } /// /// Adds Sql Server support for Umbraco /// - private static void AddUmbracoSqlServerSupport( - this IServiceCollection services, - ICollection syntaxProviders, - ICollection insertProviders, - ICollection databaseCreators) + private static IUmbracoBuilder AddUmbracoSqlServerSupport(this IUmbracoBuilder builder) { DbProviderFactories.RegisterFactory(Core.Constants.DbProviderNames.SqlServer, SqlClientFactory.Instance); - var syntaxProvider = new SqlServerSyntaxProvider(); - var insertProvider = new SqlServerBulkSqlInsertProvider(); - var databaseCreator = new NoopEmbeddedDatabaseCreator(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); - services.AddSingleton(syntaxProvider); - services.AddSingleton(insertProvider); - services.AddSingleton(databaseCreator); - - syntaxProviders.Add(syntaxProvider); - insertProviders.Add(insertProvider); - databaseCreators.Add(databaseCreator); + return builder; } } }