diff --git a/src/Umbraco.Core/Models/Mapping/MemberTabsAndPropertiesMapper.cs b/src/Umbraco.Core/Models/Mapping/MemberTabsAndPropertiesMapper.cs index 92aab36bd4..9ac1b05d0f 100644 --- a/src/Umbraco.Core/Models/Mapping/MemberTabsAndPropertiesMapper.cs +++ b/src/Umbraco.Core/Models/Mapping/MemberTabsAndPropertiesMapper.cs @@ -237,6 +237,7 @@ namespace Umbraco.Cms.Core.Models.Mapping var userRoles = username.IsNullOrWhiteSpace() ? null : _memberService.GetAllRoles(username); // create a dictionary of all roles (except internal roles) + "false" + //TODO: use MembersRoleStore var result = _memberGroupService.GetAll() .Select(x => x.Name) // if a role starts with __umbracoRole we won't show it as it's an internal role used for public access diff --git a/src/Umbraco.Infrastructure/Security/IMemberManager.cs b/src/Umbraco.Infrastructure/Security/IMemberManager.cs index 85b4c0c300..b310e9434f 100644 --- a/src/Umbraco.Infrastructure/Security/IMemberManager.cs +++ b/src/Umbraco.Infrastructure/Security/IMemberManager.cs @@ -3,7 +3,7 @@ namespace Umbraco.Cms.Core.Security /// /// The user manager for members /// - public interface IMemberManager : IUmbracoUserManager + public interface IMemberManager : IUmbracoUserManager { } } diff --git a/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs index 1a76dec2d5..50c4d1e505 100644 --- a/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs @@ -42,10 +42,10 @@ namespace Umbraco.Cms.Core.Security target.EnableChangeTracking(); }); - mapper.Define( + mapper.Define( (source, context) => { - var target = new MembersIdentityUser(source.Id); + var target = new MemberIdentityUser(source.Id); target.DisableChangeTracking(); return target; }, @@ -94,7 +94,7 @@ namespace Umbraco.Cms.Core.Security //target.Roles =; } - private void Map(IMember source, MembersIdentityUser target) + private void Map(IMember source, MemberIdentityUser target) { target.Email = source.Email; target.UserName = source.Username; diff --git a/src/Umbraco.Infrastructure/Security/MembersIdentityBuilder.cs b/src/Umbraco.Infrastructure/Security/MemberIdentityBuilder.cs similarity index 71% rename from src/Umbraco.Infrastructure/Security/MembersIdentityBuilder.cs rename to src/Umbraco.Infrastructure/Security/MemberIdentityBuilder.cs index 726b999b89..4e2e4a39b1 100644 --- a/src/Umbraco.Infrastructure/Security/MembersIdentityBuilder.cs +++ b/src/Umbraco.Infrastructure/Security/MemberIdentityBuilder.cs @@ -5,18 +5,18 @@ using Microsoft.Extensions.DependencyInjection; namespace Umbraco.Cms.Core.Security { - public class MembersIdentityBuilder : IdentityBuilder + public class MemberIdentityBuilder : IdentityBuilder { - public MembersIdentityBuilder(IServiceCollection services) : base(typeof(MembersIdentityUser), services) + public MemberIdentityBuilder(IServiceCollection services) : base(typeof(MemberIdentityUser), services) { } - public MembersIdentityBuilder(Type role, IServiceCollection services) : base(typeof(MembersIdentityUser), role, services) + public MemberIdentityBuilder(Type role, IServiceCollection services) : base(typeof(MemberIdentityUser), role, services) { } /// - /// Adds a token provider for the . + /// Adds a token provider for the . /// /// The name of the provider to add. /// The type of the to add. @@ -27,7 +27,7 @@ namespace Umbraco.Cms.Core.Security { throw new InvalidOperationException($"Invalid Type for TokenProvider: {provider.FullName}"); } - Services.Configure(options => + Services.Configure(options => { options.Tokens.ProviderMap[providerName] = new TokenProviderDescriptor(provider); }); diff --git a/src/Umbraco.Infrastructure/Security/MembersIdentityOptions.cs b/src/Umbraco.Infrastructure/Security/MemberIdentityOptions.cs similarity index 78% rename from src/Umbraco.Infrastructure/Security/MembersIdentityOptions.cs rename to src/Umbraco.Infrastructure/Security/MemberIdentityOptions.cs index 8f993a1f76..4e05797a04 100644 --- a/src/Umbraco.Infrastructure/Security/MembersIdentityOptions.cs +++ b/src/Umbraco.Infrastructure/Security/MemberIdentityOptions.cs @@ -5,7 +5,7 @@ namespace Umbraco.Cms.Core.Security /// /// Identity options specifically for the Umbraco members identity implementation /// - public class MembersIdentityOptions : IdentityOptions + public class MemberIdentityOptions : IdentityOptions { } } diff --git a/src/Umbraco.Infrastructure/Security/MembersIdentityUser.cs b/src/Umbraco.Infrastructure/Security/MemberIdentityUser.cs similarity index 90% rename from src/Umbraco.Infrastructure/Security/MembersIdentityUser.cs rename to src/Umbraco.Infrastructure/Security/MemberIdentityUser.cs index 6e3473c3ce..539234ac65 100644 --- a/src/Umbraco.Infrastructure/Security/MembersIdentityUser.cs +++ b/src/Umbraco.Infrastructure/Security/MemberIdentityUser.cs @@ -11,7 +11,7 @@ namespace Umbraco.Cms.Core.Security /// /// The identity user used for the member /// - public class MembersIdentityUser : UmbracoIdentityUser + public class MemberIdentityUser : UmbracoIdentityUser { private string _name; private string _passwordConfig; @@ -23,29 +23,29 @@ namespace Umbraco.Cms.Core.Security groups => groups.GetHashCode()); /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - public MembersIdentityUser(int userId) + public MemberIdentityUser(int userId) { // use the property setters - they do more than just setting a field Id = UserIdToString(userId); } - public MembersIdentityUser() + public MemberIdentityUser() { } /// /// Used to construct a new instance without an identity /// - public static MembersIdentityUser CreateNew(string username, string email, string memberTypeAlias, string name = null) + public static MemberIdentityUser CreateNew(string username, string email, string memberTypeAlias, string name = null) { if (string.IsNullOrWhiteSpace(username)) { throw new ArgumentException("Value cannot be null or whitespace.", nameof(username)); } - var user = new MembersIdentityUser(); + var user = new MemberIdentityUser(); user.DisableChangeTracking(); user.UserName = username; user.Email = email; diff --git a/src/Umbraco.Infrastructure/Security/MembersRoleStore.cs b/src/Umbraco.Infrastructure/Security/MemberRoleStore.cs similarity index 87% rename from src/Umbraco.Infrastructure/Security/MembersRoleStore.cs rename to src/Umbraco.Infrastructure/Security/MemberRoleStore.cs index 3aafa702cd..399da9aec0 100644 --- a/src/Umbraco.Infrastructure/Security/MembersRoleStore.cs +++ b/src/Umbraco.Infrastructure/Security/MemberRoleStore.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using System.Security.Claims; @@ -7,7 +6,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Services; namespace Umbraco.Cms.Core.Security @@ -15,19 +13,12 @@ namespace Umbraco.Cms.Core.Security /// /// A custom user store that uses Umbraco member data /// - public class MembersRoleStore : RoleStoreBase, string, IdentityUserRole, IdentityRoleClaim> + public class MemberRoleStore : RoleStoreBase, string, IdentityUserRole, IdentityRoleClaim> { - private readonly IMemberService _memberService; private readonly IMemberGroupService _memberGroupService; - private readonly IScopeProvider _scopeProvider; - public MembersRoleStore(IMemberService memberService, IMemberGroupService memberGroupService, IScopeProvider scopeProvider, IdentityErrorDescriber describer) - : base(describer) - { - _memberService = memberService ?? throw new ArgumentNullException(nameof(memberService)); - _memberGroupService = memberGroupService ?? throw new ArgumentNullException(nameof(memberGroupService)); - _scopeProvider = scopeProvider ?? throw new ArgumentNullException(nameof(scopeProvider)); - } + public MemberRoleStore(IMemberGroupService memberGroupService, IdentityErrorDescriber describer) + : base(describer) => _memberGroupService = memberGroupService ?? throw new ArgumentNullException(nameof(memberGroupService)); /// public override IQueryable> Roles @@ -94,7 +85,7 @@ namespace Umbraco.Cms.Core.Security } else { - //TODO: throw exception when not found, or return failure? And is this the correcet message + //TODO: throw exception when not found, or return failure? And is this the correct message return Task.FromResult(IdentityResult.Failed(ErrorDescriber.InvalidRoleName(role.Name))); } @@ -123,7 +114,7 @@ namespace Umbraco.Cms.Core.Security } else { - //TODO: throw exception when not found, or return failure? And is this the correcet message + //TODO: throw exception when not found, or return failure? And is this the correct message return Task.FromResult(IdentityResult.Failed(ErrorDescriber.InvalidRoleName(role.Name))); } @@ -153,6 +144,8 @@ namespace Umbraco.Cms.Core.Security return Task.FromResult(memberGroup == null ? null : MapFromMemberGroup(memberGroup)); } + ///TODO: are we implementing these claims methods? + /// public override Task> GetClaimsAsync(IdentityRole role, CancellationToken cancellationToken = new CancellationToken()) => throw new System.NotImplementedException(); diff --git a/src/Umbraco.Infrastructure/Security/MembersUserStore.cs b/src/Umbraco.Infrastructure/Security/MemberUserStore.cs similarity index 81% rename from src/Umbraco.Infrastructure/Security/MembersUserStore.cs rename to src/Umbraco.Infrastructure/Security/MemberUserStore.cs index 9405992ba8..17a45764ad 100644 --- a/src/Umbraco.Infrastructure/Security/MembersUserStore.cs +++ b/src/Umbraco.Infrastructure/Security/MemberUserStore.cs @@ -19,20 +19,20 @@ namespace Umbraco.Cms.Core.Security /// /// A custom user store that uses Umbraco member data /// - public class MembersUserStore : UserStoreBase, string, IdentityUserClaim, IdentityUserRole, IdentityUserLogin, IdentityUserToken, IdentityRoleClaim> + public class MemberUserStore : UserStoreBase, string, IdentityUserClaim, IdentityUserRole, IdentityUserLogin, IdentityUserToken, IdentityRoleClaim> { private readonly IMemberService _memberService; private readonly UmbracoMapper _mapper; private readonly IScopeProvider _scopeProvider; /// - /// Initializes a new instance of the class for the members identity store + /// Initializes a new instance of the class for the members identity store /// /// The member service /// The mapper for properties /// The scope provider /// The error describer - public MembersUserStore(IMemberService memberService, UmbracoMapper mapper, IScopeProvider scopeProvider, IdentityErrorDescriber describer) + public MemberUserStore(IMemberService memberService, UmbracoMapper mapper, IScopeProvider scopeProvider, IdentityErrorDescriber describer) : base(describer) { _memberService = memberService ?? throw new ArgumentNullException(nameof(memberService)); @@ -45,16 +45,16 @@ namespace Umbraco.Cms.Core.Security /// /// [EditorBrowsable(EditorBrowsableState.Never)] - public override IQueryable Users => throw new NotImplementedException(); + public override IQueryable Users => throw new NotImplementedException(); /// - public override Task GetNormalizedUserNameAsync(MembersIdentityUser user, CancellationToken cancellationToken) => GetUserNameAsync(user, cancellationToken); + public override Task GetNormalizedUserNameAsync(MemberIdentityUser user, CancellationToken cancellationToken) => GetUserNameAsync(user, cancellationToken); /// - public override Task SetNormalizedUserNameAsync(MembersIdentityUser user, string normalizedName, CancellationToken cancellationToken) => SetUserNameAsync(user, normalizedName, cancellationToken); + public override Task SetNormalizedUserNameAsync(MemberIdentityUser user, string normalizedName, CancellationToken cancellationToken) => SetUserNameAsync(user, normalizedName, cancellationToken); /// - public override Task CreateAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) + public override Task CreateAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -100,7 +100,7 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task UpdateAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) + public override Task UpdateAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -121,7 +121,7 @@ namespace Umbraco.Cms.Core.Security if (found != null) { // we have to remember whether Logins property is dirty, since the UpdateMemberProperties will reset it. - var isLoginsPropertyDirty = user.IsPropertyDirty(nameof(MembersIdentityUser.Logins)); + var isLoginsPropertyDirty = user.IsPropertyDirty(nameof(MemberIdentityUser.Logins)); if (UpdateMemberProperties(found, user)) { @@ -148,7 +148,7 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task DeleteAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) + public override Task DeleteAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -170,10 +170,10 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task FindByIdAsync(string userId, CancellationToken cancellationToken = default) => FindUserAsync(userId, cancellationToken); + public override Task FindByIdAsync(string userId, CancellationToken cancellationToken = default) => FindUserAsync(userId, cancellationToken); /// - protected override Task FindUserAsync(string userId, CancellationToken cancellationToken) + protected override Task FindUserAsync(string userId, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -181,30 +181,30 @@ namespace Umbraco.Cms.Core.Security IMember user = _memberService.GetById(UserIdToInt(userId)); if (user == null) { - return Task.FromResult((MembersIdentityUser)null); + return Task.FromResult((MemberIdentityUser)null); } - return Task.FromResult(AssignLoginsCallback(_mapper.Map(user))); + return Task.FromResult(AssignLoginsCallback(_mapper.Map(user))); } /// - public override Task FindByNameAsync(string userName, CancellationToken cancellationToken = default) + public override Task FindByNameAsync(string userName, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); IMember user = _memberService.GetByUsername(userName); if (user == null) { - return Task.FromResult((MembersIdentityUser)null); + return Task.FromResult((MemberIdentityUser)null); } - MembersIdentityUser result = AssignLoginsCallback(_mapper.Map(user)); + MemberIdentityUser result = AssignLoginsCallback(_mapper.Map(user)); return Task.FromResult(result); } /// - public override async Task SetPasswordHashAsync(MembersIdentityUser user, string passwordHash, CancellationToken cancellationToken = default) + public override async Task SetPasswordHashAsync(MemberIdentityUser user, string passwordHash, CancellationToken cancellationToken = default) { await base.SetPasswordHashAsync(user, passwordHash, cancellationToken); @@ -213,7 +213,7 @@ namespace Umbraco.Cms.Core.Security } /// - public override async Task HasPasswordAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) + public override async Task HasPasswordAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) { // This checks if it's null var result = await base.HasPasswordAsync(user, cancellationToken); @@ -227,28 +227,28 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task FindByEmailAsync(string email, CancellationToken cancellationToken = default) + public override Task FindByEmailAsync(string email, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); IMember member = _memberService.GetByEmail(email); - MembersIdentityUser result = member == null + MemberIdentityUser result = member == null ? null - : _mapper.Map(member); + : _mapper.Map(member); return Task.FromResult(AssignLoginsCallback(result)); } /// - public override Task GetNormalizedEmailAsync(MembersIdentityUser user, CancellationToken cancellationToken) + public override Task GetNormalizedEmailAsync(MemberIdentityUser user, CancellationToken cancellationToken) => GetEmailAsync(user, cancellationToken); /// - public override Task SetNormalizedEmailAsync(MembersIdentityUser user, string normalizedEmail, CancellationToken cancellationToken) + public override Task SetNormalizedEmailAsync(MemberIdentityUser user, string normalizedEmail, CancellationToken cancellationToken) => SetEmailAsync(user, normalizedEmail, cancellationToken); /// - public override Task AddLoginAsync(MembersIdentityUser user, UserLoginInfo login, CancellationToken cancellationToken = default) + public override Task AddLoginAsync(MemberIdentityUser user, UserLoginInfo login, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -271,7 +271,7 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task RemoveLoginAsync(MembersIdentityUser user, string loginProvider, string providerKey, CancellationToken cancellationToken = default) + public override Task RemoveLoginAsync(MemberIdentityUser user, string loginProvider, string providerKey, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -290,7 +290,7 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task> GetLoginsAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) + public override Task> GetLoginsAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -308,7 +308,7 @@ namespace Umbraco.Cms.Core.Security cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - MembersIdentityUser user = await FindUserAsync(userId, cancellationToken); + MemberIdentityUser user = await FindUserAsync(userId, cancellationToken); if (user == null) { return null; @@ -356,7 +356,7 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task AddToRoleAsync(MembersIdentityUser user, string role, CancellationToken cancellationToken = default) + public override Task AddToRoleAsync(MemberIdentityUser user, string role, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -387,7 +387,7 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task RemoveFromRoleAsync(MembersIdentityUser user, string role, CancellationToken cancellationToken = default) + public override Task RemoveFromRoleAsync(MemberIdentityUser user, string role, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -420,7 +420,7 @@ namespace Umbraco.Cms.Core.Security /// /// Gets a list of role names the specified user belongs to. /// - public override Task> GetRolesAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) + public override Task> GetRolesAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -443,7 +443,7 @@ namespace Umbraco.Cms.Core.Security /// /// Returns true if a user is in the role /// - public override Task IsInRoleAsync(MembersIdentityUser user, string normalizedRoleName, CancellationToken cancellationToken = default) + public override Task IsInRoleAsync(MemberIdentityUser user, string normalizedRoleName, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -458,7 +458,7 @@ namespace Umbraco.Cms.Core.Security /// /// Lists all users of a given role. /// - public override Task> GetUsersInRoleAsync(string normalizedRoleName, CancellationToken cancellationToken = default) + public override Task> GetUsersInRoleAsync(string normalizedRoleName, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -469,7 +469,7 @@ namespace Umbraco.Cms.Core.Security IEnumerable members = _memberService.GetMembersByMemberType(normalizedRoleName); - IList membersIdentityUsers = members.Select(x => _mapper.Map(x)).ToList(); + IList membersIdentityUsers = members.Select(x => _mapper.Map(x)).ToList(); return Task.FromResult(membersIdentityUsers); } @@ -493,7 +493,7 @@ namespace Umbraco.Cms.Core.Security /// protected override async Task> FindUserRoleAsync(string userId, string roleId, CancellationToken cancellationToken) { - MembersIdentityUser user = await FindUserAsync(userId, cancellationToken); + MemberIdentityUser user = await FindUserAsync(userId, cancellationToken); if (user == null) { return null; @@ -504,7 +504,7 @@ namespace Umbraco.Cms.Core.Security } /// - public override Task GetSecurityStampAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) + public override Task GetSecurityStampAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -519,7 +519,7 @@ namespace Umbraco.Cms.Core.Security : user.SecurityStamp); } - private MembersIdentityUser AssignLoginsCallback(MembersIdentityUser user) + private MemberIdentityUser AssignLoginsCallback(MemberIdentityUser user) { if (user != null) { @@ -530,12 +530,12 @@ namespace Umbraco.Cms.Core.Security return user; } - private bool UpdateMemberProperties(IMember member, MembersIdentityUser identityUserMember) + private bool UpdateMemberProperties(IMember member, MemberIdentityUser identityUserMember) { var anythingChanged = false; // don't assign anything if nothing has changed as this will trigger the track changes of the model - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.LastLoginDateUtc)) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.LastLoginDateUtc)) || (member.LastLoginDate != default && identityUserMember.LastLoginDateUtc.HasValue == false) || (identityUserMember.LastLoginDateUtc.HasValue && member.LastLoginDate.ToUniversalTime() != identityUserMember.LastLoginDateUtc.Value)) { @@ -546,7 +546,7 @@ namespace Umbraco.Cms.Core.Security member.LastLoginDate = dt; } - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.LastPasswordChangeDateUtc)) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.LastPasswordChangeDateUtc)) || (member.LastPasswordChangeDate != default && identityUserMember.LastPasswordChangeDateUtc.HasValue == false) || (identityUserMember.LastPasswordChangeDateUtc.HasValue && member.LastPasswordChangeDate.ToUniversalTime() != identityUserMember.LastPasswordChangeDateUtc.Value)) { @@ -554,7 +554,7 @@ namespace Umbraco.Cms.Core.Security member.LastPasswordChangeDate = identityUserMember.LastPasswordChangeDateUtc.Value.ToLocalTime(); } - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.EmailConfirmed)) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.EmailConfirmed)) || (member.EmailConfirmedDate.HasValue && member.EmailConfirmedDate.Value != default && identityUserMember.EmailConfirmed == false) || ((member.EmailConfirmedDate.HasValue == false || member.EmailConfirmedDate.Value == default) && identityUserMember.EmailConfirmed)) { @@ -562,21 +562,21 @@ namespace Umbraco.Cms.Core.Security member.EmailConfirmedDate = identityUserMember.EmailConfirmed ? (DateTime?)DateTime.Now : null; } - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.Name)) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.Name)) && member.Name != identityUserMember.Name && identityUserMember.Name.IsNullOrWhiteSpace() == false) { anythingChanged = true; member.Name = identityUserMember.Name; } - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.Email)) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.Email)) && member.Email != identityUserMember.Email && identityUserMember.Email.IsNullOrWhiteSpace() == false) { anythingChanged = true; member.Email = identityUserMember.Email; } - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.AccessFailedCount)) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.AccessFailedCount)) && member.FailedPasswordAttempts != identityUserMember.AccessFailedCount) { anythingChanged = true; @@ -595,14 +595,14 @@ namespace Umbraco.Cms.Core.Security } } - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.UserName)) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.UserName)) && member.Username != identityUserMember.UserName && identityUserMember.UserName.IsNullOrWhiteSpace() == false) { anythingChanged = true; member.Username = identityUserMember.UserName; } - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.PasswordHash)) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.PasswordHash)) && member.RawPasswordValue != identityUserMember.PasswordHash && identityUserMember.PasswordHash.IsNullOrWhiteSpace() == false) { anythingChanged = true; @@ -617,7 +617,7 @@ namespace Umbraco.Cms.Core.Security } // TODO: Fix this for Groups too (as per backoffice comment) - if (identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.Roles)) || identityUserMember.IsPropertyDirty(nameof(MembersIdentityUser.Groups))) + if (identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.Roles)) || identityUserMember.IsPropertyDirty(nameof(MemberIdentityUser.Groups))) { } @@ -645,42 +645,42 @@ namespace Umbraco.Cms.Core.Security /// /// [EditorBrowsable(EditorBrowsableState.Never)] - public override Task> GetClaimsAsync(MembersIdentityUser user, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public override Task> GetClaimsAsync(MemberIdentityUser user, CancellationToken cancellationToken = default) => throw new NotImplementedException(); /// /// Not supported in Umbraco /// /// [EditorBrowsable(EditorBrowsableState.Never)] - public override Task AddClaimsAsync(MembersIdentityUser user, IEnumerable claims, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public override Task AddClaimsAsync(MemberIdentityUser user, IEnumerable claims, CancellationToken cancellationToken = default) => throw new NotImplementedException(); /// /// Not supported in Umbraco /// /// [EditorBrowsable(EditorBrowsableState.Never)] - public override Task ReplaceClaimAsync(MembersIdentityUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public override Task ReplaceClaimAsync(MemberIdentityUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default) => throw new NotImplementedException(); /// /// Not supported in Umbraco /// /// [EditorBrowsable(EditorBrowsableState.Never)] - public override Task RemoveClaimsAsync(MembersIdentityUser user, IEnumerable claims, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public override Task RemoveClaimsAsync(MemberIdentityUser user, IEnumerable claims, CancellationToken cancellationToken = default) => throw new NotImplementedException(); /// /// Not supported in Umbraco /// /// [EditorBrowsable(EditorBrowsableState.Never)] - public override Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public override Task> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default) => throw new NotImplementedException(); /// /// Not supported in Umbraco /// /// [EditorBrowsable(EditorBrowsableState.Never)] - protected override Task> FindTokenAsync(MembersIdentityUser user, string loginProvider, string name, CancellationToken cancellationToken) => throw new NotImplementedException(); + protected override Task> FindTokenAsync(MemberIdentityUser user, string loginProvider, string name, CancellationToken cancellationToken) => throw new NotImplementedException(); /// /// Not supported in Umbraco diff --git a/src/Umbraco.Tests.Integration/Umbraco.Web.Common/MembersServiceCollectionExtensionsTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Web.Common/MembersServiceCollectionExtensionsTests.cs index c426e26750..e76716c152 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Web.Common/MembersServiceCollectionExtensionsTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Web.Common/MembersServiceCollectionExtensionsTests.cs @@ -16,10 +16,10 @@ namespace Umbraco.Tests.Integration.Umbraco.Web.Common [Test] public void AddMembersIdentity_ExpectMembersUserStoreResolvable() { - IUserStore userStore = Services.GetService>(); + IUserStore userStore = Services.GetService>(); Assert.IsNotNull(userStore); - Assert.AreEqual(typeof(MembersUserStore), userStore.GetType()); + Assert.AreEqual(typeof(MemberUserStore), userStore.GetType()); } [Test] diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberIdentityUserManagerTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberIdentityUserManagerTests.cs index b88189a08b..a319d33b34 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberIdentityUserManagerTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberIdentityUserManagerTests.cs @@ -19,36 +19,36 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security [TestFixture] public class MemberIdentityUserManagerTests { - private Mock> _mockMemberStore; - private Mock> _mockIdentityOptions; - private Mock> _mockPasswordHasher; - private Mock> _mockUserValidators; - private Mock>> _mockPasswordValidators; + private Mock> _mockMemberStore; + private Mock> _mockIdentityOptions; + private Mock> _mockPasswordHasher; + private Mock> _mockUserValidators; + private Mock>> _mockPasswordValidators; private Mock _mockNormalizer; private IdentityErrorDescriber _mockErrorDescriber; private Mock _mockServiceProviders; - private Mock>> _mockLogger; + private Mock>> _mockLogger; private Mock> _mockPasswordConfiguration; public MemberManager CreateSut() { - _mockMemberStore = new Mock>(); - _mockIdentityOptions = new Mock>(); + _mockMemberStore = new Mock>(); + _mockIdentityOptions = new Mock>(); - var idOptions = new MembersIdentityOptions { Lockout = { AllowedForNewUsers = false } }; + var idOptions = new MemberIdentityOptions { Lockout = { AllowedForNewUsers = false } }; _mockIdentityOptions.Setup(o => o.Value).Returns(idOptions); - _mockPasswordHasher = new Mock>(); + _mockPasswordHasher = new Mock>(); - var userValidators = new List>(); - _mockUserValidators = new Mock>(); - var validator = new Mock>(); + var userValidators = new List>(); + _mockUserValidators = new Mock>(); + var validator = new Mock>(); userValidators.Add(validator.Object); - _mockPasswordValidators = new Mock>>(); + _mockPasswordValidators = new Mock>>(); _mockNormalizer = new Mock(); _mockErrorDescriber = new IdentityErrorDescriber(); _mockServiceProviders = new Mock(); - _mockLogger = new Mock>>(); + _mockLogger = new Mock>>(); _mockPasswordConfiguration = new Mock>(); _mockPasswordConfiguration.Setup(x => x.Value).Returns(() => new MemberPasswordConfigurationSettings() @@ -56,9 +56,9 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security }); - var pwdValidators = new List> + var pwdValidators = new List> { - new PasswordValidator() + new PasswordValidator() }; var userManager = new MemberManager( @@ -71,12 +71,12 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security new BackOfficeIdentityErrorDescriber(), _mockServiceProviders.Object, new Mock().Object, - new Mock>>().Object, + new Mock>>().Object, _mockPasswordConfiguration.Object); validator.Setup(v => v.ValidateAsync( userManager, - It.IsAny())) + It.IsAny())) .Returns(Task.FromResult(IdentityResult.Success)).Verifiable(); return userManager; @@ -87,7 +87,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security { //arrange MemberManager sut = CreateSut(); - MembersIdentityUser fakeUser = new MembersIdentityUser() + MemberIdentityUser fakeUser = new MemberIdentityUser() { PasswordConfig = "testConfig" }; @@ -148,7 +148,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security { //arrange MemberManager sut = CreateSut(); - MembersIdentityUser fakeUser = new MembersIdentityUser() + MemberIdentityUser fakeUser = new MemberIdentityUser() { PasswordConfig = "testConfig" }; diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberIdentityUserStoreTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberIdentityUserStoreTests.cs index 8afe7fe198..8a0bf149b7 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberIdentityUserStoreTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberIdentityUserStoreTests.cs @@ -20,10 +20,10 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security { private Mock _mockMemberService; - public MembersUserStore CreateSut() + public MemberUserStore CreateSut() { _mockMemberService = new Mock(); - return new MembersUserStore( + return new MemberUserStore( _mockMemberService.Object, new UmbracoMapper(new MapDefinitionCollection(new List())), new Mock().Object, @@ -34,7 +34,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public void GivenICreateUser_AndTheUserIsNull_ThenIShouldGetAFailedResultAsync() { // arrange - MembersUserStore sut = CreateSut(); + MemberUserStore sut = CreateSut(); CancellationToken fakeCancellationToken = new CancellationToken(){}; // act @@ -49,8 +49,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenICreateANewUser_AndTheUserIsPopulatedCorrectly_ThenIShouldGetASuccessResultAsync() { // arrange - MembersUserStore sut = CreateSut(); - var fakeUser = new MembersIdentityUser() { }; + MemberUserStore sut = CreateSut(); + var fakeUser = new MemberIdentityUser() { }; var fakeCancellationToken = new CancellationToken() { }; IMemberType fakeMemberType = new MemberType(new MockShortStringHelper(), 77); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberRoleStoreTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberRoleStoreTests.cs index 6c3c741376..f74b6cef94 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberRoleStoreTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberRoleStoreTests.cs @@ -16,18 +16,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security [TestFixture] public class MemberRoleStoreTests { - private Mock _mockMemberService; private Mock _mockMemberGroupService; private IdentityErrorDescriber ErrorDescriber => new IdentityErrorDescriber(); - public MembersRoleStore CreateSut() + public MemberRoleStore CreateSut() { - _mockMemberService = new Mock(); _mockMemberGroupService = new Mock(); - return new MembersRoleStore( - _mockMemberService.Object, + return new MemberRoleStore( _mockMemberGroupService.Object, - new Mock().Object, ErrorDescriber); } @@ -35,7 +31,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public void GivenICreateAMemberRole_AndTheGroupIsNull_ThenIShouldGetAFailedResultAsync() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); CancellationToken fakeCancellationToken = new CancellationToken() { }; // act @@ -50,7 +46,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenICreateAMemberRole_AndTheGroupIsPopulatedCorrectly_ThenIShouldGetASuccessResultAsync() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole() { Id = "777", @@ -78,7 +74,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenIUpdateAMemberRole_AndTheGroupExistsWithTheSameName_ThenIShouldGetASuccessResultAsyncButNoUpdatesMade() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole() { Id = "777", @@ -107,7 +103,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenIUpdateAMemberRole_AndTheGroupExistsWithADifferentSameName_ThenIShouldGetASuccessResultAsyncWithUpdatesMade() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole() { Id = "777", @@ -137,7 +133,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenIUpdateAMemberRole_AndTheGroupDoesntExist_ThenIShouldGetAFailureResultAsync() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole() { Id = "777", @@ -161,7 +157,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenIUpdateAMemberRole_AndTheIdCannotBeParsedToAnInt_ThenIShouldGetAFailureResultAsync() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole() { Id = "7a77", @@ -184,7 +180,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenIDeleteAMemberRole_AndItExists_ThenTheMemberGroupShouldBeDeleted_AndIShouldGetASuccessResultAsync() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole() { Id = "777", @@ -211,7 +207,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenIDeleteAMemberRole_AndTheIdCannotBeParsedToAnInt_ThenTheMemberGroupShouldNotBeDeleted_AndIShouldGetAFailResultAsync() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole() { Id = "7a77", @@ -236,7 +232,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenIDeleteAMemberRole_AndItDoesntExist_ThenTheMemberGroupShouldNotBeDeleted_AndIShouldGetAFailResultAsync() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole() { Id = "777", @@ -261,7 +257,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Security public async Task GivenIGetAllMemberRoles_ThenIShouldGetAllMemberGroups_AndASuccessResultAsync() { // arrange - MembersRoleStore sut = CreateSut(); + MemberRoleStore sut = CreateSut(); var fakeRole = new IdentityRole("fakeGroupName") { Id = "777" 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 5bb4613912..52722f75d1 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs @@ -68,7 +68,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IMemberGroupService memberGroupService, IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, - IPasswordChanger passwordChanger, + IPasswordChanger passwordChanger, IOptions globalSettings, IUser user) { @@ -78,7 +78,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers sut.ModelState.AddModelError("key", "Invalid model state"); Mock.Get(umbracoMembersUserManager) - .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) + .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(umbracoMembersUserManager) .Setup(x => x.ValidatePasswordAsync(It.IsAny())) @@ -107,14 +107,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IBackOfficeSecurity backOfficeSecurity, - IPasswordChanger passwordChanger, + IPasswordChanger passwordChanger, IOptions globalSettings, IUser user) { // arrange Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew); Mock.Get(umbracoMembersUserManager) - .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) + .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(umbracoMembersUserManager) .Setup(x => x.ValidatePasswordAsync(It.IsAny())) @@ -148,14 +148,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IBackOfficeSecurity backOfficeSecurity, - IPasswordChanger passwordChanger, + IPasswordChanger passwordChanger, IOptions globalSettings, IUser user) { // arrange Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew); Mock.Get(umbracoMembersUserManager) - .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) + .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(umbracoMembersUserManager) .Setup(x => x.ValidatePasswordAsync(It.IsAny())) @@ -190,13 +190,13 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IBackOfficeSecurity backOfficeSecurity, - IPasswordChanger passwordChanger, + IPasswordChanger passwordChanger, IOptions globalSettings, IUser user) { // arrange Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.Save); - var membersIdentityUser = new MembersIdentityUser(123); + var membersIdentityUser = new MemberIdentityUser(123); Mock.Get(umbracoMembersUserManager) .Setup(x => x.FindByIdAsync(It.IsAny())) .ReturnsAsync(() => membersIdentityUser); @@ -206,7 +206,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers string password = "fakepassword9aw89rnyco3938cyr^%&*()i8Y"; Mock.Get(umbracoMembersUserManager) - .Setup(x => x.UpdateAsync(It.IsAny())) + .Setup(x => x.UpdateAsync(It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias"); Mock.Get(globalSettings); @@ -242,13 +242,13 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IBackOfficeSecurity backOfficeSecurity, - IPasswordChanger passwordChanger, + IPasswordChanger passwordChanger, IOptions globalSettings, IUser user) { // arrange Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.Save); - var membersIdentityUser = new MembersIdentityUser(123); + var membersIdentityUser = new MemberIdentityUser(123); Mock.Get(umbracoMembersUserManager) .Setup(x => x.FindByIdAsync(It.IsAny())) .ReturnsAsync(() => membersIdentityUser); @@ -257,7 +257,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers .ReturnsAsync(() => IdentityResult.Success); Mock.Get(umbracoMembersUserManager) - .Setup(x => x.UpdateAsync(It.IsAny())) + .Setup(x => x.UpdateAsync(It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias"); Mock.Get(globalSettings); @@ -289,7 +289,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers Mock.Get(backOfficeSecurity).Setup(x => x.CurrentUser).Returns(user); } - private static void SetupPasswordSuccess(IMemberManager umbracoMembersUserManager, IPasswordChanger passwordChanger, bool successful = true) + private static void SetupPasswordSuccess(IMemberManager umbracoMembersUserManager, IPasswordChanger passwordChanger, bool successful = true) { var passwordChanged = new PasswordChangedModel() { @@ -322,14 +322,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IBackOfficeSecurity backOfficeSecurity, - IPasswordChanger passwordChanger, + IPasswordChanger passwordChanger, IOptions globalSettings, IUser user) { // arrange Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew); Mock.Get(umbracoMembersUserManager) - .Setup(x => x.CreateAsync(It.IsAny())) + .Setup(x => x.CreateAsync(It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias"); Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity); @@ -364,7 +364,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IBackOfficeSecurity backOfficeSecurity, - IPasswordChanger passwordChanger, + IPasswordChanger passwordChanger, IOptions globalSettings, IUser user) { @@ -376,7 +376,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers { roleName }; - var membersIdentityUser = new MembersIdentityUser(123); + var membersIdentityUser = new MemberIdentityUser(123); Mock.Get(umbracoMembersUserManager) .Setup(x => x.FindByIdAsync(It.IsAny())) .ReturnsAsync(() => membersIdentityUser); @@ -384,7 +384,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers .Setup(x => x.ValidatePasswordAsync(It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(umbracoMembersUserManager) - .Setup(x => x.UpdateAsync(It.IsAny())) + .Setup(x => x.UpdateAsync(It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias"); Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity); @@ -429,10 +429,10 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IMemberService memberService, IMemberTypeService memberTypeService, IMemberGroupService memberGroupService, - IUmbracoUserManager membersUserManager, + IUmbracoUserManager membersUserManager, IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, - IPasswordChanger passwordChanger, + IPasswordChanger passwordChanger, IOptions globalSettings, IUser user) { diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs index b314cb4fa1..00f2fff56c 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs @@ -2435,6 +2435,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers .Select(_umbracoMapper.Map) .ToArray(); + //TODO: change to role store var allGroups = _memberGroupService.GetAll().ToArray(); var groups = entry.Rules .Where(rule => rule.RuleType == Constants.Conventions.PublicAccess.MemberRoleRuleType) diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs index 3c5adb8ebe..b5f8674f9e 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs @@ -57,7 +57,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor; private readonly IJsonSerializer _jsonSerializer; private readonly IShortStringHelper _shortStringHelper; - private readonly IPasswordChanger _passwordChanger; + private readonly IPasswordChanger _passwordChanger; /// /// Initializes a new instance of the class. @@ -90,7 +90,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers IDataTypeService dataTypeService, IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IJsonSerializer jsonSerializer, - IPasswordChanger passwordChanger) + IPasswordChanger passwordChanger) : base(cultureDictionary, loggerFactory, shortStringHelper, eventMessages, localizedTextService, jsonSerializer) { _propertyEditors = propertyEditors; @@ -355,7 +355,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers throw new InvalidOperationException($"No member type found with alias {contentItem.ContentTypeAlias}"); } - var identityMember = MembersIdentityUser.CreateNew( + var identityMember = MemberIdentityUser.CreateNew( contentItem.Username, contentItem.Email, memberType.Alias, @@ -445,7 +445,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers ModelState.AddModelError("custom", "An admin cannot lock a user"); } - MembersIdentityUser identityMember = await _memberManager.FindByIdAsync(contentItem.Id.ToString()); + MemberIdentityUser identityMember = await _memberManager.FindByIdAsync(contentItem.Id.ToString()); if (identityMember == null) { return new ValidationErrorResult("Identity member was not found"); @@ -586,7 +586,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers /// /// The member content item /// The member as an identity user - private async Task AddOrUpdateRoles(MemberSave contentItem, MembersIdentityUser identityMember) + private async Task AddOrUpdateRoles(MemberSave contentItem, MemberIdentityUser identityMember) { // We're gonna look up the current roles now because the below code can cause // events to be raised and developers could be manually adding roles to members in diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberGroupController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberGroupController.cs index 7146cd5820..3ea1d615b8 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberGroupController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberGroupController.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Mapping; @@ -26,17 +28,19 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers private readonly IMemberGroupService _memberGroupService; private readonly UmbracoMapper _umbracoMapper; private readonly ILocalizedTextService _localizedTextService; - + private readonly RoleManager> _roleManager; + public MemberGroupController( IMemberGroupService memberGroupService, UmbracoMapper umbracoMapper, - ILocalizedTextService localizedTextService + ILocalizedTextService localizedTextService, + RoleManager> roleManager ) { _memberGroupService = memberGroupService ?? throw new ArgumentNullException(nameof(memberGroupService)); + _roleManager = roleManager ?? throw new ArgumentNullException(nameof(roleManager)); _umbracoMapper = umbracoMapper ?? throw new ArgumentNullException(nameof(umbracoMapper)); - _localizedTextService = - localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService)); + _localizedTextService = localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService)); } /// @@ -46,13 +50,13 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers /// public ActionResult GetById(int id) { - var memberGroup = _memberGroupService.GetById(id); + IdentityRole memberGroup = _roleManager.FindByIdAsync(id.ToString()).Result; if (memberGroup == null) { return NotFound(); } - var dto = _umbracoMapper.Map(memberGroup); + MemberGroupDisplay dto = _umbracoMapper.Map, MemberGroupDisplay>(memberGroup); return dto; } @@ -64,7 +68,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers /// public ActionResult GetById(Guid id) { - var memberGroup = _memberGroupService.GetById(id); + IMemberGroup memberGroup = _memberGroupService.GetById(id); if (memberGroup == null) { return NotFound(); @@ -82,9 +86,11 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers { var guidUdi = id as GuidUdi; if (guidUdi == null) + { return NotFound(); + } - var memberGroup = _memberGroupService.GetById(guidUdi.Guid); + IMemberGroup memberGroup = _memberGroupService.GetById(guidUdi.Guid); if (memberGroup == null) { return NotFound(); @@ -95,15 +101,22 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers public IEnumerable GetByIds([FromQuery]int[] ids) { - return _memberGroupService.GetByIds(ids) - .Select(_umbracoMapper.Map); + var roles = new List>(); + + foreach (int id in ids) + { + Task> role = _roleManager.FindByIdAsync(id.ToString()); + roles.Add(role.Result); + } + + return roles.Select(x=> _umbracoMapper.Map, MemberGroupDisplay>(x)); } [HttpDelete] [HttpPost] public IActionResult DeleteById(int id) { - var memberGroup = _memberGroupService.GetById(id); + IMemberGroup memberGroup = _memberGroupService.GetById(id); if (memberGroup == null) { return NotFound(); @@ -113,11 +126,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return Ok(); } - public IEnumerable GetAllGroups() - { - return _memberGroupService.GetAll() - .Select(_umbracoMapper.Map); - } + public IEnumerable GetAllGroups() => _roleManager.Roles.Select(x => _umbracoMapper.Map, MemberGroupDisplay>(x)); public MemberGroupDisplay GetEmpty() { diff --git a/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs index 53ea801490..6be3008a32 100644 --- a/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilderExtensions.cs @@ -86,7 +86,7 @@ namespace Umbraco.Extensions builder.Services.AddUnique(); builder.Services.AddUnique(); builder.Services.AddUnique, PasswordChanger>(); - builder.Services.AddUnique, PasswordChanger>(); + builder.Services.AddUnique, PasswordChanger>(); return builder; } diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs index 7445f35f29..5888068656 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs @@ -32,6 +32,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees _memberGroupService = memberGroupService; } + //TODO: change to role store protected override IEnumerable GetTreeNodesFromService(string id, FormCollection queryStrings) { return _memberGroupService.GetAll() @@ -49,6 +50,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees var root = rootResult.Value; //check if there are any groups + //TODO: change to role store root.HasChildren = _memberGroupService.GetAll().Any(); return root; } diff --git a/src/Umbraco.Web.Common/DependencyInjection/ServiceCollectionExtensions.cs b/src/Umbraco.Web.Common/DependencyInjection/ServiceCollectionExtensions.cs index 8b81fc673c..39a6b2906d 100644 --- a/src/Umbraco.Web.Common/DependencyInjection/ServiceCollectionExtensions.cs +++ b/src/Umbraco.Web.Common/DependencyInjection/ServiceCollectionExtensions.cs @@ -65,17 +65,17 @@ namespace Umbraco.Extensions public static void AddMembersIdentity(this IServiceCollection services) => services.BuildMembersIdentity() .AddDefaultTokenProviders() - .AddUserStore() + .AddUserStore() .AddMembersManager(); - private static MembersIdentityBuilder BuildMembersIdentity(this IServiceCollection services) + private static MemberIdentityBuilder BuildMembersIdentity(this IServiceCollection services) { // Services used by Umbraco members identity - services.TryAddScoped, UserValidator>(); - services.TryAddScoped, PasswordValidator>(); - services.TryAddScoped, PasswordHasher>(); - return new MembersIdentityBuilder(services); + services.TryAddScoped, UserValidator>(); + services.TryAddScoped, PasswordValidator>(); + services.TryAddScoped, PasswordHasher>(); + return new MemberIdentityBuilder(services); } private static void RemoveIntParamenterIfValueGreatherThen(IDictionary commands, string parameter, int maxValue) diff --git a/src/Umbraco.Web.Common/Extensions/IdentityBuilderExtensions.cs b/src/Umbraco.Web.Common/Extensions/IdentityBuilderExtensions.cs index 4daf5457bf..b1c2944565 100644 --- a/src/Umbraco.Web.Common/Extensions/IdentityBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/IdentityBuilderExtensions.cs @@ -10,13 +10,13 @@ namespace Umbraco.Extensions public static class IdentityBuilderExtensions { /// - /// Adds a for the . + /// Adds a for the . /// /// The usermanager interface /// The usermanager type /// The current instance. public static IdentityBuilder AddMembersManager(this IdentityBuilder identityBuilder) - where TUserManager : UserManager, TInterface + where TUserManager : UserManager, TInterface { identityBuilder.Services.AddScoped(typeof(TInterface), typeof(TUserManager)); return identityBuilder; diff --git a/src/Umbraco.Web.Common/Security/MemberManager.cs b/src/Umbraco.Web.Common/Security/MemberManager.cs index c36ae0c0fc..ae91852f46 100644 --- a/src/Umbraco.Web.Common/Security/MemberManager.cs +++ b/src/Umbraco.Web.Common/Security/MemberManager.cs @@ -16,21 +16,21 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Web.Common.Security { - public class MemberManager : UmbracoUserManager, IMemberManager + public class MemberManager : UmbracoUserManager, IMemberManager { private readonly IHttpContextAccessor _httpContextAccessor; public MemberManager( IIpResolver ipResolver, - IUserStore store, - IOptions optionsAccessor, - IPasswordHasher passwordHasher, - IEnumerable> userValidators, - IEnumerable> passwordValidators, + IUserStore store, + IOptions optionsAccessor, + IPasswordHasher passwordHasher, + IEnumerable> userValidators, + IEnumerable> passwordValidators, BackOfficeIdentityErrorDescriber errors, IServiceProvider services, IHttpContextAccessor httpContextAccessor, - ILogger> logger, + ILogger> logger, IOptions passwordConfiguration) : base(ipResolver, store, optionsAccessor, passwordHasher, userValidators, passwordValidators, errors, services, logger, passwordConfiguration) { diff --git a/src/Umbraco.Web/Security/Providers/MembersRoleProvider.cs b/src/Umbraco.Web/Security/Providers/MembersRoleProvider.cs deleted file mode 100644 index f28aa75e48..0000000000 --- a/src/Umbraco.Web/Security/Providers/MembersRoleProvider.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Configuration.Provider; -using System.Linq; -using System.Web.Security; -using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Core.Persistence.Querying; -using Umbraco.Cms.Core.Services; -using Umbraco.Web.Composing; - -namespace Umbraco.Web.Security.Providers -{ - //TODO: Delete: should not be used - [Obsolete("We are now using ASP.NET Core Identity instead of membership providers")] - public class MembersRoleProvider : RoleProvider - { - private readonly IMembershipRoleService _roleService; - private string _applicationName; - - public MembersRoleProvider(IMembershipRoleService roleService) - { - _roleService = roleService; - } - - public MembersRoleProvider() - : this(Current.Services.MemberService) - { - } - - public override bool IsUserInRole(string username, string roleName) - { - return GetRolesForUser(username).Any(x => x == roleName); - } - - public override string[] GetRolesForUser(string username) - { - return _roleService.GetAllRoles(username).ToArray(); - } - - public override void CreateRole(string roleName) - { - _roleService.AddRole(roleName); - } - - public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) - { - return _roleService.DeleteRole(roleName, throwOnPopulatedRole); - } - - /// - /// Returns true if the specified member role name exists - /// - /// Member role name - /// True if member role exists, otherwise false - public override bool RoleExists(string roleName) => _roleService.GetAllRoles().Any(x => x.Name == roleName); - - public override void AddUsersToRoles(string[] usernames, string[] roleNames) - { - _roleService.AssignRoles(usernames, roleNames); - } - - public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) - { - _roleService.DissociateRoles(usernames, roleNames); - } - - public override string[] GetUsersInRole(string roleName) - { - return _roleService.GetMembersInRole(roleName).Select(x => x.Username).ToArray(); - } - - /// - /// Gets all the member roles - /// - /// A list of member roles - public override string[] GetAllRoles() => _roleService.GetAllRoles().Select(x => x.Name).ToArray(); - - public override string[] FindUsersInRole(string roleName, string usernameToMatch) - { - return _roleService.FindMembersInRole(roleName, usernameToMatch, StringPropertyMatchType.Wildcard).Select(x => x.Username).ToArray(); - } - - /// - /// The name of the application using the custom role provider. - /// - /// - /// The name of the application using the custom membership provider. - public override string ApplicationName - { - get - { - return _applicationName; - } - - set - { - if (string.IsNullOrEmpty(value)) - throw new ProviderException("ApplicationName cannot be empty."); - - if (value.Length > 0x100) - throw new ProviderException("Provider application name too long."); - - _applicationName = value; - } - } - } -} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 93cb8da83d..fbe21702f9 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -176,7 +176,6 @@ - @@ -229,4 +228,4 @@ - + \ No newline at end of file