diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs index 03f7e98b5d..58da62be1b 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; @@ -336,7 +336,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } protected override void PersistUpdatedItem(IMember entity) - { + { // update entity.UpdatingEntity(); @@ -347,7 +347,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // if parent has changed, get path, level and sort order if (entity.IsPropertyDirty("ParentId")) { - var parent = GetParentNodeDto(entity.ParentId); + NodeDto parent = GetParentNodeDto(entity.ParentId); entity.Path = string.Concat(parent.Path, ",", entity.Id); entity.Level = parent.Level + 1; @@ -355,10 +355,10 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } // create the dto - var dto = ContentBaseFactory.BuildDto(entity); + MemberDto dto = ContentBaseFactory.BuildDto(entity); // update the node dto - var nodeDto = dto.ContentDto.NodeDto; + NodeDto nodeDto = dto.ContentDto.NodeDto; Database.Update(nodeDto); // update the content dto @@ -409,7 +409,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement //get the group id var grpQry = Query().Where(group => group.Name.Equals(roleName)); var memberGroup = _memberGroupRepository.Get(grpQry).FirstOrDefault(); - if (memberGroup == null) return Enumerable.Empty(); + if (memberGroup == null) + return Enumerable.Empty(); // get the members by username var query = Query(); @@ -464,7 +465,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { var grpQry = Query().Where(group => group.Name.Equals(groupName)); var memberGroup = _memberGroupRepository.Get(grpQry).FirstOrDefault(); - if (memberGroup == null) return Enumerable.Empty(); + if (memberGroup == null) + return Enumerable.Empty(); var subQuery = Sql().Select("Member").From().Where(dto => dto.MemberGroup == memberGroup.Id); @@ -539,7 +541,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var sqlSelectTemplateVersion = SqlContext.Templates.Get("Umbraco.Core.MemberRepository.SetLastLogin2", s => s .Select(x => x.Id) - .From() + .From() .InnerJoin().On((l, r) => l.NodeId == r.NodeId) .InnerJoin().On((l, r) => l.NodeId == r.NodeId) .Where(x => x.NodeObjectType == SqlTemplate.Arg("nodeObjectType")) @@ -614,7 +616,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var cached = IsolatedCache.GetCacheItem(RepositoryCacheKeys.GetKey(dto.NodeId)); if (cached != null && cached.VersionId == dto.ContentVersionDto.Id) { - content[i] = (Member) cached; + content[i] = (Member)cached; continue; } } @@ -656,7 +658,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // get properties - indexed by version id var versionId = dto.ContentVersionDto.Id; - var temp = new TempContent(dto.ContentDto.NodeId,versionId, 0, memberType); + var temp = new TempContent(dto.ContentDto.NodeId, versionId, 0, memberType); var properties = GetPropertyCollections(new List> { temp }); member.Properties = properties[versionId]; diff --git a/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs b/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs index 794da8230e..721c0eee21 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs @@ -807,11 +807,11 @@ namespace Umbraco.Infrastructure.Services.Implement /// public void Save(IMember member, bool raiseEvents = true) { - //trimming username and email to make sure we have no trailing space + // trimming username and email to make sure we have no trailing space member.Username = member.Username.Trim(); member.Email = member.Email.Trim(); - using (var scope = ScopeProvider.CreateScope()) + using (IScope scope = ScopeProvider.CreateScope()) { var saveEventArgs = new SaveEventArgs(member); if (raiseEvents && scope.Events.DispatchCancelable(Saving, this, saveEventArgs)) @@ -834,6 +834,7 @@ namespace Umbraco.Infrastructure.Services.Implement saveEventArgs.CanCancel = false; scope.Events.Dispatch(Saved, this, saveEventArgs); } + Audit(AuditType.Save, 0, member.Id); scope.Complete(); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs index b0d4811cf6..80422dd3ed 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs @@ -221,15 +221,15 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers } /// - /// Create membercontroller to test + /// Create member controller to test /// - /// - /// - /// - /// - /// - /// - /// + /// Member service + /// Member type service + /// Member group service + /// Members user manager + /// Data type service + /// Back office security accessor + /// A member controller for the tests private MemberController CreateSut( IMemberService memberService, IMemberTypeService memberTypeService, diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs index 7a27e39c51..f203fac3be 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs @@ -436,8 +436,13 @@ namespace Umbraco.Web.BackOffice.Controllers return new ValidationErrorResult(validatePassword.Errors.ToErrorMessage()); } - string newPassword = _memberManager.HashPassword(contentItem.Password.NewPassword); - identityMember.PasswordHash = newPassword; + string token = await _memberManager.GeneratePasswordResetTokenAsync(identityMember); + IdentityResult resetPassword = await _memberManager.ResetPasswordAsync(identityMember, token, contentItem.Password.NewPassword); + + if (resetPassword.Succeeded == false) + { + return new ValidationErrorResult(validatePassword.Errors.ToErrorMessage()); + } } IdentityResult updatedResult = await _memberManager.UpdateAsync(identityMember); @@ -448,6 +453,10 @@ namespace Umbraco.Web.BackOffice.Controllers } contentItem.PersistedContent.RawPasswordValue = identityMember.PasswordHash; + if (identityMember.LastPasswordChangeDateUtc != null) + { + contentItem.PersistedContent.LastPasswordChangeDate = identityMember.LastPasswordChangeDateUtc.Value; + } _memberService.Save(contentItem.PersistedContent);