From 6f586c7eeb9aa19111d848ecb68553ac0d56fced Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 18 Mar 2014 20:36:02 +1100 Subject: [PATCH] Ensures we are not directly referencing Membership.Provider and instead targetting our provider by alias. --- .../Membership/MembershipUserExtensions.cs | 4 +- .../Editors/CurrentUserController.cs | 12 +----- src/Umbraco.Web/Editors/MemberController.cs | 38 +++++++++++-------- ...ershipProviderValidationFilterAttribute.cs | 2 +- .../Install/InstallSteps/NewInstallStep.cs | 6 +-- .../Models/Mapping/MemberModelMapper.cs | 22 +++++++---- src/Umbraco.Web/Security/WebSecurity.cs | 7 ++-- src/Umbraco.Web/Trees/MemberTreeController.cs | 20 +++++++--- .../WebApi/Binders/MemberBinder.cs | 8 +++- 9 files changed, 68 insertions(+), 51 deletions(-) diff --git a/src/Umbraco.Core/Models/Membership/MembershipUserExtensions.cs b/src/Umbraco.Core/Models/Membership/MembershipUserExtensions.cs index 7cc61110d5..6008c0ae02 100644 --- a/src/Umbraco.Core/Models/Membership/MembershipUserExtensions.cs +++ b/src/Umbraco.Core/Models/Membership/MembershipUserExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Web.Security; +using Umbraco.Core.Security; using Umbraco.Core.Services; namespace Umbraco.Core.Models.Membership @@ -32,7 +33,8 @@ namespace Umbraco.Core.Models.Membership { if (_scenario.HasValue == false) { - if (System.Web.Security.Membership.Provider.Name == Constants.Conventions.Member.UmbracoMemberProviderName) + var provider = MembershipProviderExtensions.GetMembersMembershipProvider(); + if (provider.IsUmbracoMembershipProvider()) { return MembershipScenario.NativeUmbraco; } diff --git a/src/Umbraco.Web/Editors/CurrentUserController.cs b/src/Umbraco.Web/Editors/CurrentUserController.cs index 3afab97676..5c56106063 100644 --- a/src/Umbraco.Web/Editors/CurrentUserController.cs +++ b/src/Umbraco.Web/Editors/CurrentUserController.cs @@ -36,11 +36,7 @@ namespace Umbraco.Web.Editors /// public IDictionary GetMembershipProviderConfig() { - var provider = Membership.Providers[UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider]; - if (provider == null) - { - throw new InvalidOperationException("No back office membership provider found with the name " + UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider); - } + var provider = Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider(); return provider.GetConfiguration(); } @@ -53,11 +49,7 @@ namespace Umbraco.Web.Editors /// public ModelWithNotifications PostChangePassword(ChangingPasswordModel data) { - var userProvider = Membership.Providers[UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider]; - if (userProvider == null) - { - throw new InvalidOperationException("No membership provider found with the name " + UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider); - } + var userProvider = Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider(); //TODO: WE need to support this! - requires UI updates, etc... if (userProvider.RequiresQuestionAndAnswer) diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 7dc16a5ee8..44ecbacd9d 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -45,6 +45,7 @@ namespace Umbraco.Web.Editors public MemberController() : this(UmbracoContext.Current) { + _provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); } /// @@ -54,8 +55,11 @@ namespace Umbraco.Web.Editors public MemberController(UmbracoContext umbracoContext) : base(umbracoContext) { + _provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); } + private MembershipProvider _provider; + /// /// Ensure all GUIDs are formatted without hyphens /// @@ -116,7 +120,7 @@ namespace Umbraco.Web.Editors case MembershipScenario.StandaloneCustomProvider: default: - foundMembershipMember = Membership.GetUser(key, false); + foundMembershipMember = _provider.GetUser(key, false); if (foundMembershipMember == null) { HandleContentNotFound(key); @@ -205,7 +209,7 @@ namespace Umbraco.Web.Editors } //TODO: WE need to support this! - requires UI updates, etc... - if (Membership.Provider.RequiresQuestionAndAnswer) + if (_provider.RequiresQuestionAndAnswer) { throw new NotSupportedException("Currently the member editor does not support providers that have RequiresQuestionAndAnswer specified"); } @@ -316,11 +320,11 @@ namespace Umbraco.Web.Editors { //Get the member from the provider - var membershipUser = Membership.Provider.GetUser(contentItem.PersistedContent.Key, false); + var membershipUser = _provider.GetUser(contentItem.PersistedContent.Key, false); if (membershipUser == null) { //This should never happen! so we'll let it YSOD if it does. - throw new InvalidOperationException("Could not get member from membership provider " + Membership.Provider.Name + " with key " + contentItem.PersistedContent.Key); + throw new InvalidOperationException("Could not get member from membership provider " + _provider.Name + " with key " + contentItem.PersistedContent.Key); } var shouldReFetchMember = false; @@ -328,7 +332,7 @@ namespace Umbraco.Web.Editors //Update the membership user if it has changed try { - var requiredUpdating = Members.UpdateMember(membershipUser, Membership.Provider, + var requiredUpdating = Members.UpdateMember(membershipUser, _provider, contentItem.Email.Trim(), contentItem.IsApproved, comment: contentItem.Comments); @@ -352,7 +356,7 @@ namespace Umbraco.Web.Editors { try { - var result = Membership.Provider.UnlockUser(membershipUser.UserName); + var result = _provider.UnlockUser(membershipUser.UserName); if (result == false) { //it wasn't successful - but it won't really tell us why. @@ -387,7 +391,7 @@ namespace Umbraco.Web.Editors return null; } - var passwordChangeResult = Members.ChangePassword(membershipUser.UserName, contentItem.Password, Membership.Provider); + var passwordChangeResult = Members.ChangePassword(membershipUser.UserName, contentItem.Password, _provider); if (passwordChangeResult.Success) { //If the provider has changed some values, these values need to be reflected in the member object @@ -444,12 +448,14 @@ namespace Umbraco.Web.Editors case MembershipScenario.CustomProviderWithUmbracoLink: case MembershipScenario.StandaloneCustomProvider: default: - var membershipUser = Membership.GetUser(contentItem.Key, false); + var membershipUser = _provider.GetUser(contentItem.Key, false); //Go and re-fetch the persisted item contentItem.PersistedContent = Mapper.Map(membershipUser); break; } + UpdateName(contentItem); + //re-assign the mapped values that are not part of the membership provider properties. var builtInAliases = Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray(); foreach (var p in contentItem.PersistedContent.Properties) @@ -495,7 +501,7 @@ namespace Umbraco.Web.Editors { case MembershipScenario.NativeUmbraco: //We are using the umbraco membership provider, create the member using the membership provider first. - var umbracoMembershipProvider = (UmbracoMembershipProviderBase)Membership.Provider; + var umbracoMembershipProvider = (UmbracoMembershipProviderBase)_provider; //TODO: We are not supporting q/a - passing in empty here membershipUser = umbracoMembershipProvider.CreateUser( contentItem.ContentTypeAlias, contentItem.Username, @@ -512,7 +518,7 @@ namespace Umbraco.Web.Editors Services.MemberService.Save(contentItem.PersistedContent); //TODO: We are not supporting q/a - passing in empty here - membershipUser = Membership.CreateUser( + membershipUser = _provider.CreateUser( contentItem.Username, contentItem.Password.NewPassword, contentItem.Email, @@ -529,7 +535,7 @@ namespace Umbraco.Web.Editors var newKey = Guid.NewGuid(); //TODO: We are not supporting q/a - passing in empty here - membershipUser = Membership.CreateUser( + membershipUser = _provider.CreateUser( contentItem.Username, contentItem.Password.NewPassword, contentItem.Email, @@ -556,7 +562,7 @@ namespace Umbraco.Web.Editors if (contentItem.Comments.IsNullOrWhiteSpace() == false) { membershipUser.Comment = contentItem.Comments; - Membership.UpdateUser(membershipUser); + _provider.UpdateUser(membershipUser); } RefetchMemberData(contentItem, LookupType.ByUserName); @@ -640,17 +646,17 @@ namespace Umbraco.Web.Editors { Services.MemberService.Delete(foundMember); } - foundMembershipUser = Membership.GetUser(key, false); + foundMembershipUser = _provider.GetUser(key, false); if (foundMembershipUser != null) { - Membership.DeleteUser(foundMembershipUser.UserName, true); + _provider.DeleteUser(foundMembershipUser.UserName, true); } break; case MembershipScenario.StandaloneCustomProvider: - foundMembershipUser = Membership.GetUser(key, false); + foundMembershipUser = _provider.GetUser(key, false); if (foundMembershipUser != null) { - Membership.DeleteUser(foundMembershipUser.UserName, true); + _provider.DeleteUser(foundMembershipUser.UserName, true); } break; default: diff --git a/src/Umbraco.Web/Editors/MembershipProviderValidationFilterAttribute.cs b/src/Umbraco.Web/Editors/MembershipProviderValidationFilterAttribute.cs index 91ddbbc358..aa95af3531 100644 --- a/src/Umbraco.Web/Editors/MembershipProviderValidationFilterAttribute.cs +++ b/src/Umbraco.Web/Editors/MembershipProviderValidationFilterAttribute.cs @@ -21,7 +21,7 @@ namespace Umbraco.Web.Editors base.OnActionExecuting(actionContext); //default provider! - var membershipProvider = Membership.Provider; + var membershipProvider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); var contentItem = (MemberSave) actionContext.ActionArguments["contentItem"]; diff --git a/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs b/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs index e58c21bf5e..64bef533a8 100644 --- a/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs @@ -32,11 +32,7 @@ namespace Umbraco.Web.Install.InstallSteps { get { - var provider = Membership.Providers[UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider]; - if (provider == null) - { - throw new InvalidOperationException("No MembershipProvider found with name " + UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider); - } + var provider = Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider(); return provider; } } diff --git a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs index 67f29fa85d..1f09e38720 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs @@ -101,6 +101,8 @@ namespace Umbraco.Web.Models.Mapping /// private static void MapGenericCustomProperties(IMemberService memberService, IMember member, MemberDisplay display) { + var membersProvider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + TabsAndPropertiesResolver.MapGenericProperties( member, display, GetLoginProperty(memberService, member, display), @@ -126,7 +128,7 @@ namespace Umbraco.Web.Models.Mapping //TODO: Hard coding this because the changepassword doesn't necessarily need to be a resolvable (real) property editor View = "changepassword", //initialize the dictionary with the configuration from the default membership provider - Config = new Dictionary(Membership.Provider.GetConfiguration()) + Config = new Dictionary(membersProvider.GetConfiguration()) { //the password change toggle will only be displayed if there is already a password assigned. {"hasPassword", member.RawPasswordValue.IsNullOrWhiteSpace() == false} @@ -142,7 +144,7 @@ namespace Umbraco.Web.Models.Mapping }); //check if there's an approval field - var provider = Membership.Provider as global::umbraco.providers.members.UmbracoMembershipProvider; + var provider = membersProvider as global::umbraco.providers.members.UmbracoMembershipProvider; if (member.HasIdentity == false && provider != null) { var approvedField = provider.ApprovedPropertyTypeAlias; @@ -243,6 +245,8 @@ namespace Umbraco.Web.Models.Mapping { protected override IEnumerable> ResolveCore(IContentBase content) { + var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + IgnoreProperties = content.PropertyTypes .Where(x => x.HasIdentity == false) .Select(x => x.Alias) @@ -250,7 +254,7 @@ namespace Umbraco.Web.Models.Mapping var result = base.ResolveCore(content).ToArray(); - if (Membership.Provider.IsUmbracoMembershipProvider() == false) + if (provider.IsUmbracoMembershipProvider() == false) { //it's a generic provider so update the locked out property based on our known constant alias var isLockedOutProperty = result.SelectMany(x => x.Properties).FirstOrDefault(x => x.Alias == Constants.Conventions.Member.IsLockedOut); @@ -264,7 +268,7 @@ namespace Umbraco.Web.Models.Mapping } else { - var umbracoProvider = (IUmbracoMemberTypeMembershipProvider)Membership.Provider; + var umbracoProvider = (IUmbracoMemberTypeMembershipProvider)provider; //This is kind of a hack because a developer is supposed to be allowed to set their property editor - would have been much easier // if we just had all of the membeship provider fields on the member table :( @@ -294,7 +298,9 @@ namespace Umbraco.Web.Models.Mapping protected override MembershipScenario ResolveCore(IMember source) { - if (Membership.Provider.Name == Constants.Conventions.Member.UmbracoMemberProviderName) + var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + + if (provider.IsUmbracoMembershipProvider()) { return MembershipScenario.NativeUmbraco; } @@ -312,7 +318,9 @@ namespace Umbraco.Web.Models.Mapping { protected override IDictionary ResolveCore(IMember source) { - if (Membership.Provider.IsUmbracoMembershipProvider() == false) + var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + + if (provider.IsUmbracoMembershipProvider() == false) { return new Dictionary { @@ -323,7 +331,7 @@ namespace Umbraco.Web.Models.Mapping } else { - var umbracoProvider = (IUmbracoMemberTypeMembershipProvider)Membership.Provider; + var umbracoProvider = (IUmbracoMemberTypeMembershipProvider)provider; return new Dictionary { diff --git a/src/Umbraco.Web/Security/WebSecurity.cs b/src/Umbraco.Web/Security/WebSecurity.cs index c78755cc35..351a18759c 100644 --- a/src/Umbraco.Web/Security/WebSecurity.cs +++ b/src/Umbraco.Web/Security/WebSecurity.cs @@ -161,7 +161,7 @@ namespace Umbraco.Web.Security /// internal MembershipUser GetBackOfficeMembershipUser(string username, bool setOnline) { - var membershipProvider = Membership.Providers[UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider]; + var membershipProvider = Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider(); return membershipProvider != null ? membershipProvider.GetUser(username, setOnline) : null; } @@ -178,12 +178,13 @@ namespace Umbraco.Web.Security { //get the membership user (set user to be 'online' in the provider too) var membershipUser = GetBackOfficeMembershipUser(username, true); + var provider = Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider(); if (membershipUser == null) { throw new InvalidOperationException( "The username & password validated but the membership provider '" + - Membership.Providers[UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider].Name + + provider.Name + "' did not return a MembershipUser with the username supplied"); } @@ -191,7 +192,7 @@ namespace Umbraco.Web.Security var user = _applicationContext.Services.UserService.GetByUsername(membershipUser.UserName); //we're using the built-in membership provider so the user will already be available - if (Membership.Providers[UmbracoConfig.For.UmbracoSettings().Providers.DefaultBackOfficeUserProvider] is UsersMembershipProvider) + if (provider.IsUmbracoUsersProvider()) { if (user == null) { diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs index 6e1fdd3198..8e4bed8d7f 100644 --- a/src/Umbraco.Web/Trees/MemberTreeController.cs +++ b/src/Umbraco.Web/Trees/MemberTreeController.cs @@ -5,6 +5,7 @@ using System.Net.Http.Formatting; using System.Web.Security; using Umbraco.Core; using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Security; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Filters; @@ -29,6 +30,13 @@ namespace Umbraco.Web.Trees [CoreTree] public class MemberTreeController : TreeController { + public MemberTreeController() + { + _provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + } + + private MembershipProvider _provider; + protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) { var nodes = new TreeNodeCollection(); @@ -44,7 +52,7 @@ namespace Umbraco.Web.Trees nodes.Add(folder); } //list out 'Others' if the membership provider is umbraco - if (Membership.Provider.Name == Constants.Conventions.Member.UmbracoMemberProviderName) + if (_provider.IsUmbracoMembershipProvider()) { var folder = CreateTreeNode("others", id, queryStrings, "Others", "icon-folder-close", true); folder.NodeType = "member-folder"; @@ -56,7 +64,7 @@ namespace Umbraco.Web.Trees //if it is a letter if (id.Length == 1 && char.IsLower(id, 0)) { - if (Membership.Provider.Name == Constants.Conventions.Member.UmbracoMemberProviderName) + if (_provider.IsUmbracoMembershipProvider()) { int totalRecs; var foundMembers = Services.MemberService.FindMembersByDisplayName( @@ -100,15 +108,15 @@ namespace Umbraco.Web.Trees protected virtual MembershipUserCollection FindUsersByName(char letter) { int total; - if (Membership.Provider is SqlMembershipProvider) + if (_provider is SqlMembershipProvider) { //this provider uses the % syntax - return Membership.Provider.FindUsersByName(letter + "%", 0, 9999, out total); + return _provider.FindUsersByName(letter + "%", 0, 9999, out total); } else { //the AD provider - and potentiall all other providers will use the asterisk syntax. - return Membership.Provider.FindUsersByName(letter + "*", 0, 9999, out total); + return _provider.FindUsersByName(letter + "*", 0, 9999, out total); } } @@ -136,7 +144,7 @@ namespace Umbraco.Web.Trees if (id == Constants.System.Root.ToInvariantString()) { // root actions - if (Membership.Provider.Name == Constants.Conventions.Member.UmbracoMemberProviderName) + if (_provider.IsUmbracoMembershipProvider()) { //set default menu.DefaultMenuAlias = ActionNew.Instance.Alias; diff --git a/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs b/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs index 34dcd79714..3893167a73 100644 --- a/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs @@ -6,6 +6,7 @@ using System.Web.Security; using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.WebApi.Filters; @@ -42,6 +43,7 @@ namespace Umbraco.Web.WebApi.Binders protected override IMember GetExisting(MemberSave model) { var scenario = ApplicationContext.Services.MemberService.GetMembershipScenario(); + var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); switch (scenario) { case MembershipScenario.NativeUmbraco: @@ -49,7 +51,7 @@ namespace Umbraco.Web.WebApi.Binders case MembershipScenario.CustomProviderWithUmbracoLink: case MembershipScenario.StandaloneCustomProvider: default: - var membershipUser = Membership.GetUser(model.Key, false); + var membershipUser = provider.GetUser(model.Key, false); if (membershipUser == null) { throw new InvalidOperationException("Could not find member with key " + model.Key); @@ -115,7 +117,9 @@ namespace Umbraco.Web.WebApi.Binders /// protected override IMember CreateNew(MemberSave model) { - if (Membership.Provider.Name == Constants.Conventions.Member.UmbracoMemberProviderName) + var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + + if (provider.IsUmbracoMembershipProvider()) { var contentType = ApplicationContext.Services.MemberTypeService.Get(model.ContentTypeAlias); if (contentType == null)