Allow opt out of import embedded schema file (#11296)

* Introduce an opt-out options from the import of embedded schema files.

* Moved the initialization of the static service provider into CoreRuntime as this runs before the IStartupFilters, and otherwise the static service provider is not available in hosted services. E.g. for migrations

* fix build

* Minor code tidy and naming alignment.

* Update src/Umbraco.Web.UI/Umbraco.Web.UI.csproj

* Removed default installation of starter kit.

Co-authored-by: Andy Butland <abutland73@gmail.com>
This commit is contained in:
Bjarke Berg
2021-10-06 11:13:59 +02:00
committed by GitHub
parent 83e79f9bfa
commit 2a29cdc6c6
14 changed files with 148 additions and 44 deletions

View File

@@ -47,6 +47,7 @@ namespace JsonSchema
public RichTextEditorSettings RichTextEditor { get; set; }
public RuntimeMinificationSettings RuntimeMinification { get; set; }
public BasicAuthSettings BasicAuth { get; set; }
public PackageMigrationSettings PackageMigration { get; set; }
}
/// <summary>

View File

@@ -0,0 +1,40 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.
using System.ComponentModel;
namespace Umbraco.Cms.Core.Configuration.Models
{
/// <summary>
/// Typed configuration options for package migration settings.
/// </summary>
[UmbracoOptions(Constants.Configuration.ConfigPackageMigration)]
public class PackageMigrationSettings
{
private const bool StaticRunSchemaAndContentMigrations = true;
private const bool StaticAllowComponentOverrideOfRunSchemaAndContentMigrations = true;
/// <summary>
/// Gets or sets a value indicating whether package migration steps that install schema and content should run.
/// </summary>
/// <remarks>
/// By default this is true and schema and content defined in a package migration are installed.
/// Using configuration, administrators can optionally switch this off in certain environments.
/// Deployment tools such as Umbraco Deploy can also configure this option to run or not run these migration
/// steps as is appropriate for normal use of the tool.
/// </remarks>
[DefaultValue(StaticRunSchemaAndContentMigrations)]
public bool RunSchemaAndContentMigrations { get; set; } = StaticRunSchemaAndContentMigrations;
/// <summary>
/// Gets or sets a value indicating whether components can override the configured value for <see cref="RunSchemaAndContentMigrations"/>.
/// </summary>
/// <remarks>
/// By default this is true and components can override the configured setting for <see cref="RunSchemaAndContentMigrations"/>.
/// If an administrator wants explicit control over which environments migration steps installing schema and content can run,
/// they can set this to false. Components should respect this and not override the configuration.
/// </remarks>
[DefaultValue(StaticAllowComponentOverrideOfRunSchemaAndContentMigrations)]
public bool AllowComponentOverrideOfRunSchemaAndContentMigrations { get; set; } = StaticAllowComponentOverrideOfRunSchemaAndContentMigrations;
}
}

View File

@@ -1,17 +1,19 @@
using System.ComponentModel;
// Copyright (c) Umbraco.
// See LICENSE for more details.
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace Umbraco.Cms.Core.Configuration.Models
{
/// <summary>
/// Typed configuration options for unattended settings.
/// </summary>
[UmbracoOptions(Constants.Configuration.ConfigUnattended)]
public class UnattendedSettings
{
internal const bool StaticInstallUnattended = false;
internal const bool StaticUpgradeUnattended = false;
private const bool StaticInstallUnattended = false;
private const bool StaticUpgradeUnattended = false;
/// <summary>
/// Gets or sets a value indicating whether unattended installs are enabled.

View File

@@ -52,6 +52,7 @@
public const string ConfigWebRouting = ConfigPrefix + "WebRouting";
public const string ConfigUserPassword = ConfigPrefix + "Security:UserPassword";
public const string ConfigRichTextEditor = ConfigPrefix + "RichTextEditor";
public const string ConfigPackageMigration = ConfigPrefix + "PackageMigration";
}
}
}

View File

@@ -4,22 +4,22 @@ using System.ComponentModel;
namespace Umbraco.Cms.Web.Common.DependencyInjection
{
/// <summary>
/// INTERNAL Service locator. Should only be used if no other ways exist.
/// Service locator for internal (umbraco cms) only purposes. Should only be used if no other ways exist.
/// </summary>
/// <remarks>
/// It is created with only two goals in mind
/// 1) Continue to have the same extension methods on IPublishedContent and IPublishedElement as in V8. To make migration easier.
/// 2) To have a tool to avoid breaking changes in minor versions. All methods using this should in theory be obsolete.
/// 2) To have a tool to avoid breaking changes in minor and patch versions. All methods using this should in theory be obsolete.
///
/// Keep in mind, every time this is used, the code becomes basically untestable.
/// </remarks>
[EditorBrowsable(EditorBrowsableState.Never)]
internal static class StaticServiceProvider
public static class StaticServiceProvider
{
/// <summary>
/// The service locator.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
internal static IServiceProvider Instance { get; set; }
public static IServiceProvider Instance { get; set; }
}
}

View File

@@ -72,7 +72,8 @@ namespace Umbraco.Cms.Core.DependencyInjection
.AddUmbracoOptions<UnattendedSettings>()
.AddUmbracoOptions<RichTextEditorSettings>()
.AddUmbracoOptions<BasicAuthSettings>()
.AddUmbracoOptions<RuntimeMinificationSettings>();
.AddUmbracoOptions<RuntimeMinificationSettings>()
.AddUmbracoOptions<PackageMigrationSettings>();
return builder;
}

View File

@@ -38,6 +38,7 @@ using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Sync;
using Umbraco.Cms.Core.Templates;
using Umbraco.Cms.Core.Web;
using Umbraco.Cms.Web.Common.DependencyInjection;
using Umbraco.Extensions;
namespace Umbraco.Cms.Core.DependencyInjection

View File

@@ -1,8 +1,9 @@
using System;
using System.Xml.Linq;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.PropertyEditors;
using Umbraco.Cms.Core.Serialization;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Strings;
using Umbraco.Cms.Infrastructure.Migrations;
@@ -20,7 +21,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
MediaUrlGeneratorCollection mediaUrlGenerators,
IShortStringHelper shortStringHelper,
IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
IMigrationContext context)
IMigrationContext context,
IOptions<PackageMigrationSettings> options)
: base(new ImportPackageBuilderExpression(
packagingService,
mediaService,
@@ -28,7 +30,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
mediaUrlGenerators,
shortStringHelper,
contentTypeBaseServiceProvider,
context))
context,
options))
{
}

View File

@@ -5,7 +5,9 @@ using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Packaging;
@@ -25,7 +27,9 @@ namespace Umbraco.Cms.Infrastructure.Packaging
private readonly MediaUrlGeneratorCollection _mediaUrlGenerators;
private readonly IPackagingService _packagingService;
private readonly IShortStringHelper _shortStringHelper;
private bool _executed;
private readonly PackageMigrationSettings _packageMigrationSettings;
private bool _executed;
public ImportPackageBuilderExpression(
IPackagingService packagingService,
@@ -34,7 +38,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
MediaUrlGeneratorCollection mediaUrlGenerators,
IShortStringHelper shortStringHelper,
IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
IMigrationContext context) : base(context)
IMigrationContext context,
IOptions<PackageMigrationSettings> packageMigrationSettings) : base(context)
{
_packagingService = packagingService;
_mediaService = mediaService;
@@ -42,6 +47,7 @@ namespace Umbraco.Cms.Infrastructure.Packaging
_mediaUrlGenerators = mediaUrlGenerators;
_shortStringHelper = shortStringHelper;
_contentTypeBaseServiceProvider = contentTypeBaseServiceProvider;
_packageMigrationSettings = packageMigrationSettings.Value;
}
/// <summary>
@@ -59,6 +65,7 @@ namespace Umbraco.Cms.Infrastructure.Packaging
}
_executed = true;
Context.BuildingExpression = false;
if (EmbeddedResourceMigrationType == null && PackageDataManifest == null)
@@ -67,6 +74,12 @@ namespace Umbraco.Cms.Infrastructure.Packaging
$"Nothing to execute, neither {nameof(EmbeddedResourceMigrationType)} or {nameof(PackageDataManifest)} has been set.");
}
if (!_packageMigrationSettings.RunSchemaAndContentMigrations)
{
Logger.LogInformation("Skipping import of embedded schema file, due to configuration");
return;
}
InstallationSummary installationSummary;
if (EmbeddedResourceMigrationType != null)
{

View File

@@ -1,12 +1,17 @@
using System;
using System.ComponentModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.PropertyEditors;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Strings;
using Umbraco.Cms.Infrastructure.Migrations;
using Umbraco.Cms.Web.Common.DependencyInjection;
namespace Umbraco.Cms.Infrastructure.Packaging
{
public abstract class PackageMigrationBase : MigrationBase
{
private readonly IPackagingService _packagingService;
@@ -15,6 +20,7 @@ namespace Umbraco.Cms.Infrastructure.Packaging
private readonly MediaUrlGeneratorCollection _mediaUrlGenerators;
private readonly IShortStringHelper _shortStringHelper;
private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider;
private readonly IOptions<PackageMigrationSettings> _packageMigrationsSettings;
public PackageMigrationBase(
IPackagingService packagingService,
@@ -23,7 +29,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
MediaUrlGeneratorCollection mediaUrlGenerators,
IShortStringHelper shortStringHelper,
IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
IMigrationContext context)
IMigrationContext context,
IOptions<PackageMigrationSettings> packageMigrationsSettings)
: base(context)
{
_packagingService = packagingService;
@@ -32,6 +39,29 @@ namespace Umbraco.Cms.Infrastructure.Packaging
_mediaUrlGenerators = mediaUrlGenerators;
_shortStringHelper = shortStringHelper;
_contentTypeBaseServiceProvider = contentTypeBaseServiceProvider;
_packageMigrationsSettings = packageMigrationsSettings;
}
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("Use ctor with all params")]
public PackageMigrationBase(
IPackagingService packagingService,
IMediaService mediaService,
MediaFileManager mediaFileManager,
MediaUrlGeneratorCollection mediaUrlGenerators,
IShortStringHelper shortStringHelper,
IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
IMigrationContext context)
: this(
packagingService,
mediaService,
mediaFileManager,
mediaUrlGenerators,
shortStringHelper,
contentTypeBaseServiceProvider,
context,
StaticServiceProvider.Instance.GetRequiredService<IOptions<PackageMigrationSettings>>())
{
}
public IImportPackageBuilder ImportPackage => BeginBuild(
@@ -42,7 +72,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
_mediaUrlGenerators,
_shortStringHelper,
_contentTypeBaseServiceProvider,
Context));
Context,
_packageMigrationsSettings));
}
}

View File

@@ -1,9 +1,9 @@
using System;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.Configuration;
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Exceptions;
@@ -13,7 +13,9 @@ using Umbraco.Cms.Core.Notifications;
using Umbraco.Cms.Core.Runtime;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Persistence;
using Umbraco.Cms.Web.Common.DependencyInjection;
using Umbraco.Extensions;
using ComponentCollection = Umbraco.Cms.Core.Composing.ComponentCollection;
namespace Umbraco.Cms.Infrastructure.Runtime
{
@@ -29,6 +31,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime
private readonly IEventAggregator _eventAggregator;
private readonly IHostingEnvironment _hostingEnvironment;
private readonly IUmbracoVersion _umbracoVersion;
private readonly IServiceProvider _serviceProvider;
private CancellationToken _cancellationToken;
/// <summary>
@@ -44,7 +47,8 @@ namespace Umbraco.Cms.Infrastructure.Runtime
IUmbracoDatabaseFactory databaseFactory,
IEventAggregator eventAggregator,
IHostingEnvironment hostingEnvironment,
IUmbracoVersion umbracoVersion)
IUmbracoVersion umbracoVersion,
IServiceProvider serviceProvider)
{
State = state;
_loggerFactory = loggerFactory;
@@ -56,9 +60,40 @@ namespace Umbraco.Cms.Infrastructure.Runtime
_eventAggregator = eventAggregator;
_hostingEnvironment = hostingEnvironment;
_umbracoVersion = umbracoVersion;
_serviceProvider = serviceProvider;
_logger = _loggerFactory.CreateLogger<CoreRuntime>();
}
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete]
public CoreRuntime(
ILoggerFactory loggerFactory,
IRuntimeState state,
ComponentCollection components,
IApplicationShutdownRegistry applicationShutdownRegistry,
IProfilingLogger profilingLogger,
IMainDom mainDom,
IUmbracoDatabaseFactory databaseFactory,
IEventAggregator eventAggregator,
IHostingEnvironment hostingEnvironment,
IUmbracoVersion umbracoVersion
):this(
loggerFactory,
state,
components,
applicationShutdownRegistry,
profilingLogger,
mainDom,
databaseFactory,
eventAggregator,
hostingEnvironment,
umbracoVersion,
null
)
{
}
/// <summary>
/// Gets the state of the Umbraco runtime.
/// </summary>
@@ -76,6 +111,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime
{
_cancellationToken = cancellationToken;
StaticApplicationLogging.Initialize(_loggerFactory);
StaticServiceProvider.Instance = _serviceProvider;
AppDomain.CurrentDomain.UnhandledException += (_, args) =>
{

View File

@@ -1,20 +0,0 @@
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
namespace Umbraco.Cms.Web.Common.DependencyInjection
{
/// <summary>
/// A <see cref="IStartupFilter"/> registered to automatically capture application services
/// </summary>
internal class UmbracoApplicationServicesCapture : IStartupFilter
{
/// <inheritdoc/>
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next) =>
app =>
{
StaticServiceProvider.Instance = app.ApplicationServices;
next(app);
};
}
}

View File

@@ -123,10 +123,6 @@ namespace Umbraco.Extensions
config,
profiler);
// adds the umbraco startup filter which will call UseUmbraco early on before
// other start filters are applied (depending on the ordering of IStartupFilters in DI).
services.AddTransient<IStartupFilter, UmbracoApplicationServicesCapture>();
return new UmbracoBuilder(services, config, typeLoader, loggerFactory, profiler, appCaches, tempHostingEnvironment);
}

View File

@@ -48,5 +48,4 @@
<_Parameter1>Umbraco.Tests.UnitTests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
</Project>