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
/// 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;