From ecbd6d1c810dfb5de7479dde0f507f438ab5a004 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 16 Mar 2021 19:19:03 +1100 Subject: [PATCH] Adds better support for app_plugins loading assets in a safer way and without having to pass refs --- .../WebAssets/BackOfficeWebAssets.cs | 20 +++++++--- .../UmbracoTestServerTestBase.cs | 2 +- .../Testing/UmbracoIntegrationTest.cs | 2 +- .../UmbracoBuilderExtensions.cs | 4 +- .../UmbracoBuilderExtensions.cs | 40 +++++++------------ .../Umbraco.Web.Common.csproj | 4 +- src/Umbraco.Web.UI.NetCore/Program.cs | 19 ++++----- src/Umbraco.Web.UI.NetCore/Startup.cs | 2 +- 8 files changed, 46 insertions(+), 47 deletions(-) diff --git a/src/Umbraco.Infrastructure/WebAssets/BackOfficeWebAssets.cs b/src/Umbraco.Infrastructure/WebAssets/BackOfficeWebAssets.cs index 2fe367c739..ef598e6150 100644 --- a/src/Umbraco.Infrastructure/WebAssets/BackOfficeWebAssets.cs +++ b/src/Umbraco.Infrastructure/WebAssets/BackOfficeWebAssets.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Options; @@ -94,10 +94,15 @@ namespace Umbraco.Cms.Infrastructure.WebAssets private string[] GetScriptsForBackOfficeExtensions(IEnumerable propertyEditorScripts) { var scripts = new HashSet(); - foreach (var script in _parser.Manifest.Scripts) + foreach (string script in _parser.Manifest.Scripts) + { scripts.Add(script); - foreach (var script in propertyEditorScripts) + } + + foreach (string script in propertyEditorScripts) + { scripts.Add(script); + } return scripts.ToArray(); } @@ -120,10 +125,15 @@ namespace Umbraco.Cms.Infrastructure.WebAssets { var stylesheets = new HashSet(); - foreach (var script in _parser.Manifest.Stylesheets) + foreach (string script in _parser.Manifest.Stylesheets) + { stylesheets.Add(script); - foreach (var stylesheet in propertyEditorStyles) + } + + foreach (string stylesheet in propertyEditorStyles) + { stylesheets.Add(stylesheet); + } return stylesheets.ToArray(); } diff --git a/src/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs b/src/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs index 6b61307bb3..d6492f67bb 100644 --- a/src/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs +++ b/src/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs @@ -151,7 +151,7 @@ namespace Umbraco.Cms.Tests.Integration.TestServerTest .AddConfiguration() .AddUmbracoCore() .AddWebComponents() - .AddRuntimeMinifier(webHostEnvironment) + .AddRuntimeMinifier() .AddBackOfficeCore() .AddBackOfficeAuthentication() .AddBackOfficeIdentity() diff --git a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs index 16a8a392cf..dbf047cf48 100644 --- a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs +++ b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs @@ -212,7 +212,7 @@ namespace Umbraco.Cms.Tests.Integration.Testing builder.AddConfiguration() .AddUmbracoCore() .AddWebComponents() - .AddRuntimeMinifier(webHostEnvironment) + .AddRuntimeMinifier() .AddBackOfficeAuthentication() .AddBackOfficeIdentity() .AddMembersIdentity() diff --git a/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs index e80e77e179..092290977f 100644 --- a/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs @@ -35,11 +35,11 @@ namespace Umbraco.Extensions /// /// Adds all required components to run the Umbraco back office /// - public static IUmbracoBuilder AddBackOffice(this IUmbracoBuilder builder, IWebHostEnvironment webHostEnvironment) => builder + public static IUmbracoBuilder AddBackOffice(this IUmbracoBuilder builder) => builder .AddConfiguration() .AddUmbracoCore() .AddWebComponents() - .AddRuntimeMinifier(webHostEnvironment) + .AddRuntimeMinifier() .AddBackOfficeCore() .AddBackOfficeAuthentication() .AddBackOfficeIdentity() diff --git a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs index 060cbbd113..d4d9ee5047 100644 --- a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs @@ -4,6 +4,7 @@ using System.Data.SqlClient; using System.IO; using System.Linq; using System.Reflection; +using Dazinator.Extensions.FileProviders.GlobPatternFilter; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; @@ -219,9 +220,21 @@ namespace Umbraco.Extensions /// /// Add runtime minifier support for Umbraco /// - public static IUmbracoBuilder AddRuntimeMinifier(this IUmbracoBuilder builder, IWebHostEnvironment webHostEnvironment) + public static IUmbracoBuilder AddRuntimeMinifier(this IUmbracoBuilder builder) { - var smidgePhysicalFileProvider = new SmidgePhysicalFileProvider(webHostEnvironment.ContentRootFileProvider, webHostEnvironment.WebRootFileProvider); + // Add custom ISmidgeFileProvider to include the additional App_Plugins location + // to load assets from. + builder.Services.AddSingleton(f => + { + IWebHostEnvironment hostEnv = f.GetRequiredService(); + + return new SmidgeFileProvider( + hostEnv.WebRootFileProvider, + new GlobPatternFilterFileProvider( + hostEnv.ContentRootFileProvider, + // only include js or css files within App_Plugins + new[] { "App_Plugins/**/*.js", "App_Plugins/**/*.css" })); + }); builder.Services.AddSmidge(builder.Config.GetSection(Constants.Configuration.ConfigRuntimeMinification)); builder.Services.AddSmidgeNuglify(); @@ -416,28 +429,5 @@ namespace Umbraco.Extensions return new AspNetCoreHostingEnvironment(wrappedHostingSettings,wrappedWebRoutingSettings, webHostEnvironment); } - /// - /// This file provider lets us serve physical files to Smidge for minification from both wwwroot and App_Plugins (which is outside wwwroot). - /// This file provider is NOT intended for use anywhere else, as it exposes files from the content root. - /// - private class SmidgePhysicalFileProvider : IFileProvider - { - private readonly IFileProvider _contentRootFileProvider; - private readonly IFileProvider _webRooFileProvider; - - public SmidgePhysicalFileProvider(IFileProvider contentRootFileProvider, IFileProvider webRooFileProvider) - { - _contentRootFileProvider = contentRootFileProvider; - _webRooFileProvider = webRooFileProvider; - } - - public IFileInfo GetFileInfo(string subpath) => subpath.InvariantStartsWith(Constants.SystemDirectories.AppPlugins) - ? _contentRootFileProvider.GetFileInfo(subpath) - : _webRooFileProvider.GetFileInfo(subpath); - - public IDirectoryContents GetDirectoryContents(string subpath) => throw new NotSupportedException(); - - public IChangeToken Watch(string filter) => throw new NotSupportedException(); - } } } diff --git a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj index d5ae00b3f1..03fcca3c90 100644 --- a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj +++ b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj @@ -1,4 +1,4 @@ - + net5.0 @@ -33,6 +33,8 @@ + + diff --git a/src/Umbraco.Web.UI.NetCore/Program.cs b/src/Umbraco.Web.UI.NetCore/Program.cs index 7a6ee4dcfd..89ce7d92bc 100644 --- a/src/Umbraco.Web.UI.NetCore/Program.cs +++ b/src/Umbraco.Web.UI.NetCore/Program.cs @@ -1,5 +1,4 @@ using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -8,20 +7,18 @@ namespace Umbraco.Cms.Web.UI.NetCore public class Program { public static void Main(string[] args) - => CreateHostBuilder(args) + { + CreateHostBuilder(args) .Build() .Run(); + } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) -#if DEBUG - .ConfigureAppConfiguration(config - => config.AddJsonFile( - "appsettings.Local.json", - optional: true, - reloadOnChange: true)) -#endif - .ConfigureLogging(x => x.ClearProviders()) - .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup()); + .ConfigureLogging(x => + { + x.ClearProviders(); + }) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); } } diff --git a/src/Umbraco.Web.UI.NetCore/Startup.cs b/src/Umbraco.Web.UI.NetCore/Startup.cs index 79a9bff03f..b0c9c465ad 100644 --- a/src/Umbraco.Web.UI.NetCore/Startup.cs +++ b/src/Umbraco.Web.UI.NetCore/Startup.cs @@ -45,7 +45,7 @@ namespace Umbraco.Cms.Web.UI.NetCore { #pragma warning disable IDE0022 // Use expression body for methods services.AddUmbraco(_env, _config) - .AddBackOffice(_env) + .AddBackOffice() .AddBackOfficeExternalLogins(logins => { var loginProviderOptions = new BackOfficeExternalLoginProviderOptions(