From b9e67dde559b9a1dd17c1dbaf17cb003a886512a Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Fri, 18 Sep 2020 12:53:10 +0200 Subject: [PATCH] Added configuration validation for models builder and hosting settings. Renamed models builder config class suffix to match others. --- .../Configuration/Models/ContentSettings.cs | 6 ++++- .../Configuration/Models/HostingSettings.cs | 17 ++++++++++++-- ...lderConfig.cs => ModelsBuilderSettings.cs} | 20 +++++++++++++---- .../Configuration/Models/SmtpSettings.cs | 8 +++++-- .../Validation/ConfigurationValidationBase.cs | 14 +++++++++++- .../Validation/GlobalSettingsValidation.cs | 22 +++++++++++++++++++ .../Validation/HostingSettingsValidation.cs | 22 +++++++++++++++++++ .../ModelsBuilderSettingsValidation.cs | 22 +++++++++++++++++++ .../ModelsBuilderConfigExtensions.cs | 2 +- src/Umbraco.Core/Constants-Configuration.cs | 2 -- .../BackOffice/ContentTypeModelValidator.cs | 2 +- .../ContentTypeModelValidatorBase.cs | 4 ++-- .../BackOffice/DashboardReport.cs | 12 +++++----- .../BackOffice/MediaTypeModelValidator.cs | 2 +- .../BackOffice/MemberTypeModelValidator.cs | 2 +- .../ModelsBuilderDashboardController.cs | 6 ++--- .../Building/Builder.cs | 6 ++--- .../Building/ModelsGenerator.cs | 4 ++-- .../Building/TextBuilder.cs | 2 +- .../Compose/ModelsBuilderComponent.cs | 6 ++--- .../Compose/ModelsBuilderComposer.cs | 4 ++-- .../LiveModelsProvider.cs | 6 ++--- .../ModelsGenerationError.cs | 4 ++-- .../OutOfDateModelsStatus.cs | 4 ++-- .../PureLiveModelFactory.cs | 4 ++-- .../Builders/HostingSettingsBuilder.cs | 6 ++--- .../Builders/ModelsBuilderConfigBuilder.cs | 6 ++--- .../AspNetCoreHostingEnvironment.cs | 2 +- .../UmbracoCoreServiceCollectionExtensions.cs | 9 +++++--- .../AspNet/AspNetHostingEnvironment.cs | 2 +- .../CDF/ClientDependencyComponent.cs | 2 +- 31 files changed, 171 insertions(+), 59 deletions(-) rename src/Umbraco.Core/Configuration/Models/{ModelsBuilderConfig.cs => ModelsBuilderSettings.cs} (84%) create mode 100644 src/Umbraco.Core/Configuration/Models/Validation/GlobalSettingsValidation.cs create mode 100644 src/Umbraco.Core/Configuration/Models/Validation/HostingSettingsValidation.cs create mode 100644 src/Umbraco.Core/Configuration/Models/Validation/ModelsBuilderSettingsValidation.cs diff --git a/src/Umbraco.Core/Configuration/Models/ContentSettings.cs b/src/Umbraco.Core/Configuration/Models/ContentSettings.cs index 00b9ef2181..f58d264658 100644 --- a/src/Umbraco.Core/Configuration/Models/ContentSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/ContentSettings.cs @@ -19,7 +19,11 @@ namespace Umbraco.Core.Configuration.Models public string PreviewBadge { get; set; } = DefaultPreviewBadge; - public string MacroErrors { get; set; } = MacroErrorBehaviour.Inline.ToString(); + // We could bind the enum MacroErrorsBehaviour directly from configuration, but we're doing so + // via this string to allow for validation to occur on start-up that the configured value does + // match one of the enum values. + // Without this it'll fail on first use, and we'd have less control over the error message. + internal string MacroErrors { get; set; } = MacroErrorBehaviour.Inline.ToString(); public MacroErrorBehaviour MacroErrorsBehaviour { diff --git a/src/Umbraco.Core/Configuration/Models/HostingSettings.cs b/src/Umbraco.Core/Configuration/Models/HostingSettings.cs index 0863181922..591d186761 100644 --- a/src/Umbraco.Core/Configuration/Models/HostingSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/HostingSettings.cs @@ -1,13 +1,26 @@ -namespace Umbraco.Core.Configuration.Models +using System; + +namespace Umbraco.Core.Configuration.Models { public class HostingSettings { public string ApplicationVirtualPath { get; set; } + // See note on ContentSettings.MacroErrors + internal string LocalTempStorageLocation { get; set; } = LocalTempStorage.Default.ToString(); + /// /// Gets the configuration for the location of temporary files. /// - public LocalTempStorage LocalTempStorageLocation { get; set; } = LocalTempStorage.Default; + public LocalTempStorage LocalTempStorageLocationValue + { + get + { + return Enum.TryParse(LocalTempStorageLocation, true, out var value) + ? value + : LocalTempStorage.Default; + } + } /// /// Gets a value indicating whether umbraco is running in [debug mode]. diff --git a/src/Umbraco.Core/Configuration/Models/ModelsBuilderConfig.cs b/src/Umbraco.Core/Configuration/Models/ModelsBuilderSettings.cs similarity index 84% rename from src/Umbraco.Core/Configuration/Models/ModelsBuilderConfig.cs rename to src/Umbraco.Core/Configuration/Models/ModelsBuilderSettings.cs index e99557755c..419cfd3bc9 100644 --- a/src/Umbraco.Core/Configuration/Models/ModelsBuilderConfig.cs +++ b/src/Umbraco.Core/Configuration/Models/ModelsBuilderSettings.cs @@ -1,11 +1,12 @@ -using Umbraco.Configuration; +using System; +using Umbraco.Configuration; namespace Umbraco.Core.Configuration.Models { /// /// Represents the models builder configuration. /// - public class ModelsBuilderConfig + public class ModelsBuilderSettings { public static string DefaultModelsDirectory => "~/App_Data/Models"; @@ -18,10 +19,21 @@ namespace Umbraco.Core.Configuration.Models /// public bool Enable { get; set; } = false; + // See note on ContentSettings.MacroErrors + internal string ModelsMode { get; set; } = Configuration.ModelsMode.Nothing.ToString(); + /// /// Gets the models mode. /// - public ModelsMode ModelsMode { get; set; } = ModelsMode.Nothing; + public ModelsMode ModelsModeValue + { + get + { + return Enum.TryParse(ModelsMode, true, out var value) + ? value + : Configuration.ModelsMode.Nothing; + } + } /// /// Gets the models namespace. @@ -51,7 +63,7 @@ namespace Umbraco.Core.Configuration.Models set { - if (!ModelsMode.IsLive()) + if (!ModelsModeValue.IsLive()) { _flagOutOfDateModels = false; } diff --git a/src/Umbraco.Core/Configuration/Models/SmtpSettings.cs b/src/Umbraco.Core/Configuration/Models/SmtpSettings.cs index a507f8a62f..8dac35dbee 100644 --- a/src/Umbraco.Core/Configuration/Models/SmtpSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/SmtpSettings.cs @@ -1,9 +1,13 @@ -using System.Net.Mail; +using System.ComponentModel.DataAnnotations; +using System.Net.Mail; +using Umbraco.Core.Configuration.Models.Validation; namespace Umbraco.Core.Configuration.Models { - public class SmtpSettings + public class SmtpSettings : ValidatableEntryBase { + [Required] + [EmailAddress] public string From { get; set; } public string Host { get; set; } diff --git a/src/Umbraco.Core/Configuration/Models/Validation/ConfigurationValidationBase.cs b/src/Umbraco.Core/Configuration/Models/Validation/ConfigurationValidationBase.cs index 1af1945665..3b0c9c2db8 100644 --- a/src/Umbraco.Core/Configuration/Models/Validation/ConfigurationValidationBase.cs +++ b/src/Umbraco.Core/Configuration/Models/Validation/ConfigurationValidationBase.cs @@ -20,7 +20,7 @@ namespace Umbraco.Core.Configuration.Models.Validation public bool ValidateStringIsOneOfEnumValues(string configPath, string value, Type enumType, out string message) { - var validValues = Enum.GetValues(enumType).OfType().Select(x => x.ToString().ToFirstLowerInvariant()); + var validValues = Enum.GetValues(enumType).OfType().Select(x => x.ToString()); return ValidateStringIsOneOfValidValues(configPath, value, validValues, out message); } @@ -35,5 +35,17 @@ namespace Umbraco.Core.Configuration.Models.Validation message = string.Empty; return true; } + + public bool ValidateOptionalEntry(string configPath, ValidatableEntryBase value, string validationDescription, out string message) + { + if (value != null && !value.IsValid()) + { + message = $"Configuration entry {configPath} contains one or more invalid values. {validationDescription}."; + return false; + } + + message = string.Empty; + return true; + } } } diff --git a/src/Umbraco.Core/Configuration/Models/Validation/GlobalSettingsValidation.cs b/src/Umbraco.Core/Configuration/Models/Validation/GlobalSettingsValidation.cs new file mode 100644 index 0000000000..fa99884347 --- /dev/null +++ b/src/Umbraco.Core/Configuration/Models/Validation/GlobalSettingsValidation.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.Options; + +namespace Umbraco.Core.Configuration.Models.Validation +{ + public class GlobalSettingsValidation : ConfigurationValidationBase, IValidateOptions + { + public ValidateOptionsResult Validate(string name, GlobalSettings options) + { + if (!ValidateSmtpSetting(options.Smtp, out var message)) + { + return ValidateOptionsResult.Fail(message); + } + + return ValidateOptionsResult.Success; + } + + private bool ValidateSmtpSetting(SmtpSettings value, out string message) + { + return ValidateOptionalEntry("Global:Smtp", value, "A valid From email address is required", out message); + } + } +} diff --git a/src/Umbraco.Core/Configuration/Models/Validation/HostingSettingsValidation.cs b/src/Umbraco.Core/Configuration/Models/Validation/HostingSettingsValidation.cs new file mode 100644 index 0000000000..11ba6e4a2c --- /dev/null +++ b/src/Umbraco.Core/Configuration/Models/Validation/HostingSettingsValidation.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.Options; + +namespace Umbraco.Core.Configuration.Models.Validation +{ + public class HostingSettingsValidation : ConfigurationValidationBase, IValidateOptions + { + public ValidateOptionsResult Validate(string name, HostingSettings options) + { + if (!ValidateLocalTempStorageLocation(options.LocalTempStorageLocation, out var message)) + { + return ValidateOptionsResult.Fail(message); + } + + return ValidateOptionsResult.Success; + } + + private bool ValidateLocalTempStorageLocation(string value, out string message) + { + return ValidateStringIsOneOfEnumValues("Hosting:LocalTempStorageLocation", value, typeof(LocalTempStorage), out message); + } + } +} diff --git a/src/Umbraco.Core/Configuration/Models/Validation/ModelsBuilderSettingsValidation.cs b/src/Umbraco.Core/Configuration/Models/Validation/ModelsBuilderSettingsValidation.cs new file mode 100644 index 0000000000..49351499cd --- /dev/null +++ b/src/Umbraco.Core/Configuration/Models/Validation/ModelsBuilderSettingsValidation.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.Options; + +namespace Umbraco.Core.Configuration.Models.Validation +{ + public class ModelsBuilderSettingsValidation : ConfigurationValidationBase, IValidateOptions + { + public ValidateOptionsResult Validate(string name, ModelsBuilderSettings options) + { + if (!ValidateModelsMode(options.ModelsMode, out var message)) + { + return ValidateOptionsResult.Fail(message); + } + + return ValidateOptionsResult.Success; + } + + private bool ValidateModelsMode(string value, out string message) + { + return ValidateStringIsOneOfEnumValues("ModelsBuilder:ModelsMode", value, typeof(ModelsMode), out message); + } + } +} diff --git a/src/Umbraco.Core/Configuration/ModelsBuilderConfigExtensions.cs b/src/Umbraco.Core/Configuration/ModelsBuilderConfigExtensions.cs index edf068e16f..ef80796c8b 100644 --- a/src/Umbraco.Core/Configuration/ModelsBuilderConfigExtensions.cs +++ b/src/Umbraco.Core/Configuration/ModelsBuilderConfigExtensions.cs @@ -10,7 +10,7 @@ namespace Umbraco.Core.Configuration { private static string _modelsDirectoryAbsolute = null; - public static string ModelsDirectoryAbsolute(this ModelsBuilderConfig modelsBuilderConfig, IHostingEnvironment hostingEnvironment) + public static string ModelsDirectoryAbsolute(this ModelsBuilderSettings modelsBuilderConfig, IHostingEnvironment hostingEnvironment) { if (_modelsDirectoryAbsolute is null) { diff --git a/src/Umbraco.Core/Constants-Configuration.cs b/src/Umbraco.Core/Constants-Configuration.cs index 86a02affb6..a9b2bab0fb 100644 --- a/src/Umbraco.Core/Constants-Configuration.cs +++ b/src/Umbraco.Core/Constants-Configuration.cs @@ -12,8 +12,6 @@ /// public const string ConfigPrefix = "Umbraco:CMS:"; public const string ConfigSecurityPrefix = ConfigPrefix+"Security:"; - public const string ConfigGlobalPrefix = ConfigPrefix + "Global:"; - public const string ConfigModelsBuilderPrefix = ConfigPrefix+"ModelsBuilder:"; public const string ConfigRuntimeMinification = ConfigPrefix+"RuntimeMinification"; public const string ConfigRuntimeMinificationVersion = ConfigRuntimeMinification+":Version"; } diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidator.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidator.cs index 5f806883f0..023911d518 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidator.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidator.cs @@ -11,7 +11,7 @@ namespace Umbraco.ModelsBuilder.Embedded.BackOffice // ReSharper disable once UnusedMember.Global - This is typed scanned public class ContentTypeModelValidator : ContentTypeModelValidatorBase { - public ContentTypeModelValidator(IOptions config) : base(config) + public ContentTypeModelValidator(IOptions config) : base(config) { } } diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs index c1684dde7a..0e4cd4f49a 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs @@ -14,9 +14,9 @@ namespace Umbraco.ModelsBuilder.Embedded.BackOffice where TModel : ContentTypeSave where TProperty : PropertyTypeBasic { - private readonly IOptions _config; + private readonly IOptions _config; - public ContentTypeModelValidatorBase(IOptions config) + public ContentTypeModelValidatorBase(IOptions config) { _config = config; } diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/DashboardReport.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/DashboardReport.cs index a0928fafcf..8b792343a3 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/DashboardReport.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/DashboardReport.cs @@ -8,18 +8,18 @@ namespace Umbraco.ModelsBuilder.Embedded.BackOffice { internal class DashboardReport { - private readonly ModelsBuilderConfig _config; + private readonly ModelsBuilderSettings _config; private readonly OutOfDateModelsStatus _outOfDateModels; private readonly ModelsGenerationError _mbErrors; - public DashboardReport(IOptions config, OutOfDateModelsStatus outOfDateModels, ModelsGenerationError mbErrors) + public DashboardReport(IOptions config, OutOfDateModelsStatus outOfDateModels, ModelsGenerationError mbErrors) { _config = config.Value; _outOfDateModels = outOfDateModels; _mbErrors = mbErrors; } - public bool CanGenerate() => _config.ModelsMode.SupportsExplicitGeneration(); + public bool CanGenerate() => _config.ModelsModeValue.SupportsExplicitGeneration(); public bool AreModelsOutOfDate() => _outOfDateModels.IsOutOfDate; @@ -41,13 +41,13 @@ namespace Umbraco.ModelsBuilder.Embedded.BackOffice sb.Append("
    "); sb.Append("
  • The models factory is "); - sb.Append(_config.EnableFactory || _config.ModelsMode == ModelsMode.PureLive + sb.Append(_config.EnableFactory || _config.ModelsModeValue == ModelsMode.PureLive ? "enabled" : "not enabled. Umbraco will not use models"); sb.Append(".
  • "); - sb.Append(_config.ModelsMode != ModelsMode.Nothing - ? $"
  • {_config.ModelsMode} models are enabled.
  • " + sb.Append(_config.ModelsModeValue != ModelsMode.Nothing + ? $"
  • {_config.ModelsModeValue} models are enabled.
  • " : "
  • No models mode is specified: models will not be generated.
  • "); sb.Append($"
  • Models namespace is {_config.ModelsNamespace}.
  • "); diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MediaTypeModelValidator.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MediaTypeModelValidator.cs index b6cc135e7c..4ccdc1b362 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MediaTypeModelValidator.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MediaTypeModelValidator.cs @@ -11,7 +11,7 @@ namespace Umbraco.ModelsBuilder.Embedded.BackOffice // ReSharper disable once UnusedMember.Global - This is typed scanned public class MediaTypeModelValidator : ContentTypeModelValidatorBase { - public MediaTypeModelValidator(IOptions config) : base(config) + public MediaTypeModelValidator(IOptions config) : base(config) { } } diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MemberTypeModelValidator.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MemberTypeModelValidator.cs index c930642155..9a735631ff 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MemberTypeModelValidator.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/MemberTypeModelValidator.cs @@ -11,7 +11,7 @@ namespace Umbraco.ModelsBuilder.Embedded.BackOffice // ReSharper disable once UnusedMember.Global - This is typed scanned public class MemberTypeModelValidator : ContentTypeModelValidatorBase { - public MemberTypeModelValidator(IOptions config) : base(config) + public MemberTypeModelValidator(IOptions config) : base(config) { } } diff --git a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs index 1339c79052..0240671c13 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs @@ -23,14 +23,14 @@ namespace Umbraco.ModelsBuilder.Embedded.BackOffice [UmbracoApplicationAuthorize(Core.Constants.Applications.Settings)] public class ModelsBuilderDashboardController : UmbracoAuthorizedJsonController { - private readonly ModelsBuilderConfig _config; + private readonly ModelsBuilderSettings _config; private readonly ModelsGenerator _modelGenerator; private readonly OutOfDateModelsStatus _outOfDateModels; private readonly ModelsGenerationError _mbErrors; private readonly DashboardReport _dashboardReport; private readonly IHostingEnvironment _hostingEnvironment; - public ModelsBuilderDashboardController(IOptions config, ModelsGenerator modelsGenerator, OutOfDateModelsStatus outOfDateModels, ModelsGenerationError mbErrors, IHostingEnvironment hostingEnvironment) + public ModelsBuilderDashboardController(IOptions config, ModelsGenerator modelsGenerator, OutOfDateModelsStatus outOfDateModels, ModelsGenerationError mbErrors, IHostingEnvironment hostingEnvironment) { //_umbracoServices = umbracoServices; _config = config.Value; @@ -51,7 +51,7 @@ namespace Umbraco.ModelsBuilder.Embedded.BackOffice { var config = _config; - if (!config.ModelsMode.SupportsExplicitGeneration()) + if (!config.ModelsModeValue.SupportsExplicitGeneration()) { var result2 = new BuildResult { Success = false, Message = "Models generation is not enabled." }; return Ok(result2); diff --git a/src/Umbraco.ModelsBuilder.Embedded/Building/Builder.cs b/src/Umbraco.ModelsBuilder.Embedded/Building/Builder.cs index 4c90234fab..871e221bbc 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Building/Builder.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Building/Builder.cs @@ -66,7 +66,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Building /// /// The list of models to generate. /// The models namespace. - protected Builder(ModelsBuilderConfig config, IList typeModels) + protected Builder(ModelsBuilderSettings config, IList typeModels) { _typeModels = typeModels ?? throw new ArgumentNullException(nameof(typeModels)); @@ -83,7 +83,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Building protected Builder() { } - protected ModelsBuilderConfig Config { get; } + protected ModelsBuilderSettings Config { get; } /// /// Prepares generation by processing the result of code parsing. @@ -92,7 +92,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Building { TypeModel.MapModelTypes(_typeModels, ModelsNamespace); - var pureLive = Config.ModelsMode == ModelsMode.PureLive; + var pureLive = Config.ModelsModeValue == ModelsMode.PureLive; // for the first two of these two tests, // always throw, even in purelive: cannot happen unless ppl start fidling with attributes to rename diff --git a/src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs b/src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs index 0348c287cd..bc97118ee4 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs @@ -11,11 +11,11 @@ namespace Umbraco.ModelsBuilder.Embedded.Building public class ModelsGenerator { private readonly UmbracoServices _umbracoService; - private readonly ModelsBuilderConfig _config; + private readonly ModelsBuilderSettings _config; private readonly OutOfDateModelsStatus _outOfDateModels; private readonly IHostingEnvironment _hostingEnvironment; - public ModelsGenerator(UmbracoServices umbracoService, IOptions config, OutOfDateModelsStatus outOfDateModels, IHostingEnvironment hostingEnvironment) + public ModelsGenerator(UmbracoServices umbracoService, IOptions config, OutOfDateModelsStatus outOfDateModels, IHostingEnvironment hostingEnvironment) { _umbracoService = umbracoService; _config = config.Value; diff --git a/src/Umbraco.ModelsBuilder.Embedded/Building/TextBuilder.cs b/src/Umbraco.ModelsBuilder.Embedded/Building/TextBuilder.cs index 607aa129b1..43771eb46a 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Building/TextBuilder.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Building/TextBuilder.cs @@ -18,7 +18,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Building /// and the result of code parsing. /// /// The list of models to generate. - public TextBuilder(ModelsBuilderConfig config, IList typeModels) + public TextBuilder(ModelsBuilderSettings config, IList typeModels) : base(config, typeModels) { } diff --git a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs index 1088dfb470..b490a9b62f 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComponent.cs @@ -21,7 +21,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose { internal class ModelsBuilderComponent : IComponent { - private readonly ModelsBuilderConfig _config; + private readonly ModelsBuilderSettings _config; private readonly IShortStringHelper _shortStringHelper; private readonly LiveModelsProvider _liveModelsProvider; private readonly OutOfDateModelsStatus _outOfDateModels; @@ -29,7 +29,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime; private readonly IUmbracoRequestLifetime _umbracoRequestLifetime; - public ModelsBuilderComponent(IOptions config, IShortStringHelper shortStringHelper, + public ModelsBuilderComponent(IOptions config, IShortStringHelper shortStringHelper, LiveModelsProvider liveModelsProvider, OutOfDateModelsStatus outOfDateModels, LinkGenerator linkGenerator, IUmbracoRequestLifetime umbracoRequestLifetime, IUmbracoApplicationLifetime umbracoApplicationLifetime) { @@ -55,7 +55,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose if (_config.Enable) FileService.SavingTemplate += FileService_SavingTemplate; - if (_config.ModelsMode.IsLiveNotPure()) + if (_config.ModelsModeValue.IsLiveNotPure()) _liveModelsProvider.Install(); if (_config.FlagOutOfDateModels) diff --git a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs index fd5472b223..d2ec4a4a09 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs @@ -27,8 +27,8 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose composition.RegisterUnique(factory => { - var config = factory.GetInstance>().Value; - if (config.ModelsMode == ModelsMode.PureLive) + var config = factory.GetInstance>().Value; + if (config.ModelsModeValue == ModelsMode.PureLive) { composition.RegisterUnique(); diff --git a/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs b/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs index 48a79ba953..1161d4879e 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/LiveModelsProvider.cs @@ -20,15 +20,15 @@ namespace Umbraco.ModelsBuilder.Embedded private static Mutex _mutex; private static int _req; private readonly ILogger _logger; - private readonly ModelsBuilderConfig _config; + private readonly ModelsBuilderSettings _config; private readonly ModelsGenerator _modelGenerator; private readonly ModelsGenerationError _mbErrors; private readonly IHostingEnvironment _hostingEnvironment; // we do not manage pure live here - internal bool IsEnabled => _config.ModelsMode.IsLiveNotPure(); + internal bool IsEnabled => _config.ModelsModeValue.IsLiveNotPure(); - public LiveModelsProvider(ILogger logger, IOptions config, ModelsGenerator modelGenerator, ModelsGenerationError mbErrors, IHostingEnvironment hostingEnvironment) + public LiveModelsProvider(ILogger logger, IOptions config, ModelsGenerator modelGenerator, ModelsGenerationError mbErrors, IHostingEnvironment hostingEnvironment) { _logger = logger; _config = config.Value ?? throw new ArgumentNullException(nameof(config)); diff --git a/src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs b/src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs index a5911bc9c6..dca2fda0dc 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs @@ -10,10 +10,10 @@ namespace Umbraco.ModelsBuilder.Embedded { public sealed class ModelsGenerationError { - private readonly ModelsBuilderConfig _config; + private readonly ModelsBuilderSettings _config; private readonly IHostingEnvironment _hostingEnvironment; - public ModelsGenerationError(IOptions config, IHostingEnvironment hostingEnvironment) + public ModelsGenerationError(IOptions config, IHostingEnvironment hostingEnvironment) { _config = config.Value; _hostingEnvironment = hostingEnvironment; diff --git a/src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs b/src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs index 85d08ee975..92e0604a16 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs @@ -9,10 +9,10 @@ namespace Umbraco.ModelsBuilder.Embedded { public sealed class OutOfDateModelsStatus { - private readonly ModelsBuilderConfig _config; + private readonly ModelsBuilderSettings _config; private readonly IHostingEnvironment _hostingEnvironment; - public OutOfDateModelsStatus(IOptions config, IHostingEnvironment hostingEnvironment) + public OutOfDateModelsStatus(IOptions config, IHostingEnvironment hostingEnvironment) { _config = config.Value; _hostingEnvironment = hostingEnvironment; diff --git a/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs b/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs index 596cc9ed26..00c5ec723d 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs @@ -38,7 +38,7 @@ namespace Umbraco.ModelsBuilder.Embedded private static readonly Regex AssemblyVersionRegex = new Regex("AssemblyVersion\\(\"[0-9]+.[0-9]+.[0-9]+.[0-9]+\"\\)", RegexOptions.Compiled); private static readonly string[] OurFiles = { "models.hash", "models.generated.cs", "all.generated.cs", "all.dll.path", "models.err", "Compiled" }; - private readonly ModelsBuilderConfig _config; + private readonly ModelsBuilderSettings _config; private readonly IHostingEnvironment _hostingEnvironment; private readonly IApplicationShutdownRegistry _hostingLifetime; private readonly ModelsGenerationError _errors; @@ -47,7 +47,7 @@ namespace Umbraco.ModelsBuilder.Embedded public PureLiveModelFactory( Lazy umbracoServices, IProfilingLogger logger, - IOptions config, + IOptions config, IHostingEnvironment hostingEnvironment, IApplicationShutdownRegistry hostingLifetime, IPublishedValueFallback publishedValueFallback) diff --git a/src/Umbraco.Tests.Common/Builders/HostingSettingsBuilder.cs b/src/Umbraco.Tests.Common/Builders/HostingSettingsBuilder.cs index 3e5e1db391..4a2c19aae0 100644 --- a/src/Umbraco.Tests.Common/Builders/HostingSettingsBuilder.cs +++ b/src/Umbraco.Tests.Common/Builders/HostingSettingsBuilder.cs @@ -7,7 +7,7 @@ namespace Umbraco.Tests.Common.Builders { private string _applicationVirtualPath; private bool? _debug; - private LocalTempStorage? _localTempStorageLocation; + private string _localTempStorageLocation; public HostingSettingsBuilder WithApplicationVirtualPath(string applicationVirtualPath) { @@ -23,14 +23,14 @@ namespace Umbraco.Tests.Common.Builders public HostingSettingsBuilder WithLocalTempStorageLocation(LocalTempStorage localTempStorageLocation) { - _localTempStorageLocation = localTempStorageLocation; + _localTempStorageLocation = localTempStorageLocation.ToString(); return this; } public override HostingSettings Build() { var debug = _debug ?? false; - var localTempStorageLocation = _localTempStorageLocation ?? LocalTempStorage.Default; + var localTempStorageLocation = _localTempStorageLocation ?? LocalTempStorage.Default.ToString(); var applicationVirtualPath = _applicationVirtualPath ?? null; return new HostingSettings diff --git a/src/Umbraco.Tests.Common/Builders/ModelsBuilderConfigBuilder.cs b/src/Umbraco.Tests.Common/Builders/ModelsBuilderConfigBuilder.cs index 4b94339dc0..d3f428932c 100644 --- a/src/Umbraco.Tests.Common/Builders/ModelsBuilderConfigBuilder.cs +++ b/src/Umbraco.Tests.Common/Builders/ModelsBuilderConfigBuilder.cs @@ -2,11 +2,11 @@ using Umbraco.Core.Configuration.Models; namespace Umbraco.Tests.Common.Builders { - public class ModelsBuilderConfigBuilder : BuilderBase + public class ModelsBuilderConfigBuilder : BuilderBase { - public override ModelsBuilderConfig Build() + public override ModelsBuilderSettings Build() { - return new ModelsBuilderConfig(); + return new ModelsBuilderSettings(); } } } diff --git a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs index ede121a9f7..d5e4a9f258 100644 --- a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs +++ b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs @@ -45,7 +45,7 @@ namespace Umbraco.Web.Common.AspNetCore if (_localTempPath != null) return _localTempPath; - switch (_hostingSettings.CurrentValue.LocalTempStorageLocation) + switch (_hostingSettings.CurrentValue.LocalTempStorageLocationValue) { case LocalTempStorage.AspNetTemp: diff --git a/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs b/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs index 09e4c0c82a..2a618ca39b 100644 --- a/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs @@ -128,22 +128,25 @@ namespace Umbraco.Extensions if (configuration == null) throw new ArgumentNullException(nameof(configuration)); services.AddSingleton, ContentSettingsValidation>(); + services.AddSingleton, GlobalSettingsValidation>(); + services.AddSingleton, HostingSettingsValidation>(); + services.AddSingleton, ModelsBuilderSettingsValidation>(); services.AddSingleton, RequestHandlerSettingsValidation>(); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "ActiveDirectory")); services.Configure(configuration.GetSection("ConnectionStrings"), o => o.BindNonPublicProperties = true); - services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Content")); + services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Content"), o => o.BindNonPublicProperties = true); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Core:Debug")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "ExceptionFilter")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Global")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "HealthChecks")); - services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Hosting")); + services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Hosting"), o => o.BindNonPublicProperties = true); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Imaging")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Examine")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "KeepAlive")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Logging")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigSecurityPrefix + "MemberPassword")); - services.Configure(configuration.GetSection(Constants.Configuration.ConfigGlobalPrefix + "ModelsBuilder")); + services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "ModelsBuilder"), o => o.BindNonPublicProperties = true); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "NuCache")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "RequestHandler")); services.Configure(configuration.GetSection(Constants.Configuration.ConfigPrefix + "Runtime")); diff --git a/src/Umbraco.Web/AspNet/AspNetHostingEnvironment.cs b/src/Umbraco.Web/AspNet/AspNetHostingEnvironment.cs index 2ec6599939..dae6b1ffbe 100644 --- a/src/Umbraco.Web/AspNet/AspNetHostingEnvironment.cs +++ b/src/Umbraco.Web/AspNet/AspNetHostingEnvironment.cs @@ -63,7 +63,7 @@ namespace Umbraco.Web.Hosting if (_localTempPath != null) return _localTempPath; - switch (_hostingSettings.LocalTempStorageLocation) + switch (_hostingSettings.LocalTempStorageLocationValue) { case LocalTempStorage.AspNetTemp: return _localTempPath = System.IO.Path.Combine(HttpRuntime.CodegenDir, "UmbracoData"); diff --git a/src/Umbraco.Web/WebAssets/CDF/ClientDependencyComponent.cs b/src/Umbraco.Web/WebAssets/CDF/ClientDependencyComponent.cs index 47dd0908dd..1f357d65b5 100644 --- a/src/Umbraco.Web/WebAssets/CDF/ClientDependencyComponent.cs +++ b/src/Umbraco.Web/WebAssets/CDF/ClientDependencyComponent.cs @@ -46,7 +46,7 @@ namespace Umbraco.Web.WebAssets.CDF // Now we need to detect if we are running 'Umbraco.Core.LocalTempStorage' as EnvironmentTemp and in that case we want to change the CDF file // location to be there - if (_hostingSettings.LocalTempStorageLocation == LocalTempStorage.EnvironmentTemp) + if (_hostingSettings.LocalTempStorageLocationValue == LocalTempStorage.EnvironmentTemp) { var cachePath = _hostingEnvironment.LocalTempPath;