diff --git a/src/Umbraco.Core/Configuration/GlobalSettings.cs b/src/Umbraco.Core/Configuration/GlobalSettings.cs index d3c1fcb2ae..028d745a0e 100644 --- a/src/Umbraco.Core/Configuration/GlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/GlobalSettings.cs @@ -7,6 +7,7 @@ using System.Web.Configuration; using System.Web.Routing; using System.Xml; using System.Xml.Linq; +using System.Xml.XPath; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -255,7 +256,38 @@ namespace Umbraco.Core.Configuration SaveSetting("umbracoConfigurationStatus", value); } } - + + /// + /// Gets or sets the Umbraco members membership providers' useLegacyEncoding state. This will return a boolean + /// + /// The useLegacyEncoding status. + public static bool UmbracoMembershipProviderLegacyEncoding + { + get + { + return ConfiguredMembershipProvidersLegacyEncoding(Constants.Conventions.Member.UmbracoMemberProviderName); + } + set + { + SetMembershipProvidersLegacyEncoding(Constants.Conventions.Member.UmbracoMemberProviderName, value); + } + } + + /// + /// Gets or sets the Umbraco users membership providers' useLegacyEncoding state. This will return a boolean + /// + /// The useLegacyEncoding status. + public static bool UmbracoUsersMembershipProviderLegacyEncoding + { + get + { + return ConfiguredMembershipProvidersLegacyEncoding(Constants.Conventions.User.UmbracoUsersProviderName); + } + set + { + SetMembershipProvidersLegacyEncoding(Constants.Conventions.User.UmbracoUsersProviderName, value); + } + } /// /// Saves a setting into the configuration file. @@ -315,6 +347,43 @@ namespace Umbraco.Core.Configuration return fileName; } + private static void SetMembershipProvidersLegacyEncoding(string providerName, bool useLegacyEncoding) + { + var webConfigFilename = GetFullWebConfigFileName(); + var webConfigXml = XDocument.Load(webConfigFilename, LoadOptions.PreserveWhitespace); + + var membershipConfigs = webConfigXml.XPathSelectElements("configuration/system.web/membership/providers/add").ToList(); + + if (membershipConfigs.Any() == false) + return; + + var provider = membershipConfigs.SingleOrDefault(c => c.Attribute("name") != null && c.Attribute("name").Value == providerName); + + if (provider == null) + return; + + provider.SetAttributeValue("useLegacyEncoding", useLegacyEncoding); + + webConfigXml.Save(webConfigFilename, SaveOptions.DisableFormatting); + } + + private static bool ConfiguredMembershipProvidersLegacyEncoding(string providerName) + { + var webConfigFilename = GetFullWebConfigFileName(); + var webConfigXml = XDocument.Load(webConfigFilename, LoadOptions.PreserveWhitespace); + + var membershipConfigs = webConfigXml.XPathSelectElements("configuration/system.web/membership/providers/add").ToList(); + + var provider = membershipConfigs.SingleOrDefault(c => c.Attribute("name") != null && c.Attribute("name").Value == providerName); + + var useLegacyEncodingAttribute = provider.Attribute("useLegacyEncoding"); + + bool useLegacyEncoding; + bool.TryParse(useLegacyEncodingAttribute.Value, out useLegacyEncoding); + + return useLegacyEncoding; + } + /// /// Gets the full path to root. /// diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings.cs b/src/Umbraco.Core/Configuration/UmbracoSettings.cs index 0bdb0cd5c9..2e11354f4b 100644 --- a/src/Umbraco.Core/Configuration/UmbracoSettings.cs +++ b/src/Umbraco.Core/Configuration/UmbracoSettings.cs @@ -658,7 +658,7 @@ namespace Umbraco.Core.Configuration { string defaultProvider = GetKey("/settings/providers/users/DefaultBackofficeProvider"); if (String.IsNullOrEmpty(defaultProvider)) - defaultProvider = "UsersMembershipProvider"; + defaultProvider = Constants.Conventions.User.UmbracoUsersProviderName; return defaultProvider; } diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs index f88b29c149..60492e8341 100644 --- a/src/Umbraco.Core/Constants-Conventions.cs +++ b/src/Umbraco.Core/Constants-Conventions.cs @@ -85,7 +85,7 @@ namespace Umbraco.Core /// /// MediaType alias for a folder. - /// + /// public const string Folder = "Folder"; /// @@ -94,9 +94,19 @@ namespace Umbraco.Core public const string Image = "Image"; } + + /// + /// Constants for Umbraco user + /// + public static class User + { + public static readonly string UmbracoUsersProviderName = "UsersMembershipProvider"; + } + /// /// Constants for Umbraco Member property aliases. /// + public static class Member { public static readonly string UmbracoMemberProviderName = "UmbracoMembershipProvider"; diff --git a/src/Umbraco.Web.UI/web.Template.Release.config b/src/Umbraco.Web.UI/web.Template.Release.config index 3a244ea9f6..388480b0c3 100644 --- a/src/Umbraco.Web.UI/web.Template.Release.config +++ b/src/Umbraco.Web.UI/web.Template.Release.config @@ -23,6 +23,16 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Umbraco.Web/Install/Steps/Database.cs b/src/Umbraco.Web/Install/Steps/Database.cs index ff3363947a..a20c07a122 100644 --- a/src/Umbraco.Web/Install/Steps/Database.cs +++ b/src/Umbraco.Web/Install/Steps/Database.cs @@ -1,8 +1,9 @@ using System; +using System.Linq; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.IO; -using Umbraco.Web.Install; +using Umbraco.Core.Logging; namespace Umbraco.Web.Install.Steps { @@ -32,22 +33,39 @@ namespace Umbraco.Web.Install.Steps //here we determine if the installer should skip this step... public override bool Completed() { + // Fresh installs don't have a version number so this step cannot be complete yet - if (string.IsNullOrEmpty(Umbraco.Core.Configuration.GlobalSettings.ConfigurationStatus)) + if (string.IsNullOrEmpty(GlobalSettings.ConfigurationStatus)) { //Even though the ConfigurationStatus is blank we try to determine the version if we can connect to the database var result = ApplicationContext.Current.DatabaseContext.ValidateDatabaseSchema(); var determinedVersion = result.DetermineInstalledVersion(); if (determinedVersion.Equals(new Version(0, 0, 0))) - return false; + { + // Now that we know this is a brand new Umbraco install, turn membership providers' "useLegacyEncoding" off + DisableMembershipProviderLegacyEncoding(); + return false; + } return UmbracoVersion.Current < determinedVersion; } - var configuredVersion = new Version(Umbraco.Core.Configuration.GlobalSettings.ConfigurationStatus); + var configuredVersion = new Version(GlobalSettings.ConfigurationStatus); var targetVersion = UmbracoVersion.Current; return targetVersion < configuredVersion; } + + private static void DisableMembershipProviderLegacyEncoding() + { + if (GlobalSettings.UmbracoMembershipProviderLegacyEncoding) + GlobalSettings.UmbracoMembershipProviderLegacyEncoding = false; + + if (GlobalSettings.UmbracoUsersMembershipProviderLegacyEncoding) + GlobalSettings.UmbracoUsersMembershipProviderLegacyEncoding = false; + + + LogHelper.Info("Updated Umbraco membership providers, set useLegacyEncoding to false."); + } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs index 2dbce6a350..ba2c127877 100644 --- a/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/UsersMembershipProvider.cs @@ -30,7 +30,7 @@ namespace Umbraco.Web.Security.Providers public override string ProviderName { - get { return "UsersMembershipProvider"; } + get { return Constants.Conventions.User.UmbracoUsersProviderName; } } /// diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index 75c6788640..923eb8ff10 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -11,6 +11,7 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Models.Css; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Querying; @@ -227,6 +228,7 @@ namespace umbraco.cms.businesslogic.member var model = ApplicationContext.Current.Services.MemberService.CreateMemberWithIdentity( loginName, Email.ToLower(), "", mbt.MemberTypeItem); model.Name = Name; + model.IsApproved = true; //The content object will only have the 'WasCancelled' flag set to 'True' if the 'Creating' event has been cancelled, so we return null. if (((Entity)model).WasCancelled) @@ -575,7 +577,8 @@ namespace umbraco.cms.businesslogic.member // This check should not be done here, as this logic is based on the MembershipProvider var requireUniqueEmail = Membership.Providers[UmbracoMemberProviderName].RequiresUniqueEmail; //check if there's anyone with this email in the db that isn't us - if (requireUniqueEmail && GetMembersFromEmail(Email).Any(x => x.Id != Id)) + var membersFromEmail = GetMembersFromEmail(Email); + if (requireUniqueEmail && membersFromEmail != null && membersFromEmail.Any(x => x.Id != Id)) { throw new Exception(string.Format("Duplicate Email! A member with the e-mail {0} already exists", Email)); } diff --git a/src/umbraco.providers/UsersMembershipProvider.cs b/src/umbraco.providers/UsersMembershipProvider.cs index 1561b991bc..b06be5d5b5 100644 --- a/src/umbraco.providers/UsersMembershipProvider.cs +++ b/src/umbraco.providers/UsersMembershipProvider.cs @@ -55,7 +55,7 @@ namespace umbraco.providers public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) { if (config == null) throw new ArgumentNullException("config"); - if (string.IsNullOrEmpty(name)) name = "UsersMembershipProvider"; + if (string.IsNullOrEmpty(name)) name = Constants.Conventions.User.UmbracoUsersProviderName; base.Initialize(name, config); } diff --git a/src/umbraco.providers/members/UmbracoMembershipProvider.cs b/src/umbraco.providers/members/UmbracoMembershipProvider.cs index 6a36273164..dc094fd15b 100644 --- a/src/umbraco.providers/members/UmbracoMembershipProvider.cs +++ b/src/umbraco.providers/members/UmbracoMembershipProvider.cs @@ -110,7 +110,7 @@ namespace umbraco.providers.members // Intialize values from web.config if (config == null) throw new ArgumentNullException("config"); - if (string.IsNullOrEmpty(name)) name = "UmbracoMembershipProvider"; + if (string.IsNullOrEmpty(name)) name = Constants.Conventions.Member.UmbracoMemberProviderName; base.Initialize(name, config);