diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs index cc6421c888..17d3eb69a3 100644 --- a/src/Umbraco.Core/Constants-Conventions.cs +++ b/src/Umbraco.Core/Constants-Conventions.cs @@ -105,8 +105,7 @@ namespace Umbraco.Core /// /// Constants for Umbraco Member property aliases. - /// - + /// public static class Member { /// @@ -121,63 +120,63 @@ namespace Umbraco.Core /// /// Property alias for a Members Password Question /// - public const string PasswordQuestion = "umbracoPasswordRetrievalQuestionPropertyTypeAlias"; + public const string PasswordQuestion = "umbracoMemberPasswordRetrievalQuestion"; public const string PasswordQuestionLabel = "Password Question"; /// /// Property alias for Members Password Answer /// - public const string PasswordAnswer = "umbracoPasswordRetrievalAnswerPropertyTypeAlias"; + public const string PasswordAnswer = "umbracoMemberPasswordRetrievalAnswer"; public const string PasswordAnswerLabel = "Password Answer"; /// /// Property alias for the Comments on a Member /// - public const string Comments = "umbracoCommentPropertyTypeAlias"; + public const string Comments = "umbracoMemberComments"; public const string CommentsLabel = "Comments"; /// /// Property alias for the Approved boolean of a Member /// - public const string IsApproved = "umbracoApprovePropertyTypeAlias"; + public const string IsApproved = "umbracoMemberApproved"; public const string IsApprovedLabel = "Is Approved"; /// /// Property alias for the Locked out boolean of a Member /// - public const string IsLockedOut = "umbracoLockPropertyTypeAlias"; + public const string IsLockedOut = "umbracoMemberLockedOut"; public const string IsLockedOutLabel = "Is Locked Out"; /// /// Property alias for the last date the Member logged in /// - public const string LastLoginDate = "umbracoLastLoginPropertyTypeAlias"; + public const string LastLoginDate = "umbracoMemberLastLogin"; public const string LastLoginDateLabel = "Last Login Date"; /// /// Property alias for the last date a Member changed its password /// - public const string LastPasswordChangeDate = "umbracoMemberLastPasswordChange"; + public const string LastPasswordChangeDate = "umbracoMemberLastPasswordChangeDate"; public const string LastPasswordChangeDateLabel = "Last Password Change Date"; /// /// Property alias for the last date a Member was locked out /// - public const string LastLockoutDate = "umbracoMemberLastLockout"; + public const string LastLockoutDate = "umbracoMemberLastLockoutDate"; public const string LastLockoutDateLabel = "Last Lockout Date"; /// /// Property alias for the number of failed login attemps /// - public const string FailedPasswordAttempts = "umbracoFailedPasswordAttemptsPropertyTypeAlias"; + public const string FailedPasswordAttempts = "umbracoMemberFailedPasswordAttempts"; public const string FailedPasswordAttemptsLabel = "Failed Password Attempts"; @@ -274,7 +273,7 @@ namespace Umbraco.Core /// /// MemberType alias for default member type. /// - public const string Member = "Member"; + public const string DefaultAlias = "Member"; public const string SystemDefaultProtectType = "_umbracoSystemDefaultProtectType"; } diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs index 0ea6b5b0d3..ddb3f95e77 100644 --- a/src/Umbraco.Core/Models/Member.cs +++ b/src/Umbraco.Core/Models/Member.cs @@ -142,7 +142,7 @@ namespace Umbraco.Core.Models /// Gets or sets the Password Question /// /// - /// Alias: umbracoPasswordRetrievalQuestionPropertyTypeAlias + /// Alias: umbracoMemberPasswordRetrievalQuestion /// Part of the standard properties collection. /// [IgnoreDataMember] @@ -171,7 +171,7 @@ namespace Umbraco.Core.Models /// Gets or sets the Password Answer /// /// - /// Alias: umbracoPasswordRetrievalAnswerPropertyTypeAlias + /// Alias: umbracoMemberPasswordRetrievalAnswer /// Part of the standard properties collection. /// [IgnoreDataMember] @@ -200,7 +200,7 @@ namespace Umbraco.Core.Models /// Gets or set the comments for the member /// /// - /// Alias: umbracoCommentPropertyTypeAlias + /// Alias: umbracoMemberComments /// Part of the standard properties collection. /// [IgnoreDataMember] @@ -229,7 +229,7 @@ namespace Umbraco.Core.Models /// Gets or sets a boolean indicating whether the Member is approved /// /// - /// Alias: umbracoApprovePropertyTypeAlias + /// Alias: umbracoMemberApproved /// Part of the standard properties collection. /// [IgnoreDataMember] @@ -264,7 +264,7 @@ namespace Umbraco.Core.Models /// Gets or sets a boolean indicating whether the Member is locked out /// /// - /// Alias: umbracoLockPropertyTypeAlias + /// Alias: umbracoMemberLockedOut /// Part of the standard properties collection. /// [IgnoreDataMember] @@ -297,7 +297,7 @@ namespace Umbraco.Core.Models /// Gets or sets the date for last login /// /// - /// Alias: umbracoLastLoginPropertyTypeAlias + /// Alias: umbracoMemberLastLogin /// Part of the standard properties collection. /// [IgnoreDataMember] @@ -330,7 +330,7 @@ namespace Umbraco.Core.Models /// Gest or sets the date for last password change /// /// - /// Alias: umbracoMemberLastPasswordChange + /// Alias: umbracoMemberLastPasswordChangeDate /// Part of the standard properties collection. /// [IgnoreDataMember] @@ -363,7 +363,7 @@ namespace Umbraco.Core.Models /// Gets or sets the date for when Member was locked out /// /// - /// Alias: umbracoMemberLastLockout + /// Alias: umbracoMemberLastLockoutDate /// Part of the standard properties collection. /// [IgnoreDataMember] @@ -397,7 +397,7 @@ namespace Umbraco.Core.Models /// This is the number of times the password was entered incorrectly upon login. /// /// - /// Alias: umbracoFailedPasswordAttemptsPropertyTypeAlias + /// Alias: umbracoMemberFailedPasswordAttempts /// Part of the standard properties collection. /// [IgnoreDataMember] diff --git a/src/Umbraco.Core/Models/Membership/IMembershipUser.cs b/src/Umbraco.Core/Models/Membership/IMembershipUser.cs index d6e3294c72..dcd83de767 100644 --- a/src/Umbraco.Core/Models/Membership/IMembershipUser.cs +++ b/src/Umbraco.Core/Models/Membership/IMembershipUser.cs @@ -24,7 +24,7 @@ namespace Umbraco.Core.Models.Membership /// This is the number of times the password was entered incorrectly upon login. /// /// - /// Alias: umbracoFailedPasswordAttemptsPropertyTypeAlias + /// Alias: umbracoMemberFailedPasswordAttempts /// Part of the standard properties collection. /// int FailedPasswordAttempts { get; set; } diff --git a/src/Umbraco.Core/Models/Membership/MembershipExtensions.cs b/src/Umbraco.Core/Models/Membership/MembershipExtensions.cs index d41cea5936..6754ce0f57 100644 --- a/src/Umbraco.Core/Models/Membership/MembershipExtensions.cs +++ b/src/Umbraco.Core/Models/Membership/MembershipExtensions.cs @@ -36,7 +36,7 @@ namespace Umbraco.Core.Models.Membership { return MembershipScenario.NativeUmbraco; } - var memberType = ApplicationContext.Current.Services.MemberTypeService.Get(Constants.Conventions.MemberTypes.Member); + var memberType = ApplicationContext.Current.Services.MemberTypeService.Get(Constants.Conventions.MemberTypes.DefaultAlias); return memberType != null ? MembershipScenario.CustomProviderWithUmbracoLink : MembershipScenario.StandaloneCustomProvider; diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs index db3fbdcd4c..ace2178a55 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/BaseDataCreation.cs @@ -120,7 +120,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1036, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1036", SortOrder = 2, UniqueId = new Guid("2b24165f-9782-4aa3-b459-1de4a4d21f60"), Text = "Member Picker", NodeObjectType = new Guid(Constants.ObjectTypes.DataType), CreateDate = DateTime.Now }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1040, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1040", SortOrder = 2, UniqueId = new Guid("21e798da-e06e-4eda-a511-ed257f78d4fa"), Text = "Related Links", NodeObjectType = new Guid(Constants.ObjectTypes.DataType), CreateDate = DateTime.Now }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1041, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1041", SortOrder = 2, UniqueId = new Guid("b6b73142-b9c1-4bf8-a16d-e1c23320b549"), Text = "Tags", NodeObjectType = new Guid(Constants.ObjectTypes.DataType), CreateDate = DateTime.Now }); - _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1044, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1044", SortOrder = 0, UniqueId = new Guid("d59be02f-1df9-4228-aa1e-01917d806cda"), Text = Constants.Conventions.MemberTypes.Member, NodeObjectType = new Guid(Constants.ObjectTypes.MemberType), CreateDate = DateTime.Now }); + _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1044, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1044", SortOrder = 0, UniqueId = new Guid("d59be02f-1df9-4228-aa1e-01917d806cda"), Text = Constants.Conventions.MemberTypes.DefaultAlias, NodeObjectType = new Guid(Constants.ObjectTypes.MemberType), CreateDate = DateTime.Now }); _database.Insert("umbracoNode", "id", false, new NodeDto { NodeId = 1045, Trashed = false, ParentId = -1, UserId = 0, Level = 1, Path = "-1,1045", SortOrder = 2, UniqueId = new Guid("7E3962CC-CE20-4FFC-B661-5897A894BA7E"), Text = "Multiple Media Picker", NodeObjectType = new Guid(Constants.ObjectTypes.DataType), CreateDate = DateTime.Now }); //TODO: We're not creating these for 7.0 @@ -135,7 +135,7 @@ namespace Umbraco.Core.Persistence.Migrations.Initial _database.Insert("cmsContentType", "pk", false, new ContentTypeDto { PrimaryKey = 532, NodeId = 1031, Alias = Constants.Conventions.MediaTypes.Folder, Icon = "icon-folder", Thumbnail = "folder.png", IsContainer = false, AllowAtRoot = true }); _database.Insert("cmsContentType", "pk", false, new ContentTypeDto { PrimaryKey = 533, NodeId = 1032, Alias = Constants.Conventions.MediaTypes.Image, Icon = "icon-picture", Thumbnail = "mediaPhoto.png" }); _database.Insert("cmsContentType", "pk", false, new ContentTypeDto { PrimaryKey = 534, NodeId = 1033, Alias = Constants.Conventions.MediaTypes.File, Icon = "icon-document", Thumbnail = "mediaFile.png" }); - _database.Insert("cmsContentType", "pk", false, new ContentTypeDto { PrimaryKey = 531, NodeId = 1044, Alias = Constants.Conventions.MemberTypes.Member, Icon = "icon-user", Thumbnail = "folder.png" }); + _database.Insert("cmsContentType", "pk", false, new ContentTypeDto { PrimaryKey = 531, NodeId = 1044, Alias = Constants.Conventions.MemberTypes.DefaultAlias, Icon = "icon-user", Thumbnail = "folder.png" }); } private void CreateUmbracoUserData() diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenOne/UpdateToNewMemberPropertyAliases.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenOne/UpdateToNewMemberPropertyAliases.cs new file mode 100644 index 0000000000..7e5b1eb792 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenOne/UpdateToNewMemberPropertyAliases.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Deployment.Internal; +using System.Dynamic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.Script.Serialization; +using System.Xml; +using Newtonsoft.Json; +using Umbraco.Core.Configuration; +using Umbraco.Core.Logging; +using Umbraco.Core.Models.Rdbms; + +namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenOne +{ + [Migration("7.1.0", 1, GlobalSettings.UmbracoMigrationName)] + public class UpdateToNewMemberPropertyAliases : MigrationBase + { + public override void Up() + { + Execute.Code(Update); + } + + internal static string Update(Database database) + { + if (database != null) + { + var aliasMap = new Dictionary + { + {"umbracoPasswordRetrievalQuestionPropertyTypeAlias", Constants.Conventions.Member.PasswordQuestion}, + {"umbracoPasswordRetrievalAnswerPropertyTypeAlias", Constants.Conventions.Member.PasswordAnswer}, + {"umbracoCommentPropertyTypeAlias", Constants.Conventions.Member.Comments}, + {"umbracoApprovePropertyTypeAlias", Constants.Conventions.Member.IsApproved}, + {"umbracoLockPropertyTypeAlias", Constants.Conventions.Member.IsLockedOut}, + {"umbracoLastLoginPropertyTypeAlias", Constants.Conventions.Member.LastLoginDate}, + {"umbracoMemberLastPasswordChange", Constants.Conventions.Member.LastPasswordChangeDate}, + {"umbracoMemberLastLockout", Constants.Conventions.Member.LastLockoutDate}, + {"umbracoFailedPasswordAttemptsPropertyTypeAlias", Constants.Conventions.Member.FailedPasswordAttempts} + }; + + const string propertyTypeUpdateSql = @"UPDATE cmsPropertyType +SET Alias = @newAlias +WHERE Alias = @oldAlias AND contentTypeId IN ( +SELECT DISTINCT cmsContentType.nodeId FROM cmsPropertyType +INNER JOIN cmsContentType ON cmsPropertyType.contentTypeId = cmsContentType.nodeId +INNER JOIN umbracoNode ON cmsContentType.nodeId = umbracoNode.id +WHERE umbracoNode.nodeObjectType = @objectType)"; + + const string xmlSelectSql = @"SELECT cmsContentXml.* FROM cmsContentXml +INNER JOIN umbracoNode ON cmsContentXml.nodeId = umbracoNode.id +WHERE umbracoNode.nodeObjectType = @objectType"; + + using (var trans = database.GetTransaction()) + { + try + { + + //Upate all of the property type aliases + foreach (var map in aliasMap) + { + database.Execute(propertyTypeUpdateSql, new { newAlias = map.Value, oldAlias = map.Key, objectType = Constants.ObjectTypes.MemberType }); + } + + //Update all of the XML + var items = database.Fetch(xmlSelectSql, new {objectType = Constants.ObjectTypes.Member}); + foreach (var item in items) + { + foreach (var map in aliasMap) + { + item.Xml = item.Xml.Replace("<" + map.Key + ">", "<" + map.Value + ">"); + item.Xml = item.Xml.Replace("", ""); + } + database.Update(item); + } + + trans.Complete(); + } + catch (Exception ex) + { + LogHelper.Error("Exception was thrown when trying to upgrade old member aliases to the new ones", ex); + throw; + } + } + + + } + return string.Empty; + } + + public override void Down() + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9e08a02dbc..f9837f32f0 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -355,6 +355,7 @@ + diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index b0d2e96480..786668812b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -530,13 +530,13 @@ function umbDataFormatter() { //we know the current property matches an alias, now we need to determine which membership provider property it was for // by looking at the key switch (foundAlias[0]) { - case "umbracoLockPropertyTypeAlias": + case "umbracoMemberLockedOut": saveModel.isLockedOut = prop.value.toString() === "1" ? true : false; break; - case "umbracoApprovePropertyTypeAlias": + case "umbracoMemberApproved": saveModel.isApproved = prop.value.toString() === "1" ? true : false; break; - case "umbracoCommentPropertyTypeAlias": + case "umbracoMemberComments": saveModel.comments = prop.value; break; } diff --git a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs index 6ab887a448..d20c325914 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs @@ -298,7 +298,7 @@ namespace Umbraco.Web.Models.Mapping { return MembershipScenario.NativeUmbraco; } - var memberType = _memberTypeService.Value.Get(Constants.Conventions.MemberTypes.Member); + var memberType = _memberTypeService.Value.Get(Constants.Conventions.MemberTypes.DefaultAlias); return memberType != null ? MembershipScenario.CustomProviderWithUmbracoLink : MembershipScenario.StandaloneCustomProvider; diff --git a/src/Umbraco.Web/Models/RegisterModel.cs b/src/Umbraco.Web/Models/RegisterModel.cs index 5d210d020d..eced070082 100644 --- a/src/Umbraco.Web/Models/RegisterModel.cs +++ b/src/Umbraco.Web/Models/RegisterModel.cs @@ -24,7 +24,7 @@ namespace Umbraco.Web.Models private RegisterModel(bool doLookup) { - MemberTypeAlias = Constants.Conventions.MemberTypes.Member; + MemberTypeAlias = Constants.Conventions.MemberTypes.DefaultAlias; RedirectOnSucces = false; RedirectUrl = "/"; UsernameIsEmail = true; diff --git a/src/Umbraco.Web/Security/MembershipHelper.cs b/src/Umbraco.Web/Security/MembershipHelper.cs index 78f7ab09a8..fb5c0d9f6d 100644 --- a/src/Umbraco.Web/Security/MembershipHelper.cs +++ b/src/Umbraco.Web/Security/MembershipHelper.cs @@ -263,7 +263,7 @@ namespace Umbraco.Web.Security { if (Membership.Provider.IsUmbracoMembershipProvider()) { - memberTypeAlias = memberTypeAlias ?? Constants.Conventions.MemberTypes.Member; + memberTypeAlias = memberTypeAlias ?? Constants.Conventions.MemberTypes.DefaultAlias; var memberType = _applicationContext.Services.MemberTypeService.Get(memberTypeAlias); if (memberType == null) throw new InvalidOperationException("Could not find a member type with alias " + memberTypeAlias); diff --git a/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs b/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs index 828520c0b3..70b39a3fb5 100644 --- a/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs @@ -138,7 +138,7 @@ namespace Umbraco.Web.WebApi.Binders //If the default Member type exists, we'll use that to create the IMember - that way we can associate the custom membership // provider to our data - eventually we can support editing custom properties with a custom provider. - var memberType = ApplicationContext.Services.MemberTypeService.Get(Constants.Conventions.MemberTypes.Member); + var memberType = ApplicationContext.Services.MemberTypeService.Get(Constants.Conventions.MemberTypes.DefaultAlias); if (memberType != null) { FilterContentTypeProperties(memberType, memberType.PropertyTypes.Select(x => x.Alias).ToArray());