diff --git a/src/Umbraco.Core/Configuration/ClientDependencyConfiguration.cs b/src/Umbraco.Core/Configuration/ClientDependencyConfiguration.cs index 580dae7481..acd691308a 100644 --- a/src/Umbraco.Core/Configuration/ClientDependencyConfiguration.cs +++ b/src/Umbraco.Core/Configuration/ClientDependencyConfiguration.cs @@ -16,7 +16,7 @@ namespace Umbraco.Core.Configuration } /// - /// Increases the version number in ClientDependency.config by 1 + /// Changes the version number in ClientDependency.config to a random value to avoid stale caches /// internal bool IncreaseVersionNumber() { diff --git a/src/Umbraco.Core/Configuration/GlobalSettings.cs b/src/Umbraco.Core/Configuration/GlobalSettings.cs index dbda3c9fb0..3b8065b953 100644 --- a/src/Umbraco.Core/Configuration/GlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/GlobalSettings.cs @@ -8,6 +8,7 @@ using System.Web.Hosting; using System.Web.Routing; using System.Xml; using System.Xml.Linq; +using System.Xml.XPath; using Umbraco.Core.IO; using Umbraco.Core.Logging; @@ -259,7 +260,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. @@ -304,6 +336,43 @@ namespace Umbraco.Core.Configuration } } + } + + 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/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs index 69711e257c..cc6421c888 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 { /// diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs index 532c1fb619..0ea6b5b0d3 100644 --- a/src/Umbraco.Core/Models/Member.cs +++ b/src/Umbraco.Core/Models/Member.cs @@ -31,6 +31,7 @@ namespace Umbraco.Core.Models : base(name, -1, contentType, new PropertyCollection()) { _contentType = contentType; + IsApproved = true; } //TODO: Should we just get rid of this one? no reason to have a level set. @@ -43,6 +44,7 @@ namespace Umbraco.Core.Models _email = email; _username = username; _password = password; + IsApproved = true; } public Member(string name, string email, string username, string password, IMemberType contentType) @@ -54,6 +56,7 @@ namespace Umbraco.Core.Models _email = email; _username = username; _password = password; + IsApproved = true; } //public Member(string name, string email, string username, string password, IContentBase parent, IMemberType contentType) @@ -234,7 +237,9 @@ namespace Umbraco.Core.Models { get { - var a = WarnIfPropertyTypeNotFoundOnGet(Constants.Conventions.Member.IsApproved, "IsApproved", true); + var a = WarnIfPropertyTypeNotFoundOnGet(Constants.Conventions.Member.IsApproved, "IsApproved", + //This is the default value if the prop is not found + true); if (a.Success == false) return a.Result; var tryConvert = Properties[Constants.Conventions.Member.IsApproved].Value.TryConvertTo(); @@ -242,8 +247,8 @@ namespace Umbraco.Core.Models { return tryConvert.Result; } - return default(bool); - //TODO: Use TryConvertTo instead + //if the property exists but it cannot be converted, we will assume true + return true; } set { @@ -275,7 +280,7 @@ namespace Umbraco.Core.Models { return tryConvert.Result; } - return default(bool); + return false; //TODO: Use TryConvertTo instead } set diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 1b5309cc11..4979d1bcb0 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -1950,7 +1950,7 @@ namespace Umbraco.Core.Services /// /// Occurs before Create /// - [Obsolete("This event should not be used, it was originally created for backwards compatibility for the legacy API. To modify a new document before it is saved use the Saving event")] + [Obsolete("Use the Created event instead, the Creating and Created events both offer the same functionality, Creating event has been deprecated.")] public static event TypedEventHandler> Creating; /// @@ -1960,7 +1960,6 @@ namespace Umbraco.Core.Services /// Please note that the Content object has been created, but might not have been saved /// so it does not have an identity yet (meaning no Id has been set). /// - [Obsolete("This event should not be used, it was originally created for backwards compatibility for the legacy API. To modify a new document before it is saved use the Saving event")] public static event TypedEventHandler> Created; /// diff --git a/src/Umbraco.Core/Services/IMembershipMemberService.cs b/src/Umbraco.Core/Services/IMembershipMemberService.cs index 35c996f51a..a4522a95ff 100644 --- a/src/Umbraco.Core/Services/IMembershipMemberService.cs +++ b/src/Umbraco.Core/Services/IMembershipMemberService.cs @@ -14,6 +14,7 @@ namespace Umbraco.Core.Services /// public interface IMembershipMemberService : IMembershipMemberService, IMembershipRoleService { + IMember CreateMember(string username, string email, string password, string memberType); IMember CreateMemberWithIdentity(string username, string email, string password, IMemberType memberType, bool raiseEvents = true); } @@ -67,7 +68,7 @@ namespace Umbraco.Core.Services T GetByUsername(string login); void Delete(T membershipUser); - + void Save(T entity, bool raiseEvents = true); void Save(IEnumerable entities, bool raiseEvents = true); diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs index c6d8bbf548..23f3a96679 100644 --- a/src/Umbraco.Core/Services/MediaService.cs +++ b/src/Umbraco.Core/Services/MediaService.cs @@ -1042,7 +1042,7 @@ namespace Umbraco.Core.Services /// /// Occurs before Create /// - [Obsolete("This event should not be used, it was originally created for backwards compatibility for the legacy API. To modify a new document before it is saved use the Saving event")] + [Obsolete("Use the Created event instead, the Creating and Created events both offer the same functionality, Creating event has been deprecated.")] public static event TypedEventHandler> Creating; /// @@ -1052,7 +1052,6 @@ namespace Umbraco.Core.Services /// Please note that the Media object has been created, but not saved /// so it does not have an identity yet (meaning no Id has been set). /// - [Obsolete("This event should not be used, it was originally created for backwards compatibility for the legacy API. To modify a new document before it is saved use the Saving event")] public static event TypedEventHandler> Created; /// diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index 3191baa319..0acb855f52 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -5,6 +5,7 @@ using System.Threading; using System.Web.Security; using System.Xml.Linq; using System.Xml.Linq; +using Umbraco.Core.Auditing; using Umbraco.Core.Events; using Umbraco.Core.Events; using Umbraco.Core.Models; @@ -576,6 +577,18 @@ namespace Umbraco.Core.Services } } + public IMember CreateMember(string username, string email, string password, string memberTypeAlias) + { + var memberTypeService = ApplicationContext.Current.Services.MemberTypeService; + var memberType = memberTypeService.Get(memberTypeAlias); + + var member = new Member(username, email.ToLower().Trim(), username, password, -1, memberType); + + Created.RaiseEvent(new NewEventArgs(member, false, memberTypeAlias, -1), this); + + return member; + } + public IMember CreateMemberWithIdentity(string username, string email, string password, IMemberType memberType, bool raiseEvents = true) { if (memberType == null) throw new ArgumentNullException("memberType"); @@ -712,7 +725,7 @@ namespace Umbraco.Core.Services Deleted.RaiseEvent(new DeleteEventArgs(member, false), this); } - + /// /// Saves an updated Member /// @@ -726,7 +739,7 @@ namespace Umbraco.Core.Services { return; } - + } var uow = _uowProvider.GetUnitOfWork(); @@ -822,7 +835,7 @@ namespace Umbraco.Core.Services var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { - return repository.GetByMemberGroup(roleName); + return repository.GetByMemberGroup(roleName); } } @@ -856,8 +869,8 @@ namespace Umbraco.Core.Services foreach (var memberGroup in found) { - _memberGroupService.Delete(memberGroup); - } + _memberGroupService.Delete(memberGroup); + } return found.Any(); } } @@ -897,7 +910,7 @@ namespace Umbraco.Core.Services { repository.DissociateRoles(memberIds, roleNames); } - } + } #endregion /// @@ -977,7 +990,7 @@ namespace Umbraco.Core.Services //bulk insert it into the database uow.Database.BulkInsertRecords(xmlItems, tr); - tr.Complete(); + tr.Complete(); } } } @@ -990,7 +1003,7 @@ namespace Umbraco.Core.Services } #region Event Handlers - + /// /// Occurs before Delete /// @@ -1005,12 +1018,21 @@ namespace Umbraco.Core.Services /// Occurs before Save /// public static event TypedEventHandler> Saving; + + /// + /// Occurs after Create + /// + /// + /// Please note that the Member object has been created, but might not have been saved + /// so it does not have an identity yet (meaning no Id has been set). + /// + public static event TypedEventHandler> Created; /// /// Occurs after Save /// public static event TypedEventHandler> Saved; - + #endregion /// @@ -1075,6 +1097,6 @@ namespace Umbraco.Core.Services return new Member(name, email, username, password, -1, memType); } - + } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index b26373ef86..75e520db61 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -961,5 +961,19 @@ namespace Umbraco.Tests.Services Assert.IsNull(colResult.First().VarChar); } + [Test] + public void New_Member_Approved_By_Default() + { + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + + var customMember = MockedMember.CreateSimpleMember(memberType, "hello", "hello@test.com", "hello", "hello"); + ServiceContext.MemberService.Save(customMember); + + var found = ServiceContext.MemberService.GetById(customMember.Id); + + Assert.IsTrue(found.IsApproved); + } + } } \ No newline at end of file diff --git a/src/Umbraco.Web.UI/config/ClientDependency.config b/src/Umbraco.Web.UI/config/ClientDependency.config index 10b06e9f93..47bbf4bc32 100644 --- a/src/Umbraco.Web.UI/config/ClientDependency.config +++ b/src/Umbraco.Web.UI/config/ClientDependency.config @@ -17,24 +17,24 @@ NOTES: The LoaderControlProvider is set to default, the javascriptPlaceHolderId, cssPlaceHolderId attributes are optional and default to what is listed below. If using this provider, then you must specify both PlaceHolder controls on your page in order to render the JS/CSS. --> - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + - - - + + + - - - - + + + + - diff --git a/src/Umbraco.Web.UI/config/Dashboard.Release.config b/src/Umbraco.Web.UI/config/Dashboard.Release.config index ac57ffa0b8..47fb123d88 100644 --- a/src/Umbraco.Web.UI/config/Dashboard.Release.config +++ b/src/Umbraco.Web.UI/config/Dashboard.Release.config @@ -50,6 +50,10 @@ views/dashboard/default/startupdashboardintro.html + + editor + writer + diff --git a/src/Umbraco.Web.UI/config/ExamineSettings.config b/src/Umbraco.Web.UI/config/ExamineSettings.config index 244bd1b12e..09e7b205e8 100644 --- a/src/Umbraco.Web.UI/config/ExamineSettings.config +++ b/src/Umbraco.Web.UI/config/ExamineSettings.config @@ -19,9 +19,9 @@ More information and documentation can be found on CodePlex: http://umbracoexami supportProtected="true" analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/> - - - + + + @@ -29,12 +29,12 @@ More information and documentation can be found on CodePlex: http://umbracoexami - + + + - - diff --git a/src/Umbraco.Web.UI/config/FileSystemProviders.config b/src/Umbraco.Web.UI/config/FileSystemProviders.config index 457259fae9..ae2addc39a 100644 --- a/src/Umbraco.Web.UI/config/FileSystemProviders.config +++ b/src/Umbraco.Web.UI/config/FileSystemProviders.config @@ -7,5 +7,5 @@ - + diff --git a/src/Umbraco.Web.UI/config/UrlRewriting.config b/src/Umbraco.Web.UI/config/UrlRewriting.config index 348a07c972..108f53bf5e 100644 --- a/src/Umbraco.Web.UI/config/UrlRewriting.config +++ b/src/Umbraco.Web.UI/config/UrlRewriting.config @@ -29,6 +29,5 @@ Any bugs or problems with the rewriter, contact Anders/Duckie --> - \ No newline at end of file diff --git a/src/Umbraco.Web.UI/config/applications.Release.config b/src/Umbraco.Web.UI/config/applications.Release.config index 042bd551cc..062500e1fc 100644 --- a/src/Umbraco.Web.UI/config/applications.Release.config +++ b/src/Umbraco.Web.UI/config/applications.Release.config @@ -1,4 +1,4 @@ - + diff --git a/src/Umbraco.Web.UI/config/feedProxy.config b/src/Umbraco.Web.UI/config/feedProxy.config index afce5316b0..e76284c13f 100644 --- a/src/Umbraco.Web.UI/config/feedProxy.config +++ b/src/Umbraco.Web.UI/config/feedProxy.config @@ -1,11 +1,11 @@  - - + + - - - + + + diff --git a/src/Umbraco.Web.UI/config/scripting.config b/src/Umbraco.Web.UI/config/scripting.config index 505907d38a..ec59c35acb 100644 --- a/src/Umbraco.Web.UI/config/scripting.config +++ b/src/Umbraco.Web.UI/config/scripting.config @@ -6,7 +6,6 @@ - \ No newline at end of file diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config index 92b57c87c6..6f1db98dd8 100644 --- a/src/Umbraco.Web.UI/config/umbracoSettings.config +++ b/src/Umbraco.Web.UI/config/umbracoSettings.config @@ -35,13 +35,13 @@ 1 200 --> - + 1 - robot@umbraco.dk + your@email.here @@ -50,8 +50,15 @@ False - - Raw + + UTF8 + + + false + + + + true True @@ -60,7 +67,7 @@ True - True + False False @@ -68,24 +75,27 @@ text - false - - true - - true + + false + In Preview Mode - click to end]]> 1800 + + + + false + + - inline - show an inline error within the macro but allow the page to continue rendering. Historial Umbraco behaviour. + - silent - Silently suppress the error and do not render the offending macro. + - throw - Throw an exception which can be caught by the global error handler defined in Application_OnError. If no such + error handler is defined then you'll see the Yellow Screen Of Death (YSOD) error page. + Note the error can also be handled by the umbraco.macro.Error event, where you can log/alarm with your own code and change the behaviour per event. --> throw @@ -108,14 +118,18 @@ false - false + true - + + + + plus star @@ -123,15 +137,29 @@ ae oe aa + ae + oe + ue + ss + ae + oe + - + + + + true - true + + + Mvc + @@ -140,6 +168,29 @@ + + + + + p + div + ul + span + + + + + + + + - falses - 86400 - 1440 + + + @@ -169,9 +220,9 @@ 0 - - umblb1.dev - localhost + + + diff --git a/src/Umbraco.Web.UI/web.Template.Release.config b/src/Umbraco.Web.UI/web.Template.Release.config index 7f9d2d87cd..b3193ed110 100644 --- a/src/Umbraco.Web.UI/web.Template.Release.config +++ b/src/Umbraco.Web.UI/web.Template.Release.config @@ -15,6 +15,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.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs b/src/Umbraco.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs index 51d0b8cb2a..154c180496 100644 --- a/src/Umbraco.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs +++ b/src/Umbraco.Web/Strategies/Migrations/ClearMediaXmlCacheForDeletedItemsAfterUpgrade.cs @@ -1,9 +1,7 @@ using System; -using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Persistence.Migrations; using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Services; using umbraco.interfaces; namespace Umbraco.Web.Strategies.Migrations @@ -29,7 +27,7 @@ namespace Umbraco.Web.Strategies.Migrations if (e.ConfiguredVersion <= target70) { - + var sql = @"DELETE FROM cmsContentXml WHERE nodeId IN //This query is structured to work with MySql, SQLCE and SqlServer: // http://issues.umbraco.org/issue/U4-3876 @@ -41,9 +39,7 @@ namespace Umbraco.Web.Strategies.Migrations var count = e.MigrationContext.Database.Execute(sql); LogHelper.Info("Cleared " + count + " items from the media xml cache that were trashed and not meant to be there"); - } - } } } \ No newline at end of file diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index 7fd0850bbd..db4d19c228 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -12,6 +12,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Configuration; 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; @@ -229,7 +230,7 @@ namespace umbraco.cms.businesslogic.member loginName, Email.ToLower(), "", mbt.MemberTypeItem); model.Name = Name; - //The content object will only have the 'WasCancelled' flag set to 'True' if the 'Creating' event has been cancelled, so we return null. + //The content object will only have the 'WasCancelled' flag set to 'True' if the 'Saving' event has been cancelled, so we return null. if (((Entity)model).WasCancelled) return null; @@ -576,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 3bb089a206..126f0de35c 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 9c78014de9..039610d495 100644 --- a/src/umbraco.providers/members/UmbracoMembershipProvider.cs +++ b/src/umbraco.providers/members/UmbracoMembershipProvider.cs @@ -111,7 +111,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);