Make Role Permissions more human legible (#6191)

Had to rename `CanModifyStoreWebhooks` to `CanModifyWebhooks` for this, but the value stayed the same, so I don't think it's a big deal.

Closes #6183.
This commit is contained in:
d11n 2024-09-12 05:29:10 +02:00 committed by GitHub
parent f59751853a
commit 3342122be2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 21 additions and 9 deletions

View file

@ -1,8 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Text.RegularExpressions;
namespace BTCPayServer.Client namespace BTCPayServer.Client
{ {
@ -16,7 +18,7 @@ namespace BTCPayServer.Client
public const string CanUseLightningNodeInStore = "btcpay.store.canuselightningnode"; public const string CanUseLightningNodeInStore = "btcpay.store.canuselightningnode";
public const string CanModifyServerSettings = "btcpay.server.canmodifyserversettings"; public const string CanModifyServerSettings = "btcpay.server.canmodifyserversettings";
public const string CanModifyStoreSettings = "btcpay.store.canmodifystoresettings"; public const string CanModifyStoreSettings = "btcpay.store.canmodifystoresettings";
public const string CanModifyStoreWebhooks = "btcpay.store.webhooks.canmodifywebhooks"; public const string CanModifyWebhooks = "btcpay.store.webhooks.canmodifywebhooks";
public const string CanModifyStoreSettingsUnscoped = "btcpay.store.canmodifystoresettings:"; public const string CanModifyStoreSettingsUnscoped = "btcpay.store.canmodifystoresettings:";
public const string CanViewStoreSettings = "btcpay.store.canviewstoresettings"; public const string CanViewStoreSettings = "btcpay.store.canviewstoresettings";
public const string CanViewReports = "btcpay.store.canviewreports"; public const string CanViewReports = "btcpay.store.canviewreports";
@ -48,7 +50,7 @@ namespace BTCPayServer.Client
yield return CanViewInvoices; yield return CanViewInvoices;
yield return CanCreateInvoice; yield return CanCreateInvoice;
yield return CanModifyInvoices; yield return CanModifyInvoices;
yield return CanModifyStoreWebhooks; yield return CanModifyWebhooks;
yield return CanModifyServerSettings; yield return CanModifyServerSettings;
yield return CanModifyStoreSettings; yield return CanModifyStoreSettings;
yield return CanViewStoreSettings; yield return CanViewStoreSettings;
@ -104,6 +106,16 @@ namespace BTCPayServer.Client
{ {
return policy.StartsWith("btcpay.user", StringComparison.OrdinalIgnoreCase); return policy.StartsWith("btcpay.user", StringComparison.OrdinalIgnoreCase);
} }
private static readonly CultureInfo _culture = new (CultureInfo.InvariantCulture.Name);
public static string DisplayName(string policy)
{
var p = policy.Split(".");
if (p.Length < 3 || p[0] != "btcpay") return policy;
var constName = typeof(Policies).GetFields().Select(f => f.Name).FirstOrDefault(f => f.Equals(p[^1], StringComparison.OrdinalIgnoreCase));
var perm = string.IsNullOrEmpty(constName) ? string.Join(' ', p[2..]) : Regex.Replace(constName, "([A-Z])", " $1", RegexOptions.Compiled).Trim();
return $"{_culture.TextInfo.ToTitleCase(p[1])}: {_culture.TextInfo.ToTitleCase(perm)}";
}
} }
public class PermissionSet public class PermissionSet
@ -247,7 +259,7 @@ namespace BTCPayServer.Client
Policies.CanManagePullPayments, Policies.CanManagePullPayments,
Policies.CanModifyInvoices, Policies.CanModifyInvoices,
Policies.CanViewStoreSettings, Policies.CanViewStoreSettings,
Policies.CanModifyStoreWebhooks, Policies.CanModifyWebhooks,
Policies.CanModifyPaymentRequests, Policies.CanModifyPaymentRequests,
Policies.CanManagePayouts, Policies.CanManagePayouts,
Policies.CanUseLightningNodeInStore); Policies.CanUseLightningNodeInStore);

View file

@ -1711,7 +1711,7 @@ namespace BTCPayServer.Tests
var user = tester.NewAccount(); var user = tester.NewAccount();
user.GrantAccess(); user.GrantAccess();
user.RegisterDerivationScheme("BTC"); user.RegisterDerivationScheme("BTC");
var clientProfile = await user.CreateClient(Policies.CanModifyStoreWebhooks, Policies.CanCreateInvoice); var clientProfile = await user.CreateClient(Policies.CanModifyWebhooks, Policies.CanCreateInvoice);
var hook = await clientProfile.CreateWebhook(user.StoreId, new CreateStoreWebhookRequest() var hook = await clientProfile.CreateWebhook(user.StoreId, new CreateStoreWebhookRequest()
{ {
Url = fakeServer.ServerUri.AbsoluteUri, Url = fakeServer.ServerUri.AbsoluteUri,

View file

@ -527,7 +527,7 @@ retry:
{ {
var server = new FakeServer(); var server = new FakeServer();
await server.Start(); await server.Start();
var client = await CreateClient(Policies.CanModifyStoreWebhooks); var client = await CreateClient(Policies.CanModifyWebhooks);
var wh = await client.CreateWebhook(StoreId, new CreateStoreWebhookRequest() var wh = await client.CreateWebhook(StoreId, new CreateStoreWebhookRequest()
{ {
AutomaticRedelivery = false, AutomaticRedelivery = false,

View file

@ -24,7 +24,7 @@ namespace BTCPayServer.Controllers.Greenfield
{ {
[ApiController] [ApiController]
[Authorize(AuthenticationSchemes = AuthenticationSchemes.Greenfield, [Authorize(AuthenticationSchemes = AuthenticationSchemes.Greenfield,
Policy = Policies.CanModifyStoreWebhooks)] Policy = Policies.CanModifyWebhooks)]
[EnableCors(CorsPolicies.All)] [EnableCors(CorsPolicies.All)]
public class GreenfieldStoreWebhooksController : ControllerBase public class GreenfieldStoreWebhooksController : ControllerBase
{ {

View file

@ -513,8 +513,8 @@ namespace BTCPayServer.Controllers
{Policies.CanDeleteUser, ("Delete user", "Allows deleting the user to whom it is assigned. Admin users can delete any user without this permission.")}, {Policies.CanDeleteUser, ("Delete user", "Allows deleting the user to whom it is assigned. Admin users can delete any user without this permission.")},
{Policies.CanModifyStoreSettings, ("Modify your stores", "Allows managing invoices on all your stores and modify their settings.")}, {Policies.CanModifyStoreSettings, ("Modify your stores", "Allows managing invoices on all your stores and modify their settings.")},
{$"{Policies.CanModifyStoreSettings}:", ("Manage selected stores", "Allows managing invoices on the selected stores and modify their settings.")}, {$"{Policies.CanModifyStoreSettings}:", ("Manage selected stores", "Allows managing invoices on the selected stores and modify their settings.")},
{Policies.CanModifyStoreWebhooks, ("Modify stores webhooks", "Allows modifying the webhooks of all your stores.")}, {Policies.CanModifyWebhooks, ("Modify stores webhooks", "Allows modifying the webhooks of all your stores.")},
{$"{Policies.CanModifyStoreWebhooks}:", ("Modify selected stores' webhooks", "Allows modifying the webhooks of the selected stores.")}, {$"{Policies.CanModifyWebhooks}:", ("Modify selected stores' webhooks", "Allows modifying the webhooks of the selected stores.")},
{Policies.CanViewStoreSettings, ("View your stores", "Allows viewing stores settings.")}, {Policies.CanViewStoreSettings, ("View your stores", "Allows viewing stores settings.")},
{$"{Policies.CanViewStoreSettings}:", ("View your stores", "Allows viewing the selected stores' settings.")}, {$"{Policies.CanViewStoreSettings}:", ("View your stores", "Allows viewing the selected stores' settings.")},
{Policies.CanViewReports, ("View your reports", "Allows viewing reports.")}, {Policies.CanViewReports, ("View your reports", "Allows viewing reports.")},

View file

@ -96,7 +96,7 @@
{ {
@foreach (var policy in role.Permissions) @foreach (var policy in role.Permissions)
{ {
<code class="d-block text-break">@policy</code> <code class="d-block text-break">@Policies.DisplayName(policy)</code>
} }
} }
</td> </td>