diff --git a/Directory.Build.props b/Directory.Build.props index adf984f7d195..7f3d88b869ec 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - net8.0 + net10.0 2026.2.1 @@ -11,6 +11,11 @@ annotations enable true + + $(NoWarn);NU1608 diff --git a/bitwarden_license/src/Scim/Dockerfile b/bitwarden_license/src/Scim/Dockerfile index fca3d83572dc..084b3618219a 100644 --- a/bitwarden_license/src/Scim/Dockerfile +++ b/bitwarden_license/src/Scim/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/bitwarden_license/src/Sso/Dockerfile b/bitwarden_license/src/Sso/Dockerfile index cbd049b9bd95..33d859d798e3 100644 --- a/bitwarden_license/src/Sso/Dockerfile +++ b/bitwarden_license/src/Sso/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/bitwarden_license/src/Sso/Sso.csproj b/bitwarden_license/src/Sso/Sso.csproj index 709e8c2c4a52..d3adf65ffacd 100644 --- a/bitwarden_license/src/Sso/Sso.csproj +++ b/bitwarden_license/src/Sso/Sso.csproj @@ -8,9 +8,6 @@ - - - diff --git a/bitwarden_license/src/Sso/Utilities/DynamicAuthenticationSchemeProvider.cs b/bitwarden_license/src/Sso/Utilities/DynamicAuthenticationSchemeProvider.cs index db574e71c536..b05f91f0f3a4 100644 --- a/bitwarden_license/src/Sso/Utilities/DynamicAuthenticationSchemeProvider.cs +++ b/bitwarden_license/src/Sso/Utilities/DynamicAuthenticationSchemeProvider.cs @@ -406,7 +406,7 @@ private DynamicAuthenticationScheme GetSaml2AuthenticationScheme(string name, Ss if (!string.IsNullOrWhiteSpace(config.IdpX509PublicCert)) { var cert = CoreHelpers.Base64UrlDecode(config.IdpX509PublicCert); - idp.SigningKeys.AddConfiguredKey(new X509Certificate2(cert)); + idp.SigningKeys.AddConfiguredKey(X509CertificateLoader.LoadCertificate(cert)); } idp.ArtifactResolutionServiceUrls.Clear(); // This must happen last since it calls Validate() internally. diff --git a/bitwarden_license/test/Commercial.Core.Test/SecretsManager/Queries/ServiceAccounts/ServiceAccountSecretsDetailsQueryTests.cs b/bitwarden_license/test/Commercial.Core.Test/SecretsManager/Queries/ServiceAccounts/ServiceAccountSecretsDetailsQueryTests.cs index 0f926ceae9cb..55004a7a5d9c 100644 --- a/bitwarden_license/test/Commercial.Core.Test/SecretsManager/Queries/ServiceAccounts/ServiceAccountSecretsDetailsQueryTests.cs +++ b/bitwarden_license/test/Commercial.Core.Test/SecretsManager/Queries/ServiceAccounts/ServiceAccountSecretsDetailsQueryTests.cs @@ -38,13 +38,13 @@ public async Task GetManyByOrganizationId_CallsDifferentRepoMethods( if (includeAccessToSecrets) { await sutProvider.GetDependency().Received(1) - .GetManyByOrganizationIdWithSecretsDetailsAsync(Arg.Is(AssertHelper.AssertPropertyEqual(mockSaDetails.ServiceAccount.OrganizationId)), + .GetManyByOrganizationIdWithSecretsDetailsAsync(Arg.Is(AssertHelper.AssertPropertyEqual(organizationId)), Arg.Any(), Arg.Any()); } else { await sutProvider.GetDependency().Received(1) - .GetManyByOrganizationIdAsync(Arg.Is(AssertHelper.AssertPropertyEqual(mockSa.OrganizationId)), + .GetManyByOrganizationIdAsync(Arg.Is(AssertHelper.AssertPropertyEqual(organizationId)), Arg.Any(), Arg.Any()); Assert.Equal(0, result.First().AccessToSecrets); } diff --git a/bitwarden_license/test/SSO.Test/SSO.Test.csproj b/bitwarden_license/test/SSO.Test/SSO.Test.csproj index 4b509c9a50a3..afa8c22104d3 100644 --- a/bitwarden_license/test/SSO.Test/SSO.Test.csproj +++ b/bitwarden_license/test/SSO.Test/SSO.Test.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable diff --git a/bitwarden_license/test/Scim.IntegrationTest/Scim.IntegrationTest.csproj b/bitwarden_license/test/Scim.IntegrationTest/Scim.IntegrationTest.csproj index d0d329397c91..919411df1c82 100644 --- a/bitwarden_license/test/Scim.IntegrationTest/Scim.IntegrationTest.csproj +++ b/bitwarden_license/test/Scim.IntegrationTest/Scim.IntegrationTest.csproj @@ -11,7 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/bitwarden_license/test/Sso.IntegrationTest/Sso.IntegrationTest.csproj b/bitwarden_license/test/Sso.IntegrationTest/Sso.IntegrationTest.csproj index 42d0743d514b..e4d9bed852c7 100644 --- a/bitwarden_license/test/Sso.IntegrationTest/Sso.IntegrationTest.csproj +++ b/bitwarden_license/test/Sso.IntegrationTest/Sso.IntegrationTest.csproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 enable enable @@ -14,7 +14,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/global.json b/global.json index 970250aec979..ee5bf6a6aa84 100644 --- a/global.json +++ b/global.json @@ -1,11 +1,11 @@ { "sdk": { - "version": "8.0.100", + "version": "10.0.103", "rollForward": "latestFeature" }, "msbuild-sdks": { "Microsoft.Build.Traversal": "4.1.0", - "Microsoft.Build.Sql": "1.0.0", + "Microsoft.Build.Sql": "2.1.0", "Bitwarden.Server.Sdk": "1.4.0" } } diff --git a/src/Admin/Dockerfile b/src/Admin/Dockerfile index 84248639cf7b..e0dae6ffafa5 100644 --- a/src/Admin/Dockerfile +++ b/src/Admin/Dockerfile @@ -12,7 +12,7 @@ RUN npm run build ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -47,7 +47,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/src/Api/Auth/Models/Request/OrganizationSsoRequestModel.cs b/src/Api/Auth/Models/Request/OrganizationSsoRequestModel.cs index 349bdebb8834..b71e809f5c32 100644 --- a/src/Api/Auth/Models/Request/OrganizationSsoRequestModel.cs +++ b/src/Api/Auth/Models/Request/OrganizationSsoRequestModel.cs @@ -147,7 +147,7 @@ public IEnumerable Validate(ValidationContext context) try { var certData = CoreHelpers.Base64UrlDecode(StripPemCertificateElements(IdpX509PublicCert)); - new X509Certificate2(certData); + X509CertificateLoader.LoadCertificate(certData); } catch (FormatException) { diff --git a/src/Api/Dockerfile b/src/Api/Dockerfile index beacee89aeb4..5e561361fe3f 100644 --- a/src/Api/Dockerfile +++ b/src/Api/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/src/Billing/Dockerfile b/src/Billing/Dockerfile index 1e182dedffdb..2455b6858c5d 100644 --- a/src/Billing/Dockerfile +++ b/src/Billing/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/src/Core/Billing/Services/Implementations/LicensingService.cs b/src/Core/Billing/Services/Implementations/LicensingService.cs index 6f0cdec8f55b..f4a1dc0470a3 100644 --- a/src/Core/Billing/Services/Implementations/LicensingService.cs +++ b/src/Core/Billing/Services/Implementations/LicensingService.cs @@ -62,7 +62,7 @@ public LicensingService( "‎B34876439FCDA2846505B2EFBBA6C4A951313EBE"; if (_globalSettings.SelfHosted) { - _certificate = CoreHelpers.GetEmbeddedCertificateAsync(environment.IsDevelopment() ? "licensing_dev.cer" : "licensing.cer", null) + _certificate = CoreHelpers.GetEmbeddedCertificateAsync(environment.IsDevelopment() ? "licensing_dev.cer" : "licensing.cer") .GetAwaiter().GetResult(); } else if (CoreHelpers.SettingHasValue(_globalSettings.Storage?.ConnectionString) && diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index 54a8a0483fb2..3728e6417b57 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -29,7 +29,7 @@ - + @@ -38,8 +38,8 @@ - - + + @@ -47,10 +47,10 @@ - - - - + + + + @@ -61,7 +61,7 @@ - + @@ -73,8 +73,7 @@ - - + diff --git a/src/Core/Settings/GlobalSettings.cs b/src/Core/Settings/GlobalSettings.cs index b9ba879b0b2f..0d38621bdf81 100644 --- a/src/Core/Settings/GlobalSettings.cs +++ b/src/Core/Settings/GlobalSettings.cs @@ -259,7 +259,7 @@ public string ConnectionString _readOnlyConnectionString = null; } - _connectionString = value.Trim('"'); + _connectionString = value?.Trim('"'); } } @@ -267,13 +267,13 @@ public string ReadOnlyConnectionString { get => string.IsNullOrWhiteSpace(_readOnlyConnectionString) ? _connectionString : _readOnlyConnectionString; - set => _readOnlyConnectionString = value.Trim('"'); + set => _readOnlyConnectionString = value?.Trim('"'); } public string JobSchedulerConnectionString { get => _jobSchedulerConnectionString; - set => _jobSchedulerConnectionString = value.Trim('"'); + set => _jobSchedulerConnectionString = value?.Trim('"'); } } @@ -325,19 +325,19 @@ public class AzureServiceBusSettings public string ConnectionString { get => _connectionString; - set => _connectionString = value.Trim('"'); + set => _connectionString = value?.Trim('"'); } public string EventTopicName { get => _eventTopicName; - set => _eventTopicName = value.Trim('"'); + set => _eventTopicName = value?.Trim('"'); } public string IntegrationTopicName { get => _integrationTopicName; - set => _integrationTopicName = value.Trim('"'); + set => _integrationTopicName = value?.Trim('"'); } } @@ -372,27 +372,27 @@ public class RabbitMqSettings public string HostName { get => _hostName; - set => _hostName = value.Trim('"'); + set => _hostName = value?.Trim('"'); } public string Username { get => _username; - set => _username = value.Trim('"'); + set => _username = value?.Trim('"'); } public string Password { get => _password; - set => _password = value.Trim('"'); + set => _password = value?.Trim('"'); } public string EventExchangeName { get => _eventExchangeName; - set => _eventExchangeName = value.Trim('"'); + set => _eventExchangeName = value?.Trim('"'); } public string IntegrationExchangeName { get => _integrationExchangeName; - set => _integrationExchangeName = value.Trim('"'); + set => _integrationExchangeName = value?.Trim('"'); } } } @@ -422,7 +422,7 @@ public class ConnectionStringSettings : IConnectionStringSettings public string ConnectionString { get => _connectionString; - set => _connectionString = value.Trim('"'); + set => _connectionString = value?.Trim('"'); } } @@ -445,7 +445,7 @@ public FileStorageSettings(GlobalSettings globalSettings, string urlName, string public string ConnectionString { get => _connectionString; - set => _connectionString = value.Trim('"'); + set => _connectionString = value?.Trim('"'); } public string BaseDirectory diff --git a/src/Core/Utilities/CoreHelpers.cs b/src/Core/Utilities/CoreHelpers.cs index 1461601d184a..eb68547b0a21 100644 --- a/src/Core/Utilities/CoreHelpers.cs +++ b/src/Core/Utilities/CoreHelpers.cs @@ -141,17 +141,17 @@ public static string CleanCertificateThumbprint(string thumbprint) public static X509Certificate2 GetCertificate(string file, string password) { - return new X509Certificate2(file, password); + return X509CertificateLoader.LoadPkcs12FromFile(file, password); } - public async static Task GetEmbeddedCertificateAsync(string file, string password) + public async static Task GetEmbeddedCertificateAsync(string file) { var assembly = typeof(CoreHelpers).GetTypeInfo().Assembly; using (var s = assembly.GetManifestResourceStream($"Bit.Core.{file}")!) using (var ms = new MemoryStream()) { await s.CopyToAsync(ms); - return new X509Certificate2(ms.ToArray(), password); + return X509CertificateLoader.LoadCertificate(ms.ToArray()); } } @@ -176,7 +176,7 @@ public static string GetEmbeddedResourceContentsAsync(string file) using var memStream = new MemoryStream(); await blobRef.DownloadToAsync(memStream).ConfigureAwait(false); - return new X509Certificate2(memStream.ToArray(), password); + return X509CertificateLoader.LoadPkcs12(memStream.ToArray(), password); } catch (RequestFailedException ex) when (ex.ErrorCode == BlobErrorCode.ContainerNotFound || ex.ErrorCode == BlobErrorCode.BlobNotFound) diff --git a/src/Core/Utilities/EncryptedStringAttribute.cs b/src/Core/Utilities/EncryptedStringAttribute.cs index 9c59287df6a2..70af8c74c856 100644 --- a/src/Core/Utilities/EncryptedStringAttribute.cs +++ b/src/Core/Utilities/EncryptedStringAttribute.cs @@ -1,5 +1,4 @@ -using System.Buffers.Text; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; using Bit.Core.Enums; #nullable enable @@ -111,7 +110,7 @@ private static bool ValidatePieces(ReadOnlySpan encryptionPart, int requir if (requiredPieces == 1) { // Only one more part is needed so don't split and check the chunk - if (rest.IsEmpty || !Base64.IsValid(rest)) + if (rest.IsEmpty || !IsValidBase64(rest)) { return false; } @@ -128,7 +127,7 @@ private static bool ValidatePieces(ReadOnlySpan encryptionPart, int requir } // Is the required chunk valid base 64? - if (chunk.IsEmpty || !Base64.IsValid(chunk)) + if (chunk.IsEmpty || !IsValidBase64(chunk)) { return false; } @@ -141,4 +140,28 @@ private static bool ValidatePieces(ReadOnlySpan encryptionPart, int requir // No more parts are required, so check there are no extra parts return rest.IndexOf('|') == -1; } + + // System.Buffers.Text.Base64.IsValid enforces canonical padding (non-zero unused bits are rejected) + // starting with .NET 9. Bitwarden clients may produce non-canonical base64 for random encrypted bytes, + // so we validate only character set, length, and padding structure. + private static bool IsValidBase64(ReadOnlySpan value) + { + if (value.IsEmpty || value.Length % 4 != 0) return false; + + var paddingCount = 0; + if (value[^1] == '=') paddingCount++; + if (value[^2] == '=') paddingCount++; + + for (int i = 0; i < value.Length - paddingCount; i++) + { + char c = value[i]; + if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || c == '+' || c == '/')) + { + return false; + } + } + + return true; + } } diff --git a/src/Events/Dockerfile b/src/Events/Dockerfile index 913e94da45d8..a9efeda671f0 100644 --- a/src/Events/Dockerfile +++ b/src/Events/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/src/EventsProcessor/Dockerfile b/src/EventsProcessor/Dockerfile index 433552d321ee..b71c68ec06e2 100644 --- a/src/EventsProcessor/Dockerfile +++ b/src/EventsProcessor/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/src/Icons/Dockerfile b/src/Icons/Dockerfile index 5cd2b405d411..63fb6caca5bd 100644 --- a/src/Icons/Dockerfile +++ b/src/Icons/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -36,7 +36,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/src/Identity/Dockerfile b/src/Identity/Dockerfile index e79439f275f4..457e46401f66 100644 --- a/src/Identity/Dockerfile +++ b/src/Identity/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/src/Infrastructure.EntityFramework/AdminConsole/Repositories/OrganizationRepository.cs b/src/Infrastructure.EntityFramework/AdminConsole/Repositories/OrganizationRepository.cs index efead6e24aae..af2f11e355b1 100644 --- a/src/Infrastructure.EntityFramework/AdminConsole/Repositories/OrganizationRepository.cs +++ b/src/Infrastructure.EntityFramework/AdminConsole/Repositories/OrganizationRepository.cs @@ -10,7 +10,7 @@ using Bit.Core.Models.Data.Organizations; using Bit.Core.Models.Data.Organizations.OrganizationUsers; using Bit.Core.Repositories; -using LinqToDB.Tools; +using LinqToDB; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; diff --git a/src/Infrastructure.EntityFramework/Billing/Repositories/ProviderInvoiceItemRepository.cs b/src/Infrastructure.EntityFramework/Billing/Repositories/ProviderInvoiceItemRepository.cs index ed729070ae99..6c143ecd7153 100644 --- a/src/Infrastructure.EntityFramework/Billing/Repositories/ProviderInvoiceItemRepository.cs +++ b/src/Infrastructure.EntityFramework/Billing/Repositories/ProviderInvoiceItemRepository.cs @@ -2,7 +2,7 @@ using Bit.Core.Billing.Providers.Entities; using Bit.Core.Billing.Providers.Repositories; using Bit.Infrastructure.EntityFramework.Repositories; -using LinqToDB; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using EFProviderInvoiceItem = Bit.Infrastructure.EntityFramework.Billing.Models.ProviderInvoiceItem; diff --git a/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationApplicationRepository.cs b/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationApplicationRepository.cs index f408ed85ba4a..b5504906b49f 100644 --- a/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationApplicationRepository.cs +++ b/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationApplicationRepository.cs @@ -2,7 +2,7 @@ using Bit.Core.Dirt.Repositories; using Bit.Infrastructure.EntityFramework.Dirt.Models; using Bit.Infrastructure.EntityFramework.Repositories; -using LinqToDB; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace Bit.Infrastructure.EntityFramework.Dirt.Repositories; diff --git a/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationReportRepository.cs b/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationReportRepository.cs index d08e70c35325..98829c8ea17c 100644 --- a/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationReportRepository.cs +++ b/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationReportRepository.cs @@ -8,6 +8,7 @@ using Bit.Core.Dirt.Repositories; using Bit.Infrastructure.EntityFramework.Repositories; using LinqToDB; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; diff --git a/src/Infrastructure.EntityFramework/Dirt/Repositories/PasswordHealthReportApplicationRepository.cs b/src/Infrastructure.EntityFramework/Dirt/Repositories/PasswordHealthReportApplicationRepository.cs index 296a542a8bb7..d49dd93cb035 100644 --- a/src/Infrastructure.EntityFramework/Dirt/Repositories/PasswordHealthReportApplicationRepository.cs +++ b/src/Infrastructure.EntityFramework/Dirt/Repositories/PasswordHealthReportApplicationRepository.cs @@ -2,7 +2,7 @@ using Bit.Core.Dirt.Repositories; using Bit.Infrastructure.EntityFramework.Dirt.Models; using Bit.Infrastructure.EntityFramework.Repositories; -using LinqToDB; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace Bit.Infrastructure.EntityFramework.Dirt.Repositories; diff --git a/src/Infrastructure.EntityFramework/Infrastructure.EntityFramework.csproj b/src/Infrastructure.EntityFramework/Infrastructure.EntityFramework.csproj index 180bcd770575..75513e6b22c1 100644 --- a/src/Infrastructure.EntityFramework/Infrastructure.EntityFramework.csproj +++ b/src/Infrastructure.EntityFramework/Infrastructure.EntityFramework.csproj @@ -2,18 +2,24 @@ $(WarningsNotAsErrors);CA1304;CA1305 + + $(NoWarn);NU1608 - - - - - - - + + + + + + + diff --git a/src/Notifications/Dockerfile b/src/Notifications/Dockerfile index 031df0b1b67c..fcaedf8ab777 100644 --- a/src/Notifications/Dockerfile +++ b/src/Notifications/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/src/Notifications/Notifications.csproj b/src/Notifications/Notifications.csproj index 76278fdea83c..f98d955d08b5 100644 --- a/src/Notifications/Notifications.csproj +++ b/src/Notifications/Notifications.csproj @@ -8,12 +8,12 @@ - - + + - + diff --git a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs index 8d65547f7621..426926cc0bb4 100644 --- a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs +++ b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs @@ -597,14 +597,14 @@ public static void UseForwardedHeaders(this IApplicationBuilder app, IGlobalSett var proxyNetworks = globalSettings.KnownNetworks.Split(','); foreach (var proxyNetwork in proxyNetworks) { - if (Microsoft.AspNetCore.HttpOverrides.IPNetwork.TryParse(proxyNetwork.Trim(), out var ipn)) + if (System.Net.IPNetwork.TryParse(proxyNetwork.Trim(), out var ipn)) { - options.KnownNetworks.Add(ipn); + options.KnownIPNetworks.Add(ipn); } } } - if (options.KnownProxies.Count > 1 || options.KnownNetworks.Count > 1) + if (options.KnownProxies.Count > 1 || options.KnownIPNetworks.Count > 1) { options.ForwardLimit = null; } diff --git a/test/Core.IntegrationTest/Core.IntegrationTest.csproj b/test/Core.IntegrationTest/Core.IntegrationTest.csproj index 133793d3d831..d645cdd24e41 100644 --- a/test/Core.IntegrationTest/Core.IntegrationTest.csproj +++ b/test/Core.IntegrationTest/Core.IntegrationTest.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable diff --git a/test/Core.Test/Models/Api/Request/PushSendRequestModelTests.cs b/test/Core.Test/Models/Api/Request/PushSendRequestModelTests.cs index e3728995999c..fd12963aac81 100644 --- a/test/Core.Test/Models/Api/Request/PushSendRequestModelTests.cs +++ b/test/Core.Test/Models/Api/Request/PushSendRequestModelTests.cs @@ -108,7 +108,7 @@ public void Validate_RequiredFieldNotProvided_Invalid(string requiredField) var serialized = JsonSerializer.Serialize(dictionary, JsonHelpers.IgnoreWritingNull); var jsonException = Assert.Throws(() => JsonSerializer.Deserialize>(serialized)); - Assert.Contains($"missing required properties, including the following: {requiredField}", + Assert.Contains($"was missing required properties including: '{requiredField}'", jsonException.Message); } diff --git a/test/Core.Test/Utilities/CoreHelpersTests.cs b/test/Core.Test/Utilities/CoreHelpersTests.cs index d006df536ba2..c9894ca74a80 100644 --- a/test/Core.Test/Utilities/CoreHelpersTests.cs +++ b/test/Core.Test/Utilities/CoreHelpersTests.cs @@ -410,7 +410,9 @@ public void TokenIsValid_Success(string unprotectedTokenTemplate, string firstPa { var protector = new TestDataProtector(string.Format(unprotectedTokenTemplate, CoreHelpers.ToEpocMilliseconds(creationTime))); - Assert.Equal(isValid, CoreHelpers.TokenIsValid(firstPart, protector, "protected_token", userEmail, id, expirationInHours)); + // TestDataProtector ignores the decoded bytes; value just needs to be valid base64url + var token = CoreHelpers.Base64UrlEncode(Encoding.UTF8.GetBytes("protected_token")); + Assert.Equal(isValid, CoreHelpers.TokenIsValid(firstPart, protector, token, userEmail, id, expirationInHours)); } private class TestDataProtector : IDataProtector diff --git a/test/Events.IntegrationTest/Events.IntegrationTest.csproj b/test/Events.IntegrationTest/Events.IntegrationTest.csproj index dbfe14789214..1072149dc40b 100644 --- a/test/Events.IntegrationTest/Events.IntegrationTest.csproj +++ b/test/Events.IntegrationTest/Events.IntegrationTest.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable false true diff --git a/test/Identity.IntegrationTest/Endpoints/IdentityServerTwoFactorTests.cs b/test/Identity.IntegrationTest/Endpoints/IdentityServerTwoFactorTests.cs index d0d35f5d7bfe..74ee098b82f0 100644 --- a/test/Identity.IntegrationTest/Endpoints/IdentityServerTwoFactorTests.cs +++ b/test/Identity.IntegrationTest/Endpoints/IdentityServerTwoFactorTests.cs @@ -20,7 +20,7 @@ using Duende.IdentityModel; using Duende.IdentityServer.Models; using Duende.IdentityServer.Stores; -using LinqToDB; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Distributed; using NSubstitute; using Xunit; diff --git a/test/Identity.IntegrationTest/Identity.IntegrationTest.csproj b/test/Identity.IntegrationTest/Identity.IntegrationTest.csproj index 8a3c0d0fc221..b16c8efe10e5 100644 --- a/test/Identity.IntegrationTest/Identity.IntegrationTest.csproj +++ b/test/Identity.IntegrationTest/Identity.IntegrationTest.csproj @@ -12,7 +12,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/test/Infrastructure.Dapper.Test/Infrastructure.Dapper.Test.csproj b/test/Infrastructure.Dapper.Test/Infrastructure.Dapper.Test.csproj index 7a6bd3ba2053..f3d28d60682a 100644 --- a/test/Infrastructure.Dapper.Test/Infrastructure.Dapper.Test.csproj +++ b/test/Infrastructure.Dapper.Test/Infrastructure.Dapper.Test.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable false true diff --git a/test/Infrastructure.EFIntegration.Test/Vault/Repositories/CipherRepositoryTests.cs b/test/Infrastructure.EFIntegration.Test/Vault/Repositories/CipherRepositoryTests.cs index a314d15ddab9..cc673e3a2487 100644 --- a/test/Infrastructure.EFIntegration.Test/Vault/Repositories/CipherRepositoryTests.cs +++ b/test/Infrastructure.EFIntegration.Test/Vault/Repositories/CipherRepositoryTests.cs @@ -8,7 +8,7 @@ using Bit.Infrastructure.EFIntegration.Test.Repositories.EqualityComparers; using Bit.Infrastructure.EntityFramework.Repositories.Queries; using Bit.Test.Common.AutoFixture.Attributes; -using LinqToDB; +using Microsoft.EntityFrameworkCore; using Xunit; using EfAdminConsoleRepo = Bit.Infrastructure.EntityFramework.AdminConsole.Repositories; using EfRepo = Bit.Infrastructure.EntityFramework.Repositories; diff --git a/test/Infrastructure.IntegrationTest/Infrastructure.IntegrationTest.csproj b/test/Infrastructure.IntegrationTest/Infrastructure.IntegrationTest.csproj index 262a0fe85615..c175ffd461da 100644 --- a/test/Infrastructure.IntegrationTest/Infrastructure.IntegrationTest.csproj +++ b/test/Infrastructure.IntegrationTest/Infrastructure.IntegrationTest.csproj @@ -8,9 +8,9 @@ - - - + + + diff --git a/test/Infrastructure.IntegrationTest/Tools/SendRepositoryTests.cs b/test/Infrastructure.IntegrationTest/Tools/SendRepositoryTests.cs index bcc525e0d29a..e1df69b7b083 100644 --- a/test/Infrastructure.IntegrationTest/Tools/SendRepositoryTests.cs +++ b/test/Infrastructure.IntegrationTest/Tools/SendRepositoryTests.cs @@ -37,7 +37,6 @@ public async Task CreateAsync_Works(ISendRepository sendRepository) } [DatabaseTheory, DatabaseData] - // This test runs best on a fresh database and may fail on subsequent runs with other tests. public async Task GetByDeletionDateAsync_Works(ISendRepository sendRepository) { var deletionDate = DateTime.UtcNow.AddYears(-1); @@ -61,7 +60,7 @@ public async Task GetByDeletionDateAsync_Works(ISendRepository sendRepository) }); var toDeleteSends = await sendRepository.GetManyByDeletionDateAsync(deletionDate); - var toDeleteSend = Assert.Single(toDeleteSends); - Assert.Equal(shouldDeleteSend.Id, toDeleteSend.Id); + Assert.Contains(toDeleteSends, s => s.Id == shouldDeleteSend.Id); + Assert.DoesNotContain(toDeleteSends, s => s.Id == shouldKeepSend.Id); } } diff --git a/test/IntegrationTestCommon/Factories/IdentityApplicationFactory.cs b/test/IntegrationTestCommon/Factories/IdentityApplicationFactory.cs index af60cadce464..12f28c586cbe 100644 --- a/test/IntegrationTestCommon/Factories/IdentityApplicationFactory.cs +++ b/test/IntegrationTestCommon/Factories/IdentityApplicationFactory.cs @@ -15,9 +15,9 @@ using Bit.Identity.IdentityServer; using Bit.Identity.IdentityServer.RequestValidators; using Bit.Test.Common.Helpers; -using LinqToDB; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; using NSubstitute; using Xunit; diff --git a/test/IntegrationTestCommon/IntegrationTestCommon.csproj b/test/IntegrationTestCommon/IntegrationTestCommon.csproj index 8ed593d058d7..453e2dcd3e51 100644 --- a/test/IntegrationTestCommon/IntegrationTestCommon.csproj +++ b/test/IntegrationTestCommon/IntegrationTestCommon.csproj @@ -7,7 +7,7 @@ - + diff --git a/test/Server.IntegrationTest/Server.IntegrationTest.csproj b/test/Server.IntegrationTest/Server.IntegrationTest.csproj index 362ada84a01b..7798985cb2d6 100644 --- a/test/Server.IntegrationTest/Server.IntegrationTest.csproj +++ b/test/Server.IntegrationTest/Server.IntegrationTest.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/Server.IntegrationTest/Server.cs b/test/Server.IntegrationTest/Server.cs index 073dbffb5a6c..963e6e0ecd7e 100644 --- a/test/Server.IntegrationTest/Server.cs +++ b/test/Server.IntegrationTest/Server.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.Configuration; namespace Bit.Server.IntegrationTest; @@ -12,34 +12,27 @@ public class Server : WebApplicationFactory public bool? WebVault { get; set; } public string? AppIdLocation { get; set; } - protected override IWebHostBuilder? CreateWebHostBuilder() + protected override void ConfigureWebHost(IWebHostBuilder builder) { - var args = new List + base.ConfigureWebHost(builder); + + var config = new Dictionary { - "/contentRoot", - ContentRoot ?? "", - "/webRoot", - WebRoot ?? "", - "/serveUnknown", - ServeUnknown.ToString().ToLowerInvariant(), + {"contentRoot", ContentRoot}, + {"webRoot", WebRoot}, + {"serveUnknown", ServeUnknown.ToString().ToLowerInvariant()}, }; if (WebVault.HasValue) { - args.Add("/webVault"); - args.Add(WebVault.Value.ToString().ToLowerInvariant()); + config["webVault"] = WebVault.Value.ToString().ToLowerInvariant(); } if (!string.IsNullOrEmpty(AppIdLocation)) { - args.Add("/appIdLocation"); - args.Add(AppIdLocation); + config["appIdLocation"] = AppIdLocation; } - var builder = WebHostBuilderFactory.CreateFromTypesAssemblyEntryPoint([.. args]) - ?? throw new InvalidProgramException("Could not create builder from assembly."); - - builder.UseSetting("TEST_CONTENTROOT_SERVER", ContentRoot); - return builder; + builder.UseConfiguration(new ConfigurationBuilder().AddInMemoryCollection(config).Build()); } } diff --git a/util/Attachments/Dockerfile b/util/Attachments/Dockerfile index 5ba22918c497..586e87c448f8 100644 --- a/util/Attachments/Dockerfile +++ b/util/Attachments/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/util/Migrator/Migrator.csproj b/util/Migrator/Migrator.csproj index 29caf74f3941..a8a9859f3e7a 100644 --- a/util/Migrator/Migrator.csproj +++ b/util/Migrator/Migrator.csproj @@ -13,7 +13,7 @@ - + diff --git a/util/MsSqlMigratorUtility/Dockerfile b/util/MsSqlMigratorUtility/Dockerfile index b8bd7ff4a116..468b45a33f42 100644 --- a/util/MsSqlMigratorUtility/Dockerfile +++ b/util/MsSqlMigratorUtility/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -38,7 +38,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 AS app +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS app ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" diff --git a/util/MsSqlMigratorUtility/MsSqlMigratorUtility.csproj b/util/MsSqlMigratorUtility/MsSqlMigratorUtility.csproj index 7e68a91b65e1..3a3df2040b81 100644 --- a/util/MsSqlMigratorUtility/MsSqlMigratorUtility.csproj +++ b/util/MsSqlMigratorUtility/MsSqlMigratorUtility.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/util/MySqlMigrations/MySqlMigrations.csproj b/util/MySqlMigrations/MySqlMigrations.csproj index b297ea10416e..cb5de6c59525 100644 --- a/util/MySqlMigrations/MySqlMigrations.csproj +++ b/util/MySqlMigrations/MySqlMigrations.csproj @@ -12,7 +12,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/util/PostgresMigrations/PostgresMigrations.csproj b/util/PostgresMigrations/PostgresMigrations.csproj index 66f3abe769e9..b0805f5b4476 100644 --- a/util/PostgresMigrations/PostgresMigrations.csproj +++ b/util/PostgresMigrations/PostgresMigrations.csproj @@ -11,7 +11,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/util/RustSdk/RustSdk.csproj b/util/RustSdk/RustSdk.csproj index 14cc01736567..61dd2bcd9602 100644 --- a/util/RustSdk/RustSdk.csproj +++ b/util/RustSdk/RustSdk.csproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 enable enable Bit.RustSDK diff --git a/util/Seeder/Seeder.csproj b/util/Seeder/Seeder.csproj index 1988c7d393cf..a2f07e3c18b4 100644 --- a/util/Seeder/Seeder.csproj +++ b/util/Seeder/Seeder.csproj @@ -2,7 +2,7 @@ - net8.0 + net10.0 enable enable Bit.Seeder diff --git a/util/SeederApi/SeederApi.csproj b/util/SeederApi/SeederApi.csproj index 53e9941c1cb4..43a75eab69a9 100644 --- a/util/SeederApi/SeederApi.csproj +++ b/util/SeederApi/SeederApi.csproj @@ -2,7 +2,7 @@ bitwarden-seeder-api - net8.0 + net10.0 enable enable false diff --git a/util/SeederUtility/SeederUtility.csproj b/util/SeederUtility/SeederUtility.csproj index b0e9f7b5e40b..e55b41a85dd8 100644 --- a/util/SeederUtility/SeederUtility.csproj +++ b/util/SeederUtility/SeederUtility.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net10.0 enable enable Bit.SeederUtility diff --git a/util/Server/Program.cs b/util/Server/Program.cs index 3d563830ab20..bc00b46ecbcd 100644 --- a/util/Server/Program.cs +++ b/util/Server/Program.cs @@ -6,27 +6,30 @@ namespace Bit.Server; public class Program { public static void Main(string[] args) - { - var builder = CreateWebHostBuilder(args); - var host = builder.Build(); - host.Run(); - } - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) { var config = new ConfigurationBuilder() .AddCommandLine(args) .Build(); - var builder = new WebHostBuilder() - .UseConfiguration(config) - .UseKestrel() - .UseStartup() - .ConfigureLogging((hostingContext, logging) => + var builder = new HostBuilder() + .ConfigureWebHost(builder => { - logging.AddConsole().AddDebug(); + builder.UseConfiguration(config); + builder.UseKestrel(); + builder.UseStartup(); + builder.ConfigureKestrel((_, _) => { }); + + var webRoot = config.GetValue("webRoot"); + if (string.IsNullOrWhiteSpace(webRoot)) + { + builder.UseWebRoot(webRoot); + } }) - .ConfigureKestrel((context, options) => { }); + .ConfigureLogging(logging => + { + logging.AddConsole() + .AddDebug(); + }); var contentRoot = config.GetValue("contentRoot"); if (!string.IsNullOrWhiteSpace(contentRoot)) @@ -38,12 +41,7 @@ public static IWebHostBuilder CreateWebHostBuilder(string[] args) builder.UseContentRoot(Directory.GetCurrentDirectory()); } - var webRoot = config.GetValue("webRoot"); - if (string.IsNullOrWhiteSpace(webRoot)) - { - builder.UseWebRoot(webRoot); - } - - return builder; + var host = builder.Build(); + host.Run(); } } diff --git a/util/Setup/Dockerfile b/util/Setup/Dockerfile index 2ab86c69ed86..db19f59661b1 100644 --- a/util/Setup/Dockerfile +++ b/util/Setup/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Build stage # ############################################### -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine3.21 AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build # Docker buildx supplies the value for this arg ARG TARGETPLATFORM @@ -37,7 +37,7 @@ RUN . /tmp/rid.txt && dotnet publish \ ############################################### # App stage # ############################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine3.21 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine ARG TARGETPLATFORM LABEL com.bitwarden.product="bitwarden" com.bitwarden.project="setup" diff --git a/util/Setup/Setup.csproj b/util/Setup/Setup.csproj index b4ab0bd806cc..1d45d32af11b 100644 --- a/util/Setup/Setup.csproj +++ b/util/Setup/Setup.csproj @@ -13,7 +13,7 @@ - + diff --git a/util/SqlServerEFScaffold/SqlServerEFScaffold.csproj b/util/SqlServerEFScaffold/SqlServerEFScaffold.csproj index a2fb8173bf06..fd96f22655b5 100644 --- a/util/SqlServerEFScaffold/SqlServerEFScaffold.csproj +++ b/util/SqlServerEFScaffold/SqlServerEFScaffold.csproj @@ -5,7 +5,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/util/SqliteMigrations/SqliteMigrations.csproj b/util/SqliteMigrations/SqliteMigrations.csproj index 26def0dad201..259f306c2924 100644 --- a/util/SqliteMigrations/SqliteMigrations.csproj +++ b/util/SqliteMigrations/SqliteMigrations.csproj @@ -13,7 +13,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all