using System; using System.Linq; using System.Collections.Generic; namespace Nibriboard.Userspace { public class RbacRole { public readonly string Name; public readonly List SubRoles = new List(); public readonly List Permissions = new List(); public RbacRole() { } public RbacRole(string inRoleName, List inPermissions) : this(inRoleName, inPermissions, new List()) { } public RbacRole(string inRoleName, List inPermissions, List inSubRoles) { Name = inRoleName; Permissions = inPermissions; SubRoles = inSubRoles; } public bool HasPermission(RbacPermission permission) { return Permissions.Contains(permission) || SubRoles.Any((RbacRole obj) => obj.HasPermission(permission)); } public bool HasRole(RbacRole targetRole) { if (Name == targetRole.Name) return true; return SubRoles.Any((RbacRole subRole) => subRole.HasRole(targetRole)); } public override string ToString() { List subItems = new List(); subItems.AddRange(SubRoles.Select((RbacRole subRole) => $"[r] {subRole.Name}")); subItems.AddRange(Permissions.Select((RbacPermission subPermission) => $"[p] {subPermission.Name}")); return string.Format( "{0}: {1}", Name, string.Join(", ", subItems) ); } } }