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:
@@ -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];
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user