diff options
| author | Jake Mannens <jake@asger.xyz> | 2023-10-03 02:20:13 +1100 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2023-10-03 02:20:13 +1100 |
| commit | 035d2e3858dd55580c294031573c3be9e1999449 (patch) | |
| tree | 643d545aa036b901f185ba7148d4a4353d6c957b /Pages/Component/AclDialog.razor | |
| parent | 7170867a9a2650fa5a98b9e2664fb2114a0bf114 (diff) | |
AclDialog
Diffstat (limited to 'Pages/Component/AclDialog.razor')
| -rw-r--r-- | Pages/Component/AclDialog.razor | 76 |
1 files changed, 72 insertions, 4 deletions
diff --git a/Pages/Component/AclDialog.razor b/Pages/Component/AclDialog.razor index 33d1f03..7c3267d 100644 --- a/Pages/Component/AclDialog.razor +++ b/Pages/Component/AclDialog.razor @@ -1,19 +1,87 @@ -@implements IDialog +@using System.Numerics; +@inject IDbContextFactory<HBContext> dbFactory; +@implements IDialog <Dialog Title="Edit permissions" @ref=dialog> + @if(obj?.Acl is not null) { + <table class="data-table"> + <tr> + <th>Action</th> + <th>Subject</th> + <th>Permissions</th> + </tr> + @foreach(var rule in Object.Acl.Rules) { + <tr> + <td style="font-family:'lucida console';font-size:10pt;">@rule.Action.ToString()</td> + <td style="font-family:'lucida console';font-size:10pt;">@rule.Principal.ToString()</td> + <td style="font-family:'lucida console';font-size:10pt;">@GetActivePermissions(rule)</td> + </tr> + } + </table> + <ButtonContainer> + <button class="secondary" @onclick=Hide>Cancel</button> + </ButtonContainer> + } else { + <center><i>This item does not have any permissions set!</i></center> + <ButtonContainer> + <button class="secondary" @onclick=Hide>Cancel</button> + </ButtonContainer> + } </Dialog> @code { - [Parameter] - public HBObject Object { get; set; } - public bool Visible { get => dialog.Visible; set => dialog.Visible = value; } + private HBObject? obj; + private Dialog dialog; public void Show() => Visible = true; public void Hide() => Visible = false; + + public HBObject? Object { + get => obj; + set { + 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(); + } + } + + public 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<int> 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); + for(int i = toRemove.Count() - 1; i >= 0; i--) + perms.RemoveAt(toRemove[i]); + + return string.Join(", ", perms + .OrderByDescending(kv => BitOperations.PopCount(kv.Value)) + .ThenByDescending(kv => kv.Value) + .Select(kv => kv.Key)); + } }
\ No newline at end of file |
