From 0670caee15a7bc3ff85518e6dfa20d3b2fb031f4 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Mon, 23 Dec 2019 14:35:39 +0100 Subject: [PATCH 1/3] Populated user and member password configuration from settings file. --- .../Configuration/ConfigsExtensions.cs | 22 ++++- .../MemberPasswordConfiguration.cs | 15 +++ .../Configuration/PasswordConfiguration.cs | 41 ++++++++ .../IMemberPasswordConfigurationSection.cs | 6 ++ .../IPasswordConfigurationSection.cs | 21 ++++ .../UmbracoSettings/ISecuritySection.cs | 6 +- .../IUserPasswordConfigurationSection.cs | 6 ++ .../UserPasswordConfiguration.cs | 15 +++ src/Umbraco.Configuration/ConfigsFactory.cs | 27 ++---- .../MemberPasswordConfigurationElement.cs | 6 ++ .../PasswordConfigurationElement.cs | 31 ++++++ .../UmbracoSettings/SecurityElement.cs | 10 ++ .../UserPasswordConfigurationElement.cs | 6 ++ .../UmbracoSettings/SecurityElementTests.cs | 96 +++++++++++++++++++ .../UmbracoSettings/WebRoutingElementTests.cs | 2 +- .../UmbracoSettings/umbracoSettings.config | 7 ++ .../Stubs/TestUserPasswordConfig.cs | 23 +++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + .../AuthenticationControllerTests.cs | 4 +- .../config/umbracoSettings.config | 6 ++ src/Umbraco.Web/UmbracoDefaultOwinStartup.cs | 2 +- 21 files changed, 324 insertions(+), 29 deletions(-) create mode 100644 src/Umbraco.Abstractions/Configuration/MemberPasswordConfiguration.cs create mode 100644 src/Umbraco.Abstractions/Configuration/PasswordConfiguration.cs create mode 100644 src/Umbraco.Abstractions/Configuration/UmbracoSettings/IMemberPasswordConfigurationSection.cs create mode 100644 src/Umbraco.Abstractions/Configuration/UmbracoSettings/IPasswordConfigurationSection.cs create mode 100644 src/Umbraco.Abstractions/Configuration/UmbracoSettings/IUserPasswordConfigurationSection.cs create mode 100644 src/Umbraco.Abstractions/Configuration/UserPasswordConfiguration.cs create mode 100644 src/Umbraco.Configuration/UmbracoSettings/MemberPasswordConfigurationElement.cs create mode 100644 src/Umbraco.Configuration/UmbracoSettings/PasswordConfigurationElement.cs create mode 100644 src/Umbraco.Configuration/UmbracoSettings/UserPasswordConfigurationElement.cs create mode 100644 src/Umbraco.Tests/TestHelpers/Stubs/TestUserPasswordConfig.cs diff --git a/src/Umbraco.Abstractions/Configuration/ConfigsExtensions.cs b/src/Umbraco.Abstractions/Configuration/ConfigsExtensions.cs index a41665a59e..1723785069 100644 --- a/src/Umbraco.Abstractions/Configuration/ConfigsExtensions.cs +++ b/src/Umbraco.Abstractions/Configuration/ConfigsExtensions.cs @@ -28,9 +28,6 @@ namespace Umbraco.Core public static IUmbracoSettingsSection Settings(this Configs configs) => configs.GetConfig(); - public static IUserPasswordConfiguration UserPasswordConfig(this Configs configs) - => configs.GetConfig(); - public static IHealthChecks HealthChecks(this Configs configs) => configs.GetConfig(); @@ -40,11 +37,28 @@ namespace Umbraco.Core public static ICoreDebug CoreDebug(this Configs configs) => configs.GetConfig(); + public static IUserPasswordConfiguration UserPasswordConfiguration(this Configs configs) + => configs.GetConfig(); + + public static IMemberPasswordConfiguration MemberPasswordConfiguration(this Configs configs) + => configs.GetConfig(); + + public static void AddPasswordConfigurations(this Configs configs) + { + configs.Add(() => + { + return new UserPasswordConfiguration(configs.Settings().Security.UserPasswordConfiguration); + }); + configs.Add(() => + { + return new MemberPasswordConfiguration(configs.Settings().Security.MemberPasswordConfiguration); + }); + } + public static void AddCoreConfigs(this Configs configs, IIOHelper ioHelper) { var configDir = new DirectoryInfo(ioHelper.MapPath(Constants.SystemDirectories.Config)); - // GridConfig depends on runtime caches, manifest parsers... and cannot be available during composition configs.Add(factory => new GridConfig( factory.GetInstance(), diff --git a/src/Umbraco.Abstractions/Configuration/MemberPasswordConfiguration.cs b/src/Umbraco.Abstractions/Configuration/MemberPasswordConfiguration.cs new file mode 100644 index 0000000000..58c907c31f --- /dev/null +++ b/src/Umbraco.Abstractions/Configuration/MemberPasswordConfiguration.cs @@ -0,0 +1,15 @@ +using Umbraco.Core.Configuration.UmbracoSettings; + +namespace Umbraco.Core.Configuration +{ + /// + /// The password configuration for back office users + /// + public class MemberPasswordConfiguration : PasswordConfiguration, IMemberPasswordConfiguration + { + public MemberPasswordConfiguration(IMemberPasswordConfigurationSection configSection) + : base(configSection) + { + } + } +} diff --git a/src/Umbraco.Abstractions/Configuration/PasswordConfiguration.cs b/src/Umbraco.Abstractions/Configuration/PasswordConfiguration.cs new file mode 100644 index 0000000000..9edf1a462e --- /dev/null +++ b/src/Umbraco.Abstractions/Configuration/PasswordConfiguration.cs @@ -0,0 +1,41 @@ +using System; +using Umbraco.Core.Configuration.UmbracoSettings; + +namespace Umbraco.Core.Configuration +{ + public abstract class PasswordConfiguration : IPasswordConfiguration + { + protected PasswordConfiguration(IPasswordConfigurationSection configSection) + { + if (configSection == null) + { + throw new ArgumentNullException(nameof(configSection)); + } + + RequiredLength = configSection.RequiredLength; + RequireNonLetterOrDigit = configSection.RequireNonLetterOrDigit; + RequireDigit = configSection.RequireDigit; + RequireLowercase = configSection.RequireLowercase; + RequireUppercase = configSection.RequireUppercase; + UseLegacyEncoding = configSection.UseLegacyEncoding; + HashAlgorithmType = configSection.HashAlgorithmType; + MaxFailedAccessAttemptsBeforeLockout = configSection.MaxFailedAccessAttemptsBeforeLockout; + } + + public int RequiredLength { get; } + + public bool RequireNonLetterOrDigit { get; } + + public bool RequireDigit { get; } + + public bool RequireLowercase { get; } + + public bool RequireUppercase { get; } + + public bool UseLegacyEncoding { get; } + + public string HashAlgorithmType { get; } + + public int MaxFailedAccessAttemptsBeforeLockout { get; } + } +} diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IMemberPasswordConfigurationSection.cs b/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IMemberPasswordConfigurationSection.cs new file mode 100644 index 0000000000..cbbb933857 --- /dev/null +++ b/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IMemberPasswordConfigurationSection.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Core.Configuration.UmbracoSettings +{ + public interface IMemberPasswordConfigurationSection : IPasswordConfigurationSection + { + } +} diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IPasswordConfigurationSection.cs b/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IPasswordConfigurationSection.cs new file mode 100644 index 0000000000..a561b7808e --- /dev/null +++ b/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IPasswordConfigurationSection.cs @@ -0,0 +1,21 @@ +namespace Umbraco.Core.Configuration.UmbracoSettings +{ + public interface IPasswordConfigurationSection : IUmbracoConfigurationSection + { + int RequiredLength { get; } + + bool RequireNonLetterOrDigit { get; } + + bool RequireDigit { get; } + + bool RequireLowercase { get; } + + bool RequireUppercase { get; } + + bool UseLegacyEncoding { get; } + + string HashAlgorithmType { get; } + + int MaxFailedAccessAttemptsBeforeLockout { get; } + } +} diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ISecuritySection.cs b/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ISecuritySection.cs index b8b8c86f8d..a6ed188713 100644 --- a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ISecuritySection.cs +++ b/src/Umbraco.Abstractions/Configuration/UmbracoSettings/ISecuritySection.cs @@ -3,7 +3,7 @@ public interface ISecuritySection : IUmbracoConfigurationSection { bool KeepUserLoggedIn { get; } - + bool HideDisabledUsersInBackoffice { get; } /// @@ -23,5 +23,9 @@ /// When this is false, the username and email fields will be shown in the user section. /// bool UsernameIsEmail { get; } + + IUserPasswordConfigurationSection UserPasswordConfiguration { get; } + + IMemberPasswordConfigurationSection MemberPasswordConfiguration { get; } } } diff --git a/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IUserPasswordConfigurationSection.cs b/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IUserPasswordConfigurationSection.cs new file mode 100644 index 0000000000..d80dd2b7e5 --- /dev/null +++ b/src/Umbraco.Abstractions/Configuration/UmbracoSettings/IUserPasswordConfigurationSection.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Core.Configuration.UmbracoSettings +{ + public interface IUserPasswordConfigurationSection : IPasswordConfigurationSection + { + } +} diff --git a/src/Umbraco.Abstractions/Configuration/UserPasswordConfiguration.cs b/src/Umbraco.Abstractions/Configuration/UserPasswordConfiguration.cs new file mode 100644 index 0000000000..4cfee5280b --- /dev/null +++ b/src/Umbraco.Abstractions/Configuration/UserPasswordConfiguration.cs @@ -0,0 +1,15 @@ +using Umbraco.Core.Configuration.UmbracoSettings; + +namespace Umbraco.Core.Configuration +{ + /// + /// The password configuration for back office users + /// + public class UserPasswordConfiguration : PasswordConfiguration, IUserPasswordConfiguration + { + public UserPasswordConfiguration(IUserPasswordConfigurationSection configSection) + : base(configSection) + { + } + } +} diff --git a/src/Umbraco.Configuration/ConfigsFactory.cs b/src/Umbraco.Configuration/ConfigsFactory.cs index c843467e93..fea0c23f29 100644 --- a/src/Umbraco.Configuration/ConfigsFactory.cs +++ b/src/Umbraco.Configuration/ConfigsFactory.cs @@ -13,6 +13,7 @@ namespace Umbraco.Core.Configuration } public IHostingSettings HostingSettings { get; } = new HostingSettings(); + public ICoreDebug CoreDebug { get; } = new CoreDebug(); public IUmbracoSettingsSection UmbracoSettings { get; } @@ -21,33 +22,19 @@ namespace Umbraco.Core.Configuration { var configs = new Configs(section => ConfigurationManager.GetSection(section)); configs.Add(() => new GlobalSettings(ioHelper)); - configs.Add(() => HostingSettings); + configs.Add(() => HostingSettings); configs.Add("umbracoConfiguration/settings"); configs.Add("umbracoConfiguration/HealthChecks"); - configs.Add(() => new DefaultPasswordConfig()); - configs.Add(() => new DefaultPasswordConfig()); - configs.Add(() => CoreDebug); + // Password configuration is held within IUmbracoSettingsSection from umbracoConfiguration/settings but we'll add explicitly + // so it can be independently retrieved in classes that need it. + configs.AddPasswordConfigurations(); + + configs.Add(() => CoreDebug); configs.Add(() => new ConnectionStrings()); configs.AddCoreConfigs(ioHelper); return configs; } } - - // Default/static user password configs - // TODO: Make this configurable somewhere - we've removed membership providers for users, so could be a section in the umbracosettings.config file? - // keeping in mind that we will also be removing the members membership provider so there will be 2x the same/similar configuration. - // TODO: Currently it doesn't actually seem possible to replace any sub-configuration unless totally replacing the IConfigsFactory?? - internal class DefaultPasswordConfig : IUserPasswordConfiguration, IMemberPasswordConfiguration - { - public int RequiredLength => 12; - public bool RequireNonLetterOrDigit => false; - public bool RequireDigit => false; - public bool RequireLowercase => false; - public bool RequireUppercase => false; - public bool UseLegacyEncoding => false; - public string HashAlgorithmType => "HMACSHA256"; - public int MaxFailedAccessAttemptsBeforeLockout => 5; - } } diff --git a/src/Umbraco.Configuration/UmbracoSettings/MemberPasswordConfigurationElement.cs b/src/Umbraco.Configuration/UmbracoSettings/MemberPasswordConfigurationElement.cs new file mode 100644 index 0000000000..93c7c20159 --- /dev/null +++ b/src/Umbraco.Configuration/UmbracoSettings/MemberPasswordConfigurationElement.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Core.Configuration.UmbracoSettings +{ + internal class MemberPasswordConfigurationElement : PasswordConfigurationElement, IMemberPasswordConfigurationSection + { + } +} diff --git a/src/Umbraco.Configuration/UmbracoSettings/PasswordConfigurationElement.cs b/src/Umbraco.Configuration/UmbracoSettings/PasswordConfigurationElement.cs new file mode 100644 index 0000000000..fcc0e1d017 --- /dev/null +++ b/src/Umbraco.Configuration/UmbracoSettings/PasswordConfigurationElement.cs @@ -0,0 +1,31 @@ +using System.Configuration; + +namespace Umbraco.Core.Configuration.UmbracoSettings +{ + internal class PasswordConfigurationElement : UmbracoConfigurationElement + { + [ConfigurationProperty("requiredLength", DefaultValue = "12")] + public int RequiredLength => (int)base["requiredLength"]; + + [ConfigurationProperty("requireNonLetterOrDigit", DefaultValue = "false")] + public bool RequireNonLetterOrDigit => (bool)base["requireNonLetterOrDigit"]; + + [ConfigurationProperty("requireDigit", DefaultValue = "false")] + public bool RequireDigit => (bool)base["requireDigit"]; + + [ConfigurationProperty("requireLowercase", DefaultValue = "false")] + public bool RequireLowercase => (bool)base["requireLowercase"]; + + [ConfigurationProperty("requireUppercase", DefaultValue = "false")] + public bool RequireUppercase => (bool)base["requireUppercase"]; + + [ConfigurationProperty("useLegacyEncoding", DefaultValue = "false")] + public bool UseLegacyEncoding => (bool)base["useLegacyEncoding"]; + + [ConfigurationProperty("hashAlgorithmType", DefaultValue = "HMACSHA256")] + public string HashAlgorithmType => (string)base["hashAlgorithmType"]; + + [ConfigurationProperty("maxFailedAccessAttemptsBeforeLockout", DefaultValue = "5")] + public int MaxFailedAccessAttemptsBeforeLockout => (int)base["maxFailedAccessAttemptsBeforeLockout"]; + } +} diff --git a/src/Umbraco.Configuration/UmbracoSettings/SecurityElement.cs b/src/Umbraco.Configuration/UmbracoSettings/SecurityElement.cs index d45a3e7d85..82012cfd0f 100644 --- a/src/Umbraco.Configuration/UmbracoSettings/SecurityElement.cs +++ b/src/Umbraco.Configuration/UmbracoSettings/SecurityElement.cs @@ -32,6 +32,12 @@ namespace Umbraco.Core.Configuration.UmbracoSettings [ConfigurationProperty("authCookieDomain")] internal InnerTextConfigurationElement AuthCookieDomain => GetOptionalTextElement("authCookieDomain", null); + [ConfigurationProperty("userPasswordConfiguration")] + public UserPasswordConfigurationElement UserPasswordConfiguration => (UserPasswordConfigurationElement)this["userPasswordConfiguration"]; + + [ConfigurationProperty("memberPasswordConfiguration")] + public MemberPasswordConfigurationElement MemberPasswordConfiguration => (MemberPasswordConfigurationElement)this["memberPasswordConfiguration"]; + bool ISecuritySection.KeepUserLoggedIn => KeepUserLoggedIn; bool ISecuritySection.HideDisabledUsersInBackoffice => HideDisabledUsersInBackoffice; @@ -53,5 +59,9 @@ namespace Umbraco.Core.Configuration.UmbracoSettings string ISecuritySection.AuthCookieName => AuthCookieName; string ISecuritySection.AuthCookieDomain => AuthCookieDomain; + + IUserPasswordConfigurationSection ISecuritySection.UserPasswordConfiguration => UserPasswordConfiguration; + + IMemberPasswordConfigurationSection ISecuritySection.MemberPasswordConfiguration => MemberPasswordConfiguration; } } diff --git a/src/Umbraco.Configuration/UmbracoSettings/UserPasswordConfigurationElement.cs b/src/Umbraco.Configuration/UmbracoSettings/UserPasswordConfigurationElement.cs new file mode 100644 index 0000000000..8128f3d8e7 --- /dev/null +++ b/src/Umbraco.Configuration/UmbracoSettings/UserPasswordConfigurationElement.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Core.Configuration.UmbracoSettings +{ + internal class UserPasswordConfigurationElement : PasswordConfigurationElement, IUserPasswordConfigurationSection + { + } +} diff --git a/src/Umbraco.Tests/Configurations/UmbracoSettings/SecurityElementTests.cs b/src/Umbraco.Tests/Configurations/UmbracoSettings/SecurityElementTests.cs index 3adfd17d9f..9300c88a67 100644 --- a/src/Umbraco.Tests/Configurations/UmbracoSettings/SecurityElementTests.cs +++ b/src/Umbraco.Tests/Configurations/UmbracoSettings/SecurityElementTests.cs @@ -35,5 +35,101 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings { Assert.IsTrue(SettingsSection.Security.AuthCookieName == "UMB_UCONTEXT"); } + + [Test] + public void UserPasswordConfiguration_RequiredLength() + { + Assert.IsTrue(SettingsSection.Security.UserPasswordConfiguration.RequiredLength == 12); + } + + [Test] + public void UserPasswordConfiguration_RequireNonLetterOrDigit() + { + Assert.IsTrue(SettingsSection.Security.UserPasswordConfiguration.RequireNonLetterOrDigit == false); + } + + [Test] + public void UserPasswordConfiguration_RequireDigit() + { + Assert.IsTrue(SettingsSection.Security.UserPasswordConfiguration.RequireDigit == false); + } + + [Test] + public void UserPasswordConfiguration_RequireLowercase() + { + Assert.IsTrue(SettingsSection.Security.UserPasswordConfiguration.RequireLowercase == false); + } + + [Test] + public void UserPasswordConfiguration_RequireUppercase() + { + Assert.IsTrue(SettingsSection.Security.UserPasswordConfiguration.RequireUppercase == false); + } + + [Test] + public void UserPasswordConfiguration_UseLegacyEncoding() + { + Assert.IsTrue(SettingsSection.Security.UserPasswordConfiguration.UseLegacyEncoding == false); + } + + [Test] + public void UserPasswordConfiguration_HashAlgorithmType() + { + Assert.IsTrue(SettingsSection.Security.UserPasswordConfiguration.HashAlgorithmType == "HMACSHA256"); + } + + [Test] + public void UserPasswordConfiguration_MaxFailedAccessAttemptsBeforeLockout() + { + Assert.IsTrue(SettingsSection.Security.UserPasswordConfiguration.MaxFailedAccessAttemptsBeforeLockout == 5); + } + + [Test] + public void MemberPasswordConfiguration_RequiredLength() + { + Assert.IsTrue(SettingsSection.Security.MemberPasswordConfiguration.RequiredLength == 12); + } + + [Test] + public void MemberPasswordConfiguration_RequireNonLetterOrDigit() + { + Assert.IsTrue(SettingsSection.Security.MemberPasswordConfiguration.RequireNonLetterOrDigit == false); + } + + [Test] + public void MemberPasswordConfiguration_RequireDigit() + { + Assert.IsTrue(SettingsSection.Security.MemberPasswordConfiguration.RequireDigit == false); + } + + [Test] + public void MemberPasswordConfiguration_RequireLowercase() + { + Assert.IsTrue(SettingsSection.Security.MemberPasswordConfiguration.RequireLowercase == false); + } + + [Test] + public void MemberPasswordConfiguration_RequireUppercase() + { + Assert.IsTrue(SettingsSection.Security.MemberPasswordConfiguration.RequireUppercase == false); + } + + [Test] + public void MemberPasswordConfiguration_UseLegacyEncoding() + { + Assert.IsTrue(SettingsSection.Security.MemberPasswordConfiguration.UseLegacyEncoding == false); + } + + [Test] + public void MemberPasswordConfiguration_HashAlgorithmType() + { + Assert.IsTrue(SettingsSection.Security.MemberPasswordConfiguration.HashAlgorithmType == "HMACSHA256"); + } + + [Test] + public void MemberPasswordConfiguration_MaxFailedAccessAttemptsBeforeLockout() + { + Assert.IsTrue(SettingsSection.Security.MemberPasswordConfiguration.MaxFailedAccessAttemptsBeforeLockout == 5); + } } } diff --git a/src/Umbraco.Tests/Configurations/UmbracoSettings/WebRoutingElementTests.cs b/src/Umbraco.Tests/Configurations/UmbracoSettings/WebRoutingElementTests.cs index dad1173c3f..0fa1fb6681 100644 --- a/src/Umbraco.Tests/Configurations/UmbracoSettings/WebRoutingElementTests.cs +++ b/src/Umbraco.Tests/Configurations/UmbracoSettings/WebRoutingElementTests.cs @@ -14,7 +14,7 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings [Test] public void InternalRedirectPreservesTemplate() { - Assert.IsTrue(SettingsSection.WebRouting.TrySkipIisCustomErrors == false); + Assert.IsTrue(SettingsSection.WebRouting.InternalRedirectPreservesTemplate == false); } [Test] diff --git a/src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.config b/src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.config index 8cbb799d88..666a98c1b7 100644 --- a/src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.config +++ b/src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.config @@ -69,6 +69,13 @@ true + + + diff --git a/src/Umbraco.Tests/TestHelpers/Stubs/TestUserPasswordConfig.cs b/src/Umbraco.Tests/TestHelpers/Stubs/TestUserPasswordConfig.cs new file mode 100644 index 0000000000..ac89c1e2b5 --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/Stubs/TestUserPasswordConfig.cs @@ -0,0 +1,23 @@ +using Umbraco.Core.Configuration; + +namespace Umbraco.Tests.TestHelpers.Stubs +{ + internal class TestUserPasswordConfig : IUserPasswordConfiguration + { + public int RequiredLength => 12; + + public bool RequireNonLetterOrDigit => false; + + public bool RequireDigit => false; + + public bool RequireLowercase => false; + + public bool RequireUppercase => false; + + public bool UseLegacyEncoding => false; + + public string HashAlgorithmType => "HMACSHA256"; + + public int MaxFailedAccessAttemptsBeforeLockout => 5; + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 82a2bc5dab..6ad9ca5f78 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -168,6 +168,7 @@ + diff --git a/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs index e99d3eb165..a3263259c4 100644 --- a/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs @@ -16,7 +16,6 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; -using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Mapping; using Umbraco.Core.Persistence; @@ -26,6 +25,7 @@ using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.ControllerTesting; +using Umbraco.Tests.TestHelpers.Stubs; using Umbraco.Tests.Testing; using Umbraco.Web; using Umbraco.Web.Editors; @@ -76,7 +76,7 @@ namespace Umbraco.Tests.Web.Controllers } IOHelper.ForceNotHosted = true; var usersController = new AuthenticationController( - new DefaultPasswordConfig(), + new TestUserPasswordConfig(), Factory.GetInstance(), umbracoContextAccessor, Factory.GetInstance(), diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index a7f6e1e0f1..f905840775 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -63,6 +63,12 @@ true false + + diff --git a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs index bd3ca2a156..86794e4e41 100644 --- a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs +++ b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs @@ -29,7 +29,7 @@ namespace Umbraco.Web protected IUmbracoContextAccessor UmbracoContextAccessor => Current.UmbracoContextAccessor; protected IGlobalSettings GlobalSettings => Current.Configs.Global(); protected IUmbracoSettingsSection UmbracoSettings => Current.Configs.Settings(); - protected IUserPasswordConfiguration UserPasswordConfig => Current.Configs.UserPasswordConfig(); + protected IUserPasswordConfiguration UserPasswordConfig => Current.Configs.UserPasswordConfiguration(); protected IRuntimeState RuntimeState => Core.Composing.Current.RuntimeState; protected ServiceContext Services => Current.Services; protected UmbracoMapper Mapper => Current.Mapper; From 0e8f1887bd3eacc55096f1d505585249f26ef6c4 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Mon, 23 Dec 2019 15:28:05 +0100 Subject: [PATCH 2/3] Completed setup to fix failing unit tests. --- src/Umbraco.Tests/TestHelpers/SettingsForTests.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs b/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs index 058b274fc5..56fdc96aa7 100644 --- a/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs +++ b/src/Umbraco.Tests/TestHelpers/SettingsForTests.cs @@ -48,6 +48,11 @@ namespace Umbraco.Tests.TestHelpers var logging = new Mock(); var routing = new Mock(); + var userPasswordConfig = new Mock(); + var memberPasswordConfig = new Mock(); + security.Setup(x => x.UserPasswordConfiguration).Returns(userPasswordConfig.Object); + security.Setup(x => x.MemberPasswordConfiguration).Returns(memberPasswordConfig.Object); + settings.Setup(x => x.Content).Returns(content.Object); settings.Setup(x => x.Security).Returns(security.Object); settings.Setup(x => x.RequestHandler).Returns(requestHandler.Object); From 32e46b0f0ced05f5a11d3888b9c13ba84fd1ec61 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 24 Dec 2019 08:05:33 +0100 Subject: [PATCH 3/3] Added user and member password configuration to release config. --- .../config/umbracoSettings.Release.config | 10 ++++++++++ src/Umbraco.Web.UI/config/umbracoSettings.config | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config index 00b556fd34..ed72679b1e 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config @@ -60,10 +60,20 @@ false + true + false + + + + diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index f905840775..325a26f3f5 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -59,10 +59,14 @@ false + true + false + +