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