diff --git a/Moonlight.Api/Http/Controllers/Admin/ContainerHelperController.cs b/Moonlight.Api/Http/Controllers/Admin/ContainerHelperController.cs index 7fed23c7..fa61a329 100644 --- a/Moonlight.Api/Http/Controllers/Admin/ContainerHelperController.cs +++ b/Moonlight.Api/Http/Controllers/Admin/ContainerHelperController.cs @@ -1,10 +1,11 @@ -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using Moonlight.Api.Configuration; using Moonlight.Api.Mappers; using Moonlight.Api.Services; -using Moonlight.Shared.Http.Events; +using Moonlight.Shared; using Moonlight.Shared.Http.Requests.Admin.ContainerHelper; using Moonlight.Shared.Http.Responses.Admin; @@ -12,6 +13,7 @@ namespace Moonlight.Api.Http.Controllers.Admin; [ApiController] [Route("api/admin/ch")] +[Authorize(Policy = Permissions.System.Instance)] public class ContainerHelperController : Controller { private readonly ContainerHelperService ContainerHelperService; diff --git a/Moonlight.Frontend/Implementations/PermissionProvider.cs b/Moonlight.Frontend/Implementations/PermissionProvider.cs index c0ad6166..739c11ec 100644 --- a/Moonlight.Frontend/Implementations/PermissionProvider.cs +++ b/Moonlight.Frontend/Implementations/PermissionProvider.cs @@ -28,6 +28,7 @@ public sealed class PermissionProvider : IPermissionProvider new Permission(Permissions.System.Info, "Info", "View system info"), new Permission(Permissions.System.Diagnose, "Diagnose", "Run diagnostics"), new Permission(Permissions.System.Versions, "Versions", "Look at the available versions"), + new Permission(Permissions.System.Instance, "Instance", "Update the moonlight instance and add plugins"), ]), new PermissionCategory("API Keys", typeof(KeyIcon), [ new Permission(Permissions.ApiKeys.Create, "Create", "Create new API keys"), diff --git a/Moonlight.Frontend/UI/Admin/Views/Sys/Index.razor b/Moonlight.Frontend/UI/Admin/Views/Sys/Index.razor index 7d764378..3f09ac48 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Sys/Index.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Sys/Index.razor @@ -31,7 +31,7 @@ Diagnose - + Instance @@ -61,9 +61,12 @@ } - - - + @if (InstanceResult.Succeeded && VersionsResult.Succeeded) + { + + + + } @code @@ -76,6 +79,8 @@ private AuthorizationResult ApiKeyAccess; private AuthorizationResult ThemesAccess; + private AuthorizationResult InstanceResult; + private AuthorizationResult VersionsResult; protected override async Task OnInitializedAsync() { @@ -83,6 +88,8 @@ ApiKeyAccess = await AuthorizationService.AuthorizeAsync(authState.User, Permissions.ApiKeys.View); ThemesAccess = await AuthorizationService.AuthorizeAsync(authState.User, Permissions.Themes.View); + InstanceResult = await AuthorizationService.AuthorizeAsync(authState.User, Permissions.System.Versions); + VersionsResult = await AuthorizationService.AuthorizeAsync(authState.User, Permissions.System.Instance); } private void OnTabChanged(string name) diff --git a/Moonlight.Frontend/UI/Admin/Views/Sys/Instance.razor b/Moonlight.Frontend/UI/Admin/Views/Sys/Instance.razor index 6f0bd3cc..957db194 100644 --- a/Moonlight.Frontend/UI/Admin/Views/Sys/Instance.razor +++ b/Moonlight.Frontend/UI/Admin/Views/Sys/Instance.razor @@ -1,4 +1,3 @@ -@using System.Text.RegularExpressions @using LucideBlazor @using Moonlight.Frontend.UI.Admin.Modals @using Moonlight.Shared.Http.Responses.Admin @@ -38,10 +37,12 @@ - v2.1 - v2.1.1 - feat/ContainerHelper - + @foreach (var version in Versions) + { + + @version.Identifier + + } @@ -49,7 +50,7 @@ Bypass Build Cache - + @@ -118,9 +119,18 @@ private string SelectedVersion = "v2.1"; private bool NoBuildCache; + private VersionDto[] Versions; + private async Task LoadAsync(LazyLoader _) { StatusDto = (await HttpClient.GetFromJsonAsync("api/admin/ch/status"))!; + + var currentVersion = await HttpClient.GetFromJsonAsync("api/admin/versions/instance"); + + if (currentVersion != null) + SelectedVersion = currentVersion.Identifier; + + Versions = (await HttpClient.GetFromJsonAsync("api/admin/versions"))!; } private async Task ApplyAsync() @@ -144,6 +154,8 @@ if (string.IsNullOrWhiteSpace(SelectedVersion)) return; + var version = Versions.First(x => x.Identifier == SelectedVersion); + var shouldContinue = await ConfirmRiskyVersionAsync( "Moonlight Rebuild", "If you continue the moonlight instance will become unavailable during the rebuild process. This will impact users on this instance" @@ -152,7 +164,7 @@ if (!shouldContinue) return; - if (!Regex.IsMatch(SelectedVersion, @"^v\d+(\.\d+)*b?$")) + if (version.IsDevelopment) { shouldContinue = await ConfirmRiskyVersionAsync( "Development Version", @@ -161,7 +173,7 @@ } else { - if (SelectedVersion.EndsWith('b')) + if (version.IsPreRelease) { shouldContinue = await ConfirmRiskyVersionAsync( "Beta / Pre-Release Version", diff --git a/Moonlight.Shared/Permissions.cs b/Moonlight.Shared/Permissions.cs index 87943dea..96d8a1df 100644 --- a/Moonlight.Shared/Permissions.cs +++ b/Moonlight.Shared/Permissions.cs @@ -54,5 +54,6 @@ public static class Permissions public const string Info = $"{Prefix}{Section}.{nameof(Info)}"; public const string Diagnose = $"{Prefix}{Section}.{nameof(Diagnose)}"; public const string Versions = $"{Prefix}{Section}.{nameof(Versions)}"; + public const string Instance = $"{Prefix}{Section}.{nameof(Instance)}"; } } \ No newline at end of file