From 53bdb91e59447dda6f2185e8c32b64924122ed6e Mon Sep 17 00:00:00 2001 From: Matthew Knox Date: Sat, 6 Dec 2025 14:13:48 +1100 Subject: [PATCH] Fix deprecation warnings --- Dockerfile | 4 +- .../Auth/AuthenticationValidatorTest.cs | 24 ++++----- backend/PlexSSO/Program.cs | 51 ++++++++++--------- backend/PlexSSO/Startup.cs | 3 +- 4 files changed, 42 insertions(+), 40 deletions(-) diff --git a/Dockerfile b/Dockerfile index d1aab8b..c560114 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,9 @@ FROM node:current-alpine as react-builder COPY ./ui /ui WORKDIR /ui -RUN corepack yarn && \ +RUN rm /usr/local/bin/yarn* && \ + npm install -g corepack@latest && \ + corepack yarn && \ corepack yarn build FROM mcr.microsoft.com/dotnet/sdk:10.0 as aspnet-builder diff --git a/backend/PlexSSO.Test/Service/Auth/AuthenticationValidatorTest.cs b/backend/PlexSSO.Test/Service/Auth/AuthenticationValidatorTest.cs index 863765d..10d9438 100644 --- a/backend/PlexSSO.Test/Service/Auth/AuthenticationValidatorTest.cs +++ b/backend/PlexSSO.Test/Service/Auth/AuthenticationValidatorTest.cs @@ -78,7 +78,7 @@ public void Validate_WithNoAccess_CustomControl_ReturnsCustomisedAccessDeniedMes var serviceName = new ServiceName(_config!.AccessControls.Keys.First()); var serviceUri = new ServiceUri("/"); - _config.AccessControls[serviceName.Value].First().BlockMessage = "Test Access Denied Message"; + _config!.AccessControls[serviceName.Value].First().BlockMessage = "Test Access Denied Message"; var result = validator.ValidateAuthenticationStatus(identity, serviceName, serviceUri); @@ -88,7 +88,7 @@ public void Validate_WithNoAccess_CustomControl_ReturnsCustomisedAccessDeniedMes blocked: true, accessTier: AccessTier.NoAccess, status: 403, - message: _config.AccessControls.Values.First().First().BlockMessage + message: _config!.AccessControls.Values.First().First().BlockMessage )); } @@ -101,8 +101,8 @@ public void Validate_WithExemptAccess_CustomControl_IsAllowed() var serviceName = new ServiceName(_config!.AccessControls.Keys.First()); var serviceUri = new ServiceUri("/"); - _config.AccessControls[serviceName.Value].First().BlockMessage = "Test Access Denied Message"; - _config.AccessControls[serviceName.Value].First().Exempt = [username]; + _config!.AccessControls[serviceName.Value].First().BlockMessage = "Test Access Denied Message"; + _config!.AccessControls[serviceName.Value].First().Exempt = [username]; var result = validator.ValidateAuthenticationStatus(identity, serviceName, serviceUri); @@ -132,7 +132,7 @@ public void Validate_WithNoAccess_DefaultControl_ReturnsCustomisedAccessDeniedMe blocked: true, accessTier: AccessTier.NoAccess, status: 403, - message: _config.DefaultAccessDeniedMessage + message: _config!.DefaultAccessDeniedMessage )); } @@ -191,13 +191,13 @@ public void Validate_WithAccess_CustomBlockControl_IsAllowed(AccessTier[] blocke AccessTier[] allowedAccessTiers) { // NoAccess is permanently blocked - AccessTier[] allBlockedAccessTiers = [.. blockedAccessTiers, AccessTier.NoAccess]; + var allBlockedAccessTiers = blockedAccessTiers.Concat([AccessTier.NoAccess]).ToArray(); var validator = CreateValidator(); var serviceName = new ServiceName("status"); var serviceUri = new ServiceUri("/"); - _config.AccessControls = new Dictionary() + _config!.AccessControls = new Dictionary() { { "status", new[] @@ -223,7 +223,7 @@ public void Validate_WithAccess_CustomBlockControl_IsAllowed(AccessTier[] blocke blocked: true, accessTier: AccessTier.NoAccess, status: 403, - message: _config.AccessControls.Values.First().First().BlockMessage + message: _config!.AccessControls.Values.First().First().BlockMessage )); } @@ -253,13 +253,13 @@ public void Validate_WithAccess_CustomAllowControl_IsAllowed(AccessTier[] allowe AccessTier[] blockedAccessTiers) { // NoAccess are permanently blocked - AccessTier[] allBlockedAccessTiers = [.. blockedAccessTiers, AccessTier.NoAccess]; + var allBlockedAccessTiers = blockedAccessTiers.Concat([AccessTier.NoAccess]).ToArray(); var validator = CreateValidator(); var serviceName = new ServiceName("status"); var serviceUri = new ServiceUri("/"); - _config.AccessControls = new Dictionary() + _config!.AccessControls = new Dictionary() { { "status", new[] @@ -286,8 +286,8 @@ public void Validate_WithAccess_CustomAllowControl_IsAllowed(AccessTier[] allowe accessTier: AccessTier.NoAccess, status: 403, message: blockedAccessTier == AccessTier.NoAccess - ? _config.DefaultAccessDeniedMessage - : _config.AccessControls.Values.First().First().BlockMessage + ? _config!.DefaultAccessDeniedMessage + : _config!.AccessControls.Values.First().First().BlockMessage )); } diff --git a/backend/PlexSSO/Program.cs b/backend/PlexSSO/Program.cs index 92a15dc..45ed763 100644 --- a/backend/PlexSSO/Program.cs +++ b/backend/PlexSSO/Program.cs @@ -1,35 +1,36 @@ +using System; using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; using PlexSSO.Extensions; using PlexSSO.Model; using PlexSSO.Model.Internal; using PlexSSO.Service.HealthCheck; +using PlexSSO; -namespace PlexSSO -{ - public class Program - { - public static async Task Main(string[] args) - { - if (args.Contains("--healthcheck")) - { - await HealthChecker.CheckHealth($"http://127.0.0.1:{Constants.PortNumber}{Constants.HealthcheckPath}"); - return; - } +// Top-level statements - minimal hosting model +var argsList = args ?? []; - WebHost.CreateDefaultBuilder(args) - .ConfigureAppConfiguration((hostingContext, config) => - { - config.AddCommandLine(args, typeof(PlexSsoConfig).GetAnnotatedCliArgumentsAsDictionary()); - }) - .ConfigureKestrel((context, options) => options.AddServerHeader = false) - .UseStartup() - .UseUrls($"http://0.0.0.0:{Constants.PortNumber}/") - .Build() - .Run(); - } - } +if (argsList.Contains("--healthcheck")) +{ + await HealthChecker.CheckHealth($"http://127.0.0.1:{Constants.PortNumber}{Constants.HealthcheckPath}"); + return; } + +var builder = WebApplication.CreateBuilder(args); + +// Allow CLI args to map to our annotated config +builder.Configuration.AddCommandLine(argsList, typeof(PlexSsoConfig).GetAnnotatedCliArgumentsAsDictionary()); + +// Configure web host to use Startup for separation of concerns +builder.Host.ConfigureWebHostDefaults(webBuilder => +{ + webBuilder.ConfigureKestrel((context, options) => options.AddServerHeader = false); + webBuilder.UseUrls($"http://0.0.0.0:{Constants.PortNumber}/"); + webBuilder.UseStartup(); +}); + +var host = builder.Build(); +await host.RunAsync(); diff --git a/backend/PlexSSO/Startup.cs b/backend/PlexSSO/Startup.cs index 0922a50..79735af 100644 --- a/backend/PlexSSO/Startup.cs +++ b/backend/PlexSSO/Startup.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Text.Json.Serialization; using Microsoft.AspNetCore.Antiforgery; @@ -86,7 +85,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAntifor app.Use((context, next) => { var tokens = antiForgery.GetAndStoreTokens(context); context.Response.Cookies.Append(Constants.CsrfHeaderName, tokens.RequestToken, new CookieOptions { HttpOnly = false }); - context.Response.Headers.TryAdd(Constants.PoweredByHeaderName, Constants.PoweredByHeaderValue); + context.Response.Headers.Append(Constants.PoweredByHeaderName, Constants.PoweredByHeaderValue); return next.Invoke(); }); app.UseStaticFiles();