From b598e86044cd6b514c60499827443835547c8ebb Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Thu, 13 Nov 2025 20:02:50 +0100 Subject: [PATCH 01/20] Upgrade AliasVault.Admin to .NET 10 (#1353) --- .../AliasVault.Admin/AliasVault.Admin.csproj | 14 +++++----- .../AliasVault.Admin/Auth/Pages/Login.razor | 2 +- .../Auth/Pages/LoginWith2fa.razor | 2 +- .../Auth/Pages/LoginWithRecoveryCode.razor | 2 +- apps/server/AliasVault.Admin/Dockerfile | 4 +-- .../Pages/Account/Manage/ChangePassword.razor | 2 +- .../Account/Manage/EnableAuthenticator.razor | 2 +- apps/server/AliasVault.Admin/Program.cs | 2 +- .../AliasVault.Api/AliasVault.Api.csproj | 6 ++--- .../AliasVault.Client.csproj | 22 ++++++++-------- .../AliasClientDb/AliasClientDb.csproj | 22 ++++++++-------- .../AliasServerDb/AliasServerDb.csproj | 26 ++++++++++--------- .../AliasVault.SmtpService.csproj | 10 +++---- .../AliasVault.TaskRunner.csproj | 10 +++---- .../AliasVault.RazorComponents.csproj | 10 +++---- .../AliasVault.Shared.Core.csproj | 8 +++--- .../AliasVault.Shared.Server.csproj | 6 ++--- .../AliasVault.Shared.csproj | 8 +++--- .../AliasVault.E2ETests.csproj | 10 +++---- .../AliasVault.IntegrationTests.csproj | 8 +++--- .../AliasVault.UnitTests.csproj | 8 +++--- .../AliasVault.E2ETests.Client.Server.csproj | 6 ++--- .../AliasVault.Auth/AliasVault.Auth.csproj | 8 +++--- .../AliasVault.FaviconExtractor.csproj | 10 +++---- .../AliasVault.ImportExport.csproj | 4 +-- .../AliasVault.InstallCli.csproj | 8 +++--- .../AliasVault.Logging.csproj | 16 ++++++------ .../AliasVault.TotpGenerator.csproj | 8 +++--- .../AliasVault.WorkerStatus.csproj | 12 ++++----- .../AliasVault.Cryptography.Client.csproj | 8 +++--- .../AliasVault.Cryptography.Server.csproj | 8 +++--- 31 files changed, 137 insertions(+), 135 deletions(-) diff --git a/apps/server/AliasVault.Admin/AliasVault.Admin.csproj b/apps/server/AliasVault.Admin/AliasVault.Admin.csproj index 86e63f39f..b12c24b40 100644 --- a/apps/server/AliasVault.Admin/AliasVault.Admin.csproj +++ b/apps/server/AliasVault.Admin/AliasVault.Admin.csproj @@ -1,29 +1,29 @@ - net9.0 + net10.0 enable enable aspnet-AliasVault.Admin-1DAADE35-C01B-43BB-B440-AA5E1E0B672D Linux - 1701;1702;NU1900 - 13 + 1701;1702;NU1900;NU1903 + 14 - bin\Debug\net9.0\AliasVault.Admin.xml + bin\Debug\net10.0\AliasVault.Admin.xml true - bin\Release\net9.0\AliasVault.Admin.xml + bin\Release\net10.0\AliasVault.Admin.xml true - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/AliasVault.Admin/Auth/Pages/Login.razor b/apps/server/AliasVault.Admin/Auth/Pages/Login.razor index 73c3f6795..9b334063a 100644 --- a/apps/server/AliasVault.Admin/Auth/Pages/Login.razor +++ b/apps/server/AliasVault.Admin/Auth/Pages/Login.razor @@ -69,7 +69,7 @@ else @code { [CascadingParameter] private HttpContext HttpContext { get; set; } = default!; - [SupplyParameterFromForm] private InputModel Input { get; set; } = new(); + [SupplyParameterFromForm] private InputModel Input { get; set; } = default!; [SupplyParameterFromQuery] private string? ReturnUrl { get; set; } diff --git a/apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor b/apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor index 08860cf2b..5e4384ed3 100644 --- a/apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor +++ b/apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor @@ -41,7 +41,7 @@ private AdminUser user = default!; [SupplyParameterFromForm] - private InputModel Input { get; set; } = new(); + private InputModel Input { get; set; } = default!; [SupplyParameterFromQuery] private string? ReturnUrl { get; set; } diff --git a/apps/server/AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor b/apps/server/AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor index 6c770ccf3..c97ee9552 100644 --- a/apps/server/AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor +++ b/apps/server/AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor @@ -29,7 +29,7 @@ @code { private AdminUser user = default!; - [SupplyParameterFromForm] private InputModel Input { get; set; } = new(); + [SupplyParameterFromForm] private InputModel Input { get; set; } = default!; [SupplyParameterFromQuery] private string? ReturnUrl { get; set; } diff --git a/apps/server/AliasVault.Admin/Dockerfile b/apps/server/AliasVault.Admin/Dockerfile index db2fd9f08..118b2835a 100644 --- a/apps/server/AliasVault.Admin/Dockerfile +++ b/apps/server/AliasVault.Admin/Dockerfile @@ -1,8 +1,8 @@ -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base WORKDIR /app EXPOSE 3002 -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /src diff --git a/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor b/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor index 90cb93453..5c78b904b 100644 --- a/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor +++ b/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor @@ -36,7 +36,7 @@ @code { [CascadingParameter] private HttpContext HttpContext { get; set; } = default!; - [SupplyParameterFromForm] private InputModel Input { get; set; } = new(); + [SupplyParameterFromForm] private InputModel Input { get; set; } = default!; private async Task OnValidSubmitAsync() { diff --git a/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/EnableAuthenticator.razor b/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/EnableAuthenticator.razor index f322c41c9..d9b6053ed 100644 --- a/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/EnableAuthenticator.razor +++ b/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/EnableAuthenticator.razor @@ -77,7 +77,7 @@ else private IEnumerable? RecoveryCodes { get; set; } private bool _isLoading = true; - [SupplyParameterFromForm] private InputModel Input { get; set; } = new(); + [SupplyParameterFromForm] private InputModel Input { get; set; } = default!; /// protected override async Task OnAfterRenderAsync(bool firstRender) diff --git a/apps/server/AliasVault.Admin/Program.cs b/apps/server/AliasVault.Admin/Program.cs index 3a54a66b5..921575aa0 100644 --- a/apps/server/AliasVault.Admin/Program.cs +++ b/apps/server/AliasVault.Admin/Program.cs @@ -126,7 +126,7 @@ var forwardedHeadersOptions = new ForwardedHeadersOptions ForwardedHostHeaderName = "X-Forwarded-Host", ForwardedForHeaderName = "X-Forwarded-For", }; -forwardedHeadersOptions.KnownNetworks.Clear(); +forwardedHeadersOptions.KnownIPNetworks.Clear(); forwardedHeadersOptions.KnownProxies.Clear(); app.UseForwardedHeaders(forwardedHeadersOptions); diff --git a/apps/server/AliasVault.Api/AliasVault.Api.csproj b/apps/server/AliasVault.Api/AliasVault.Api.csproj index eb548fb5b..68ee8e797 100644 --- a/apps/server/AliasVault.Api/AliasVault.Api.csproj +++ b/apps/server/AliasVault.Api/AliasVault.Api.csproj @@ -1,14 +1,14 @@ - net9.0 + net10.0 enable enable AliasVault.Api Linux True $(DefineConstants);E2ETEST - 13 + 14 @@ -22,7 +22,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/AliasVault.Client/AliasVault.Client.csproj b/apps/server/AliasVault.Client/AliasVault.Client.csproj index 17954128c..ef8c3cf3b 100644 --- a/apps/server/AliasVault.Client/AliasVault.Client.csproj +++ b/apps/server/AliasVault.Client/AliasVault.Client.csproj @@ -1,25 +1,25 @@ AliasVault.Client - net9.0 + net10.0 enable enable Linux $([System.DateTime]::UtcNow.ToString("yyyy-MM-dd HH:mm:ss")) true - 13 + 14 true - bin\Debug\net9.0\AliasVault.Client.xml + bin\Debug\net10.0\AliasVault.Client.xml true dev false - bin\Release\net9.0\AliasVault.Client.xml + bin\Release\net10.0\AliasVault.Client.xml true True $([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss")) @@ -52,13 +52,13 @@ - - - - - - - + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Databases/AliasClientDb/AliasClientDb.csproj b/apps/server/Databases/AliasClientDb/AliasClientDb.csproj index 9752281e0..18063e852 100644 --- a/apps/server/Databases/AliasClientDb/AliasClientDb.csproj +++ b/apps/server/Databases/AliasClientDb/AliasClientDb.csproj @@ -1,33 +1,33 @@  - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\AliasClientDb.xml + bin\Debug\net10.0\AliasClientDb.xml true true - bin\Release\net9.0\AliasClientDb.xml + bin\Release\net10.0\AliasClientDb.xml - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Databases/AliasServerDb/AliasServerDb.csproj b/apps/server/Databases/AliasServerDb/AliasServerDb.csproj index 1ad0bf84b..cd7999794 100644 --- a/apps/server/Databases/AliasServerDb/AliasServerDb.csproj +++ b/apps/server/Databases/AliasServerDb/AliasServerDb.csproj @@ -1,35 +1,37 @@ - net9.0 + net10.0 enable enable True - 13 + 14 true + NU1903 true + NU1903 - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj b/apps/server/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj index ee57b142c..ba15a95bc 100644 --- a/apps/server/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj +++ b/apps/server/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj @@ -1,23 +1,23 @@ - net9.0 + net10.0 enable enable dotnet-AliasVault.SmtpService-eaac287e-32a7-4ff9-bbf9-1925c446ef73 Linux ..\..\.. - 13 + 14 true - bin\Debug\net9.0\AliasVault.SmtpService.xml + bin\Debug\net10.0\AliasVault.SmtpService.xml true - bin\Release\net9.0\AliasVault.SmtpService.xml + bin\Release\net10.0\AliasVault.SmtpService.xml @@ -25,7 +25,7 @@ - + diff --git a/apps/server/Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj b/apps/server/Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj index 83ba844ea..57d5a8469 100644 --- a/apps/server/Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj +++ b/apps/server/Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj @@ -1,23 +1,23 @@ - net9.0 + net10.0 enable enable dotnet-AliasVault.TaskRunner-eaac287e-32a7-4ff9-bbf9-1925c446ef73 Linux ..\..\.. - 13 + 14 true - bin\Debug\net9.0\AliasVault.TaskRunner.xml + bin\Debug\net10.0\AliasVault.TaskRunner.xml true - bin\Release\net9.0\AliasVault.TaskRunner.xml + bin\Release\net10.0\AliasVault.TaskRunner.xml @@ -25,7 +25,7 @@ - + all diff --git a/apps/server/Shared/AliasVault.RazorComponents/AliasVault.RazorComponents.csproj b/apps/server/Shared/AliasVault.RazorComponents/AliasVault.RazorComponents.csproj index ce71c9797..e17bf32c0 100644 --- a/apps/server/Shared/AliasVault.RazorComponents/AliasVault.RazorComponents.csproj +++ b/apps/server/Shared/AliasVault.RazorComponents/AliasVault.RazorComponents.csproj @@ -1,19 +1,19 @@ - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\AliasVault.RazorComponents.xml + bin\Debug\net10.0\AliasVault.RazorComponents.xml true - bin\Release\net9.0\AliasVault.RazorComponents.xml + bin\Release\net10.0\AliasVault.RazorComponents.xml true @@ -23,7 +23,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Shared/AliasVault.Shared.Core/AliasVault.Shared.Core.csproj b/apps/server/Shared/AliasVault.Shared.Core/AliasVault.Shared.Core.csproj index 3847acece..c5b025f95 100644 --- a/apps/server/Shared/AliasVault.Shared.Core/AliasVault.Shared.Core.csproj +++ b/apps/server/Shared/AliasVault.Shared.Core/AliasVault.Shared.Core.csproj @@ -1,19 +1,19 @@  - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\AliasVault.Shared.Core.xml + bin\Debug\net10.0\AliasVault.Shared.Core.xml true - bin\Release\net9.0\AliasVault.Shared.Core.xml + bin\Release\net10.0\AliasVault.Shared.Core.xml true diff --git a/apps/server/Shared/AliasVault.Shared.Server/AliasVault.Shared.Server.csproj b/apps/server/Shared/AliasVault.Shared.Server/AliasVault.Shared.Server.csproj index 54233aa2e..ff6aed68f 100644 --- a/apps/server/Shared/AliasVault.Shared.Server/AliasVault.Shared.Server.csproj +++ b/apps/server/Shared/AliasVault.Shared.Server/AliasVault.Shared.Server.csproj @@ -1,18 +1,18 @@  - net9.0 + net10.0 enable enable - bin\Debug\net9.0\AliasVault.Shared.Server.xml + bin\Debug\net10.0\AliasVault.Shared.Server.xml true - bin\Release\net9.0\AliasVault.Shared.Server.xml + bin\Release\net10.0\AliasVault.Shared.Server.xml true diff --git a/apps/server/Shared/AliasVault.Shared/AliasVault.Shared.csproj b/apps/server/Shared/AliasVault.Shared/AliasVault.Shared.csproj index 6ce68f970..28fcbac44 100644 --- a/apps/server/Shared/AliasVault.Shared/AliasVault.Shared.csproj +++ b/apps/server/Shared/AliasVault.Shared/AliasVault.Shared.csproj @@ -1,19 +1,19 @@ - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\AliasVault.Shared.xml + bin\Debug\net10.0\AliasVault.Shared.xml true - bin\Release\net9.0\AliasVault.Shared.xml + bin\Release\net10.0\AliasVault.Shared.xml true diff --git a/apps/server/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj b/apps/server/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj index 9c679aac8..51b21af6b 100644 --- a/apps/server/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj +++ b/apps/server/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj @@ -1,23 +1,23 @@ - net9.0 + net10.0 enable enable false true - 13 + 14 true - bin\Debug\net9.0\AliasVault.E2ETests.xml + bin\Debug\net10.0\AliasVault.E2ETests.xml TRACE true - bin\Release\net9.0\AliasVault.E2ETests.xml + bin\Release\net10.0\AliasVault.E2ETests.xml TRACE @@ -30,7 +30,7 @@ - + diff --git a/apps/server/Tests/AliasVault.IntegrationTests/AliasVault.IntegrationTests.csproj b/apps/server/Tests/AliasVault.IntegrationTests/AliasVault.IntegrationTests.csproj index 231dc9994..e80e2683b 100644 --- a/apps/server/Tests/AliasVault.IntegrationTests/AliasVault.IntegrationTests.csproj +++ b/apps/server/Tests/AliasVault.IntegrationTests/AliasVault.IntegrationTests.csproj @@ -1,21 +1,21 @@ - net9.0 + net10.0 enable enable false true - 13 + 14 - bin\Debug\net9.0\AliasVault.IntegrationTests.xml + bin\Debug\net10.0\AliasVault.IntegrationTests.xml true - bin\Release\net9.0\AliasVault.IntegrationTests.xml + bin\Release\net10.0\AliasVault.IntegrationTests.xml true diff --git a/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj b/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj index 06ad64f40..a50651def 100644 --- a/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj +++ b/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj @@ -1,23 +1,23 @@ - net9.0 + net10.0 enable enable false true AliasVault.UnitTests - 13 + 14 true - bin\Debug\net9.0\AliasVault.UnitTests.xml + bin\Debug\net10.0\AliasVault.UnitTests.xml true - bin\Release\net9.0\AliasVault.UnitTests.xml + bin\Release\net10.0\AliasVault.UnitTests.xml diff --git a/apps/server/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj b/apps/server/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj index ba2e9f0aa..d008f60de 100644 --- a/apps/server/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj +++ b/apps/server/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj @@ -1,14 +1,14 @@ - net9.0 + net10.0 enable enable - 13 + 14 - + diff --git a/apps/server/Utilities/AliasVault.Auth/AliasVault.Auth.csproj b/apps/server/Utilities/AliasVault.Auth/AliasVault.Auth.csproj index a97f6b16d..35e8add24 100644 --- a/apps/server/Utilities/AliasVault.Auth/AliasVault.Auth.csproj +++ b/apps/server/Utilities/AliasVault.Auth/AliasVault.Auth.csproj @@ -1,19 +1,19 @@  - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\AliasVault.AuthLogging.xml + bin\Debug\net10.0\AliasVault.AuthLogging.xml true - bin\Release\net9.0\AliasVault.AuthLogging.xml + bin\Release\net10.0\AliasVault.AuthLogging.xml true diff --git a/apps/server/Utilities/AliasVault.FaviconExtractor/AliasVault.FaviconExtractor.csproj b/apps/server/Utilities/AliasVault.FaviconExtractor/AliasVault.FaviconExtractor.csproj index 6f1d6e002..6854c0a2e 100644 --- a/apps/server/Utilities/AliasVault.FaviconExtractor/AliasVault.FaviconExtractor.csproj +++ b/apps/server/Utilities/AliasVault.FaviconExtractor/AliasVault.FaviconExtractor.csproj @@ -1,20 +1,20 @@ - net9.0 + net10.0 enable enable - 13 + 14 true - bin\Debug\net9.0\FaviconExtractor.xml + bin\Debug\net10.0\FaviconExtractor.xml true - bin\Release\net9.0\FaviconExtractor.xml + bin\Release\net10.0\FaviconExtractor.xml @@ -29,7 +29,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/apps/server/Utilities/AliasVault.ImportExport/AliasVault.ImportExport.csproj b/apps/server/Utilities/AliasVault.ImportExport/AliasVault.ImportExport.csproj index c86d4044d..d4a3ce15e 100644 --- a/apps/server/Utilities/AliasVault.ImportExport/AliasVault.ImportExport.csproj +++ b/apps/server/Utilities/AliasVault.ImportExport/AliasVault.ImportExport.csproj @@ -1,10 +1,10 @@  - net9.0 + net10.0 enable enable - 13 + 14 diff --git a/apps/server/Utilities/AliasVault.InstallCli/AliasVault.InstallCli.csproj b/apps/server/Utilities/AliasVault.InstallCli/AliasVault.InstallCli.csproj index 727100b73..4974a71ee 100644 --- a/apps/server/Utilities/AliasVault.InstallCli/AliasVault.InstallCli.csproj +++ b/apps/server/Utilities/AliasVault.InstallCli/AliasVault.InstallCli.csproj @@ -2,19 +2,19 @@ Exe - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\AliasVault.InstallCli.xml + bin\Debug\net10.0\AliasVault.InstallCli.xml true - bin\Release\net9.0\AliasVault.InstallCli.xml + bin\Release\net10.0\AliasVault.InstallCli.xml true diff --git a/apps/server/Utilities/AliasVault.Logging/AliasVault.Logging.csproj b/apps/server/Utilities/AliasVault.Logging/AliasVault.Logging.csproj index a6271cd35..adec154d6 100644 --- a/apps/server/Utilities/AliasVault.Logging/AliasVault.Logging.csproj +++ b/apps/server/Utilities/AliasVault.Logging/AliasVault.Logging.csproj @@ -1,27 +1,27 @@  - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\AliasVault.Logging.xml + bin\Debug\net10.0\AliasVault.Logging.xml true - bin\Release\net9.0\AliasVault.Logging.xml + bin\Release\net10.0\AliasVault.Logging.xml true - - - - + + + + diff --git a/apps/server/Utilities/AliasVault.TotpGenerator/AliasVault.TotpGenerator.csproj b/apps/server/Utilities/AliasVault.TotpGenerator/AliasVault.TotpGenerator.csproj index 5939d06b2..69a9ae127 100644 --- a/apps/server/Utilities/AliasVault.TotpGenerator/AliasVault.TotpGenerator.csproj +++ b/apps/server/Utilities/AliasVault.TotpGenerator/AliasVault.TotpGenerator.csproj @@ -1,20 +1,20 @@  - net9.0 + net10.0 enable enable - 13 + 14 true - bin\Debug\net9.0\TotpGenerator.xml + bin\Debug\net10.0\TotpGenerator.xml true - bin\Release\net9.0\TotpGenerator.xml + bin\Release\net10.0\TotpGenerator.xml diff --git a/apps/server/Utilities/AliasVault.WorkerStatus/AliasVault.WorkerStatus.csproj b/apps/server/Utilities/AliasVault.WorkerStatus/AliasVault.WorkerStatus.csproj index 2083f312b..a7bc28436 100644 --- a/apps/server/Utilities/AliasVault.WorkerStatus/AliasVault.WorkerStatus.csproj +++ b/apps/server/Utilities/AliasVault.WorkerStatus/AliasVault.WorkerStatus.csproj @@ -1,18 +1,18 @@  - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\AliasVault.WorkerStatus.xml + bin\Debug\net10.0\AliasVault.WorkerStatus.xml - bin\Release\net9.0\AliasVault.WorkerStatus.xml + bin\Release\net10.0\AliasVault.WorkerStatus.xml @@ -22,8 +22,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Utilities/Cryptography/AliasVault.Cryptography.Client/AliasVault.Cryptography.Client.csproj b/apps/server/Utilities/Cryptography/AliasVault.Cryptography.Client/AliasVault.Cryptography.Client.csproj index a7558bc73..56c1a10eb 100644 --- a/apps/server/Utilities/Cryptography/AliasVault.Cryptography.Client/AliasVault.Cryptography.Client.csproj +++ b/apps/server/Utilities/Cryptography/AliasVault.Cryptography.Client/AliasVault.Cryptography.Client.csproj @@ -1,19 +1,19 @@  - net9.0 + net10.0 enable enable - 13 + 14 - bin\Debug\net9.0\CryptographyClient.xml + bin\Debug\net10.0\CryptographyClient.xml true - bin\Release\net9.0\CryptographyClient.xml + bin\Release\net10.0\CryptographyClient.xml true diff --git a/apps/server/Utilities/Cryptography/AliasVault.Cryptography.Server/AliasVault.Cryptography.Server.csproj b/apps/server/Utilities/Cryptography/AliasVault.Cryptography.Server/AliasVault.Cryptography.Server.csproj index a9f739cf3..fa7a68f0d 100644 --- a/apps/server/Utilities/Cryptography/AliasVault.Cryptography.Server/AliasVault.Cryptography.Server.csproj +++ b/apps/server/Utilities/Cryptography/AliasVault.Cryptography.Server/AliasVault.Cryptography.Server.csproj @@ -1,20 +1,20 @@  - net9.0 + net10.0 enable enable - 13 + 14 true - bin\Debug\net9.0\Cryptography.xml + bin\Debug\net10.0\Cryptography.xml true - bin\Release\net9.0\Cryptography.xml + bin\Release\net10.0\Cryptography.xml From 2d24ec366f6592a98f74c206bdd171d7a592e2d3 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Thu, 13 Nov 2025 20:10:35 +0100 Subject: [PATCH 02/20] Fix SupplyParameterFromForm usages (#1353) --- apps/server/AliasVault.Admin/Auth/Pages/Login.razor | 5 +++++ apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor | 1 + .../AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor | 1 + .../Main/Pages/Account/Manage/ChangePassword.razor | 5 +++++ .../Main/Pages/Account/Manage/EnableAuthenticator.razor | 5 +++++ 5 files changed, 17 insertions(+) diff --git a/apps/server/AliasVault.Admin/Auth/Pages/Login.razor b/apps/server/AliasVault.Admin/Auth/Pages/Login.razor index 9b334063a..76d6f7395 100644 --- a/apps/server/AliasVault.Admin/Auth/Pages/Login.razor +++ b/apps/server/AliasVault.Admin/Auth/Pages/Login.razor @@ -75,6 +75,11 @@ else private bool IsAdminConfigured { get; set; } = true; + protected override void OnInitialized() + { + Input ??= new(); + } + /// protected override async Task OnInitializedAsync() { diff --git a/apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor b/apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor index 5e4384ed3..4c3ccbd26 100644 --- a/apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor +++ b/apps/server/AliasVault.Admin/Auth/Pages/LoginWith2fa.razor @@ -52,6 +52,7 @@ /// protected override async Task OnInitializedAsync() { + Input ??= new(); await base.OnInitializedAsync(); // Ensure the user has gone through the username & password screen first diff --git a/apps/server/AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor b/apps/server/AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor index c97ee9552..c25f5c404 100644 --- a/apps/server/AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor +++ b/apps/server/AliasVault.Admin/Auth/Pages/LoginWithRecoveryCode.razor @@ -36,6 +36,7 @@ /// protected override async Task OnInitializedAsync() { + Input ??= new(); // Ensure the user has gone through the username & password screen first user = await SignInManager.GetTwoFactorAuthenticationUserAsync() ?? throw new InvalidOperationException("Unable to load two-factor authentication user."); diff --git a/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor b/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor index 5c78b904b..11ac83cfe 100644 --- a/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor +++ b/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/ChangePassword.razor @@ -38,6 +38,11 @@ [SupplyParameterFromForm] private InputModel Input { get; set; } = default!; + protected override void OnInitialized() + { + Input ??= new(); + } + private async Task OnValidSubmitAsync() { var user = await UserManager.FindByIdAsync(UserService.User().Id); diff --git a/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/EnableAuthenticator.razor b/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/EnableAuthenticator.razor index d9b6053ed..672a0a4f3 100644 --- a/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/EnableAuthenticator.razor +++ b/apps/server/AliasVault.Admin/Main/Pages/Account/Manage/EnableAuthenticator.razor @@ -79,6 +79,11 @@ else [SupplyParameterFromForm] private InputModel Input { get; set; } = default!; + protected override void OnInitialized() + { + Input ??= new(); + } + /// protected override async Task OnAfterRenderAsync(bool firstRender) { From 45581a3c2231095285cf3919b564cc90d55dc2d6 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Thu, 13 Nov 2025 20:23:03 +0100 Subject: [PATCH 03/20] Upgrade services to .NET 10 (#1353) --- apps/server/Services/AliasVault.SmtpService/Dockerfile | 4 ++-- apps/server/Services/AliasVault.TaskRunner/Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/server/Services/AliasVault.SmtpService/Dockerfile b/apps/server/Services/AliasVault.SmtpService/Dockerfile index df5e90e2b..9993dfa40 100644 --- a/apps/server/Services/AliasVault.SmtpService/Dockerfile +++ b/apps/server/Services/AliasVault.SmtpService/Dockerfile @@ -1,7 +1,7 @@ -FROM mcr.microsoft.com/dotnet/runtime:9.0 AS base +FROM mcr.microsoft.com/dotnet/runtime:10.0 AS base WORKDIR /app -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /src diff --git a/apps/server/Services/AliasVault.TaskRunner/Dockerfile b/apps/server/Services/AliasVault.TaskRunner/Dockerfile index f5c53c756..57d6581e7 100644 --- a/apps/server/Services/AliasVault.TaskRunner/Dockerfile +++ b/apps/server/Services/AliasVault.TaskRunner/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /src @@ -14,7 +14,7 @@ RUN dotnet publish "./AliasVault.TaskRunner.csproj" \ -o /app/publish \ /p:UseAppHost=false -FROM mcr.microsoft.com/dotnet/runtime:9.0 AS final +FROM mcr.microsoft.com/dotnet/runtime:10.0 AS final # OCI Image Labels LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" From 7724c2e215fafcaa163f1f64808cb37332d037fb Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Thu, 13 Nov 2025 20:50:47 +0100 Subject: [PATCH 04/20] Upgrade AliasVault.Client to .NET 10 (#1353) --- apps/server/AliasVault.Client/AliasVault.Client.csproj | 3 ++- apps/server/AliasVault.Client/Dockerfile | 4 ++-- apps/server/AliasVault.Client/Program.cs | 10 +++++++--- .../Databases/AliasClientDb/AliasClientDb.csproj | 2 ++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/server/AliasVault.Client/AliasVault.Client.csproj b/apps/server/AliasVault.Client/AliasVault.Client.csproj index ef8c3cf3b..d6c4150ff 100644 --- a/apps/server/AliasVault.Client/AliasVault.Client.csproj +++ b/apps/server/AliasVault.Client/AliasVault.Client.csproj @@ -15,6 +15,7 @@ bin\Debug\net10.0\AliasVault.Client.xml true dev + NU1903 @@ -24,6 +25,7 @@ True $([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss")) 0 + NU1903 @@ -71,7 +73,6 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/apps/server/AliasVault.Client/Dockerfile b/apps/server/AliasVault.Client/Dockerfile index 70c3231b7..cf1f6386f 100644 --- a/apps/server/AliasVault.Client/Dockerfile +++ b/apps/server/AliasVault.Client/Dockerfile @@ -1,7 +1,7 @@ -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base WORKDIR /app -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 diff --git a/apps/server/AliasVault.Client/Program.cs b/apps/server/AliasVault.Client/Program.cs index a0c279c7f..965752712 100644 --- a/apps/server/AliasVault.Client/Program.cs +++ b/apps/server/AliasVault.Client/Program.cs @@ -106,9 +106,13 @@ builder.Services.AddBlazoredLocalStorage(); var app = builder.Build(); // Load all supported cultures for dynamic switching -var supportedLanguages = LanguageService.GetSupportedLanguages(); -var cultures = supportedLanguages.Keys.Select(langCode => new CultureInfo(langCode)).ToArray(); -await app.LoadSatelliteCultureAssembliesCultureAsync(cultures); +// NOTE: Temporarily disabled due to .NET 10 HTTP streaming compatibility issue +// The third-party package Blazor.WebAssembly.DynamicCulture.Loader v3.1.0 +// attempts to read Response streams multiple times, which fails in .NET 10 +// TODO: Update to compatible version or implement alternative solution +// var supportedLanguages = LanguageService.GetSupportedLanguages(); +// var cultures = supportedLanguages.Keys.Select(langCode => new CultureInfo(langCode)).ToArray(); +// await app.LoadSatelliteCultureAssembliesCultureAsync(cultures); // Initialize language service var languageService = app.Services.GetRequiredService(); diff --git a/apps/server/Databases/AliasClientDb/AliasClientDb.csproj b/apps/server/Databases/AliasClientDb/AliasClientDb.csproj index 18063e852..59f1f0090 100644 --- a/apps/server/Databases/AliasClientDb/AliasClientDb.csproj +++ b/apps/server/Databases/AliasClientDb/AliasClientDb.csproj @@ -10,11 +10,13 @@ bin\Debug\net10.0\AliasClientDb.xml true + NU1903 true bin\Release\net10.0\AliasClientDb.xml + NU1903 From cab3d9ed4e9251f8b5a0434704b0300294168791 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Thu, 13 Nov 2025 20:51:53 +0100 Subject: [PATCH 05/20] Update dotnet-e2e-tests.yml for .NET 10 (#1353) --- .github/workflows/dotnet-e2e-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dotnet-e2e-tests.yml b/.github/workflows/dotnet-e2e-tests.yml index 04cbbe461..978861008 100644 --- a/.github/workflows/dotnet-e2e-tests.yml +++ b/.github/workflows/dotnet-e2e-tests.yml @@ -36,7 +36,7 @@ jobs: - name: Ensure browsers are installed working-directory: apps/server - run: pwsh Tests/AliasVault.E2ETests/bin/Debug/net9.0/playwright.ps1 install --with-deps + run: pwsh Tests/AliasVault.E2ETests/bin/Debug/net10.0/playwright.ps1 install --with-deps - name: Run AdminTests with retry uses: nick-fields/retry@v3 @@ -80,7 +80,7 @@ jobs: - name: Ensure browsers are installed working-directory: apps/server - run: pwsh Tests/AliasVault.E2ETests/bin/Debug/net9.0/playwright.ps1 install --with-deps + run: pwsh Tests/AliasVault.E2ETests/bin/Debug/net10.0/playwright.ps1 install --with-deps - name: Run ClientTests with retry (Shard ${{ matrix.shard }}) uses: nick-fields/retry@v3 @@ -124,7 +124,7 @@ jobs: - name: Ensure browsers are installed working-directory: apps/server - run: pwsh Tests/AliasVault.E2ETests/bin/Debug/net9.0/playwright.ps1 install --with-deps + run: pwsh Tests/AliasVault.E2ETests/bin/Debug/net10.0/playwright.ps1 install --with-deps - name: Run ExtensionTests with retry uses: nick-fields/retry@v3 From e547e1de0c51f057766b138f362fc8c3847c3335 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Thu, 13 Nov 2025 20:53:42 +0100 Subject: [PATCH 06/20] Upgrade dependencies from .NET 9 to .NET 10 (#1353) --- .github/workflows/dotnet-e2e-tests.yml | 6 +++--- .github/workflows/dotnet-integration-tests.yml | 2 +- .github/workflows/dotnet-unit-tests.yml | 2 +- dockerfiles/all-in-one/Dockerfile | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/dotnet-e2e-tests.yml b/.github/workflows/dotnet-e2e-tests.yml index 978861008..6bba576ef 100644 --- a/.github/workflows/dotnet-e2e-tests.yml +++ b/.github/workflows/dotnet-e2e-tests.yml @@ -21,7 +21,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Install dependencies working-directory: apps/server @@ -65,7 +65,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Install dependencies working-directory: apps/server @@ -98,7 +98,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/dotnet-integration-tests.yml b/.github/workflows/dotnet-integration-tests.yml index 3eb39ff8a..6b6a55f83 100644 --- a/.github/workflows/dotnet-integration-tests.yml +++ b/.github/workflows/dotnet-integration-tests.yml @@ -21,7 +21,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Install dependencies run: dotnet workload install wasm-tools diff --git a/.github/workflows/dotnet-unit-tests.yml b/.github/workflows/dotnet-unit-tests.yml index fae23d65d..74061871e 100644 --- a/.github/workflows/dotnet-unit-tests.yml +++ b/.github/workflows/dotnet-unit-tests.yml @@ -20,7 +20,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.x + dotnet-version: 10.0.x - name: Install dependencies run: dotnet workload install wasm-tools diff --git a/dockerfiles/all-in-one/Dockerfile b/dockerfiles/all-in-one/Dockerfile index 5785b3700..fd14386e4 100644 --- a/dockerfiles/all-in-one/Dockerfile +++ b/dockerfiles/all-in-one/Dockerfile @@ -3,7 +3,7 @@ # ============================================ # Stage 1: Build .NET applications # ============================================ -FROM mcr.microsoft.com/dotnet/sdk:9.0 AS dotnet-builder +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS dotnet-builder # Install Python (required for WASM compilation) RUN apt-get update && \ @@ -66,7 +66,7 @@ RUN wget https://github.com/just-containers/s6-overlay/releases/download/v${S6_O # ============================================ # Stage 3: Final runtime image # ============================================ -FROM mcr.microsoft.com/dotnet/aspnet:9.0-bookworm-slim +FROM mcr.microsoft.com/dotnet/aspnet:10.0-bookworm-slim # OCI Image Labels LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" From e66cc1a213927baaf091e885cd392f9d99d5668c Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Thu, 13 Nov 2025 21:15:10 +0100 Subject: [PATCH 07/20] Update global.json (#1353) --- apps/server/global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/global.json b/apps/server/global.json index b6c230e18..75a166b5d 100644 --- a/apps/server/global.json +++ b/apps/server/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "9.0.100", + "version": "10.0.100", "rollForward": "feature" } } From 89a3798e3294135c12b38845831f47fb16cac2eb Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 30 Jan 2026 13:09:06 +0100 Subject: [PATCH 08/20] Update .NET 10.0 base images (#1353) --- apps/server/AliasVault.Admin/Dockerfile | 4 ++-- apps/server/AliasVault.Api/Dockerfile | 4 ++-- apps/server/AliasVault.Client/Dockerfile | 4 ++-- apps/server/Services/AliasVault.SmtpService/Dockerfile | 4 ++-- apps/server/Services/AliasVault.TaskRunner/Dockerfile | 4 ++-- apps/server/Utilities/AliasVault.InstallCli/Dockerfile | 4 ++-- dockerfiles/all-in-one/Dockerfile | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/server/AliasVault.Admin/Dockerfile b/apps/server/AliasVault.Admin/Dockerfile index 118b2835a..45606d232 100644 --- a/apps/server/AliasVault.Admin/Dockerfile +++ b/apps/server/AliasVault.Admin/Dockerfile @@ -1,8 +1,8 @@ -FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS base WORKDIR /app EXPOSE 3002 -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /src diff --git a/apps/server/AliasVault.Api/Dockerfile b/apps/server/AliasVault.Api/Dockerfile index 194f847d1..8a3107ec8 100644 --- a/apps/server/AliasVault.Api/Dockerfile +++ b/apps/server/AliasVault.Api/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /src @@ -15,7 +15,7 @@ RUN dotnet publish "./AliasVault.Api.csproj" \ /p:UseAppHost=false # Final stage -FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS final # OCI Image Labels LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" diff --git a/apps/server/AliasVault.Client/Dockerfile b/apps/server/AliasVault.Client/Dockerfile index c4214a4a6..115d7d8c1 100644 --- a/apps/server/AliasVault.Client/Dockerfile +++ b/apps/server/AliasVault.Client/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble AS base WORKDIR /app # ============================================ @@ -29,7 +29,7 @@ RUN cd ./core && \ # ============================================ # Stage: Build .NET application # ============================================ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-noble AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 diff --git a/apps/server/Services/AliasVault.SmtpService/Dockerfile b/apps/server/Services/AliasVault.SmtpService/Dockerfile index 9993dfa40..cef79695a 100644 --- a/apps/server/Services/AliasVault.SmtpService/Dockerfile +++ b/apps/server/Services/AliasVault.SmtpService/Dockerfile @@ -1,7 +1,7 @@ -FROM mcr.microsoft.com/dotnet/runtime:10.0 AS base +FROM mcr.microsoft.com/dotnet/runtime:10.0-alpine AS base WORKDIR /app -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /src diff --git a/apps/server/Services/AliasVault.TaskRunner/Dockerfile b/apps/server/Services/AliasVault.TaskRunner/Dockerfile index 57d6581e7..b6473d44a 100644 --- a/apps/server/Services/AliasVault.TaskRunner/Dockerfile +++ b/apps/server/Services/AliasVault.TaskRunner/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /src @@ -14,7 +14,7 @@ RUN dotnet publish "./AliasVault.TaskRunner.csproj" \ -o /app/publish \ /p:UseAppHost=false -FROM mcr.microsoft.com/dotnet/runtime:10.0 AS final +FROM mcr.microsoft.com/dotnet/runtime:10.0-alpine AS final # OCI Image Labels LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" diff --git a/apps/server/Utilities/AliasVault.InstallCli/Dockerfile b/apps/server/Utilities/AliasVault.InstallCli/Dockerfile index 52e71dcc2..5d852c235 100644 --- a/apps/server/Utilities/AliasVault.InstallCli/Dockerfile +++ b/apps/server/Utilities/AliasVault.InstallCli/Dockerfile @@ -1,7 +1,7 @@ -FROM mcr.microsoft.com/dotnet/runtime:9.0 AS base +FROM mcr.microsoft.com/dotnet/runtime:10.0-alpine AS base WORKDIR /app -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /apps/server diff --git a/dockerfiles/all-in-one/Dockerfile b/dockerfiles/all-in-one/Dockerfile index 81b8fa61a..785083477 100644 --- a/dockerfiles/all-in-one/Dockerfile +++ b/dockerfiles/all-in-one/Dockerfile @@ -28,7 +28,7 @@ RUN cd ./core && \ # ============================================ # Stage 2: Build .NET applications # ============================================ -FROM mcr.microsoft.com/dotnet/sdk:10.0 AS dotnet-builder +FROM mcr.microsoft.com/dotnet/sdk:10.0-noble AS dotnet-builder # Install Python (required for WASM compilation) and Node.js (required by JS bundler) RUN apt-get update && \ @@ -114,7 +114,7 @@ RUN ARCH="${TARGETARCH}"; \ # ============================================ # Stage 4: Final runtime image # ============================================ -FROM mcr.microsoft.com/dotnet/aspnet:10.0-bookworm-slim +FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble # OCI Image Labels LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" From 71c9bd71ee052d4893dbd4016686921d1aa44ca5 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 30 Jan 2026 13:38:06 +0100 Subject: [PATCH 09/20] Update all .NET packages to latest stable versions (#1353) --- .../AliasVault.Admin/AliasVault.Admin.csproj | 6 +++--- .../AliasVault.Api/AliasVault.Api.csproj | 10 ++++----- .../AliasVault.Client.csproj | 21 ++++++++++--------- .../AliasClientDb/AliasClientDb.csproj | 14 ++++++------- .../AliasServerDb/AliasServerDb.csproj | 20 +++++++++--------- .../AliasVault.SmtpService.csproj | 10 ++++----- .../AliasVault.TaskRunner.csproj | 4 ++-- .../AliasVault.RazorComponents.csproj | 2 +- .../AliasVault.Shared.csproj | 2 +- .../AliasVault.E2ETests.csproj | 12 +++++------ .../AliasVault.IntegrationTests.csproj | 13 +++++++----- .../AliasVault.UnitTests.csproj | 8 +++---- .../AliasVault.E2ETests.Client.Server.csproj | 2 +- .../AliasVault.FaviconExtractor.csproj | 8 +++---- .../AliasVault.ImportExport.csproj | 2 +- .../AliasVault.Logging.csproj | 20 +++++++++--------- .../AliasVault.TotpGenerator.csproj | 2 +- .../AliasVault.WorkerStatus.csproj | 4 ++-- 18 files changed, 82 insertions(+), 78 deletions(-) diff --git a/apps/server/AliasVault.Admin/AliasVault.Admin.csproj b/apps/server/AliasVault.Admin/AliasVault.Admin.csproj index b12c24b40..a5426ef25 100644 --- a/apps/server/AliasVault.Admin/AliasVault.Admin.csproj +++ b/apps/server/AliasVault.Admin/AliasVault.Admin.csproj @@ -21,9 +21,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/AliasVault.Api/AliasVault.Api.csproj b/apps/server/AliasVault.Api/AliasVault.Api.csproj index 80cc3f2ea..567a7e98d 100644 --- a/apps/server/AliasVault.Api/AliasVault.Api.csproj +++ b/apps/server/AliasVault.Api/AliasVault.Api.csproj @@ -20,10 +20,10 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -31,7 +31,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/apps/server/AliasVault.Client/AliasVault.Client.csproj b/apps/server/AliasVault.Client/AliasVault.Client.csproj index bac43c3a0..aef6ced58 100644 --- a/apps/server/AliasVault.Client/AliasVault.Client.csproj +++ b/apps/server/AliasVault.Client/AliasVault.Client.csproj @@ -60,24 +60,25 @@ - + - - - - - - - + + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Databases/AliasClientDb/AliasClientDb.csproj b/apps/server/Databases/AliasClientDb/AliasClientDb.csproj index 59f1f0090..d55d99cc7 100644 --- a/apps/server/Databases/AliasClientDb/AliasClientDb.csproj +++ b/apps/server/Databases/AliasClientDb/AliasClientDb.csproj @@ -20,16 +20,16 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Databases/AliasServerDb/AliasServerDb.csproj b/apps/server/Databases/AliasServerDb/AliasServerDb.csproj index cd7999794..a535f1056 100644 --- a/apps/server/Databases/AliasServerDb/AliasServerDb.csproj +++ b/apps/server/Databases/AliasServerDb/AliasServerDb.csproj @@ -19,19 +19,19 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj b/apps/server/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj index ba15a95bc..2e8414dde 100644 --- a/apps/server/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj +++ b/apps/server/Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj @@ -25,11 +25,11 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj b/apps/server/Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj index 57d5a8469..546fc9d4b 100644 --- a/apps/server/Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj +++ b/apps/server/Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj @@ -25,8 +25,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Shared/AliasVault.RazorComponents/AliasVault.RazorComponents.csproj b/apps/server/Shared/AliasVault.RazorComponents/AliasVault.RazorComponents.csproj index e17bf32c0..1131b16c2 100644 --- a/apps/server/Shared/AliasVault.RazorComponents/AliasVault.RazorComponents.csproj +++ b/apps/server/Shared/AliasVault.RazorComponents/AliasVault.RazorComponents.csproj @@ -23,7 +23,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Shared/AliasVault.Shared/AliasVault.Shared.csproj b/apps/server/Shared/AliasVault.Shared/AliasVault.Shared.csproj index 28fcbac44..c4edb72cb 100644 --- a/apps/server/Shared/AliasVault.Shared/AliasVault.Shared.csproj +++ b/apps/server/Shared/AliasVault.Shared/AliasVault.Shared.csproj @@ -22,7 +22,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj b/apps/server/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj index 51b21af6b..6446924e1 100644 --- a/apps/server/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj +++ b/apps/server/Tests/AliasVault.E2ETests/AliasVault.E2ETests.csproj @@ -30,15 +30,15 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Tests/AliasVault.IntegrationTests/AliasVault.IntegrationTests.csproj b/apps/server/Tests/AliasVault.IntegrationTests/AliasVault.IntegrationTests.csproj index e80e2683b..c802b70bc 100644 --- a/apps/server/Tests/AliasVault.IntegrationTests/AliasVault.IntegrationTests.csproj +++ b/apps/server/Tests/AliasVault.IntegrationTests/AliasVault.IntegrationTests.csproj @@ -21,11 +21,14 @@ - - - - - + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj b/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj index 8af13f71e..f604a735a 100644 --- a/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj +++ b/apps/server/Tests/AliasVault.UnitTests/AliasVault.UnitTests.csproj @@ -31,10 +31,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj b/apps/server/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj index d008f60de..2f178a3d3 100644 --- a/apps/server/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj +++ b/apps/server/Tests/Server/AliasVault.E2ETests.Client.Server/AliasVault.E2ETests.Client.Server.csproj @@ -8,7 +8,7 @@ - + diff --git a/apps/server/Utilities/AliasVault.FaviconExtractor/AliasVault.FaviconExtractor.csproj b/apps/server/Utilities/AliasVault.FaviconExtractor/AliasVault.FaviconExtractor.csproj index 6854c0a2e..f3fce6672 100644 --- a/apps/server/Utilities/AliasVault.FaviconExtractor/AliasVault.FaviconExtractor.csproj +++ b/apps/server/Utilities/AliasVault.FaviconExtractor/AliasVault.FaviconExtractor.csproj @@ -22,14 +22,14 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/apps/server/Utilities/AliasVault.ImportExport/AliasVault.ImportExport.csproj b/apps/server/Utilities/AliasVault.ImportExport/AliasVault.ImportExport.csproj index d4a3ce15e..b4433b1b7 100644 --- a/apps/server/Utilities/AliasVault.ImportExport/AliasVault.ImportExport.csproj +++ b/apps/server/Utilities/AliasVault.ImportExport/AliasVault.ImportExport.csproj @@ -12,7 +12,7 @@ - + diff --git a/apps/server/Utilities/AliasVault.Logging/AliasVault.Logging.csproj b/apps/server/Utilities/AliasVault.Logging/AliasVault.Logging.csproj index adec154d6..93563b3c0 100644 --- a/apps/server/Utilities/AliasVault.Logging/AliasVault.Logging.csproj +++ b/apps/server/Utilities/AliasVault.Logging/AliasVault.Logging.csproj @@ -18,16 +18,16 @@ - - - - - - - - - - + + + + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Utilities/AliasVault.TotpGenerator/AliasVault.TotpGenerator.csproj b/apps/server/Utilities/AliasVault.TotpGenerator/AliasVault.TotpGenerator.csproj index 69a9ae127..fb6f09e54 100644 --- a/apps/server/Utilities/AliasVault.TotpGenerator/AliasVault.TotpGenerator.csproj +++ b/apps/server/Utilities/AliasVault.TotpGenerator/AliasVault.TotpGenerator.csproj @@ -18,7 +18,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/apps/server/Utilities/AliasVault.WorkerStatus/AliasVault.WorkerStatus.csproj b/apps/server/Utilities/AliasVault.WorkerStatus/AliasVault.WorkerStatus.csproj index a7bc28436..e487f46dd 100644 --- a/apps/server/Utilities/AliasVault.WorkerStatus/AliasVault.WorkerStatus.csproj +++ b/apps/server/Utilities/AliasVault.WorkerStatus/AliasVault.WorkerStatus.csproj @@ -22,8 +22,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive From 892cabe6f71b92800d6a109ad3481fd821bd1923 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 30 Jan 2026 15:18:07 +0100 Subject: [PATCH 10/20] Update AliasVault.Client.csproj (#1353) --- apps/server/AliasVault.Client/AliasVault.Client.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/server/AliasVault.Client/AliasVault.Client.csproj b/apps/server/AliasVault.Client/AliasVault.Client.csproj index aef6ced58..d322afcc9 100644 --- a/apps/server/AliasVault.Client/AliasVault.Client.csproj +++ b/apps/server/AliasVault.Client/AliasVault.Client.csproj @@ -66,7 +66,6 @@ - From 1bc82999a3f0a968be952a993825fc8178a584f5 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 30 Jan 2026 15:23:09 +0100 Subject: [PATCH 11/20] Update Swagger config (#1353) --- apps/server/AliasVault.Api/Program.cs | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/apps/server/AliasVault.Api/Program.cs b/apps/server/AliasVault.Api/Program.cs index 51cb57af5..f597e42fc 100644 --- a/apps/server/AliasVault.Api/Program.cs +++ b/apps/server/AliasVault.Api/Program.cs @@ -26,7 +26,7 @@ using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; -using Microsoft.OpenApi.Models; +using Microsoft.OpenApi; var builder = WebApplication.CreateBuilder(args); @@ -168,19 +168,9 @@ builder.Services.AddSwaggerGen(c => BearerFormat = "JWT", Scheme = "Bearer", }); - c.AddSecurityRequirement(new OpenApiSecurityRequirement + c.AddSecurityRequirement(_ => new OpenApiSecurityRequirement { - { - new OpenApiSecurityScheme - { - Reference = new OpenApiReference - { - Type = ReferenceType.SecurityScheme, - Id = "Bearer", - }, - }, - Array.Empty() - }, + [new OpenApiSecuritySchemeReference("Bearer")] = [], }); }); From ff0cc90da9191e406d10afbf096d17e72ed3d0bb Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 30 Jan 2026 15:23:38 +0100 Subject: [PATCH 12/20] Refactor (#1353) --- .../Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs | 2 +- .../Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/server/Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs b/apps/server/Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs index 0a9513533..73d6835e6 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs @@ -12,7 +12,7 @@ using AliasServerDb; /// /// Base class for Playwright E2E tests that run against Admin webapp. /// -public class AdminPlaywrightTest : PlaywrightTest +public abstract class AdminPlaywrightTest : PlaywrightTest { private const int BasePort = 5700; private static int _currentPort = BasePort; diff --git a/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs b/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs index dfde635ba..a2cceecba 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs @@ -15,7 +15,7 @@ using Microsoft.Playwright; /// /// Base class for tests that use Playwright for E2E browser testing. /// -public class ClientPlaywrightTest : PlaywrightTest +public abstract class ClientPlaywrightTest : PlaywrightTest { private const int BasePort = 5600; private static int _currentPort = BasePort; From d68874821f55a2737334ae56191615b9f21f92fe Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 30 Jan 2026 15:30:25 +0100 Subject: [PATCH 13/20] Add startup delay to SmtpServerTests.cs (#1353) --- .../SmtpServer/SmtpServerTests.cs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/server/Tests/AliasVault.IntegrationTests/SmtpServer/SmtpServerTests.cs b/apps/server/Tests/AliasVault.IntegrationTests/SmtpServer/SmtpServerTests.cs index ba43fd4c9..6e01e9233 100644 --- a/apps/server/Tests/AliasVault.IntegrationTests/SmtpServer/SmtpServerTests.cs +++ b/apps/server/Tests/AliasVault.IntegrationTests/SmtpServer/SmtpServerTests.cs @@ -331,14 +331,31 @@ public class SmtpServerTests } /// - /// Sends a message to the SMTP server. + /// Sends a message to the SMTP server with retry logic for connection. /// /// MimeMessage to send. private static async Task SendMessageToSmtpServer(MimeMessage message) { using var client = new SmtpClient(); - await client.ConnectAsync("localhost", 2525, SecureSocketOptions.None); + // Retry connection up to 10 times with 100ms delay to handle race condition + // where the SMTP server may not be fully started yet. + const int maxRetries = 10; + const int retryDelayMs = 100; + + for (var attempt = 1; attempt <= maxRetries; attempt++) + { + try + { + await client.ConnectAsync("localhost", 2525, SecureSocketOptions.None); + break; + } + catch (System.Net.Sockets.SocketException) when (attempt < maxRetries) + { + await Task.Delay(retryDelayMs); + } + } + try { await client.SendAsync(message); From 84280c23275a98772daa9949a5ca2f04c46011f3 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 30 Jan 2026 19:42:44 +0100 Subject: [PATCH 14/20] Update AliasVault.Client.csproj (#1353) --- apps/server/AliasVault.Client/AliasVault.Client.csproj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/server/AliasVault.Client/AliasVault.Client.csproj b/apps/server/AliasVault.Client/AliasVault.Client.csproj index d322afcc9..75a60dc7f 100644 --- a/apps/server/AliasVault.Client/AliasVault.Client.csproj +++ b/apps/server/AliasVault.Client/AliasVault.Client.csproj @@ -25,7 +25,8 @@ True $([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss")) 0 - NU1903 + + NU1903;IL2037 @@ -66,6 +67,7 @@ + From 9e05576e73b640eb52901b38dbe9db3510626750 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 6 Feb 2026 12:24:46 +0100 Subject: [PATCH 15/20] Update Docker image buildplatform tags (#1353) --- apps/server/AliasVault.Admin/Dockerfile | 2 +- apps/server/AliasVault.Client/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/server/AliasVault.Admin/Dockerfile b/apps/server/AliasVault.Admin/Dockerfile index 45606d232..7e13dbc5f 100644 --- a/apps/server/AliasVault.Admin/Dockerfile +++ b/apps/server/AliasVault.Admin/Dockerfile @@ -2,7 +2,7 @@ WORKDIR /app EXPOSE 3002 -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release WORKDIR /src diff --git a/apps/server/AliasVault.Client/Dockerfile b/apps/server/AliasVault.Client/Dockerfile index 319ae2574..b6dec15c2 100644 --- a/apps/server/AliasVault.Client/Dockerfile +++ b/apps/server/AliasVault.Client/Dockerfile @@ -31,7 +31,7 @@ RUN cd ./core && \ # ============================================ # Stage: Build .NET application # ============================================ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-noble AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0-noble AS build ARG TARGETARCH ARG BUILD_CONFIGURATION=Release ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 From b4bdd2dc0e4856db6be694798504caa79e58097b Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Fri, 6 Feb 2026 12:55:02 +0100 Subject: [PATCH 16/20] Remove duplicate dotnet webassembly hot reload, now shipped as part of core (#1353) --- apps/server/AliasVault.Client/AliasVault.Client.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/server/AliasVault.Client/AliasVault.Client.csproj b/apps/server/AliasVault.Client/AliasVault.Client.csproj index 75a60dc7f..9fb17bc86 100644 --- a/apps/server/AliasVault.Client/AliasVault.Client.csproj +++ b/apps/server/AliasVault.Client/AliasVault.Client.csproj @@ -67,7 +67,6 @@ - From 8e35b2f89539f4c7405254989719a5720e5ce8bd Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Sat, 7 Feb 2026 15:23:24 +0100 Subject: [PATCH 17/20] Update test infrastructure to use built-in Kestrel test methods (#1353) --- .../Common/AdminPlaywrightTest.cs | 1 + .../Common/ClientPlaywrightTest.cs | 2 + .../Abstracts/WebApplicationFactoryFixture.cs | 25 +++++-- .../Infrastructure/KestrelTestServer.cs | 66 ------------------- .../WebApplicationClientFactoryFixture.cs | 26 ++++---- .../Tests/Client/Shard1/ApiTests.cs | 4 +- 6 files changed, 38 insertions(+), 86 deletions(-) delete mode 100644 apps/server/Tests/AliasVault.E2ETests/Infrastructure/KestrelTestServer.cs diff --git a/apps/server/Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs b/apps/server/Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs index 73d6835e6..3fe346b2c 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Common/AdminPlaywrightTest.cs @@ -62,6 +62,7 @@ public abstract class AdminPlaywrightTest : PlaywrightTest // Start Admin project in-memory. _webAppFactory.Port = appPort; + _webAppFactory.InitializeKestrel(); _webAppFactory.CreateDefaultClient(); await SetupPlaywrightBrowserAndContext(); diff --git a/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs b/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs index a2cceecba..f305ec22c 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs @@ -101,10 +101,12 @@ public abstract class ClientPlaywrightTest : PlaywrightTest // Start WebAPI in-memory. _apiFactory.Port = apiPort; + _apiFactory.InitializeKestrel(); _apiFactory.CreateDefaultClient(); // Start Blazor WASM in-memory. _clientFactory.Port = appPort; + _clientFactory.InitializeKestrel(); _clientFactory.CreateDefaultClient(); await SetupPlaywrightBrowserAndContext(); diff --git a/apps/server/Tests/AliasVault.E2ETests/Infrastructure/Abstracts/WebApplicationFactoryFixture.cs b/apps/server/Tests/AliasVault.E2ETests/Infrastructure/Abstracts/WebApplicationFactoryFixture.cs index f1b2d7a34..1ad6cf992 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Infrastructure/Abstracts/WebApplicationFactoryFixture.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Infrastructure/Abstracts/WebApplicationFactoryFixture.cs @@ -11,7 +11,6 @@ using AliasServerDb; using AliasVault.Shared.Providers.Time; using AliasVault.Shared.Server.Services; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -44,6 +43,11 @@ public abstract class WebApplicationFactoryFixture : WebApplication /// private string? _tempDbName; + /// + /// Whether UseKestrel has been called. + /// + private bool _kestrelConfigured; + /// /// Gets or sets the port the web application kestrel host will listen on. /// @@ -120,15 +124,22 @@ public abstract class WebApplicationFactoryFixture : WebApplication await base.DisposeAsync(); } + /// + /// Initializes the factory with Kestrel on the specified port. + /// Must be called before CreateDefaultClient() in tests. + /// + public void InitializeKestrel() + { + if (!_kestrelConfigured) + { + UseKestrel(Port); + _kestrelConfigured = true; + } + } + /// protected override IHost CreateHost(IHostBuilder builder) { - builder.ConfigureWebHost(webHostBuilder => - { - webHostBuilder.UseKestrel(opt => opt.ListenLocalhost(Port)); - webHostBuilder.ConfigureServices(s => s.AddSingleton()); - }); - var host = base.CreateHost(builder); // Get the DbContextFactory instance and store it for later use during tests. diff --git a/apps/server/Tests/AliasVault.E2ETests/Infrastructure/KestrelTestServer.cs b/apps/server/Tests/AliasVault.E2ETests/Infrastructure/KestrelTestServer.cs deleted file mode 100644 index 90dbc3ed7..000000000 --- a/apps/server/Tests/AliasVault.E2ETests/Infrastructure/KestrelTestServer.cs +++ /dev/null @@ -1,66 +0,0 @@ -//----------------------------------------------------------------------- -// -// Copyright (c) aliasvault. All rights reserved. -// Licensed under the AGPLv3 license. See LICENSE.md file in the project root for full license information. -// -//----------------------------------------------------------------------- - -namespace AliasVault.E2ETests.Infrastructure; - -using Microsoft.AspNetCore.Connections; -using Microsoft.AspNetCore.Hosting.Server; -using Microsoft.AspNetCore.Server.Kestrel.Core; -using Microsoft.AspNetCore.TestHost; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; - -/// -/// A that uses Kestrel as the server. -/// -public class KestrelTestServer : TestServer, IServer -{ - private readonly KestrelServer _server; - - /// - /// Initializes a new instance of the class. - /// - /// The to use. - public KestrelTestServer(IServiceProvider serviceProvider) - : base(serviceProvider) - { - // We get all the transport factories registered, and the first one is the correct one - // Getting the IConnectionListenerFactory directly from the service provider does not work - var transportFactory = serviceProvider.GetRequiredService>().First(); - - var kestrelOptions = serviceProvider.GetRequiredService>(); - var loggerFactory = serviceProvider.GetRequiredService(); - _server = new KestrelServer(kestrelOptions, transportFactory, loggerFactory); - } - - /// - async Task IServer.StartAsync(IHttpApplication application, CancellationToken cancellationToken) - { - // We need to also invoke the TestServer's StartAsync method to ensure that the test server is started - // Because the TestServer's StartAsync method is implemented explicitly, we need to use reflection to invoke it - await InvokeExplicitInterfaceMethod(nameof(IServer.StartAsync), typeof(TContext), [application, cancellationToken]); - - // We also start the Kestrel server in order for localhost to work - await _server.StartAsync(application, cancellationToken); - } - - /// - async Task IServer.StopAsync(CancellationToken cancellationToken) - { - await InvokeExplicitInterfaceMethod(nameof(IServer.StopAsync), null, [cancellationToken]); - await _server.StopAsync(cancellationToken); - } - - private Task InvokeExplicitInterfaceMethod(string methodName, Type? genericParameter, object[] args) - { - var baseMethod = typeof(TestServer).GetInterfaceMap(typeof(IServer)).TargetMethods.First(m => m.Name.EndsWith(methodName)); - var method = genericParameter == null ? baseMethod : baseMethod.MakeGenericMethod(genericParameter); - var task = method.Invoke(this, args) as Task ?? throw new InvalidOperationException("Task not returned"); - return task; - } -} diff --git a/apps/server/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationClientFactoryFixture.cs b/apps/server/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationClientFactoryFixture.cs index 93970e5a0..3cf56df49 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationClientFactoryFixture.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Infrastructure/WebApplicationClientFactoryFixture.cs @@ -7,11 +7,7 @@ namespace AliasVault.E2ETests.Infrastructure; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; /// /// Client web application factory fixture for integration tests. @@ -20,20 +16,26 @@ using Microsoft.Extensions.Hosting; public class WebApplicationClientFactoryFixture : WebApplicationFactory where TEntryPoint : class { + /// + /// Whether UseKestrel has been called. + /// + private bool _kestrelConfigured; + /// /// Gets or sets the port the web application kestrel host will listen on. /// public int Port { get; set; } = 5002; - /// - protected override IHost CreateHost(IHostBuilder builder) + /// + /// Initializes the factory with Kestrel on the specified port. + /// Must be called before CreateDefaultClient() in tests. + /// + public void InitializeKestrel() { - builder.ConfigureWebHost(webHostBuilder => + if (!_kestrelConfigured) { - webHostBuilder.UseKestrel(opt => opt.ListenLocalhost(Port)); - webHostBuilder.ConfigureServices(s => s.AddSingleton()); - }); - - return base.CreateHost(builder); + UseKestrel(Port); + _kestrelConfigured = true; + } } } diff --git a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs index b07779210..bf8416014 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs @@ -66,7 +66,9 @@ public class ApiTests : ClientPlaywrightTest { // Check if the IP address is not anonymized as we enabled IP logging for this test file, see OneTimeSetUp(). var authLogEntry = await ApiDbContext.AuthLogs.FirstAsync(x => x.Username == TestUserUsername && x.EventType == AuthEventType.Register); - Assert.That(authLogEntry.IpAddress, Is.EqualTo("::1"), "IP address is anonymized while IP logging should be enabled. Check test configuration."); + + bool isValidLocalhostIp = authLogEntry.IpAddress == "::1" || authLogEntry.IpAddress == "127.0.0.1"; + Assert.That(isValidLocalhostIp, Is.True, $"IP address '{authLogEntry.IpAddress}' is anonymized while IP logging should be enabled. Check test configuration."); } /// From 6079a6004f097c35db070043ea4e5e9a70093a21 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Wed, 11 Feb 2026 20:11:17 +0100 Subject: [PATCH 18/20] Update ApiTests.cs --- .../Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs index bf8416014..9f30dce4a 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard1/ApiTests.cs @@ -67,7 +67,7 @@ public class ApiTests : ClientPlaywrightTest // Check if the IP address is not anonymized as we enabled IP logging for this test file, see OneTimeSetUp(). var authLogEntry = await ApiDbContext.AuthLogs.FirstAsync(x => x.Username == TestUserUsername && x.EventType == AuthEventType.Register); - bool isValidLocalhostIp = authLogEntry.IpAddress == "::1" || authLogEntry.IpAddress == "127.0.0.1"; + bool isValidLocalhostIp = authLogEntry.IpAddress == "::1" || authLogEntry.IpAddress == "127.0.0.xxx"; Assert.That(isValidLocalhostIp, Is.True, $"IP address '{authLogEntry.IpAddress}' is anonymized while IP logging should be enabled. Check test configuration."); } From 7cd62a5bcdc24843141c9e7a0592ea1e9829159f Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Wed, 11 Feb 2026 20:38:01 +0100 Subject: [PATCH 19/20] Update tests --- .../AliasVault.E2ETests/Common/ClientPlaywrightTest.cs | 2 +- .../Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs | 9 +++++++++ .../Tests/Client/Shard2/DbUpgradeTests.cs | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs b/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs index 7c215a037..49ef62647 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs @@ -189,7 +189,7 @@ public abstract class ClientPlaywrightTest : PlaywrightTest protected async Task RefreshPageAndUnlockVault() { // Get current URL. - var currentUrl = Page.Url; + var currentUrl = GetCurrentRelativeUrl(); // Hard refresh the page. await Page.ReloadAsync(); diff --git a/apps/server/Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs b/apps/server/Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs index 2d5a3dbd7..7aa0b06c9 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Common/PlaywrightTest.cs @@ -104,6 +104,15 @@ public abstract class PlaywrightTest } } + /// + /// Get the current relative URL. + /// + /// Current page as relative URL. + protected string GetCurrentRelativeUrl() + { + return Page.Url.Replace(AppBaseUrl, string.Empty); + } + /// /// Navigate to a relative URL using Blazor's client-side router. /// diff --git a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard2/DbUpgradeTests.cs b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard2/DbUpgradeTests.cs index 91c56162f..53081fe50 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard2/DbUpgradeTests.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard2/DbUpgradeTests.cs @@ -77,7 +77,7 @@ public class DbUpgradeTests : ClientPlaywrightTest // Soft navigate to items. await NavigateUsingBlazorRouter("items"); - await WaitForUrlAsync(string.Empty, "Test credential 1"); + await WaitForUrlAsync("**", "Test credential 1"); // Wait for all item cards on the page to have fully rendered. await Task.Delay(500); From 5cb22c40d77593d8dd3061ca5eb417aa389a7451 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Wed, 11 Feb 2026 21:10:54 +0100 Subject: [PATCH 20/20] Update ClientPlaywrightTest.cs --- .../AliasVault.E2ETests/Common/ClientPlaywrightTest.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs b/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs index 49ef62647..792e4ee5c 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Common/ClientPlaywrightTest.cs @@ -501,6 +501,12 @@ public abstract class ClientPlaywrightTest : PlaywrightTest /// Async task. protected async Task Register(bool checkForSuccess = true, string? username = null, string? password = null) { + // Check that we are on the login page after navigating to the base URL. + // This hard navigation ensures the Blazor app is fully reset, which is important + // after logout to ensure the router is in a clean state. + await Page.GotoAsync(AppBaseUrl); + await WaitForUrlAsync("user/start", "Log in with"); + // Try to register a new account. await NavigateUsingBlazorRouter("user/register"); await WaitForUrlAsync("user/register", "Create account");