From 1f68cad45b68e5229825e60c9010b25ef38cf253 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Wed, 4 Sep 2013 15:42:01 +0200 Subject: [PATCH] Refactoring MemberService and MembersMembershipProvider from Darrens pull request to fit the changes made the past week. SecurityHelper is moved to the Umbraco.Web.Security namespace. MembershipExtensions are changed to the new models --- .../Models/Membership/MembershipExtensions.cs | 25 +++ .../Membership/UmbracoMembershipMember.cs | 5 + src/Umbraco.Core/Services/IMemberService.cs | 16 +- src/Umbraco.Core/Services/MemberService.cs | 69 ++++++--- src/Umbraco.Core/Umbraco.Core.csproj | 1 + .../Providers/MembersMembershipProvider.cs | 144 +++++++++++------- .../{Helpers => Security}/SecurityHelper.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 2 +- src/umbraco.providers/SecUtility.cs | 5 +- 9 files changed, 181 insertions(+), 88 deletions(-) create mode 100644 src/Umbraco.Core/Models/Membership/MembershipExtensions.cs rename src/Umbraco.Web/{Helpers => Security}/SecurityHelper.cs (98%) diff --git a/src/Umbraco.Core/Models/Membership/MembershipExtensions.cs b/src/Umbraco.Core/Models/Membership/MembershipExtensions.cs new file mode 100644 index 0000000000..a986869371 --- /dev/null +++ b/src/Umbraco.Core/Models/Membership/MembershipExtensions.cs @@ -0,0 +1,25 @@ +using System; +using System.Web.Security; + +namespace Umbraco.Core.Models.Membership +{ + internal static class MembershipExtensions + { + internal static MembershipUser AsConcreteMembershipUser(this IMember member) + { + var membershipMember = new UmbracoMembershipMember(member); + return membershipMember; + } + + internal static IMember AsIMember(this MembershipUser membershipMember) + { + var member = membershipMember as UmbracoMembershipMember; + if (member != null) + { + return member.Member; + } + + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Membership/UmbracoMembershipMember.cs b/src/Umbraco.Core/Models/Membership/UmbracoMembershipMember.cs index 6dbf963ff5..06e50ecd9b 100644 --- a/src/Umbraco.Core/Models/Membership/UmbracoMembershipMember.cs +++ b/src/Umbraco.Core/Models/Membership/UmbracoMembershipMember.cs @@ -11,6 +11,11 @@ namespace Umbraco.Core.Models.Membership _member = member; } + internal IMember Member + { + get { return _member; } + } + public override string Email { get { return _member.Email; } diff --git a/src/Umbraco.Core/Services/IMemberService.cs b/src/Umbraco.Core/Services/IMemberService.cs index 0216639cb3..2b86ac8e99 100644 --- a/src/Umbraco.Core/Services/IMemberService.cs +++ b/src/Umbraco.Core/Services/IMemberService.cs @@ -1,4 +1,4 @@ -using Umbraco.Core.Models.Membership; +using Umbraco.Core.Models; namespace Umbraco.Core.Services { @@ -18,16 +18,16 @@ namespace Umbraco.Core.Services /// internal interface IMembershipMemberService : IService { - IMembershipUser CreateMember(string username, string email, string password, string memberType, int userId = 0); - - IMembershipUser GetByUsername(string login); + IMember CreateMember(string username, string email, string password, string memberTypeAlias, int userId = 0); - IMembershipUser GetByEmail(string email); + IMember GetByUsername(string login); - IMembershipUser GetById(object id); + IMember GetByEmail(string email); - void Delete(IMembershipUser membershipUser); + IMember GetById(object id); - void Save(IMembershipUser membershipUser); + void Delete(IMember membershipUser); + + void Save(IMember membershipUser); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index 0d6a6e471b..6bd1fe4284 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Models.Membership; +using System; +using Umbraco.Core.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.UnitOfWork; @@ -30,11 +31,21 @@ namespace Umbraco.Core.Services _uowProvider = provider; } - public IMembershipUser CreateMember(string username, string email, string password, string memberType, int userId = 0) + public IMember CreateMember(string username, string email, string password, string memberTypeAlias, int userId = 0) { var uow = _uowProvider.GetUnitOfWork(); + IMemberType memberType; - var member = new Member(); + using (var repository = _repositoryFactory.CreateMemberTypeRepository(uow)) + { + var query = Query.Builder.Where(x => x.Alias == memberTypeAlias); + memberType = repository.GetByQuery(query).FirstOrDefault(); + } + + if (memberType == null) + throw new Exception(string.Format("No MemberType matching the passed in Alias: '{0}' was found", memberTypeAlias)); + + var member = new Member(email, -1, memberType, new PropertyCollection()); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { @@ -49,50 +60,68 @@ namespace Umbraco.Core.Services return member; } - public IMembershipUser GetByUsername(string userName) + public IMember GetByUsername(string userName) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { - var query = Query.Builder.Where(x => x.Username == userName); - var membershipUser = repository.GetByQuery(query).FirstOrDefault(); + var query = Query.Builder.Where(x => x.Username == userName); + var member = repository.GetByQuery(query).FirstOrDefault(); - return membershipUser; + return member; } } - public IMembershipUser GetByEmail(string email) + public IMember GetByEmail(string email) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { - var query = Query.Builder.Where(x => x.Email == email); - var membershipUser = repository.GetByQuery(query).FirstOrDefault(); + var query = Query.Builder.Where(x => x.Email == email); + var member = repository.GetByQuery(query).FirstOrDefault(); - return membershipUser; + return member; } } - public IMembershipUser GetById(object id) + public IMember GetById(object id) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { - var query = Query.Builder.Where(x => x.Id == id); - var membershipUser = repository.GetByQuery(query).FirstOrDefault(); + if (id is int) + { + var query = Query.Builder.Where(x => x.Id == (int)id); + var member = repository.GetByQuery(query).FirstOrDefault(); + return member; + } - return membershipUser; + if (id is Guid) + { + var query = Query.Builder.Where(x => x.Key == (Guid)id); + var member = repository.GetByQuery(query).FirstOrDefault(); + return member; + } + + return null; } } - public void Delete(IMembershipUser membershipUser) + public void Delete(IMember member) { - using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) + var uow = _uowProvider.GetUnitOfWork(); + using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { - repository.Delete(membershipUser); + repository.Delete(member); + uow.Commit(); } } - public void Save(IMembershipUser membershipUser) + public void Save(IMember member) { - throw new System.NotImplementedException(); + var uow = _uowProvider.GetUnitOfWork(); + using (var repository = _repositoryFactory.CreateMemberRepository(uow)) + { + repository.AddOrUpdate(member); + uow.Commit(); + } } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index f2dd7eb2cb..43b8891c92 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -203,6 +203,7 @@ + diff --git a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs index b4e9ebbb2b..b638dcdff5 100644 --- a/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs +++ b/src/Umbraco.Web/Security/Providers/MembersMembershipProvider.cs @@ -4,67 +4,20 @@ using System.Configuration.Provider; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; +using System.Web.Hosting; using System.Web.Security; using Umbraco.Core; using Umbraco.Core.Logging; -using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; -using Umbraco.Web.Helpers; +using Umbraco.Core.Models.Membership; namespace Umbraco.Web.Security.Providers { - /// - /// Extension methods - /// - static internal class Extensions - { - public static MembershipUser AsConcreteMembershipUser(this IMembershipUser member) - { - // TODO: Provider name?? first constructor arg... Replace DateTime.Now; - var m = new MembershipUser("", - member.Username, - member.ProviderUserKey, - member.Email, - member.PasswordQuestion, - member.Comments, - member.IsApproved, - member.IsLockedOut, - member.CreateDate, - member.LastLoginDate, - member.UpdateDate, - member.LastPasswordChangeDate, - member.LastLockoutDate); - - return m; - } - - public static IMembershipUser AsIMembershipUser(this MembershipUser membershipUser) - { - var m = new Member - { - Username = membershipUser.UserName, - Password = membershipUser.GetPassword(), - Email = membershipUser.Email, - CreateDate = membershipUser.CreationDate, - Comments = membershipUser.Comment, - IsApproved = membershipUser.IsApproved, - IsLockedOut = membershipUser.IsLockedOut, - LastLockoutDate = membershipUser.LastLockoutDate, - LastLoginDate = membershipUser.LastLoginDate, - LastPasswordChangeDate = membershipUser.LastPasswordChangedDate - }; - - return m; - } - - } - /// /// Custom Membership Provider for Umbraco Members (User authentication for Frontend applications NOT umbraco CMS) /// internal class MembersMembershipProvider : MembershipProvider { - #region Fields private string _applicationName; private bool _enablePasswordReset; @@ -76,9 +29,9 @@ namespace Umbraco.Web.Security.Providers private MembershipPasswordFormat _passwordFormat; - private string _passwordStrengthRegularExpression; - private bool _requiresQuestionAndAnswer; - private bool _requiresUniqueEmail; + private string _passwordStrengthRegularExpression; + private bool _requiresQuestionAndAnswer; + private bool _requiresUniqueEmail; #endregion @@ -534,7 +487,7 @@ namespace Umbraco.Web.Security.Providers /// A object that represents the user to update and the updated information for the user. public override void UpdateUser(MembershipUser user) { - var member = user.AsIMembershipUser(); + var member = user.AsIMember(); MemberService.Save(member); } @@ -742,6 +695,8 @@ namespace Umbraco.Web.Security.Providers throw new System.NotImplementedException(); } + #region Private methods + private bool IsPasswordValid(string password) { if (_minRequiredNonAlphanumericCharacters > 0) @@ -796,6 +751,87 @@ namespace Umbraco.Web.Security.Providers throw new ProviderException("Unsupported password format."); } return encodedPassword; - } + } + + /// + /// Gets the boolean value. + /// + /// The config. + /// Name of the value. + /// if set to true [default value]. + /// + private bool GetBooleanValue(NameValueCollection config, string valueName, bool defaultValue) + { + bool flag; + var str = config[valueName]; + if (str == null) + return defaultValue; + + if (bool.TryParse(str, out flag) == false) + { + throw new ProviderException("Value must be boolean."); + } + return flag; + } + + /// + /// Gets the int value. + /// + /// The config. + /// Name of the value. + /// The default value. + /// if set to true [zero allowed]. + /// The max value allowed. + /// + private int GetIntValue(NameValueCollection config, string valueName, int defaultValue, bool zeroAllowed, int maxValueAllowed) + { + int num; + var s = config[valueName]; + if (s == null) + { + return defaultValue; + } + if (int.TryParse(s, out num) == false) + { + if (zeroAllowed) + { + throw new ProviderException("Value must be non negative integer"); + } + throw new ProviderException("Value must be positive integer"); + } + if (zeroAllowed && (num < 0)) + { + throw new ProviderException("Value must be non negativeinteger"); + } + if (zeroAllowed == false && (num <= 0)) + { + throw new ProviderException("Value must be positive integer"); + } + if ((maxValueAllowed > 0) && (num > maxValueAllowed)) + { + throw new ProviderException("Value too big"); + } + return num; + } + + + /// + /// Gets the name of the default app. + /// + /// + private string GetDefaultAppName() + { + try + { + var applicationVirtualPath = HostingEnvironment.ApplicationVirtualPath; + return string.IsNullOrEmpty(applicationVirtualPath) ? "/" : applicationVirtualPath; + } + catch + { + return "/"; + } + } + + #endregion } } \ No newline at end of file diff --git a/src/Umbraco.Web/Helpers/SecurityHelper.cs b/src/Umbraco.Web/Security/SecurityHelper.cs similarity index 98% rename from src/Umbraco.Web/Helpers/SecurityHelper.cs rename to src/Umbraco.Web/Security/SecurityHelper.cs index a731d516b2..ca22aa9901 100644 --- a/src/Umbraco.Web/Helpers/SecurityHelper.cs +++ b/src/Umbraco.Web/Security/SecurityHelper.cs @@ -2,7 +2,7 @@ using System.Configuration.Provider; using System.Web.Hosting; -namespace Umbraco.Web.Helpers +namespace Umbraco.Web.Security { internal class SecurityHelper { diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index a3e57c95f6..a87f2fa449 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -294,7 +294,7 @@ - + diff --git a/src/umbraco.providers/SecUtility.cs b/src/umbraco.providers/SecUtility.cs index 0bf43bfa08..572d8fbc12 100644 --- a/src/umbraco.providers/SecUtility.cs +++ b/src/umbraco.providers/SecUtility.cs @@ -1,11 +1,8 @@ using System; -using System.Collections.Generic; -using System.Text; using System.Collections.Specialized; using System.Collections; using System.Globalization; using System.Web.Hosting; -using System.Diagnostics; using System.Configuration.Provider; namespace umbraco.providers @@ -13,7 +10,7 @@ namespace umbraco.providers /// /// Security Helper Methods /// - [ObsoleteAttribute("This clas is obsolete. Use Umbraco.Web.Security.Helper.SecurityHelper instead.", false)] + [ObsoleteAttribute("This clas is obsolete and wil be removed along with the legacy Membership Provider.", false)] internal class SecUtility { ///