diff --git a/NuGet.config b/NuGet.config index 9fa908668f8f..e1e647dd1771 100644 --- a/NuGet.config +++ b/NuGet.config @@ -4,10 +4,10 @@ - + - + @@ -30,10 +30,10 @@ - + - + diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props index f566358b9acb..dfd9247704ed 100644 --- a/eng/Baseline.Designer.props +++ b/eng/Baseline.Designer.props @@ -2,117 +2,117 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - - + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 @@ -120,279 +120,279 @@ - 9.0.0 + 9.0.1 - - - + + + - - - + + + - - - + + + - 9.0.0 + 9.0.1 - - - + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 - - - - - + + + + + - 9.0.0 + 9.0.1 - - - - - + + + + + - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - - - - - + + + + + + - 9.0.0 + 9.0.1 - - - + + + - 9.0.0 + 9.0.1 - - - + + + - + - - - + + + - - - + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - + - + - + - 9.0.0 + 9.0.1 - - - - - - + + + + + + - + - - - - - - - + + + + + + + - - - - - - + + + + + + - + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 - - + + - - + + - - + + - 9.0.0 + 9.0.1 - + - + - + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 @@ -401,83 +401,83 @@ - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - - - + + + - + - - - - + + + + - - - - + + + + - - - - + + + + - 9.0.0 + 9.0.1 - - + + - + - - + + - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 @@ -493,510 +493,510 @@ - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - - - + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - + + - - + + - - + + - 9.0.0 + 9.0.1 - - - - - - + + + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - 9.0.0 + 9.0.1 - - + + - + - - + + - - - + + + - 9.0.0 + 9.0.1 - + - + - + - 9.0.0 + 9.0.1 - + - + - + - 9.0.0 + 9.0.1 - + - + - + - 9.0.0 + 9.0.1 - - - - + + + + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - + + - - + + - - + + - 9.0.0 + 9.0.1 - - - + + + - - - + + + - - - + + + - - - + + + - 9.0.0 + 9.0.1 - - + + - - + + - - + + - 9.0.0 + 9.0.1 - - - - - + + + + + - - - - + + + + - - - - - + + + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - - + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - + - + - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - - - + + + - - - + + + - - - + + + - 9.0.0 + 9.0.1 - - - + + + - - - + + + - - - + + + - 9.0.0 + 9.0.1 - - - - + + + + - - - - + + + + - - - - + + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - - - + + + - - + + - - - + + + - 9.0.0 + 9.0.1 - 9.0.0 + 9.0.1 - + - 9.0.0 + 9.0.1 - + \ No newline at end of file diff --git a/eng/Baseline.xml b/eng/Baseline.xml index 1b4ce55e8e33..b081a19bb966 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -4,110 +4,110 @@ This file contains a list of all the packages and their versions which were rele Update this list when preparing for a new patch. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b87535c6b679..206dc89ef3ad 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -9,334 +9,334 @@ --> - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8 + 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8 + 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8 + 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8 + 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8 + 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8 + 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8 + 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e - + https://dev.azure.com/dnceng/internal/_git/dotnet-efcore - 480480b57cd6e43fe5cab1b552ac0ef917bf3fe8 + 7bb42e8dd6df45b8570b7cb7ccdcfd5fb6460b0e - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://github.com/dotnet/xdt - 1a54480f52703fb45fac2a6b955247d33758383e + 63ae81154c50a1cf9287cc47d8351d55b4289e6d - + https://github.com/dotnet/xdt - 1a54480f52703fb45fac2a6b955247d33758383e + 63ae81154c50a1cf9287cc47d8351d55b4289e6d @@ -367,60 +367,60 @@ bc1c3011064a493b0ca527df6fb7215e2e5cfa96 - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 - + https://github.com/dotnet/source-build-externals - c65b1c1affed1f4847f9c3f81623dfa929d21e1a + ab469606a3e6b026dcac301e2dab96117c94faeb - + https://dev.azure.com/dnceng/internal/_git/dotnet-runtime - c8acea22626efab11c13778c028975acdc34678f + 80aa709f5d919c6814726788dc6dabe23e79e672 https://github.com/dotnet/winforms 9b822fd70005bf5632d12fe76811b97b3dd044e4 - + https://github.com/dotnet/arcade - b41381d5cd633471265e9cd72e933a7048e03062 + 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54 - + https://github.com/dotnet/arcade - b41381d5cd633471265e9cd72e933a7048e03062 + 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54 - + https://github.com/dotnet/arcade - b41381d5cd633471265e9cd72e933a7048e03062 + 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54 - + https://github.com/dotnet/arcade - b41381d5cd633471265e9cd72e933a7048e03062 + 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54 - + https://github.com/dotnet/arcade - b41381d5cd633471265e9cd72e933a7048e03062 + 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54 - + https://github.com/dotnet/arcade - b41381d5cd633471265e9cd72e933a7048e03062 + 8cc6ecd76c24ef6665579a5c5e386a211a1e7c54 - + https://github.com/dotnet/extensions - cfed375f3161f2e553e946b4f968b818e8e858f1 + 309f2b7f73a28ffd75dac15434d160e5bd765384 - + https://github.com/dotnet/extensions - cfed375f3161f2e553e946b4f968b818e8e858f1 + 309f2b7f73a28ffd75dac15434d160e5bd765384 https://github.com/nuget/nuget.client diff --git a/eng/Versions.props b/eng/Versions.props index 3d2831de877a..796893bce1e8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -8,7 +8,7 @@ 9 0 - 1 + 2 true @@ -68,92 +68,92 @@ --> - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1-servicing.24610.10 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1-servicing.24610.10 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1-servicing.24610.10 - 9.0.1-servicing.24610.10 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2-servicing.25066.10 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2-servicing.25066.10 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2-servicing.25066.10 + 9.0.2-servicing.25066.10 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 - 9.0.1-servicing.24610.10 - 9.0.1 + 9.0.2-servicing.25066.10 + 9.0.2 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 - 9.1.0-preview.1.24575.1 - 9.1.0-preview.1.24575.1 + 9.1.0-preview.1.25060.3 + 9.1.0-preview.1.25060.3 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 - 9.0.1 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 + 9.0.2 4.11.0-3.24554.2 4.11.0-3.24554.2 @@ -166,12 +166,12 @@ 6.2.4 6.2.4 - 9.0.0-beta.24572.2 - 9.0.0-beta.24572.2 - 9.0.0-beta.24572.2 - 9.0.0-beta.24572.2 + 9.0.0-beta.25058.5 + 9.0.0-beta.25058.5 + 9.0.0-beta.25058.5 + 9.0.0-beta.25058.5 - 9.0.0-alpha.1.24568.2 + 9.0.0-alpha.1.24575.1 9.0.0-alpha.1.24413.1 @@ -179,8 +179,8 @@ 9.0.0-rtm.24512.2 - 9.0.0-preview.24522.2 - 9.0.0-preview.24522.2 + 10.0.0-preview.24609.2 + 10.0.0-preview.24609.2 - + - + diff --git a/eng/targets/Helix.targets b/eng/targets/Helix.targets index 43bf0cb7f7f1..70e01877befa 100644 --- a/eng/targets/Helix.targets +++ b/eng/targets/Helix.targets @@ -19,7 +19,7 @@ $(HelixQueueAlmaLinux8); $(HelixQueueAlpine318); $(HelixQueueDebian12); - $(HelixQueueFedora38); + $(HelixQueueFedora40); $(HelixQueueMariner); Ubuntu.2004.Amd64.Open; diff --git a/global.json b/global.json index e4674ed713f8..f0a083e23ce2 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.101" }, "tools": { - "dotnet": "9.0.100", + "dotnet": "9.0.101", "runtimes": { "dotnet/x86": [ "$(MicrosoftNETCoreBrowserDebugHostTransportVersion)" @@ -27,7 +27,7 @@ "jdk": "11.0.24" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24572.2", - "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.24572.2" + "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.25058.5", + "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.25058.5" } } diff --git a/src/Components/WebAssembly/DevServer/src/Server/Startup.cs b/src/Components/WebAssembly/DevServer/src/Server/Startup.cs index 046031a29f79..a9870bf688fb 100644 --- a/src/Components/WebAssembly/DevServer/src/Server/Startup.cs +++ b/src/Components/WebAssembly/DevServer/src/Server/Startup.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Components.WebAssembly.DevServer.Server; @@ -69,6 +70,14 @@ public static void Configure(IApplicationBuilder app, IConfiguration configurati { OnPrepareResponse = fileContext => { + // Avoid caching index.html during development. + // When hot reload is enabled, a middleware injects a hot reload script into the response HTML. + // We don't want the browser to bypass this injection by using a cached response that doesn't + // contain the injected script. In the future, if script injection is removed in favor of a + // different mechanism, we can delete this comment and the line below it. + // See also: https://github.com/dotnet/aspnetcore/issues/45213 + fileContext.Context.Response.Headers[HeaderNames.CacheControl] = "no-store"; + if (applyCopHeaders) { // Browser multi-threaded runtime requires cross-origin policy headers to enable SharedArrayBuffer. diff --git a/src/Http/WebUtilities/src/MultipartReaderStream.cs b/src/Http/WebUtilities/src/MultipartReaderStream.cs index 208d1b38f0e0..9dd5ce6a76f8 100644 --- a/src/Http/WebUtilities/src/MultipartReaderStream.cs +++ b/src/Http/WebUtilities/src/MultipartReaderStream.cs @@ -174,7 +174,7 @@ public override int Read(byte[] buffer, int offset, int count) if (index != 0) { // Sync, it's already buffered - var slice = buffer.AsSpan(0, Math.Min(buffer.Length, index)); + var slice = buffer.AsSpan(offset, Math.Min(count, index)); var readAmount = _innerStream.Read(slice); return UpdatePosition(readAmount); diff --git a/src/Http/WebUtilities/test/MultipartReaderTests.cs b/src/Http/WebUtilities/test/MultipartReaderTests.cs index 8231ec472bc0..bc442b567dc0 100644 --- a/src/Http/WebUtilities/test/MultipartReaderTests.cs +++ b/src/Http/WebUtilities/test/MultipartReaderTests.cs @@ -389,4 +389,28 @@ public async Task MultipartReader_StripQuotesFromBoundary() var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); } + + [Fact] + public async Task SyncReadWithOffsetWorks() + { + var stream = MakeStream(OnePartBody); + var reader = new MultipartReader(Boundary, stream); + var buffer = new byte[5]; + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Single(section.Headers); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + + var read = section.Body.Read(buffer, 2, buffer.Length - 2); + Assert.Equal("\0\0tex", GetString(buffer, read + 2)); + + read = section.Body.Read(buffer, 1, buffer.Length - 1); + Assert.Equal("\0t de", GetString(buffer, read + 1)); + + read = section.Body.Read(buffer, 0, buffer.Length); + Assert.Equal("fault", GetString(buffer, read)); + + Assert.Null(await reader.ReadNextSectionAsync()); + } } diff --git a/src/OpenApi/src/Comparers/OpenApiSchemaComparer.cs b/src/OpenApi/src/Comparers/OpenApiSchemaComparer.cs index 0591035d2f47..2e69b10f213f 100644 --- a/src/OpenApi/src/Comparers/OpenApiSchemaComparer.cs +++ b/src/OpenApi/src/Comparers/OpenApiSchemaComparer.cs @@ -24,6 +24,15 @@ public bool Equals(OpenApiSchema? x, OpenApiSchema? y) return true; } + // If a local reference is present, we can't compare the schema directly + // and should instead use the schema ID as a type-check to assert if the schemas are + // equivalent. + if ((x.Reference != null && y.Reference == null) + || (x.Reference == null && y.Reference != null)) + { + return SchemaIdEquals(x, y); + } + // Compare property equality in an order that should help us find inequality faster return x.Type == y.Type && diff --git a/src/OpenApi/src/Services/OpenApiDocumentService.cs b/src/OpenApi/src/Services/OpenApiDocumentService.cs index a9a7ecf6a1a6..5d678e67c8c7 100644 --- a/src/OpenApi/src/Services/OpenApiDocumentService.cs +++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs @@ -411,7 +411,7 @@ private async Task GetResponseAsync( "Query" => ParameterLocation.Query, "Header" => ParameterLocation.Header, "Path" => ParameterLocation.Path, - _ => throw new InvalidOperationException($"Unsupported parameter source: {parameter.Source.Id}") + _ => ParameterLocation.Query }, Required = IsRequired(parameter), Schema = await _componentService.GetOrCreateSchemaAsync(GetTargetType(description, parameter), scopedServiceProvider, schemaTransformers, parameter, cancellationToken: cancellationToken), diff --git a/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs index d7ea158b919a..537eb5d5db72 100644 --- a/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs +++ b/src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs @@ -32,7 +32,7 @@ internal sealed class OpenApiSchemaService( IOptionsMonitor optionsMonitor) { private readonly OpenApiSchemaStore _schemaStore = serviceProvider.GetRequiredKeyedService(documentName); - private readonly OpenApiJsonSchemaContext _jsonSchemaContext = new OpenApiJsonSchemaContext(new(jsonOptions.Value.SerializerOptions)); + private readonly OpenApiJsonSchemaContext _jsonSchemaContext = new(new(jsonOptions.Value.SerializerOptions)); private readonly JsonSerializerOptions _jsonSerializerOptions = new(jsonOptions.Value.SerializerOptions) { // In order to properly handle the `RequiredAttribute` on type properties, add a modifier to support @@ -102,7 +102,7 @@ internal sealed class OpenApiSchemaService( // "nested": "#/properties/nested" becomes "nested": "#/components/schemas/NestedType" if (jsonPropertyInfo.PropertyType == jsonPropertyInfo.DeclaringType) { - return new JsonObject { [OpenApiSchemaKeywords.RefKeyword] = context.TypeInfo.GetSchemaReferenceId() }; + return new JsonObject { [OpenApiSchemaKeywords.RefKeyword] = createSchemaReferenceId(context.TypeInfo) }; } schema.ApplyNullabilityContextInfo(jsonPropertyInfo); } @@ -212,7 +212,13 @@ private async Task InnerApplySchemaTransformersAsync(OpenApiSchema schema, } } } - } + + if (schema is { AdditionalPropertiesAllowed: true, AdditionalProperties: not null } && jsonTypeInfo.ElementType is not null) + { + var elementTypeInfo = _jsonSerializerOptions.GetTypeInfo(jsonTypeInfo.ElementType); + await InnerApplySchemaTransformersAsync(schema.AdditionalProperties, elementTypeInfo, null, context, transformer, cancellationToken); + } + } private JsonNode CreateSchema(OpenApiSchemaKey key) => JsonSchemaExporter.GetJsonSchemaAsNode(_jsonSerializerOptions, key.Type, _configuration); diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs index 10c65ae2787f..999283022706 100644 --- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs +++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.OpenApi.Models; public partial class OpenApiDocumentServiceTests : OpenApiDocumentServiceTestBase @@ -190,4 +191,29 @@ await VerifyOpenApiDocument(builder, document => Assert.Null(document.Paths["/api/content-type-lower"].Operations[OperationType.Get].Parameters); }); } + + [Fact] + public async Task GetOpenApiParameters_ToleratesCustomBindingSource() + { + var action = CreateActionDescriptor(nameof(ActionWithCustomBinder)); + + await VerifyOpenApiDocument(action, document => + { + var operation = document.Paths["/custom-binding"].Operations[OperationType.Get]; + var parameter = Assert.Single(operation.Parameters); + Assert.Equal("model", parameter.Name); + Assert.Equal(ParameterLocation.Query, parameter.In); + }); + } + + [Route("/custom-binding")] + private void ActionWithCustomBinder([ModelBinder(BinderType = typeof(CustomBinder))] Todo model) { } + + public class CustomBinder : IModelBinder + { + public Task BindModelAsync(ModelBindingContext bindingContext) + { + return Task.CompletedTask; + } + } } diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/Implementations/OpenApiSchemaReferenceTransformerTests.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/Implementations/OpenApiSchemaReferenceTransformerTests.cs index 4d16ff51d4e7..7209715e3516 100644 --- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/Implementations/OpenApiSchemaReferenceTransformerTests.cs +++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/Implementations/OpenApiSchemaReferenceTransformerTests.cs @@ -477,4 +477,126 @@ await VerifyOpenApiDocument(builder, options, document => Assert.Equal(ReferenceType.Link, responseSchema.Reference.Type); }); } + + [Fact] + public async Task SupportsNestedSchemasWithSelfReference() + { + // Arrange + var builder = CreateBuilder(); + + builder.MapPost("/", (LocationContainer item) => { }); + + await VerifyOpenApiDocument(builder, document => + { + var operation = document.Paths["/"].Operations[OperationType.Post]; + var requestSchema = operation.RequestBody.Content["application/json"].Schema; + + // Assert $ref used for top-level + Assert.Equal("LocationContainer", requestSchema.Reference.Id); + + // Assert that $ref is used for nested LocationDto + var locationContainerSchema = requestSchema.GetEffective(document); + Assert.Equal("LocationDto", locationContainerSchema.Properties["location"].Reference.Id); + + // Assert that $ref is used for nested AddressDto + var locationSchema = locationContainerSchema.Properties["location"].GetEffective(document); + Assert.Equal("AddressDto", locationSchema.Properties["address"].Reference.Id); + + // Assert that $ref is used for related LocationDto + var addressSchema = locationSchema.Properties["address"].GetEffective(document); + Assert.Equal("LocationDto", addressSchema.Properties["relatedLocation"].Reference.Id); + }); + } + + [Fact] + public async Task SupportsListNestedSchemasWithSelfReference() + { + // Arrange + var builder = CreateBuilder(); + + builder.MapPost("/", (ParentObject item) => { }); + + await VerifyOpenApiDocument(builder, document => + { + var operation = document.Paths["/"].Operations[OperationType.Post]; + var requestSchema = operation.RequestBody.Content["application/json"].Schema; + + // Assert $ref used for top-level + Assert.Equal("ParentObject", requestSchema.Reference.Id); + + // Assert that $ref is used for nested Children + var parentSchema = requestSchema.GetEffective(document); + Assert.Equal("ChildObject", parentSchema.Properties["children"].Items.Reference.Id); + + // Assert that $ref is used for nested Parent + var childSchema = parentSchema.Properties["children"].Items.GetEffective(document); + Assert.Equal("ParentObject", childSchema.Properties["parent"].Reference.Id); + }); + } + + [Fact] + public async Task SupportsMultiplePropertiesWithSameType() + { + // Arrange + var builder = CreateBuilder(); + + builder.MapPost("/", (Root item) => { }); + + await VerifyOpenApiDocument(builder, document => + { + var operation = document.Paths["/"].Operations[OperationType.Post]; + var requestSchema = operation.RequestBody.Content["application/json"].Schema; + + // Assert $ref used for top-level + Assert.Equal("Root", requestSchema.Reference.Id); + + // Assert that $ref is used for nested Item1 + var rootSchema = requestSchema.GetEffective(document); + Assert.Equal("Item", rootSchema.Properties["item1"].Reference.Id); + + // Assert that $ref is used for nested Item2 + Assert.Equal("Item", rootSchema.Properties["item2"].Reference.Id); + }); + } + + private class Root + { + public Item Item1 { get; set; } = null!; + public Item Item2 { get; set; } = null!; + } + + private class Item + { + public string[] Name { get; set; } = null!; + public int value { get; set; } + } + + private class LocationContainer + { + public LocationDto Location { get; set; } + } + + private class LocationDto + { + public AddressDto Address { get; set; } + } + + private class AddressDto + { + public LocationDto RelatedLocation { get; set; } + } + +#nullable enable + private class ParentObject + { + public int Id { get; set; } + public List Children { get; set; } = []; + } + + private class ChildObject + { + public int Id { get; set; } + public required ParentObject Parent { get; set; } + } } +#nullable restore diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/SchemaTransformerTests.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/SchemaTransformerTests.cs index 5d20c810d6fa..565c3a2b48b1 100644 --- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/SchemaTransformerTests.cs +++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Transformers/SchemaTransformerTests.cs @@ -444,6 +444,7 @@ public async Task SchemaTransformer_CanModifyItemTypesInADocument() builder.MapGet("/list", () => new List { 1, 2, 3, 4 }); builder.MapGet("/single", () => 1); + builder.MapGet("/dictionary", () => new Dictionary {{ "key", 1 }}); var options = new OpenApiOptions(); options.AddSchemaTransformer((schema, context, cancellationToken) => @@ -469,7 +470,13 @@ await VerifyOpenApiDocument(builder, options, document => getOperation = path.Operations[OperationType.Get]; responseSchema = getOperation.Responses["200"].Content["application/json"].Schema.GetEffective(document); Assert.Equal("modified-number-format", responseSchema.Format); - }); + + // Assert that the schema represent dictionary values has been modified + path = document.Paths["/dictionary"]; + getOperation = path.Operations[OperationType.Get]; + responseSchema = getOperation.Responses["200"].Content["application/json"].Schema.GetEffective(document); + Assert.Equal("modified-number-format", responseSchema.AdditionalProperties.Format); + }); } [Fact] diff --git a/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs b/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs index 6ce4d6014bbb..1ec03cca626c 100644 --- a/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs +++ b/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs @@ -72,7 +72,7 @@ public void Configure(string? name, JwtBearerOptions options) ValidAudiences = audiences, ValidAudience = audience, ValidateIssuerSigningKey = true, - IssuerSigningKeys = GetIssuerSigningKeys(configSection, issuers), + IssuerSigningKeys = GetIssuerSigningKeys(configSection, [issuer, ..issuers]), }; } diff --git a/src/Security/Authentication/test/JwtBearerTests_Handler.cs b/src/Security/Authentication/test/JwtBearerTests_Handler.cs index 1c24afe93cc0..dc5eb760a270 100644 --- a/src/Security/Authentication/test/JwtBearerTests_Handler.cs +++ b/src/Security/Authentication/test/JwtBearerTests_Handler.cs @@ -957,6 +957,7 @@ public async Task ExpirationAndIssuedWhenMinOrMaxValue() public void CanReadJwtBearerOptionsFromConfig() { var services = new ServiceCollection(); + var key = "qPG6tDtfxFYZifHW3sEueQ=="; var config = new ConfigurationBuilder().AddInMemoryCollection([ new("Authentication:Schemes:Bearer:ValidIssuer", "dotnet-user-jwts"), new("Authentication:Schemes:Bearer:ValidIssuers:0", "dotnet-user-jwts-2"), @@ -965,6 +966,9 @@ public void CanReadJwtBearerOptionsFromConfig() new("Authentication:Schemes:Bearer:BackchannelTimeout", "00:01:00"), new("Authentication:Schemes:Bearer:RequireHttpsMetadata", "false"), new("Authentication:Schemes:Bearer:SaveToken", "True"), + new("Authentication:Schemes:Bearer:SigningKeys:0:Issuer", "dotnet-user-jwts"), + new("Authentication:Schemes:Bearer:SigningKeys:0:Value", key), + new("Authentication:Schemes:Bearer:SigningKeys:0:Length", "32"), ]).Build(); services.AddSingleton(config); @@ -987,6 +991,10 @@ public void CanReadJwtBearerOptionsFromConfig() Assert.True(jwtBearerOptions.MapInboundClaims); Assert.True(jwtBearerOptions.TokenValidationParameters.ValidateIssuer); Assert.True(jwtBearerOptions.TokenValidationParameters.ValidateAudience); + + var securityKey = Assert.Single(jwtBearerOptions.TokenValidationParameters.IssuerSigningKeys); + var symmetricKey = Assert.IsType(securityKey); + Assert.Equal(key, Convert.ToBase64String(symmetricKey.Key)); } [Fact] diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs b/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs index b8714d601f9c..178007ec06ac 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs @@ -3,7 +3,6 @@ using System.Buffers; using System.Diagnostics; -using System.Globalization; using System.IO.Pipelines; using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Connections.Features; @@ -644,16 +643,24 @@ private void ValidateNonOriginHostHeader(string hostText) // authority component, excluding any userinfo subcomponent and its "@" // delimiter. + // Accessing authority always allocates, store it in a local to only allocate once + var authority = _absoluteRequestTarget!.Authority; + // System.Uri doesn't not tell us if the port was in the original string or not. // When IsDefaultPort = true, we will allow Host: with or without the default port - if (hostText != _absoluteRequestTarget!.Authority) + if (hostText != authority) { if (!_absoluteRequestTarget.IsDefaultPort - || hostText != _absoluteRequestTarget.Authority + ":" + _absoluteRequestTarget.Port.ToString(CultureInfo.InvariantCulture)) + || hostText != $"{authority}:{_absoluteRequestTarget.Port}") { if (_context.ServiceContext.ServerOptions.AllowHostHeaderOverride) { - hostText = _absoluteRequestTarget.Authority + ":" + _absoluteRequestTarget.Port.ToString(CultureInfo.InvariantCulture); + // No need to include the port here, it's either already in the Authority + // or it's the default port + // see: https://datatracker.ietf.org/doc/html/rfc2616/#section-14.23 + // A "host" without any trailing port information implies the default + // port for the service requested (e.g., "80" for an HTTP URL). + hostText = authority; HttpRequestHeaders.HeaderHost = hostText; } else diff --git a/src/Servers/Kestrel/shared/test/HttpParsingData.cs b/src/Servers/Kestrel/shared/test/HttpParsingData.cs index 6b240e18b5c8..a301e27e3877 100644 --- a/src/Servers/Kestrel/shared/test/HttpParsingData.cs +++ b/src/Servers/Kestrel/shared/test/HttpParsingData.cs @@ -497,8 +497,10 @@ public static TheoryData HostHeaderData { "GET /pub/WWW/", "www.example.org" }, { "GET http://localhost/", "localhost" }, { "GET http://localhost:80/", "localhost:80" }, + { "GET http://localhost:80/", "localhost" }, { "GET https://localhost/", "localhost" }, { "GET https://localhost:443/", "localhost:443" }, + { "GET https://localhost:443/", "localhost" }, { "CONNECT asp.net:80", "asp.net:80" }, { "CONNECT asp.net:443", "asp.net:443" }, { "CONNECT user-images.githubusercontent.com:443", "user-images.githubusercontent.com:443" }, @@ -534,10 +536,13 @@ public static TheoryData HostHeaderInvalidData data.Add("CONNECT contoso.com", host); } - // port mismatch when target contains port + // port mismatch when target contains default https port data.Add("GET https://contoso.com:443/", "contoso.com:5000"); data.Add("CONNECT contoso.com:443", "contoso.com:5000"); + // port mismatch when target contains default http port + data.Add("GET http://contoso.com:80/", "contoso.com:5000"); + return data; } } diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs index d7076dacfd4c..af9d93aea3d6 100644 --- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs +++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs @@ -153,9 +153,12 @@ public Task BadRequestIfHostHeaderDoesNotMatchRequestTarget(string requestTarget } [Theory] - [InlineData("Host: www.foo.comConnection: keep-alive")] // Corrupted - missing line-break - [InlineData("Host: www.notfoo.com")] // Syntactically correct but not matching - public async Task CanOptOutOfBadRequestIfHostHeaderDoesNotMatchRequestTarget(string hostHeader) + [InlineData("http://www.foo.com", "Host: www.foo.comConnection: keep-alive", "www.foo.com")] // Corrupted - missing line-break + [InlineData("http://www.foo.com/", "Host: www.notfoo.com", "www.foo.com")] // Syntactically correct but not matching + [InlineData("http://www.foo.com:80", "Host: www.notfoo.com", "www.foo.com")] // Explicit default port in request string + [InlineData("http://www.foo.com:5129", "Host: www.foo.com", "www.foo.com:5129")] // Non-default port in request string + [InlineData("http://www.foo.com:5129", "Host: www.foo.com:5128", "www.foo.com:5129")] // Different port in host header + public async Task CanOptOutOfBadRequestIfHostHeaderDoesNotMatchRequestTarget(string requestString, string hostHeader, string expectedHost) { var testMeterFactory = new TestMeterFactory(); using var connectionDuration = new MetricCollector(testMeterFactory, "Microsoft.AspNetCore.Server.Kestrel", "kestrel.connection.duration"); @@ -175,13 +178,13 @@ public async Task CanOptOutOfBadRequestIfHostHeaderDoesNotMatchRequestTarget(str { using (var client = server.CreateConnection()) { - await client.SendAll($"GET http://www.foo.com/api/data HTTP/1.1\r\n{hostHeader}\r\n\r\n"); + await client.SendAll($"GET {requestString} HTTP/1.1\r\n{hostHeader}\r\n\r\n"); await client.Receive("HTTP/1.1 200 OK"); } } - Assert.Equal("www.foo.com:80", receivedHost); + Assert.Equal(expectedHost, receivedHost); Assert.Collection(connectionDuration.GetMeasurementSnapshot(), m => MetricsAssert.NoError(m.Tags)); } diff --git a/src/StaticAssets/src/StaticAssetsInvoker.cs b/src/StaticAssets/src/StaticAssetsInvoker.cs index 1d21cc2929ec..c7555c901b93 100644 --- a/src/StaticAssets/src/StaticAssetsInvoker.cs +++ b/src/StaticAssets/src/StaticAssetsInvoker.cs @@ -223,7 +223,7 @@ private async Task SendRangeAsync(StaticAssetInvocationContext requestContext, R if (requestContext.Response.StatusCode == StatusCodes.Status200OK) { - requestContext.Response.StatusCode = StatusCodes.Status416RangeNotSatisfiable; + requestContext.Response.StatusCode = StatusCodes.Status206PartialContent; } await ApplyResponseHeadersAsync(requestContext, StatusCodes.Status206PartialContent); diff --git a/src/StaticAssets/test/StaticAssetsIntegrationTests.cs b/src/StaticAssets/test/StaticAssetsIntegrationTests.cs index 541a468a15a2..fda161ea055a 100644 --- a/src/StaticAssets/test/StaticAssetsIntegrationTests.cs +++ b/src/StaticAssets/test/StaticAssetsIntegrationTests.cs @@ -989,6 +989,33 @@ public async Task IfUnmodifiedSinceDateLessThanLastModifiedShouldReturn412(HttpM Assert.Equal(HttpStatusCode.PreconditionFailed, res2.StatusCode); } + // 14.35.2 Range Retrieval Requests + // The presence of a Range header in an unconditional GET modifies + // what is returned if the GET is otherwise successful. In other + // words, the response carries a status code of 206 (Partial + // Content) instead of 200 (OK). + [Fact] + public async Task RangeGivesMatchingRange() + { + var client = await CreateClient(); + + var req1 = new HttpRequestMessage(HttpMethod.Get, "http://localhost/sample.txt"); + req1.Headers.Range = new RangeHeaderValue(0, 4); + var res1 = await client.SendAsync(req1); + + var req2 = new HttpRequestMessage(HttpMethod.Get, "http://localhost/sample.txt"); + req2.Headers.Range = new RangeHeaderValue(7, 11); + var res2 = await client.SendAsync(req2); + + Assert.Equal(HttpStatusCode.PartialContent, res1.StatusCode); + Assert.Equal("Hello", await res1.Content.ReadAsStringAsync()); + Assert.Equal(5, res1.Content.Headers.ContentLength); + + Assert.Equal(HttpStatusCode.PartialContent, res2.StatusCode); + Assert.Equal("World", await res2.Content.ReadAsStringAsync()); + Assert.Equal(5, res2.Content.Headers.ContentLength); + } + public static IEnumerable SupportedMethods => new[] { new [] { HttpMethod.Get }, diff --git a/src/Testing/src/xunit/SkipOnHelixAttribute.cs b/src/Testing/src/xunit/SkipOnHelixAttribute.cs index 38b376cb6808..2c7b66f75a67 100644 --- a/src/Testing/src/xunit/SkipOnHelixAttribute.cs +++ b/src/Testing/src/xunit/SkipOnHelixAttribute.cs @@ -66,7 +66,10 @@ private bool ShouldSkip() return true; } - return Queues.ToLowerInvariant().Split(';').Contains(targetQueue); + // We have "QueueName" and "QueueName.Open" queues for internal and public builds + // If we want to skip the test in the public queue, we want to skip it in the internal queue, and vice versa + return Queues.ToLowerInvariant().Split(';').Any(q => q.Equals(targetQueue, StringComparison.Ordinal) || q.StartsWith(targetQueue, StringComparison.Ordinal) || + targetQueue.StartsWith(q, StringComparison.Ordinal)); } public static bool OnHelix() => HelixHelper.OnHelix(); diff --git a/src/Tools/Tools.slnf b/src/Tools/Tools.slnf index 484313af8712..38dbc4a65ae9 100644 --- a/src/Tools/Tools.slnf +++ b/src/Tools/Tools.slnf @@ -29,6 +29,7 @@ "src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj", "src\\Hosting\\Hosting\\src\\Microsoft.AspNetCore.Hosting.csproj", "src\\Hosting\\Server.Abstractions\\src\\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj", + "src\\Hosting\\TestHost\\src\\Microsoft.AspNetCore.TestHost.csproj", "src\\Html.Abstractions\\src\\Microsoft.AspNetCore.Html.Abstractions.csproj", "src\\Http\\Authentication.Abstractions\\src\\Microsoft.AspNetCore.Authentication.Abstractions.csproj", "src\\Http\\Authentication.Core\\src\\Microsoft.AspNetCore.Authentication.Core.csproj", @@ -109,9 +110,9 @@ "src\\Tools\\Extensions.ApiDescription.Server\\src\\Microsoft.Extensions.ApiDescription.Server.csproj", "src\\Tools\\FirstRunCertGenerator\\src\\Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj", "src\\Tools\\FirstRunCertGenerator\\test\\Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests.csproj", + "src\\Tools\\GetDocumentInsider\\sample\\GetDocumentSample.csproj", "src\\Tools\\GetDocumentInsider\\src\\GetDocument.Insider.csproj", "src\\Tools\\GetDocumentInsider\\tests\\GetDocumentInsider.Tests.csproj", - "src\\Tools\\GetDocumentInsider\\sample\\GetDocumentSample.csproj", "src\\Tools\\LinkabilityChecker\\LinkabilityChecker.csproj", "src\\Tools\\Microsoft.dotnet-openapi\\src\\Microsoft.dotnet-openapi.csproj", "src\\Tools\\Microsoft.dotnet-openapi\\test\\dotnet-microsoft.openapi.Tests.csproj", @@ -125,4 +126,4 @@ "src\\WebEncoders\\src\\Microsoft.Extensions.WebEncoders.csproj" ] } -} +} \ No newline at end of file diff --git a/src/Tools/dotnet-user-jwts/test/UserJwtsTests.cs b/src/Tools/dotnet-user-jwts/test/UserJwtsTests.cs index 71cc2cdb7d10..801e414fe95e 100644 --- a/src/Tools/dotnet-user-jwts/test/UserJwtsTests.cs +++ b/src/Tools/dotnet-user-jwts/test/UserJwtsTests.cs @@ -1,14 +1,19 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Text.RegularExpressions; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.InternalTesting; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.UserSecrets; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Tools.Internal; using Xunit.Abstractions; -using System.Text.RegularExpressions; -using System.Text.Json; -using System.Text.Json.Nodes; -using System.IdentityModel.Tokens.Jwt; namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools.Tests; @@ -62,6 +67,38 @@ public void Create_WritesGeneratedTokenToDisk() Assert.Contains("dotnet-user-jwts", File.ReadAllText(appsettings)); } + [Fact] + public async Task Create_TokenAcceptedByJwtBearerHandler() + { + var project = Path.Combine(fixture.CreateProject(), "TestProject.csproj"); + var appsettings = Path.Combine(Path.GetDirectoryName(project), "appsettings.Development.json"); + var secrets = PathHelper.GetSecretsPathFromSecretsId(fixture.TestSecretsId); + var app = new Program(_console); + + app.Run(["create", "--project", project, "-o", "token"]); + var token = _console.GetOutput().Trim(); + + var builder = WebApplication.CreateEmptyBuilder(new()); + builder.WebHost.UseTestServer(); + + builder.Configuration.AddJsonFile(appsettings); + builder.Configuration.AddJsonFile(secrets); + + builder.Services.AddRouting(); + builder.Services.AddAuthentication().AddJwtBearer(); + builder.Services.AddAuthorization(); + + using var webApp = builder.Build(); + webApp.MapGet("/secret", (ClaimsPrincipal user) => $"Hello {user.Identity?.Name}!") + .RequireAuthorization(); + + await webApp.StartAsync(); + + var client = webApp.GetTestClient(); + client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}"); + Assert.Equal($"Hello {Environment.UserName}!", await client.GetStringAsync("/secret")); + } + [Fact] public void Create_CanModifyExistingScheme() { diff --git a/src/Tools/dotnet-user-jwts/test/dotnet-user-jwts.Tests.csproj b/src/Tools/dotnet-user-jwts/test/dotnet-user-jwts.Tests.csproj index 5ad17868a98a..b362c30d0611 100644 --- a/src/Tools/dotnet-user-jwts/test/dotnet-user-jwts.Tests.csproj +++ b/src/Tools/dotnet-user-jwts/test/dotnet-user-jwts.Tests.csproj @@ -14,4 +14,10 @@ + + + + + + diff --git a/src/submodules/googletest b/src/submodules/googletest index d14403194054..7d76a231b0e2 160000 --- a/src/submodules/googletest +++ b/src/submodules/googletest @@ -1 +1 @@ -Subproject commit d144031940543e15423a25ae5a8a74141044862f +Subproject commit 7d76a231b0e29caf86e68d1df858308cd53b2a66