// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Microsoft.AspNet.Identity { /// /// Validates roles before they are saved /// /// public class RoleValidator : IRoleValidator where TRole : class { public RoleValidator(IdentityErrorDescriber errors = null) { Describer = errors ?? new IdentityErrorDescriber(); } private IdentityErrorDescriber Describer { get; set; } /// /// Validates a role before saving /// /// /// /// /// public virtual async Task ValidateAsync(RoleManager manager, TRole role) { if (manager == null) { throw new ArgumentNullException(nameof(manager)); } if (role == null) { throw new ArgumentNullException(nameof(role)); } var errors = new List(); await ValidateRoleName(manager, role, errors); if (errors.Count > 0) { return IdentityResult.Failed(errors.ToArray()); } return IdentityResult.Success; } private async Task ValidateRoleName(RoleManager manager, TRole role, ICollection errors) { var roleName = await manager.GetRoleNameAsync(role); if (string.IsNullOrWhiteSpace(roleName)) { errors.Add(Describer.InvalidRoleName(roleName)); } else { var owner = await manager.FindByNameAsync(roleName); if (owner != null && !string.Equals(await manager.GetRoleIdAsync(owner), await manager.GetRoleIdAsync(role))) { errors.Add(Describer.DuplicateRoleName(roleName)); } } } } }