From 71e6ea70b29271d176379c03bb87d1eae98b7058 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 10 Oct 2013 12:22:38 +1100 Subject: [PATCH] Updates member repository and tests to ensure that an existing password will not be replaced if the password specified is null or empty. --- src/Umbraco.Core/Models/Member.cs | 11 ++++ .../Repositories/MemberRepository.cs | 29 ++++++++-- .../Repositories/MemberRepositoryTest.cs | 57 +++++++++++++++++++ 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/Models/Member.cs b/src/Umbraco.Core/Models/Member.cs index 335beb9ee4..650f664254 100644 --- a/src/Umbraco.Core/Models/Member.cs +++ b/src/Umbraco.Core/Models/Member.cs @@ -20,6 +20,17 @@ namespace Umbraco.Core.Models private object _providerUserKey; private Type _userTypeKey; + /// + /// Constructor for creating a Member object + /// + /// Name of the content + /// ContentType for the current Content object + public Member(string name, IMemberType contentType) + : base(name, -1, contentType, new PropertyCollection()) + { + _contentType = contentType; + } + public Member(string name, string email, string username, string password, int parentId, IMemberType contentType) : base(name, parentId, contentType, new PropertyCollection()) { diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index 8854f169cd..dbaec8471a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -265,8 +265,10 @@ namespace Umbraco.Core.Persistence.Repositories //Updates Modified date ((Member)entity).UpdatingEntity(); + var dirtyEntity = (ICanBeDirty) entity; + //Look up parent to get and set the correct Path and update SortOrder if ParentId has changed - if (((ICanBeDirty)entity).IsPropertyDirty("ParentId")) + if (dirtyEntity.IsPropertyDirty("ParentId")) { var parent = Database.First("WHERE id = @ParentId", new { ParentId = ((IUmbracoEntity)entity).ParentId }); ((IUmbracoEntity)entity).Path = string.Concat(parent.Path, ",", entity.Id); @@ -302,8 +304,27 @@ namespace Umbraco.Core.Persistence.Repositories //Updates the current version - cmsContentVersion //Assumes a Version guid exists and Version date (modified date) has been set/updated Database.Update(dto.ContentVersionDto); - //Updates the cmsMember entry - Database.Update(dto); + + //Updates the cmsMember entry if it has changed + var changedCols = new List(); + if (dirtyEntity.IsPropertyDirty("Email")) + { + changedCols.Add("Email"); + } + if (dirtyEntity.IsPropertyDirty("Username")) + { + changedCols.Add("LoginName"); + } + // DO NOT update the password if it is null or empty + if (dirtyEntity.IsPropertyDirty("Password") && entity.Password.IsNullOrWhiteSpace() == false) + { + changedCols.Add("Password"); + } + //only update the changed cols + if (changedCols.Count > 0) + { + Database.Update(dto, changedCols); + } //TODO ContentType for the Member entity @@ -337,7 +358,7 @@ namespace Umbraco.Core.Persistence.Repositories UpdatePropertyTags(entity, _tagRepository); - ((ICanBeDirty)entity).ResetDirtyProperties(); + dirtyEntity.ResetDirtyProperties(); } protected override void PersistDeletedItem(IMember entity) diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs index fa75070ad4..49a63a007e 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs @@ -189,6 +189,63 @@ namespace Umbraco.Tests.Persistence.Repositories } } + [Test] + public void MemberRepository_Does_Not_Replace_Password_When_Null() + { + IMember sut; + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + MemberTypeRepository memberTypeRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + { + var memberType = MockedContentTypes.CreateSimpleMemberType(); + memberTypeRepository.AddOrUpdate(memberType); + unitOfWork.Commit(); + + var member = MockedMember.CreateSimpleContent(memberType, "Johnny Hefty", "johnny@example.com", "123", "hefty", -1); + repository.AddOrUpdate(member); + unitOfWork.Commit(); + + sut = repository.Get(member.Id); + //when the password is null it will not overwrite what is already there. + sut.Password = null; + repository.AddOrUpdate(sut); + unitOfWork.Commit(); + sut = repository.Get(member.Id); + + Assert.That(sut.Password, Is.EqualTo("123")); + } + } + + [Test] + public void MemberRepository_Can_Update_Email_And_Login_When_Changed() + { + IMember sut; + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + MemberTypeRepository memberTypeRepository; + using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) + { + var memberType = MockedContentTypes.CreateSimpleMemberType(); + memberTypeRepository.AddOrUpdate(memberType); + unitOfWork.Commit(); + + var member = MockedMember.CreateSimpleContent(memberType, "Johnny Hefty", "johnny@example.com", "123", "hefty", -1); + repository.AddOrUpdate(member); + unitOfWork.Commit(); + + sut = repository.Get(member.Id); + sut.Username = "This is new"; + sut.Email = "thisisnew@hello.com"; + repository.AddOrUpdate(sut); + unitOfWork.Commit(); + sut = repository.Get(member.Id); + + Assert.That(sut.Email, Is.EqualTo("thisisnew@hello.com")); + Assert.That(sut.Username, Is.EqualTo("This is new")); + } + } + [Test] public void Can_Create_Correct_Subquery() {