Merge remote-tracking branch 'origin/v10/dev' into v10/feature/nullable-reference-types-in-Umbraco-Core
# Conflicts: # build/build.ps1 # src/Umbraco.Core/Configuration/ConfigConnectionString.cs # src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs # src/Umbraco.Core/Install/InstallSteps/TelemetryIdentifierStep.cs # src/Umbraco.Core/Models/ContentType.cs # src/Umbraco.Infrastructure/Migrations/Install/DatabaseBuilder.cs # tests/Umbraco.Tests.AcceptanceTest/package.json
This commit is contained in:
@@ -1,31 +1,34 @@
|
||||
// Copyright (c) Umbraco.
|
||||
// See LICENSE for more details.
|
||||
using Umbraco.Extensions;
|
||||
|
||||
namespace Umbraco.Cms.Core.Configuration.Models
|
||||
namespace Umbraco.Cms.Core.Configuration.Models;
|
||||
|
||||
[UmbracoOptions("ConnectionStrings")]
|
||||
public class ConnectionStrings
|
||||
{
|
||||
/// <summary>
|
||||
/// Typed configuration options for connection strings.
|
||||
/// </summary>
|
||||
[UmbracoOptions("ConnectionStrings", BindNonPublicProperties = true)]
|
||||
public class ConnectionStrings
|
||||
{
|
||||
// Backing field for UmbracoConnectionString to load from configuration value with key umbracoDbDSN.
|
||||
// Attributes cannot be applied to map from keys that don't match, and have chosen to retain the key name
|
||||
// used in configuration for older Umbraco versions.
|
||||
// See: https://stackoverflow.com/a/54607296/489433
|
||||
#pragma warning disable SA1300 // Element should begin with upper-case letter
|
||||
#pragma warning disable IDE1006 // Naming Styles
|
||||
private string? umbracoDbDSN
|
||||
#pragma warning restore IDE1006 // Naming Styles
|
||||
#pragma warning restore SA1300 // Element should begin with upper-case letter
|
||||
{
|
||||
get => UmbracoConnectionString?.ConnectionString;
|
||||
set => UmbracoConnectionString = new ConfigConnectionString(Constants.System.UmbracoConnectionName, value);
|
||||
}
|
||||
private string _connectionString;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value for the Umbraco database connection string..
|
||||
/// </summary>
|
||||
public ConfigConnectionString UmbracoConnectionString { get; set; } = new ConfigConnectionString(Constants.System.UmbracoConnectionName, null);
|
||||
/// <summary>
|
||||
/// The default provider name when not present in configuration.
|
||||
/// </summary>
|
||||
public const string DefaultProviderName = "Microsoft.Data.SqlClient";
|
||||
|
||||
/// <summary>
|
||||
/// The DataDirectory placeholder.
|
||||
/// </summary>
|
||||
public const string DataDirectoryPlaceholder = "|DataDirectory|";
|
||||
|
||||
/// <summary>
|
||||
/// The postfix used to identify a connection strings provider setting.
|
||||
/// </summary>
|
||||
public const string ProviderNamePostfix = "_ProviderName";
|
||||
|
||||
public string Name { get; set; }
|
||||
|
||||
public string ConnectionString
|
||||
{
|
||||
get => _connectionString;
|
||||
set => _connectionString = value.ReplaceDataDirectoryPlaceholder();
|
||||
}
|
||||
|
||||
public string ProviderName { get; set; } = DefaultProviderName;
|
||||
}
|
||||
|
||||
@@ -156,6 +156,9 @@ namespace Umbraco.Cms.Core.Configuration.Models
|
||||
internal const bool StaticShowDeprecatedPropertyEditors = false;
|
||||
internal const string StaticLoginBackgroundImage = "assets/img/login.jpg";
|
||||
internal const string StaticLoginLogoImage = "assets/img/application/umbraco_logo_white.svg";
|
||||
internal const bool StaticHideBackOfficeLogo = false;
|
||||
internal const bool StaticDisableDeleteWhenReferenced = false;
|
||||
internal const bool StaticDisableUnpublishWhenReferenced = false;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value for the content notification settings.
|
||||
@@ -219,6 +222,24 @@ namespace Umbraco.Cms.Core.Configuration.Models
|
||||
[DefaultValue(StaticLoginLogoImage)]
|
||||
public string LoginLogoImage { get; set; } = StaticLoginLogoImage;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to hide the backoffice umbraco logo or not.
|
||||
/// </summary>
|
||||
[DefaultValue(StaticHideBackOfficeLogo)]
|
||||
public bool HideBackOfficeLogo { get; set; } = StaticHideBackOfficeLogo;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to disable the deletion of items referenced by other items.
|
||||
/// </summary>
|
||||
[DefaultValue(StaticDisableDeleteWhenReferenced)]
|
||||
public bool DisableDeleteWhenReferenced { get; set; } = StaticDisableDeleteWhenReferenced;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to disable the unpublishing of items referenced by other items.
|
||||
/// </summary>
|
||||
[DefaultValue(StaticDisableUnpublishWhenReferenced)]
|
||||
public bool DisableUnpublishWhenReferenced { get; set; } = StaticDisableUnpublishWhenReferenced;
|
||||
|
||||
/// <summary>
|
||||
/// Get or sets the model representing the global content version cleanup policy
|
||||
/// </summary>
|
||||
|
||||
@@ -27,8 +27,10 @@ namespace Umbraco.Cms.Core.Configuration.Models
|
||||
internal const bool StaticInstallMissingDatabase = false;
|
||||
internal const bool StaticDisableElectionForSingleServer = false;
|
||||
internal const string StaticNoNodesViewPath = "~/umbraco/UmbracoWebsite/NoNodes.cshtml";
|
||||
internal const string StaticSqlWriteLockTimeOut = "00:00:05";
|
||||
internal const string StaticDistributedLockingReadLockDefaultTimeout = "00:01:00";
|
||||
internal const string StaticDistributedLockingWriteLockDefaultTimeout = "00:00:05";
|
||||
internal const bool StaticSanitizeTinyMce = false;
|
||||
internal const int StaticMainDomReleaseSignalPollingInterval = 2000;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value for the reserved URLs (must end with a comma).
|
||||
@@ -137,6 +139,26 @@ namespace Umbraco.Cms.Core.Configuration.Models
|
||||
/// </summary>
|
||||
public string MainDomLock { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value to discriminate MainDom boundaries.
|
||||
/// <para>
|
||||
/// Generally the default should suffice but useful for advanced scenarios e.g. azure deployment slot based zero downtime deployments.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public string MainDomKeyDiscriminator { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the duration (in milliseconds) for which the MainDomLock release signal polling task should sleep.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Doesn't apply to MainDomSemaphoreLock.
|
||||
/// <para>
|
||||
/// The default value is 2000ms.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
[DefaultValue(StaticMainDomReleaseSignalPollingInterval)]
|
||||
public int MainDomReleaseSignalPollingInterval { get; set; } = StaticMainDomReleaseSignalPollingInterval;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the telemetry ID.
|
||||
/// </summary>
|
||||
@@ -174,18 +196,32 @@ namespace Umbraco.Cms.Core.Configuration.Models
|
||||
public bool IsPickupDirectoryLocationConfigured => !string.IsNullOrWhiteSpace(Smtp?.PickupDirectoryLocation);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether TinyMCE scripting sanitization should be applied.
|
||||
/// Gets or sets a value indicating whether TinyMCE scripting sanitization should be applied.
|
||||
/// </summary>
|
||||
[DefaultValue(StaticSanitizeTinyMce)]
|
||||
public bool SanitizeTinyMce => StaticSanitizeTinyMce;
|
||||
public bool SanitizeTinyMce { get; set; } = StaticSanitizeTinyMce;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value representing the time in milliseconds to lock the database for a write operation.
|
||||
/// Gets or sets a value representing the maximum time to wait whilst attempting to obtain a distributed read lock.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The default value is 5000 milliseconds.
|
||||
/// The default value is 60 seconds.
|
||||
/// </remarks>
|
||||
[DefaultValue(StaticSqlWriteLockTimeOut)]
|
||||
public TimeSpan SqlWriteLockTimeOut { get; } = TimeSpan.Parse(StaticSqlWriteLockTimeOut);
|
||||
[DefaultValue(StaticDistributedLockingReadLockDefaultTimeout)]
|
||||
public TimeSpan DistributedLockingReadLockDefaultTimeout { get; set; } = TimeSpan.Parse(StaticDistributedLockingReadLockDefaultTimeout);
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value representing the maximum time to wait whilst attempting to obtain a distributed write lock.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The default value is 5 seconds.
|
||||
/// </remarks>
|
||||
[DefaultValue(StaticDistributedLockingWriteLockDefaultTimeout)]
|
||||
public TimeSpan DistributedLockingWriteLockDefaultTimeout { get; set; } = TimeSpan.Parse(StaticDistributedLockingWriteLockDefaultTimeout);
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value representing the DistributedLockingMechanism to use.
|
||||
/// </summary>
|
||||
public string DistributedLockingMechanism { get; set; } = string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
|
||||
if (!ModelsMode.IsAuto())
|
||||
{
|
||||
_flagOutOfDateModels = false;
|
||||
return;
|
||||
}
|
||||
|
||||
_flagOutOfDateModels = value;
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
|
||||
[UmbracoOptions(Constants.Configuration.ConfigRichTextEditor)]
|
||||
public class RichTextEditorSettings
|
||||
{
|
||||
internal const string StaticValidElements = "+a[id|style|rel|data-id|data-udi|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|reversed|start|style|type],-ul[class|style],-li[class|style],br[class],img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align|umbracoorgwidth|umbracoorgheight|onresize|onresizestart|onresizeend|rel|data-id],-sub[style|class],-sup[style|class],-blockquote[dir|style|class],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[class|align|style],-pre[class|align|style],address[class|align|style],-h1[id|dir|class|align|style],-h2[id|dir|class|align|style],-h3[id|dir|class|align|style],-h4[id|dir|class|align|style],-h5[id|dir|class|align|style],-h6[id|style|dir|class|align|style],hr[class|style],small[class|style],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],object[class|id|width|height|codebase|*],param[name|value|_value|class],embed[type|width|height|src|class|*],map[name|class],area[shape|coords|href|alt|target|class],bdo[class],button[class],iframe[*]";
|
||||
internal const string StaticValidElements = "+a[id|style|rel|data-id|data-udi|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|reversed|start|style|type],-ul[class|style],-li[class|style],br[class],img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align|umbracoorgwidth|umbracoorgheight|onresize|onresizestart|onresizeend|rel|data-id],-sub[style|class],-sup[style|class],-blockquote[dir|style|class],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[class|align|style],-pre[class|align|style],address[class|align|style],-h1[id|dir|class|align|style],-h2[id|dir|class|align|style],-h3[id|dir|class|align|style],-h4[id|dir|class|align|style],-h5[id|dir|class|align|style],-h6[id|style|dir|class|align|style],hr[class|style],small[class|style],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],object[class|id|width|height|codebase|*],param[name|value|_value|class],embed[type|width|height|src|class|*],map[name|class],area[shape|coords|href|alt|target|class],bdo[class],button[class],iframe[*],figure,figcaption";
|
||||
internal const string StaticInvalidElements = "font";
|
||||
|
||||
private static readonly string[] s_default_plugins = new[]
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace Umbraco.Cms.Core.Configuration.Models.Validation
|
||||
return ValidateOptionsResult.Fail(message);
|
||||
}
|
||||
|
||||
if (!ValidateSqlWriteLockTimeOutSetting(options.SqlWriteLockTimeOut, out var message2))
|
||||
if (!ValidateSqlWriteLockTimeOutSetting(options.DistributedLockingWriteLockDefaultTimeout, out var message2))
|
||||
{
|
||||
return ValidateOptionsResult.Fail(message2);
|
||||
}
|
||||
@@ -37,7 +37,7 @@ namespace Umbraco.Cms.Core.Configuration.Models.Validation
|
||||
const int maximumTimeOut = 20000;
|
||||
if (configuredTimeOut.TotalMilliseconds < minimumTimeOut || configuredTimeOut.TotalMilliseconds > maximumTimeOut) // between 0.1 and 20 seconds
|
||||
{
|
||||
message = $"The `{Constants.Configuration.ConfigGlobal}:{nameof(GlobalSettings.SqlWriteLockTimeOut)}` setting is not between the minimum of {minimumTimeOut} ms and maximum of {maximumTimeOut} ms";
|
||||
message = $"The `{Constants.Configuration.ConfigGlobal}:{nameof(GlobalSettings.DistributedLockingWriteLockDefaultTimeout)}` setting is not between the minimum of {minimumTimeOut} ms and maximum of {maximumTimeOut} ms";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user