@using System.Numerics; @inject IDbContextFactory dbFactory; @implements IDialog
@if(obj?.Acl is not null) {
@if(editOwner is not null) { } else { editOwner = obj.Owner.ToString())> @obj.Owner.ToString() }
@foreach(var rule in obj.Acl.Rules.OrderByDescending(r => r.Action)) { }
Action Subject Permissions
@rule.Principal.ToString() @GetActivePermissions(rule) EditRule(rule))>🖉 RemoveRule(rule))>✖

Add new
} else {

This item does not have any permissions set!

}
@if(ruleToEdit is not null && permissionCheckboxes is not null) { var permissions = Acl.GetPermissionDescriptions(obj!) .OrderByDescending(kv => BitOperations.PopCount(kv.Value)) .ThenBy(kv => kv.Value); foreach(var perm in permissionCheckboxes) { } } else {

Click 'Edit' next to a rule to edit it's permissions

}
@if(obj?.Acl is not null) { }
@code { public bool Visible { get => dialog.Visible; set { dialog.Visible = value; if(value) StateHasChanged(); } } private HBObject? obj; private AclRule? ruleToEdit; private PermissionCheckbox[]? permissionCheckboxes; private string? editOwner; private string? editSubject; private Dialog dialog; public void Show() => Visible = true; public void Hide() => Visible = false; public void Show(HBObject obj) { Object = obj; Show(); } public HBObject? Object { get => obj; set { editOwner = null; CancelEditRule(); if(value is null) { obj = null; return; } using var db = dbFactory.CreateDbContext(); obj = db.Objects .Include(o => o.Acl) .First(o => o.ObjectId == value.ObjectId); if(obj.Acl is not null) db.Entry(obj.Acl).Collection(a => a.Rules).Load(); } } private string GetActivePermissions(AclRule rule) { var perms = Acl.GetPermissionDescriptions(obj!) .Where(kv => (rule.Permissions & kv.Value) == kv.Value) .ToList(); // Filter the list of matching permissions to include the // most relevant encapsulation permissions only. E.g. if // 'Full access' includes 'Read' and 'Write', then only // show 'Full access'. List toRemove = new(); for(int i = 0; i < perms.Count(); i++) for(int j = 0; j < perms.Count(); j++) if(i != j) if((perms[i].Value & perms[j].Value) == perms[i].Value) toRemove.Add(i); toRemove = toRemove.Order().Distinct().ToList(); for(int i = toRemove.Count() - 1; i >= 0; i--) perms.RemoveAt(toRemove[i]); return string.Join(", ", perms .OrderByDescending(kv => BitOperations.PopCount(kv.Value)) .ThenBy(kv => kv.Value) .Select(kv => kv.Key)); } private void AddRule() { var rule = new AclRule() { Principal = WellKnownSid.NullSid, Action = AclRuleAction.Allow, Permissions = 0 }; obj!.Acl!.Rules.Add(rule); EditRule(rule); } private void RemoveRule(AclRule rule) { if(rule == ruleToEdit) CancelEditRule(); obj!.Acl!.Rules.Remove(rule); } private void EditRule(AclRule rule) { ruleToEdit = rule; editSubject = null; permissionCheckboxes = Acl.GetPermissionDescriptions(obj!) .OrderByDescending(kv => BitOperations.PopCount(kv.Value)) .ThenBy(kv => kv.Value) .Select(kv => new PermissionCheckbox(rule, kv)) .ToArray(); } private void CancelEditRule() { ruleToEdit = null; permissionCheckboxes = null; } private class PermissionCheckbox { public string Description { get; private init; } private AclRule rule; private ulong mask; public PermissionCheckbox(AclRule rule, KeyValuePair kv) { this.rule = rule; this.mask = kv.Value; Description = kv.Key; } public bool Value { get => (rule.Permissions & mask) == mask; set { if(value) rule.Permissions |= mask; else rule.Permissions &= ~mask; } } } }