Ensure last password updated date is set when password is changed during member update. Moved password logic to use identity instead of just hashing the password.

This commit is contained in:
Emma Garland
2021-01-29 11:41:58 +00:00
parent 6ff38582d6
commit 2893dcb8b8
4 changed files with 34 additions and 22 deletions

View File

@@ -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<IMemberGroup>().Where(group => group.Name.Equals(roleName));
var memberGroup = _memberGroupRepository.Get(grpQry).FirstOrDefault();
if (memberGroup == null) return Enumerable.Empty<IMember>();
if (memberGroup == null)
return Enumerable.Empty<IMember>();
// get the members by username
var query = Query<IMember>();
@@ -464,7 +465,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
{
var grpQry = Query<IMemberGroup>().Where(group => group.Name.Equals(groupName));
var memberGroup = _memberGroupRepository.Get(grpQry).FirstOrDefault();
if (memberGroup == null) return Enumerable.Empty<IMember>();
if (memberGroup == null)
return Enumerable.Empty<IMember>();
var subQuery = Sql().Select("Member").From<Member2MemberGroupDto>().Where<Member2MemberGroupDto>(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<ContentVersionDto>(x => x.Id)
.From<ContentVersionDto>()
.From<ContentVersionDto>()
.InnerJoin<NodeDto>().On<NodeDto, ContentVersionDto>((l, r) => l.NodeId == r.NodeId)
.InnerJoin<MemberDto>().On<MemberDto, NodeDto>((l, r) => l.NodeId == r.NodeId)
.Where<NodeDto>(x => x.NodeObjectType == SqlTemplate.Arg<Guid>("nodeObjectType"))
@@ -614,7 +616,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
var cached = IsolatedCache.GetCacheItem<IMember>(RepositoryCacheKeys.GetKey<IMember>(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<Member>(dto.ContentDto.NodeId,versionId, 0, memberType);
var temp = new TempContent<Member>(dto.ContentDto.NodeId, versionId, 0, memberType);
var properties = GetPropertyCollections(new List<TempContent<Member>> { temp });
member.Properties = properties[versionId];

View File

@@ -807,11 +807,11 @@ namespace Umbraco.Infrastructure.Services.Implement
/// <inheritdoc />
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<IMember>(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();

View File

@@ -221,15 +221,15 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
}
/// <summary>
/// Create membercontroller to test
/// Create member controller to test
/// </summary>
/// <param name="memberService"></param>
/// <param name="memberTypeService"></param>
/// <param name="memberGroupService"></param>
/// <param name="membersUserManager"></param>
/// <param name="dataTypeService"></param>
/// <param name="backOfficeSecurityAccessor"></param>
/// <returns></returns>
/// <param name="memberService">Member service</param>
/// <param name="memberTypeService">Member type service</param>
/// <param name="memberGroupService">Member group service</param>
/// <param name="membersUserManager">Members user manager</param>
/// <param name="dataTypeService">Data type service</param>
/// <param name="backOfficeSecurityAccessor">Back office security accessor</param>
/// <returns>A member controller for the tests</returns>
private MemberController CreateSut(
IMemberService memberService,
IMemberTypeService memberTypeService,

View File

@@ -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);