Updated mooncore versions. Updated permission checking. Added client side permission check. Added dotnet tool specifications for scripts project

This commit is contained in:
2025-05-21 10:30:37 +02:00
parent da55f2b19e
commit dc49e168ab
24 changed files with 307 additions and 100 deletions

View File

@@ -1,9 +1,9 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MoonCore.Exceptions; using MoonCore.Exceptions;
using MoonCore.Extended.Abstractions; using MoonCore.Extended.Abstractions;
using MoonCore.Extended.PermFilter;
using MoonCore.Models; using MoonCore.Models;
using Moonlight.ApiServer.Database.Entities; using Moonlight.ApiServer.Database.Entities;
using Moonlight.ApiServer.Services; using Moonlight.ApiServer.Services;
@@ -26,7 +26,7 @@ public class ApiKeysController : Controller
} }
[HttpGet] [HttpGet]
[RequirePermission("admin.apikeys.read")] [Authorize(Policy = "permissions:admin.apikeys.get")]
public async Task<IPagedData<ApiKeyResponse>> Get( public async Task<IPagedData<ApiKeyResponse>> Get(
[FromQuery] int page, [FromQuery] int page,
[FromQuery] [Range(1, 100)] int pageSize = 50 [FromQuery] [Range(1, 100)] int pageSize = 50
@@ -62,7 +62,7 @@ public class ApiKeysController : Controller
} }
[HttpGet("{id}")] [HttpGet("{id}")]
[RequirePermission("admin.apikeys.read")] [Authorize(Policy = "permissions:admin.apikeys.get")]
public async Task<ApiKeyResponse> GetSingle(int id) public async Task<ApiKeyResponse> GetSingle(int id)
{ {
var apiKey = await ApiKeyRepository var apiKey = await ApiKeyRepository
@@ -82,7 +82,7 @@ public class ApiKeysController : Controller
} }
[HttpPost] [HttpPost]
[RequirePermission("admin.apikeys.create")] [Authorize(Policy = "permissions:admin.apikeys.create")]
public async Task<CreateApiKeyResponse> Create([FromBody] CreateApiKeyRequest request) public async Task<CreateApiKeyResponse> Create([FromBody] CreateApiKeyRequest request)
{ {
var apiKey = new ApiKey() var apiKey = new ApiKey()
@@ -107,7 +107,7 @@ public class ApiKeysController : Controller
} }
[HttpPatch("{id}")] [HttpPatch("{id}")]
[RequirePermission("admin.apikeys.update")] [Authorize(Policy = "permissions:admin.apikeys.update")]
public async Task<ApiKeyResponse> Update([FromRoute] int id, [FromBody] UpdateApiKeyRequest request) public async Task<ApiKeyResponse> Update([FromRoute] int id, [FromBody] UpdateApiKeyRequest request)
{ {
var apiKey = await ApiKeyRepository var apiKey = await ApiKeyRepository
@@ -131,7 +131,7 @@ public class ApiKeysController : Controller
} }
[HttpDelete("{id}")] [HttpDelete("{id}")]
[RequirePermission("admin.apikeys.delete")] [Authorize(Policy = "permissions:admin.apikeys.delete")]
public async Task Delete([FromRoute] int id) public async Task Delete([FromRoute] int id)
{ {
var apiKey = await ApiKeyRepository var apiKey = await ApiKeyRepository

View File

@@ -1,6 +1,5 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonCore.Extended.PermFilter;
using Moonlight.ApiServer.Services; using Moonlight.ApiServer.Services;
namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys; namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys;
@@ -18,7 +17,7 @@ public class AdvancedController : Controller
} }
[HttpGet("frontend")] [HttpGet("frontend")]
[RequirePermission("admin.system.advanced.frontend")] [Authorize(Policy = "permissions:admin.system.advanced.frontend")]
public async Task Frontend() public async Task Frontend()
{ {
var stream = await FrontendService.GenerateZip(); var stream = await FrontendService.GenerateZip();

View File

@@ -1,16 +1,15 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonCore.Attributes;
using Moonlight.ApiServer.Services; using Moonlight.ApiServer.Services;
using Moonlight.Shared.Http.Requests.Admin.Sys; using Moonlight.Shared.Http.Requests.Admin.Sys;
using Moonlight.Shared.Http.Responses.Admin.Sys; using Moonlight.Shared.Http.Responses.Admin.Sys;
using Moonlight.Shared.Misc;
namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys; namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys;
[ApiController] [ApiController]
[Route("api/admin/system/diagnose")] [Route("api/admin/system/diagnose")]
[RequirePermission("admin.system.diagnose")] [Authorize(Policy = "permissions:admin.system.diagnose")]
public class DiagnoseController : Controller public class DiagnoseController : Controller
{ {
private readonly DiagnoseService DiagnoseService; private readonly DiagnoseService DiagnoseService;

View File

@@ -2,9 +2,9 @@
using ICSharpCode.SharpZipLib.GZip; using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar; using ICSharpCode.SharpZipLib.Tar;
using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonCore.Exceptions; using MoonCore.Exceptions;
using MoonCore.Extended.PermFilter;
using MoonCore.Helpers; using MoonCore.Helpers;
using Moonlight.Shared.Http.Requests.Admin.Sys.Files; using Moonlight.Shared.Http.Requests.Admin.Sys.Files;
using Moonlight.Shared.Http.Responses.Admin.Sys; using Moonlight.Shared.Http.Responses.Admin.Sys;
@@ -13,7 +13,7 @@ namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys;
[ApiController] [ApiController]
[Route("api/admin/system/files")] [Route("api/admin/system/files")]
[RequirePermission("admin.system.files")] [Authorize(Policy = "permissions:admin.system.files")]
public class FilesController : Controller public class FilesController : Controller
{ {
private readonly string BaseDirectory = PathBuilder.Dir("storage"); private readonly string BaseDirectory = PathBuilder.Dir("storage");

View File

@@ -1,13 +1,13 @@
using Hangfire; using Hangfire;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonCore.Extended.PermFilter;
using Moonlight.Shared.Http.Responses.Admin.Hangfire; using Moonlight.Shared.Http.Responses.Admin.Hangfire;
namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys; namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys;
[ApiController] [ApiController]
[Route("api/admin/system/hangfire")] [Route("api/admin/system/hangfire")]
[RequirePermission("admin.system.hangfire")] [Authorize(Policy = "permissions:admin.system.hangfire")]
public class HangfireController : Controller public class HangfireController : Controller
{ {
private readonly JobStorage JobStorage; private readonly JobStorage JobStorage;

View File

@@ -1,3 +1,4 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonCore.Attributes; using MoonCore.Attributes;
using Moonlight.ApiServer.Interfaces; using Moonlight.ApiServer.Interfaces;
@@ -21,7 +22,7 @@ public class SystemController : Controller
} }
[HttpGet] [HttpGet]
[RequirePermission("admin.system.overview")] [Authorize(Policy = "permissions:admin.system.overview")]
public async Task<SystemOverviewResponse> GetOverview() public async Task<SystemOverviewResponse> GetOverview()
{ {
return new() return new()
@@ -34,7 +35,7 @@ public class SystemController : Controller
} }
[HttpPost("shutdown")] [HttpPost("shutdown")]
[RequirePermission("admin.system.shutdown")] [Authorize(Policy = "permissions:admin.system.shutdown")]
public async Task Shutdown() public async Task Shutdown()
{ {
await ApplicationService.Shutdown(); await ApplicationService.Shutdown();

View File

@@ -1,6 +1,6 @@
using System.Text.Json; using System.Text.Json;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonCore.Extended.PermFilter;
using MoonCore.Helpers; using MoonCore.Helpers;
using Moonlight.Shared.Http.Requests.Admin.Sys; using Moonlight.Shared.Http.Requests.Admin.Sys;
@@ -11,7 +11,7 @@ namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys;
public class ThemeController : Controller public class ThemeController : Controller
{ {
[HttpPatch] [HttpPatch]
[RequirePermission("admin.system.theme.update")] [Authorize(Policy = "permissions:admin.system.theme.update")]
public async Task Patch([FromBody] UpdateThemeRequest request) public async Task Patch([FromBody] UpdateThemeRequest request)
{ {
var themePath = PathBuilder.File("storage", "theme.json"); var themePath = PathBuilder.File("storage", "theme.json");

View File

@@ -1,10 +1,10 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using MoonCore.Exceptions; using MoonCore.Exceptions;
using MoonCore.Extended.Abstractions; using MoonCore.Extended.Abstractions;
using MoonCore.Extended.Helpers; using MoonCore.Extended.Helpers;
using MoonCore.Extended.PermFilter;
using MoonCore.Models; using MoonCore.Models;
using Moonlight.ApiServer.Database.Entities; using Moonlight.ApiServer.Database.Entities;
using Moonlight.Shared.Http.Requests.Admin.Users; using Moonlight.Shared.Http.Requests.Admin.Users;
@@ -24,7 +24,7 @@ public class UsersController : Controller
} }
[HttpGet] [HttpGet]
[RequirePermission("admin.users.read")] [Authorize(Policy = "permissions:admin.users.get")]
public async Task<IPagedData<UserResponse>> Get( public async Task<IPagedData<UserResponse>> Get(
[FromQuery] int page, [FromQuery] int page,
[FromQuery] [Range(1, 100)] int pageSize = 50 [FromQuery] [Range(1, 100)] int pageSize = 50
@@ -60,7 +60,7 @@ public class UsersController : Controller
} }
[HttpGet("{id}")] [HttpGet("{id}")]
[RequirePermission("admin.users.read")] [Authorize(Policy = "permissions:admin.users.get")]
public async Task<UserResponse> GetSingle(int id) public async Task<UserResponse> GetSingle(int id)
{ {
var user = await UserRepository var user = await UserRepository
@@ -80,7 +80,7 @@ public class UsersController : Controller
} }
[HttpPost] [HttpPost]
[RequirePermission("admin.users.create")] [Authorize(Policy = "permissions:admin.users.create")]
public async Task<UserResponse> Create([FromBody] CreateUserRequest request) public async Task<UserResponse> Create([FromBody] CreateUserRequest request)
{ {
// Reformat values // Reformat values
@@ -116,7 +116,7 @@ public class UsersController : Controller
} }
[HttpPatch("{id}")] [HttpPatch("{id}")]
[RequirePermission("admin.users.update")] [Authorize(Policy = "permissions:admin.users.update")]
public async Task<UserResponse> Update([FromRoute] int id, [FromBody] UpdateUserRequest request) public async Task<UserResponse> Update([FromRoute] int id, [FromBody] UpdateUserRequest request)
{ {
var user = await UserRepository var user = await UserRepository
@@ -165,7 +165,7 @@ public class UsersController : Controller
} }
[HttpDelete("{id}")] [HttpDelete("{id}")]
[RequirePermission("admin.users.delete")] [Authorize(Policy = "permissions:admin.users.delete")]
public async Task Delete([FromRoute] int id) public async Task Delete([FromRoute] int id)
{ {
var user = await UserRepository var user = await UserRepository

View File

@@ -34,8 +34,8 @@
<PackageReference Include="Hangfire.EntityFrameworkCore" Version="0.7.0" /> <PackageReference Include="Hangfire.EntityFrameworkCore" Version="0.7.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.5" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="9.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.5" />
<PackageReference Include="MoonCore" Version="1.8.6" /> <PackageReference Include="MoonCore" Version="1.8.8" />
<PackageReference Include="MoonCore.Extended" Version="1.3.3" /> <PackageReference Include="MoonCore.Extended" Version="1.3.4" />
<PackageReference Include="SharpZipLib" Version="1.4.2" /> <PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.1" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.1" />
<PackageReference Include="Ben.Demystifier" Version="0.4.1" /> <PackageReference Include="Ben.Demystifier" Version="0.4.1" />

View File

@@ -12,6 +12,7 @@ using MoonCore.Extended.Helpers;
using MoonCore.Extended.JwtInvalidation; using MoonCore.Extended.JwtInvalidation;
using MoonCore.Extensions; using MoonCore.Extensions;
using MoonCore.Helpers; using MoonCore.Helpers;
using MoonCore.Permissions;
using Moonlight.ApiServer.Configuration; using Moonlight.ApiServer.Configuration;
using Moonlight.ApiServer.Database; using Moonlight.ApiServer.Database;
using Moonlight.ApiServer.Database.Entities; using Moonlight.ApiServer.Database.Entities;
@@ -480,6 +481,12 @@ public class Startup
}); });
WebApplicationBuilder.Services.AddAuthorization(); WebApplicationBuilder.Services.AddAuthorization();
WebApplicationBuilder.Services.AddAuthorizationPermissions(options =>
{
options.ClaimName = "permissions";
options.Prefix = "permissions:";
});
// Add local oauth2 provider if enabled // Add local oauth2 provider if enabled
if (Configuration.Authentication.EnableLocalOAuth2) if (Configuration.Authentication.EnableLocalOAuth2)

View File

@@ -28,7 +28,7 @@ public class DefaultSidebarItemProvider : ISidebarItemProvider
Path = "/admin", Path = "/admin",
Priority = 0, Priority = 0,
RequiresExactMatch = true, RequiresExactMatch = true,
Permission = "admin.overview" Policy = "permissions:admin.overview"
}, },
new SidebarItem() new SidebarItem()
{ {
@@ -38,7 +38,7 @@ public class DefaultSidebarItemProvider : ISidebarItemProvider
Path = "/admin/users", Path = "/admin/users",
Priority = 1, Priority = 1,
RequiresExactMatch = false, RequiresExactMatch = false,
Permission = "admin.users.read" Policy = "permissions:admin.users.get"
}, },
new SidebarItem() new SidebarItem()
{ {
@@ -48,7 +48,7 @@ public class DefaultSidebarItemProvider : ISidebarItemProvider
Path = "/admin/api", Path = "/admin/api",
Priority = 2, Priority = 2,
RequiresExactMatch = false, RequiresExactMatch = false,
Permission = "admin.api.read" Policy = "permissions:admin.api.get"
}, },
new SidebarItem() new SidebarItem()
{ {
@@ -58,7 +58,7 @@ public class DefaultSidebarItemProvider : ISidebarItemProvider
Path = "/admin/system", Path = "/admin/system",
Priority = 3, Priority = 3,
RequiresExactMatch = false, RequiresExactMatch = false,
Permission = "admin.system.overview" Policy = "permissions:admin.system.overview"
}, },
] ]
); );

View File

@@ -8,5 +8,5 @@ public class SidebarItem
public string Path { get; set; } public string Path { get; set; }
public int Priority { get; set; } public int Priority { get; set; }
public bool RequiresExactMatch { get; set; } = false; public bool RequiresExactMatch { get; set; } = false;
public string? Permission { get; set; } public string? Policy { get; set; }
} }

View File

@@ -24,9 +24,9 @@
<PackageReference Include="Blazor-ApexCharts" Version="6.0.0" /> <PackageReference Include="Blazor-ApexCharts" Version="6.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.5" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.5" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.5" PrivateAssets="all" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.5" PrivateAssets="all" />
<PackageReference Include="MoonCore" Version="1.8.6" /> <PackageReference Include="MoonCore" Version="1.8.8" />
<PackageReference Include="MoonCore.Blazor" Version="1.3.0" /> <PackageReference Include="MoonCore.Blazor" Version="1.3.0" />
<PackageReference Include="MoonCore.Blazor.Tailwind" Version="1.4.3" /> <PackageReference Include="MoonCore.Blazor.Tailwind" Version="1.4.5" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="**\*.cs" Exclude="storage\**\*;bin\**\*;obj\**\*"> <None Include="**\*.cs" Exclude="storage\**\*;bin\**\*;obj\**\*">

View File

@@ -9,6 +9,7 @@ using MoonCore.Blazor.Tailwind.Extensions;
using MoonCore.Blazor.Tailwind.Auth; using MoonCore.Blazor.Tailwind.Auth;
using MoonCore.Extensions; using MoonCore.Extensions;
using MoonCore.Helpers; using MoonCore.Helpers;
using MoonCore.Permissions;
using Moonlight.Client.Implementations; using Moonlight.Client.Implementations;
using Moonlight.Client.Interfaces; using Moonlight.Client.Interfaces;
using Moonlight.Client.Plugins; using Moonlight.Client.Plugins;
@@ -307,6 +308,12 @@ public class Startup
WebAssemblyHostBuilder.Services.AddCascadingAuthenticationState(); WebAssemblyHostBuilder.Services.AddCascadingAuthenticationState();
WebAssemblyHostBuilder.Services.AddAuthenticationStateManager<RemoteAuthStateManager>(); WebAssemblyHostBuilder.Services.AddAuthenticationStateManager<RemoteAuthStateManager>();
WebAssemblyHostBuilder.Services.AddAuthorizationPermissions(options =>
{
options.ClaimName = "permissions";
options.Prefix = "permissions:";
});
return Task.CompletedTask; return Task.CompletedTask;
} }

View File

@@ -1,4 +1,101 @@
[ [
"btn",
"btn-lg",
"btn-sm",
"btn-xs",
"1))",
"1));",
"btn",
"btn-lg",
"btn-sm",
"5);",
"5);",
"btn-xs",
"5);",
"btn-primary",
"511",
"262",
"966)",
"btn-secondary",
"btn-tertiary",
"627",
"265",
"9)",
"btn-danger",
"586",
"253",
"585)",
"btn-warning",
"828",
"189",
"429)",
"btn-info",
"546",
"245",
"881)",
"btn-success",
"627",
"194",
"214)",
"btn:disabled",
"btn-lg:disabled",
"btn-sm:disabled",
"btn-xs:disabled",
"btn-primary:disabled",
"511",
"262",
"966)",
"btn-secondary:disabled",
"btn-tertiary:disabled",
"627",
"265",
"9)",
"btn-danger:disabled",
"586",
"253",
"585)",
"btn-warning:disabled",
"828",
"189",
"429)",
"btn-info:disabled",
"546",
"245",
"881)",
"btn-success:disabled",
"627",
"194",
"214)",
"card",
"1))",
"1));",
"card-header",
"card-header:has(\u002B",
"card-body)",
"card-title",
"card-body",
"card-footer",
"progress",
"progress-bar",
"6s",
"progress-bar.progress-intermediate",
"4);",
"5);",
"no-scrollbar",
"loader-spinner",
"5rem;",
"5rem;",
"loader-spinner::before",
"tabs",
"tabs",
"tabs-segment",
"5);",
"5);",
"tabs",
"tabs-segment-active",
"511",
"262",
"966)",
"pointer-events-auto", "pointer-events-auto",
"pointer-events-none", "pointer-events-none",
"sr-only", "sr-only",
@@ -32,18 +129,22 @@
"mx-auto", "mx-auto",
"my-1", "my-1",
"my-3", "my-3",
"my-5",
"my-8", "my-8",
"ms-0.5", "ms-0.5",
"5);",
"ms-1", "ms-1",
"ms-2", "ms-2",
"ms-3", "ms-3",
"me-1", "me-1",
"me-2", "me-2",
"me-2.5", "me-2.5",
"5);",
"me-3", "me-3",
"mt-1", "mt-1",
"mt-2", "mt-2",
"mt-2.5", "mt-2.5",
"5);",
"mt-3", "mt-3",
"mt-4", "mt-4",
"mt-5", "mt-5",
@@ -51,7 +152,6 @@
"mt-8", "mt-8",
"mt-10", "mt-10",
"mt-auto", "mt-auto",
"-mr-1",
"mr-2", "mr-2",
"mr-4", "mr-4",
"mb-1", "mb-1",
@@ -70,6 +170,9 @@
"6%", "6%",
"245", "245",
"881);", "881);",
"6%",
"245",
"881);",
"w3.org/2000/svg\u0027%3e%3cpath", "w3.org/2000/svg\u0027%3e%3cpath",
"207", "207",
"793a1", "793a1",
@@ -77,12 +180,28 @@
"414", "414",
"414-1.414L6.5", "414-1.414L6.5",
"086l4.293-4.293a1", "086l4.293-4.293a1",
"414",
"w3.org/2000/svg\u0027", "w3.org/2000/svg\u0027",
"form-radio", "form-radio",
"6%",
"245",
"881);",
"6%",
"245",
"881);",
"w3.org/2000/svg\u0027%3e%3ccircle", "w3.org/2000/svg\u0027%3e%3ccircle",
"form-input", "form-input",
"5rem;", "5rem;",
"75rem;", "75rem;",
"5rem;",
"75rem;",
"5rem;",
"6%",
"245",
"881);",
"6%",
"245",
"881);",
"5em;", "5em;",
"block", "block",
"flex", "flex",
@@ -109,6 +228,7 @@
"min-h-svh", "min-h-svh",
"w-0", "w-0",
"w-0.5", "w-0.5",
"5);",
"w-4", "w-4",
"w-5", "w-5",
"w-8", "w-8",
@@ -118,7 +238,6 @@
"w-24", "w-24",
"w-32", "w-32",
"w-40", "w-40",
"w-56",
"w-64", "w-64",
"w-full", "w-full",
"w-screen", "w-screen",
@@ -145,14 +264,41 @@
"transform", "transform",
"animate-spin", "animate-spin",
"cursor-default", "cursor-default",
"cursor-none",
"cursor-not-allowed", "cursor-not-allowed",
"cursor-pointer", "cursor-pointer",
"list-disc", "list-disc",
"form-select", "form-select",
"5rem;",
"75rem;",
"5rem;",
"75rem;",
"5rem;",
"6%",
"245",
"881);",
"6%",
"245",
"881);",
"w3.org/2000/svg\u0027",
"5\u0027", "5\u0027",
"5rem", "5rem",
"5em", "5em",
"5em;",
"5rem;",
"75rem;",
"form-textarea", "form-textarea",
"5rem;",
"75rem;",
"5rem;",
"75rem;",
"5rem;",
"6%",
"245",
"881);",
"6%",
"245",
"881);",
"grid-flow-col", "grid-flow-col",
"grid-cols-1", "grid-cols-1",
"grid-cols-2", "grid-cols-2",
@@ -173,7 +319,9 @@
"justify-start", "justify-start",
"justify-stretch", "justify-stretch",
"gap-0.5", "gap-0.5",
"5);",
"gap-1.5", "gap-1.5",
"5);",
"gap-2", "gap-2",
"gap-3", "gap-3",
"gap-4", "gap-4",
@@ -184,10 +332,12 @@
"space-y-2", "space-y-2",
"space-y-3", "space-y-3",
"space-y-4", "space-y-4",
"space-y-6",
"space-y-8", "space-y-8",
"gap-x-2", "gap-x-2",
"space-x-0.5", "space-x-0.5",
"5)", "5)",
"5)",
"space-x-1", "space-x-1",
"space-x-2", "space-x-2",
"space-x-5", "space-x-5",
@@ -238,7 +388,10 @@
"bg-gray-900", "bg-gray-900",
"bg-gray-900/75", "bg-gray-900/75",
"bg-gray-950", "bg-gray-950",
"bg-indigo-600",
"bg-info", "bg-info",
"bg-primary",
"bg-red-600",
"bg-success", "bg-success",
"bg-transparent", "bg-transparent",
"bg-warning", "bg-warning",
@@ -265,13 +418,17 @@
"px-6", "px-6",
"py-1", "py-1",
"py-1.5", "py-1.5",
"5);",
"py-2", "py-2",
"py-2.5", "py-2.5",
"5);",
"py-3", "py-3",
"py-6", "py-6",
"py-8", "py-8",
"py-12",
"ps-1", "ps-1",
"pt-0.5", "pt-0.5",
"5);",
"pt-3", "pt-3",
"pt-5", "pt-5",
"pr-3", "pr-3",
@@ -298,10 +455,12 @@
"text-xs", "text-xs",
"text-xs/5", "text-xs/5",
"leading-6", "leading-6",
"leading-9",
"font-bold", "font-bold",
"font-medium", "font-medium",
"font-normal", "font-normal",
"font-semibold", "font-semibold",
"tracking-tight",
"text-danger", "text-danger",
"text-diffcolor", "text-diffcolor",
"text-gray-100", "text-gray-100",
@@ -310,7 +469,6 @@
"text-gray-400", "text-gray-400",
"text-gray-500", "text-gray-500",
"text-gray-600", "text-gray-600",
"text-gray-700",
"text-gray-800", "text-gray-800",
"text-green-500", "text-green-500",
"text-info", "text-info",
@@ -326,12 +484,19 @@
"placeholder-gray-500", "placeholder-gray-500",
"opacity-0", "opacity-0",
"opacity-100", "opacity-100",
"shadow",
"1))",
"1));",
"shadow-lg", "shadow-lg",
"1))", "1))",
"1));", "1));",
"shadow-none", "shadow-none",
"shadow-sm", "shadow-sm",
"1))",
"1));",
"shadow-xl", "shadow-xl",
"1))",
"1));",
"shadow-xs", "shadow-xs",
"05));", "05));",
"ring-1", "ring-1",
@@ -350,11 +515,13 @@
"group-hover:text-gray-500", "group-hover:text-gray-500",
"group):hover", "group):hover",
"hover:border-gray-500", "hover:border-gray-500",
"hover:bg-gray-100",
"hover:bg-gray-600", "hover:bg-gray-600",
"hover:bg-gray-700", "hover:bg-gray-700",
"hover:bg-indigo-500",
"hover:bg-primary", "hover:bg-primary",
"hover:bg-red-500",
"hover:bg-white/5", "hover:bg-white/5",
"hover:text-diffcolor",
"hover:text-gray-100", "hover:text-gray-100",
"hover:text-gray-500", "hover:text-gray-500",
"hover:text-white", "hover:text-white",
@@ -364,6 +531,11 @@
"focus:ring-offset-0", "focus:ring-offset-0",
"focus:ring-offset-2", "focus:ring-offset-2",
"focus:outline-none", "focus:outline-none",
"focus-visible:outline",
"focus-visible:outline-2",
"focus-visible:outline-offset-2",
"focus-visible:outline-indigo-600",
"focus-visible:outline-red-600",
"disabled:cursor-not-allowed", "disabled:cursor-not-allowed",
"disabled:border-gray-200", "disabled:border-gray-200",
"disabled:border-gray-700", "disabled:border-gray-700",
@@ -373,17 +545,20 @@
"disabled:text-gray-600", "disabled:text-gray-600",
"max-lg:hidden", "max-lg:hidden",
"max-lg:flex-col", "max-lg:flex-col",
"sm:mx-auto",
"sm:mt-5", "sm:mt-5",
"sm:mt-6", "sm:mt-6",
"sm:mb-0", "sm:mb-0",
"sm:block", "sm:block",
"sm:flex", "sm:flex",
"sm:w-full",
"sm:max-w-2xl", "sm:max-w-2xl",
"sm:max-w-3xl", "sm:max-w-3xl",
"sm:max-w-4xl", "sm:max-w-4xl",
"sm:max-w-5xl", "sm:max-w-5xl",
"sm:max-w-6xl", "sm:max-w-6xl",
"sm:max-w-7xl", "sm:max-w-7xl",
"sm:max-w-[480px]",
"sm:max-w-lg", "sm:max-w-lg",
"sm:max-w-md", "sm:max-w-md",
"sm:max-w-xl", "sm:max-w-xl",
@@ -392,8 +567,11 @@
"sm:items-end", "sm:items-end",
"sm:justify-between", "sm:justify-between",
"sm:justify-end", "sm:justify-end",
"sm:rounded-lg",
"sm:p-0", "sm:p-0",
"sm:p-6", "sm:p-6",
"sm:px-6",
"sm:px-12",
"sm:py-2", "sm:py-2",
"sm:pb-4", "sm:pb-4",
"sm:text-sm", "sm:text-sm",
@@ -416,11 +594,14 @@
"lg:bg-gray-900/80", "lg:bg-gray-900/80",
"lg:bg-gray-950/80", "lg:bg-gray-950/80",
"lg:p-10", "lg:p-10",
"lg:px-8",
"lg:pt-5", "lg:pt-5",
"lg:pr-3.5", "lg:pr-3.5",
"5);",
"lg:pb-5", "lg:pb-5",
"lg:pl-64", "lg:pl-64",
"lg:shadow-xs", "lg:shadow-xs",
"05));",
"lg:ring-1", "lg:ring-1",
"lg:ring-white/10", "lg:ring-white/10",
"dark:bg-gray-700", "dark:bg-gray-700",
@@ -428,50 +609,39 @@
"dark:text-gray-400", "dark:text-gray-400",
"dark:text-gray-500", "dark:text-gray-500",
"dark:group-hover:text-gray-400", "dark:group-hover:text-gray-400",
"group):hover",
"dark:disabled:border-gray-700", "dark:disabled:border-gray-700",
"dark:disabled:bg-gray-800", "dark:disabled:bg-gray-800",
"dark:disabled:text-gray-600", "dark:disabled:text-gray-600",
"dark:disabled:placeholder:text-gray-600", "dark:disabled:placeholder:text-gray-600",
"btn", "form-input",
"btn-lg", "form-textarea",
"btn-sm", "form-multiselect",
"btn-xs", "form-select",
"form-checkbox",
"form-radio",
"form-checkbox",
"25rem;",
"form-input",
"form-textarea",
"form-multiselect",
"form-select",
"1))", "1))",
"1));", "1));",
"5);", "form-input",
"btn-primary", "form-textarea",
"form-select",
"form-checkbox",
"form-radio",
"511", "511",
"262", "262",
"966)", "966)",
"btn-secondary", "form-switch",
"btn-tertiary", "form-switch",
"627", "form-switch",
"265", "15s",
"9)", "form-switch",
"btn-danger", "form-switch",
"586", "form-switch",
"253", "form-switch"
"585)",
"btn-warning",
"828",
"189",
"429)",
"btn-info",
"546",
"245",
"881)",
"btn-success",
"194",
"214)",
"btn:disabled",
"btn-lg:disabled",
"btn-sm:disabled",
"btn-xs:disabled",
"btn-primary:disabled",
"btn-secondary:disabled",
"btn-tertiary:disabled",
"btn-danger:disabled",
"btn-warning:disabled",
"btn-info:disabled",
"btn-success:disabled"
] ]

View File

@@ -1,6 +1,4 @@
@using Moonlight.Client.UI.Partials @using Moonlight.Client.UI.Partials
@using MoonCore.Blazor.Tailwind.Toasts
@using MoonCore.Blazor.Tailwind.Modals
@inherits LayoutComponentBase @inherits LayoutComponentBase

View File

@@ -1,4 +1,6 @@
@using Microsoft.AspNetCore.Components.Authorization @using System.Security.Claims
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using MoonCore.Blazor.Tailwind.Auth @using MoonCore.Blazor.Tailwind.Auth
@using Moonlight.Client.Interfaces @using Moonlight.Client.Interfaces
@using Moonlight.Client.Models @using Moonlight.Client.Models
@@ -8,6 +10,7 @@
@inject NavigationManager Navigation @inject NavigationManager Navigation
@inject AuthenticationStateManager AuthStateManager @inject AuthenticationStateManager AuthStateManager
@inject IEnumerable<ISidebarItemProvider> SidebarItemProviders @inject IEnumerable<ISidebarItemProvider> SidebarItemProviders
@inject IAuthorizationService AuthorizationService
@{ @{
var url = new Uri(Navigation.Uri); var url = new Uri(Navigation.Uri);
@@ -201,29 +204,45 @@
private string Username; private string Username;
private string Email; private string Email;
private ClaimsPrincipal Identity;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
var identity = await AuthState; var authState = await AuthState;
Username = identity.User.Claims.First(x => x.Type == "username").Value; Identity = authState.User;
Email = identity.User.Claims.First(x => x.Type == "email").Value; Username = Identity.Claims.First(x => x.Type == "username").Value;
} Email = Identity.Claims.First(x => x.Type == "email").Value;
protected override void OnInitialized()
{
var sidebarItems = new List<SidebarItem>(); var sidebarItems = new List<SidebarItem>();
foreach (var provider in SidebarItemProviders) foreach (var provider in SidebarItemProviders)
provider.ModifySidebar(sidebarItems); provider.ModifySidebar(sidebarItems);
var itemsToRemove = new List<SidebarItem>();
foreach (var sidebarItem in sidebarItems)
{
if(string.IsNullOrEmpty(sidebarItem.Policy))
continue;
var authResult = await AuthorizationService.AuthorizeAsync(Identity, sidebarItem.Policy);
if(authResult.Succeeded)
continue;
itemsToRemove.Add(sidebarItem);
}
foreach (var sidebarItem in itemsToRemove)
sidebarItems.Remove(sidebarItem);
Items = sidebarItems Items = sidebarItems
//.Where(x => x.Permission == null || (x.Permission != null && IdentityService.HasPermission(x.Permission)))
.GroupBy(x => x.Group ?? "") .GroupBy(x => x.Group ?? "")
.OrderByDescending(x => string.IsNullOrEmpty(x.Key)) .OrderByDescending(x => string.IsNullOrEmpty(x.Key))
.ToDictionary(x => x.Key, x => x.OrderBy(y => y.Priority).ToArray()); .ToDictionary(x => x.Key, x => x.OrderBy(y => y.Priority).ToArray());
} }
protected override Task OnAfterRenderAsync(bool firstRender) protected override Task OnAfterRenderAsync(bool firstRender)
{ {
if (!firstRender) if (!firstRender)

View File

@@ -1,9 +1,9 @@
@page "/admin/system/advanced" @page "/admin/system/advanced"
@using MoonCore.Attributes @using Microsoft.AspNetCore.Authorization
@using MoonCore.Helpers @using MoonCore.Helpers
@attribute [RequirePermission("admin.system.advanced")] @attribute [Authorize(Policy = "permissions:admin.system.advanced")]
@inject HttpApiClient ApiClient @inject HttpApiClient ApiClient
@inject DownloadService DownloadService @inject DownloadService DownloadService

View File

@@ -1,11 +1,11 @@
@page "/admin/system/diagnose" @page "/admin/system/diagnose"
@using MoonCore.Attributes @using Microsoft.AspNetCore.Authorization
@using MoonCore.Helpers @using MoonCore.Helpers
@using Moonlight.Shared.Http.Requests.Admin.Sys @using Moonlight.Shared.Http.Requests.Admin.Sys
@using Moonlight.Shared.Http.Responses.Admin.Sys @using Moonlight.Shared.Http.Responses.Admin.Sys
@attribute [RequirePermission("admin.system.diagnose")] @attribute [Authorize(Policy = "permissions:admin.system.diagnose")]
@inject HttpApiClient ApiClient @inject HttpApiClient ApiClient
@inject DownloadService DownloadService @inject DownloadService DownloadService

View File

@@ -1,12 +1,12 @@
@page "/admin/system/files" @page "/admin/system/files"
@using MoonCore.Attributes @using Microsoft.AspNetCore.Authorization
@using MoonCore.Blazor.Services @using MoonCore.Blazor.Services
@using MoonCore.Helpers @using MoonCore.Helpers
@using MoonCore.Blazor.Tailwind.Fm @using MoonCore.Blazor.Tailwind.Fm
@using Moonlight.Client.Implementations @using Moonlight.Client.Implementations
@attribute [RequirePermission("admin.system.overview")] @attribute [Authorize(Policy = "permissions:admin.system.overview")]
@inject HttpApiClient ApiClient @inject HttpApiClient ApiClient
@inject DownloadService DownloadService @inject DownloadService DownloadService

View File

@@ -1,11 +1,11 @@
@page "/admin/system/hangfire" @page "/admin/system/hangfire"
@using MoonCore.Attributes @using Microsoft.AspNetCore.Authorization
@using MoonCore.Helpers @using MoonCore.Helpers
@using Moonlight.Shared.Http.Responses.Admin.Hangfire @using Moonlight.Shared.Http.Responses.Admin.Hangfire
@using Moonlight.Client.UI.Components @using Moonlight.Client.UI.Components
@attribute [RequirePermission("admin.system.hangfire")] @attribute [Authorize(Policy = "permissions:admin.system.hangfire")]
@inject HttpApiClient ApiClient @inject HttpApiClient ApiClient

View File

@@ -1,11 +1,11 @@
@page "/admin/system" @page "/admin/system"
@using MoonCore.Attributes @using Microsoft.AspNetCore.Authorization
@using MoonCore.Helpers @using MoonCore.Helpers
@using Moonlight.Client.UI.Components @using Moonlight.Client.UI.Components
@using Moonlight.Shared.Http.Responses.Admin.Sys @using Moonlight.Shared.Http.Responses.Admin.Sys
@attribute [RequirePermission("admin.system.overview")] @attribute [Authorize(Policy = "permissions:admin.system.overview")]
@inject HttpApiClient ApiClient @inject HttpApiClient ApiClient

View File

@@ -1,9 +1,9 @@
@page "/admin/system/theme" @page "/admin/system/theme"
@using MoonCore.Attributes @using Microsoft.AspNetCore.Authorization
@using Moonlight.Client.UI.Partials.Design @using Moonlight.Client.UI.Partials.Design
@attribute [RequirePermission("admin.system.theme")] @attribute [Authorize(Policy = "permissions:admin.system.theme")]
<div class="mb-5"> <div class="mb-5">
<NavTabs Index="1" Names="UiConstants.AdminNavNames" Links="UiConstants.AdminNavLinks" /> <NavTabs Index="1" Names="UiConstants.AdminNavNames" Links="UiConstants.AdminNavLinks" />

View File

@@ -11,4 +11,11 @@
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.13.0" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.13.0" />
<PackageReference Include="MoonCore" Version="1.8.6" /> <PackageReference Include="MoonCore" Version="1.8.6" />
</ItemGroup> </ItemGroup>
<PropertyGroup>
<PackageId>dotnet-moonlight</PackageId>
<Title>dotnet-moonlight</Title>
<PackAsTool>true</PackAsTool>
<ToolCommandName>dotnet-moonlight</ToolCommandName>
</PropertyGroup>
</Project> </Project>