diff --git a/src/Umbraco.Cms.Api.Management/DependencyInjection/MemberBuilderExtensions.cs b/src/Umbraco.Cms.Api.Management/DependencyInjection/MemberBuilderExtensions.cs index 90ea476c189e..b5a5bb842cb6 100644 --- a/src/Umbraco.Cms.Api.Management/DependencyInjection/MemberBuilderExtensions.cs +++ b/src/Umbraco.Cms.Api.Management/DependencyInjection/MemberBuilderExtensions.cs @@ -10,7 +10,7 @@ internal static class MemberBuilderExtensions { internal static IUmbracoBuilder AddMember(this IUmbracoBuilder builder) { - builder.Services.AddTransient(); + builder.Services.AddSingleton(); builder.Services.AddTransient(); builder.WithCollectionBuilder().Add(); diff --git a/src/Umbraco.Cms.Api.Management/Factories/MemberPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/MemberPresentationFactory.cs index 7e53676c5f36..aaa4240caa2d 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/MemberPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/MemberPresentationFactory.cs @@ -1,7 +1,9 @@ -using Umbraco.Cms.Api.Management.ViewModels.Content; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Api.Management.ViewModels.Member; using Umbraco.Cms.Api.Management.ViewModels.Member.Item; using Umbraco.Cms.Api.Management.ViewModels.MemberType; +using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Extensions; using Umbraco.Cms.Core.Mapping; using Umbraco.Cms.Core.Models; @@ -19,19 +21,23 @@ internal sealed class MemberPresentationFactory : IMemberPresentationFactory private readonly IMemberTypeService _memberTypeService; private readonly ITwoFactorLoginService _twoFactorLoginService; private readonly IMemberGroupService _memberGroupService; + private readonly DeliveryApiSettings _deliveryApiSettings; + private IEnumerable? _clientCredentialsMemberKeys; public MemberPresentationFactory( IUmbracoMapper umbracoMapper, IMemberService memberService, IMemberTypeService memberTypeService, ITwoFactorLoginService twoFactorLoginService, - IMemberGroupService memberGroupService) + IMemberGroupService memberGroupService, + IOptions deliveryApiSettings) { _umbracoMapper = umbracoMapper; _memberService = memberService; _memberTypeService = memberTypeService; _twoFactorLoginService = twoFactorLoginService; _memberGroupService = memberGroupService; + _deliveryApiSettings = deliveryApiSettings.Value; } public async Task CreateResponseModelAsync(IMember member, IUser currentUser) @@ -39,6 +45,7 @@ public async Task CreateResponseModelAsync(IMember member, MemberResponseModel responseModel = _umbracoMapper.Map(member)!; responseModel.IsTwoFactorEnabled = await _twoFactorLoginService.IsTwoFactorEnabledAsync(member.Key); + responseModel.Kind = GetMemberKind(member.Key); IEnumerable roles = _memberService.GetAllRoles(member.Username); // Get the member groups per role, so we can return the group keys @@ -71,7 +78,8 @@ private MemberItemResponseModel CreateItemResponseModel(T entity) { Id = entity.Key, MemberType = _umbracoMapper.Map(entity)!, - Variants = CreateVariantsItemResponseModels(entity) + Variants = CreateVariantsItemResponseModels(entity), + Kind = GetMemberKind(entity.Key) }; private static IEnumerable CreateVariantsItemResponseModels(ITreeEntity entity) @@ -108,4 +116,24 @@ private async Task RemoveSensitiveDataAsync(IMember member, return responseModel; } + + private MemberKind GetMemberKind(Guid key) + { + if (_clientCredentialsMemberKeys is null) + { + IEnumerable clientCredentialsMemberUserNames = _deliveryApiSettings + .MemberAuthorization? + .ClientCredentialsFlow? + .AssociatedMembers + .Select(m => m.UserName).ToArray() + ?? []; + + _clientCredentialsMemberKeys = clientCredentialsMemberUserNames + .Select(_memberService.GetByUsername) + .WhereNotNull() + .Select(m => m.Key).ToArray(); + } + + return _clientCredentialsMemberKeys.Contains(key) ? MemberKind.Api : MemberKind.Default; + } } diff --git a/src/Umbraco.Cms.Api.Management/Factories/UserPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/UserPresentationFactory.cs index ccb12a579a03..7ba122941639 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/UserPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/UserPresentationFactory.cs @@ -80,7 +80,7 @@ public UserResponseModel CreateResponseModel(IUser user) LastLockoutDate = user.LastLockoutDate, LastPasswordChangeDate = user.LastPasswordChangeDate, IsAdmin = user.IsAdmin(), - Type = user.Type + Kind = user.Kind }; return responseModel; @@ -93,7 +93,7 @@ public UserItemResponseModel CreateItemResponseModel(IUser user) => Name = user.Name ?? user.Username, AvatarUrls = user.GetUserAvatarUrls(_appCaches.RuntimeCache, _mediaFileManager, _imageUrlGenerator) .Select(url => _absoluteUrlBuilder.ToAbsoluteUrl(url).ToString()), - Type = user.Type + Kind = user.Kind }; public async Task CreateCreationModelAsync(CreateUserRequestModel requestModel) @@ -105,7 +105,7 @@ public async Task CreateCreationModelAsync(CreateUserRequestMod Name = requestModel.Name, UserName = requestModel.UserName, UserGroupKeys = requestModel.UserGroupIds.Select(x => x.Id).ToHashSet(), - Type = requestModel.Type + Kind = requestModel.Kind }; return await Task.FromResult(createModel); diff --git a/src/Umbraco.Cms.Api.Management/Mapping/Member/MemberMapDefinition.cs b/src/Umbraco.Cms.Api.Management/Mapping/Member/MemberMapDefinition.cs index 2310da80fa3a..a6e16c8c7b96 100644 --- a/src/Umbraco.Cms.Api.Management/Mapping/Member/MemberMapDefinition.cs +++ b/src/Umbraco.Cms.Api.Management/Mapping/Member/MemberMapDefinition.cs @@ -17,7 +17,7 @@ public MemberMapDefinition(PropertyEditorCollection propertyEditorCollection) public void DefineMaps(IUmbracoMapper mapper) => mapper.Define((_, _) => new MemberResponseModel(), Map); - // Umbraco.Code.MapAll -IsTwoFactorEnabled -Groups + // Umbraco.Code.MapAll -IsTwoFactorEnabled -Groups -Kind private void Map(IMember source, MemberResponseModel target, MapperContext context) { target.Id = source.Key; diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index 9f56d0c8aa70..1bcf48be971d 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -35493,8 +35493,8 @@ "CreateUserRequestModel": { "required": [ "email", + "kind", "name", - "type", "userGroupIds", "userName" ], @@ -35525,8 +35525,8 @@ "format": "uuid", "nullable": true }, - "type": { - "$ref": "#/components/schemas/UserTypeModel" + "kind": { + "$ref": "#/components/schemas/UserKindModel" } }, "additionalProperties": false @@ -38244,7 +38244,6 @@ "required": [ "email", "name", - "type", "userGroupIds", "userName" ], @@ -38275,9 +38274,6 @@ "format": "uuid", "nullable": true }, - "type": { - "$ref": "#/components/schemas/UserTypeModel" - }, "message": { "type": "string", "nullable": true @@ -39415,6 +39411,7 @@ "MemberItemResponseModel": { "required": [ "id", + "kind", "memberType", "variants" ], @@ -39440,10 +39437,20 @@ } ] } + }, + "kind": { + "$ref": "#/components/schemas/MemberKindModel" } }, "additionalProperties": false }, + "MemberKindModel": { + "enum": [ + "Default", + "Api" + ], + "type": "string" + }, "MemberResponseModel": { "required": [ "email", @@ -39453,6 +39460,7 @@ "isApproved", "isLockedOut", "isTwoFactorEnabled", + "kind", "memberType", "username", "values", @@ -39531,6 +39539,9 @@ "type": "string", "format": "uuid" } + }, + "kind": { + "$ref": "#/components/schemas/MemberKindModel" } }, "additionalProperties": false @@ -45082,8 +45093,8 @@ "required": [ "avatarUrls", "id", - "name", - "type" + "kind", + "name" ], "type": "object", "properties": { @@ -45100,12 +45111,19 @@ "type": "string" } }, - "type": { - "$ref": "#/components/schemas/UserTypeModel" + "kind": { + "$ref": "#/components/schemas/UserKindModel" } }, "additionalProperties": false }, + "UserKindModel": { + "enum": [ + "Default", + "Api" + ], + "type": "string" + }, "UserOrderModel": { "enum": [ "UserName", @@ -45172,10 +45190,10 @@ "hasMediaRootAccess", "id", "isAdmin", + "kind", "mediaStartNodeIds", "name", "state", - "type", "updateDate", "userGroupIds", "userName" @@ -45277,8 +45295,8 @@ "isAdmin": { "type": "boolean" }, - "type": { - "$ref": "#/components/schemas/UserTypeModel" + "kind": { + "$ref": "#/components/schemas/UserKindModel" } }, "additionalProperties": false @@ -45339,13 +45357,6 @@ }, "additionalProperties": false }, - "UserTypeModel": { - "enum": [ - "Default", - "Api" - ], - "type": "string" - }, "VariantItemResponseModel": { "required": [ "name" @@ -45566,4 +45577,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Member/Item/MemberItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Member/Item/MemberItemResponseModel.cs index f959a37a9049..e55ad0457229 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Member/Item/MemberItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Member/Item/MemberItemResponseModel.cs @@ -1,6 +1,7 @@ using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Api.Management.ViewModels.Item; using Umbraco.Cms.Api.Management.ViewModels.MemberType; +using Umbraco.Cms.Core.Models.Membership; namespace Umbraco.Cms.Api.Management.ViewModels.Member.Item; @@ -9,4 +10,6 @@ public class MemberItemResponseModel : ItemResponseModelBase public MemberTypeReferenceResponseModel MemberType { get; set; } = new(); public IEnumerable Variants { get; set; } = Enumerable.Empty(); + + public MemberKind Kind { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Member/MemberResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Member/MemberResponseModel.cs index 0125d85523ec..df5f9c9a2217 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Member/MemberResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Member/MemberResponseModel.cs @@ -1,5 +1,6 @@ using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Api.Management.ViewModels.MemberType; +using Umbraco.Cms.Core.Models.Membership; namespace Umbraco.Cms.Api.Management.ViewModels.Member; @@ -26,4 +27,6 @@ public class MemberResponseModel : ContentResponseModelBase Groups { get; set; } = []; + + public MemberKind Kind { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/CreateUserRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/CreateUserRequestModel.cs index dff46bf2fc8a..3ce44784b908 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/User/CreateUserRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/CreateUserRequestModel.cs @@ -2,9 +2,7 @@ namespace Umbraco.Cms.Api.Management.ViewModels.User; -public class CreateUserRequestModel : UserPresentationBase +public class CreateUserRequestModel : CreateUserRequestModelBase { - public Guid? Id { get; set; } - - public UserType Type { get; set; } + public UserKind Kind { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/CreateUserRequestModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/CreateUserRequestModelBase.cs new file mode 100644 index 000000000000..35ccf445acde --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/CreateUserRequestModelBase.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Cms.Api.Management.ViewModels.User; + +public class CreateUserRequestModelBase : UserPresentationBase +{ + public Guid? Id { get; set; } +} diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/InviteUserRequestModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/InviteUserRequestModel.cs index 9f73d12deaca..e41c4d54879f 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/User/InviteUserRequestModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/InviteUserRequestModel.cs @@ -1,6 +1,6 @@ namespace Umbraco.Cms.Api.Management.ViewModels.User; -public class InviteUserRequestModel : CreateUserRequestModel +public class InviteUserRequestModel : CreateUserRequestModelBase { public string? Message { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/Item/UserItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/Item/UserItemResponseModel.cs index b65b3302dff5..4dd8139ba174 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/User/Item/UserItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/Item/UserItemResponseModel.cs @@ -7,5 +7,5 @@ public class UserItemResponseModel : NamedItemResponseModelBase { public IEnumerable AvatarUrls { get; set; } = Enumerable.Empty(); - public UserType Type { get; set; } + public UserKind Kind { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/User/UserResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/User/UserResponseModel.cs index 52c37da7a348..8177b02d1e5f 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/User/UserResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/User/UserResponseModel.cs @@ -34,5 +34,5 @@ public class UserResponseModel : UserPresentationBase public bool IsAdmin { get; set; } - public UserType Type { get; set; } + public UserKind Kind { get; set; } } diff --git a/src/Umbraco.Core/Models/Membership/IUser.cs b/src/Umbraco.Core/Models/Membership/IUser.cs index 3d499f835f3d..868daee42609 100644 --- a/src/Umbraco.Core/Models/Membership/IUser.cs +++ b/src/Umbraco.Core/Models/Membership/IUser.cs @@ -42,7 +42,7 @@ public interface IUser : IMembershipUser, IRememberBeingDirty /// /// The type of user. /// - UserType Type { get; set; } + UserKind Kind { get; set; } void RemoveGroup(string group); diff --git a/src/Umbraco.Core/Models/Membership/MemberKind.cs b/src/Umbraco.Core/Models/Membership/MemberKind.cs new file mode 100644 index 000000000000..640abcbac12d --- /dev/null +++ b/src/Umbraco.Core/Models/Membership/MemberKind.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Cms.Core.Models.Membership; + +public enum MemberKind +{ + Default = 0, + Api +} diff --git a/src/Umbraco.Core/Models/Membership/User.cs b/src/Umbraco.Core/Models/Membership/User.cs index 52f91afb8afb..b51d207aa396 100644 --- a/src/Umbraco.Core/Models/Membership/User.cs +++ b/src/Umbraco.Core/Models/Membership/User.cs @@ -41,7 +41,7 @@ public class User : EntityBase, IUser, IProfile private HashSet _userGroups; private string _username; - private UserType _type; + private UserKind _kind; /// /// Constructor for creating a new/empty user @@ -359,10 +359,10 @@ public string? Language } [DataMember] - public UserType Type + public UserKind Kind { - get => _type; - set => SetPropertyValueAndDetectChanges(value, ref _type, nameof(Type)); + get => _kind; + set => SetPropertyValueAndDetectChanges(value, ref _kind, nameof(Kind)); } /// diff --git a/src/Umbraco.Core/Models/Membership/UserType.cs b/src/Umbraco.Core/Models/Membership/UserKind.cs similarity index 79% rename from src/Umbraco.Core/Models/Membership/UserType.cs rename to src/Umbraco.Core/Models/Membership/UserKind.cs index beccd157fdb3..46cc0edb21fb 100644 --- a/src/Umbraco.Core/Models/Membership/UserType.cs +++ b/src/Umbraco.Core/Models/Membership/UserKind.cs @@ -1,6 +1,6 @@ namespace Umbraco.Cms.Core.Models.Membership; -public enum UserType +public enum UserKind { Default = 0, Api diff --git a/src/Umbraco.Core/Models/UserCreateModel.cs b/src/Umbraco.Core/Models/UserCreateModel.cs index 556fad5b1580..f21561657fcb 100644 --- a/src/Umbraco.Core/Models/UserCreateModel.cs +++ b/src/Umbraco.Core/Models/UserCreateModel.cs @@ -12,7 +12,7 @@ public class UserCreateModel public string Name { get; set; } = string.Empty; - public UserType Type { get; set; } + public UserKind Kind { get; set; } public ISet UserGroupKeys { get; set; } = new HashSet(); } diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index 6397e96dd0de..008e945738a8 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -1189,7 +1189,7 @@ public async Task> ChangePass return Attempt.FailWithStatus(UserOperationStatus.UserNotFound, new PasswordChangedModel()); } - if (user.Type != UserType.Default) + if (user.Kind != UserKind.Default) { return Attempt.FailWithStatus(UserOperationStatus.InvalidUserType, new PasswordChangedModel()); } @@ -2494,7 +2494,7 @@ public async Task AddClientIdAsync(Guid us } IUser? user = await GetAsync(userKey); - if (user is null || user.Type != UserType.Api) + if (user is null || user.Kind != UserKind.Api) { return UserClientCredentialsOperationStatus.InvalidUser; } @@ -2517,7 +2517,7 @@ public async Task RemoveClientIdAsync(Guid userKey, string clientId) using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true); IUser? user = _userRepository.GetByClientId(clientId); - return Task.FromResult(user?.Type == UserType.Api ? user : null); + return Task.FromResult(user?.Kind == UserKind.Api ? user : null); } public async Task> GetClientIdsAsync(Guid userKey) diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs index 54a73f7839ef..7cd6663f63b2 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs @@ -94,6 +94,6 @@ protected virtual void DefinePlan() // To 15.0.0 To("{7F4F31D8-DD71-4F0D-93FC-2690A924D84B}"); - To("{1A8835EF-F8AB-4472-B4D8-D75B7C164022}"); + To("{1A8835EF-F8AB-4472-B4D8-D75B7C164022}"); } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_15_0_0/AddTypeToUser.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_15_0_0/AddKindToUser.cs similarity index 97% rename from src/Umbraco.Infrastructure/Migrations/Upgrade/V_15_0_0/AddTypeToUser.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_15_0_0/AddKindToUser.cs index 4882813ce7d2..b807c4cc9aed 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_15_0_0/AddTypeToUser.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_15_0_0/AddKindToUser.cs @@ -8,12 +8,12 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_15_0_0; [Obsolete("Remove in Umbraco 18.")] -public class AddTypeToUser : UnscopedMigrationBase +public class AddKindToUser : UnscopedMigrationBase { - private const string NewColumnName = "type"; + private const string NewColumnName = "kind"; private readonly IScopeProvider _scopeProvider; - public AddTypeToUser(IMigrationContext context, IScopeProvider scopeProvider) + public AddKindToUser(IMigrationContext context, IScopeProvider scopeProvider) : base(context) => _scopeProvider = scopeProvider; @@ -90,7 +90,7 @@ private void MigrateSqlite() CreateDate = x.CreateDate, UpdateDate = x.UpdateDate, Avatar = x.Avatar, - Type = 0 + Kind = 0 }); Delete.Table(Constants.DatabaseSchema.Tables.User).Do(); diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs index ea892d8d47f6..fa8011be2941 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/UserDto.cs @@ -103,10 +103,10 @@ public UserDto() [Constraint(Default = SystemMethods.CurrentDateTime)] public DateTime UpdateDate { get; set; } = DateTime.Now; - [Column("type")] + [Column("kind")] [NullSetting(NullSetting = NullSettings.NotNull)] [Constraint(Default = 0)] - public short Type { get; set; } + public short Kind { get; set; } /// /// Will hold the media file system relative path of the users custom avatar if they uploaded one diff --git a/src/Umbraco.Infrastructure/Persistence/Factories/UserFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/UserFactory.cs index 662b2f2e3fe5..9a8ae113864a 100644 --- a/src/Umbraco.Infrastructure/Persistence/Factories/UserFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/Factories/UserFactory.cs @@ -47,7 +47,7 @@ public static IUser BuildEntity( user.Avatar = dto.Avatar; user.EmailConfirmedDate = dto.EmailConfirmedDate; user.InvitedDate = dto.InvitedDate; - user.Type = (UserType)dto.Type; + user.Kind = (UserKind)dto.Kind; // reset dirty initial properties (U4-1946) user.ResetDirtyProperties(false); @@ -83,7 +83,7 @@ public static UserDto BuildDto(IUser entity) Avatar = entity.Avatar, EmailConfirmedDate = entity.EmailConfirmedDate, InvitedDate = entity.InvitedDate, - Type = (short)entity.Type + Kind = (short)entity.Kind }; if (entity.StartContentIds is not null) diff --git a/src/Umbraco.Infrastructure/Security/BackOfficeIdentityUser.cs b/src/Umbraco.Infrastructure/Security/BackOfficeIdentityUser.cs index 061195e18787..7fdbb043da63 100644 --- a/src/Umbraco.Infrastructure/Security/BackOfficeIdentityUser.cs +++ b/src/Umbraco.Infrastructure/Security/BackOfficeIdentityUser.cs @@ -21,7 +21,7 @@ public class BackOfficeIdentityUser : UmbracoIdentityUser private DateTime? _inviteDateUtc; private int[] _startContentIds; private int[] _startMediaIds; - private UserType _type; + private UserKind _kind; /// /// Initializes a new instance of the class. @@ -116,10 +116,10 @@ public Guid Key } } - public UserType Type + public UserKind Kind { - get => _type; - set => BeingDirty.SetPropertyValueAndDetectChanges(value, ref _type, nameof(Type)); + get => _kind; + set => BeingDirty.SetPropertyValueAndDetectChanges(value, ref _kind, nameof(Kind)); } /// @@ -130,7 +130,7 @@ public UserType Type /// This is allowed to be null (but would need to be filled in if trying to persist this instance) /// /// - public static BackOfficeIdentityUser CreateNew(GlobalSettings globalSettings, string? username, string email, string culture, string? name = null, Guid? id = null, UserType type = UserType.Default) + public static BackOfficeIdentityUser CreateNew(GlobalSettings globalSettings, string? username, string email, string culture, string? name = null, Guid? id = null, UserKind kind = UserKind.Default) { if (string.IsNullOrWhiteSpace(username)) { @@ -156,7 +156,7 @@ public static BackOfficeIdentityUser CreateNew(GlobalSettings globalSettings, st user.HasIdentity = false; user._culture = culture; user.Name = name; - user.Type = type; + user.Kind = kind; user.EnableChangeTracking(); return user; } diff --git a/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs b/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs index b68b3f218978..03d1c35c56ea 100644 --- a/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs @@ -141,7 +141,7 @@ public override Task CreateAsync( StartMediaIds = user.StartMediaIds ?? new int[] { }, IsLockedOut = user.IsLockedOut, Key = user.Key, - Type = user.Type + Kind = user.Kind }; diff --git a/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs index 6731ae1fcee3..5032a2a87182 100644 --- a/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs @@ -96,7 +96,7 @@ private void Map(IUser source, BackOfficeIdentityUser target) target.SecurityStamp = source.SecurityStamp; DateTime? lockedOutUntil = source.LastLockoutDate?.AddMinutes(_securitySettings.UserDefaultLockoutTimeInMinutes); target.LockoutEnd = source.IsLockedOut ? (lockedOutUntil ?? DateTime.MaxValue).ToUniversalTime() : null; - target.Type = source.Type; + target.Kind = source.Kind; } // Umbraco.Code.MapAll -Id -LockoutEnabled -PhoneNumber -PhoneNumberConfirmed -ConcurrencyStamp -NormalizedEmail -NormalizedUserName -Roles diff --git a/src/Umbraco.Web.Common/Security/BackOfficeUserManager.cs b/src/Umbraco.Web.Common/Security/BackOfficeUserManager.cs index 31b3963bb9c4..fc8d4d23e7db 100644 --- a/src/Umbraco.Web.Common/Security/BackOfficeUserManager.cs +++ b/src/Umbraco.Web.Common/Security/BackOfficeUserManager.cs @@ -299,7 +299,7 @@ public async Task CreateAsync(UserCreateModel createMode _globalSettings.DefaultUILanguage, createModel.Name, createModel.Id, - createModel.Type); + createModel.Kind); IdentityResult created = await CreateAsync(identityUser); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/UserServiceCrudTests.ChangePassword.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/UserServiceCrudTests.ChangePassword.cs index 5bc5c89158c4..5ed591d1d8c5 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/UserServiceCrudTests.ChangePassword.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/UserServiceCrudTests.ChangePassword.cs @@ -49,7 +49,7 @@ public async Task Cannot_Reset_Password_For_Api_User() Email = "some@one", Name = "Some One", UserGroupKeys = new HashSet { userGroup.Key }, - Type = UserType.Api + Kind = UserKind.Api }; var userKey = (await userService.CreateAsync(Constants.Security.SuperUserKey, creationModel, true)).Result.CreatedUser!.Key; diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/UserServiceCrudTests.Create.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/UserServiceCrudTests.Create.cs index aaa2f619ec7b..c70a8831795c 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/UserServiceCrudTests.Create.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/UserServiceCrudTests.Create.cs @@ -50,12 +50,12 @@ public async Task Creating_User_Name_Must_Be_Email( Assert.IsNotNull(createdUser); Assert.AreEqual(username, createdUser.Username); Assert.AreEqual(email, createdUser.Email); - Assert.AreEqual(UserType.Default, createdUser.Type); + Assert.AreEqual(UserKind.Default, createdUser.Kind); } - [TestCase(UserType.Default)] - [TestCase(UserType.Api)] - public async Task Can_Create_All_User_Types(UserType type) + [TestCase(UserKind.Default)] + [TestCase(UserKind.Api)] + public async Task Can_Create_All_User_Types(UserKind kind) { var securitySettings = new SecuritySettings(); var userService = CreateUserService(securitySettings); @@ -67,7 +67,7 @@ public async Task Can_Create_All_User_Types(UserType type) Email = "api@local", Name = "API user", UserGroupKeys = new HashSet { userGroup.Key }, - Type = type + Kind = kind }; var result = await userService.CreateAsync(Constants.Security.SuperUserKey, creationModel, true); @@ -76,11 +76,11 @@ public async Task Can_Create_All_User_Types(UserType type) Assert.AreEqual(UserOperationStatus.Success, result.Status); var createdUser = result.Result.CreatedUser; Assert.IsNotNull(createdUser); - Assert.AreEqual(type, createdUser.Type); + Assert.AreEqual(kind, createdUser.Kind); var user = await userService.GetAsync(createdUser.Key); Assert.NotNull(user); - Assert.AreEqual(type, user.Type); + Assert.AreEqual(kind, user.Kind); } [Test]