diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dc324cd5667..f43bf2be45d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: jobs: release: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 diff --git a/src/HotChocolate/Core/src/Abstractions/ErrorCodes.cs b/src/HotChocolate/Core/src/Abstractions/ErrorCodes.cs index aa71de9ad74..064d49ef456 100644 --- a/src/HotChocolate/Core/src/Abstractions/ErrorCodes.cs +++ b/src/HotChocolate/Core/src/Abstractions/ErrorCodes.cs @@ -321,6 +321,11 @@ public static class Validation /// The introspection is not allowed for the current request /// public const string IntrospectionNotAllowed = "HC0046"; + + /// + /// The maximum allowed introspection depth was exceeded. + /// + public const string MaxIntrospectionDepthOverflow = "HC0086"; } /// diff --git a/src/HotChocolate/Core/src/Abstractions/packages.lock.json b/src/HotChocolate/Core/src/Abstractions/packages.lock.json index 28a7c3a6941..9bce93705bc 100644 --- a/src/HotChocolate/Core/src/Abstractions/packages.lock.json +++ b/src/HotChocolate/Core/src/Abstractions/packages.lock.json @@ -284,9 +284,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Core/src/Types.Shared/packages.lock.json b/src/HotChocolate/Core/src/Types.Shared/packages.lock.json index bd23a6b2c1b..37244c9fc4c 100644 --- a/src/HotChocolate/Core/src/Types.Shared/packages.lock.json +++ b/src/HotChocolate/Core/src/Types.Shared/packages.lock.json @@ -158,9 +158,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Core/src/Validation/CoordinateLimit.cs b/src/HotChocolate/Core/src/Validation/CoordinateLimit.cs new file mode 100644 index 00000000000..2717b7cc7bd --- /dev/null +++ b/src/HotChocolate/Core/src/Validation/CoordinateLimit.cs @@ -0,0 +1,27 @@ +namespace HotChocolate.Validation; + +internal sealed class CoordinateLimit +{ + public ushort MaxAllowed { get; private set; } + + public ushort Count { get; private set; } + + public bool Add() + { + if (Count < MaxAllowed) + { + Count++; + return true; + } + + return false; + } + + public void Remove() => Count--; + + public void Reset(ushort maxAllowed) + { + MaxAllowed = maxAllowed; + Count = 0; + } +} diff --git a/src/HotChocolate/Core/src/Validation/DocumentValidator.cs b/src/HotChocolate/Core/src/Validation/DocumentValidator.cs index 31b4b57412d..7306e1dbabf 100644 --- a/src/HotChocolate/Core/src/Validation/DocumentValidator.cs +++ b/src/HotChocolate/Core/src/Validation/DocumentValidator.cs @@ -110,6 +110,11 @@ public ValueTask ValidateAsync( for (var i = 0; i < length; i++) { Unsafe.Add(ref start, i).Validate(context, document); + + if (context.FatalErrorDetected) + { + break; + } } if (_aggregators.Length == 0) diff --git a/src/HotChocolate/Core/src/Validation/DocumentValidatorContext.cs b/src/HotChocolate/Core/src/Validation/DocumentValidatorContext.cs index 084655c6c9f..fe5b2bd3b27 100644 --- a/src/HotChocolate/Core/src/Validation/DocumentValidatorContext.cs +++ b/src/HotChocolate/Core/src/Validation/DocumentValidatorContext.cs @@ -98,6 +98,8 @@ public IOutputType NonNullString public bool UnexpectedErrorsDetected { get; set; } + public bool FatalErrorDetected { get; set; } + public int Count { get; set; } public int Max { get; set; } @@ -112,6 +114,8 @@ public IOutputType NonNullString public HashSet ProcessedFieldPairs { get; } = []; + public FieldDepthCycleTracker FieldDepth { get; } = new(); + public IList RentFieldInfoList() { var buffer = _buffers.Peek(); @@ -168,7 +172,9 @@ public void Clear() CurrentFieldPairs.Clear(); NextFieldPairs.Clear(); ProcessedFieldPairs.Clear(); + FieldDepth.Reset(); UnexpectedErrorsDetected = false; + FatalErrorDetected = false; Count = 0; Max = 0; Allowed = 0; diff --git a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs index f1534b08680..c5a552cd0bd 100644 --- a/src/HotChocolate/Core/src/Validation/ErrorHelper.cs +++ b/src/HotChocolate/Core/src/Validation/ErrorHelper.cs @@ -725,4 +725,18 @@ public static IError StreamOnNonListField( .SpecifiedBy("sec-Stream-Directives-Are-Used-On-List-Fields") .SetPath(context.CreateErrorPath()) .Build(); + + public static void ReportMaxIntrospectionDepthOverflow( + this IDocumentValidatorContext context, + ISyntaxNode selection) + { + context.FatalErrorDetected = true; + context.ReportError( + ErrorBuilder.New() + .SetMessage("Maximum allowed introspection depth exceeded.") + .SetCode(ErrorCodes.Validation.MaxIntrospectionDepthOverflow) + .SetSyntaxNode(selection) + .SetPath(context.CreateErrorPath()) + .Build()); + } } diff --git a/src/HotChocolate/Core/src/Validation/Extensions/ValidatiobBuilderExtensions.Rules.cs b/src/HotChocolate/Core/src/Validation/Extensions/ValidatiobBuilderExtensions.Rules.cs index 97f5b897caf..e6ffc78c31a 100644 --- a/src/HotChocolate/Core/src/Validation/Extensions/ValidatiobBuilderExtensions.Rules.cs +++ b/src/HotChocolate/Core/src/Validation/Extensions/ValidatiobBuilderExtensions.Rules.cs @@ -342,4 +342,11 @@ public static IValidationBuilder AddMaxExecutionDepthRule( public static IValidationBuilder AddIntrospectionAllowedRule( this IValidationBuilder builder) => builder.TryAddValidationVisitor((_, _) => new IntrospectionVisitor(), false); + + /// + /// Adds a validation rule that restricts the depth of a GraphQL introspection request. + /// + public static IValidationBuilder AddIntrospectionDepthRule( + this IValidationBuilder builder) + => builder.TryAddValidationVisitor(); } diff --git a/src/HotChocolate/Core/src/Validation/Extensions/ValidationServiceCollectionExtensions.cs b/src/HotChocolate/Core/src/Validation/Extensions/ValidationServiceCollectionExtensions.cs index 5ab7538b971..308c8800bea 100644 --- a/src/HotChocolate/Core/src/Validation/Extensions/ValidationServiceCollectionExtensions.cs +++ b/src/HotChocolate/Core/src/Validation/Extensions/ValidationServiceCollectionExtensions.cs @@ -28,6 +28,7 @@ public static IValidationBuilder AddValidation( var builder = new DefaultValidationBuilder(schemaName, services); builder + .AddIntrospectionDepthRule() .AddDocumentRules() .AddOperationRules() .AddFieldRules() diff --git a/src/HotChocolate/Core/src/Validation/FieldDepthCycleTracker.cs b/src/HotChocolate/Core/src/Validation/FieldDepthCycleTracker.cs new file mode 100644 index 00000000000..f0321bb1b7f --- /dev/null +++ b/src/HotChocolate/Core/src/Validation/FieldDepthCycleTracker.cs @@ -0,0 +1,90 @@ +using System.Collections.Generic; +using HotChocolate.Language; + +namespace HotChocolate.Validation; + +/// +/// Allows to track field cycle depths in a GraphQL query. +/// +public sealed class FieldDepthCycleTracker +{ + private readonly Dictionary _coordinates = new(); + private readonly List _limits = new(); + private ushort? _defaultMaxAllowed; + + /// + /// Adds a field coordinate to the tracker. + /// + /// + /// A field coordinate. + /// + /// + /// true if the field coordinate has not reached its cycle depth limit; + /// otherwise, false. + /// + public bool Add(FieldCoordinate coordinate) + { + if (_coordinates.TryGetValue(coordinate, out var limit)) + { + return limit.Add(); + } + + if(_defaultMaxAllowed.HasValue) + { + _limits.TryPop(out limit); + limit ??= new CoordinateLimit(); + limit.Reset(_defaultMaxAllowed.Value); + _coordinates.Add(coordinate, limit); + return limit.Add(); + } + + return true; + } + + /// + /// Removes a field coordinate from the tracker. + /// + /// + /// A field coordinate. + /// + public void Remove(FieldCoordinate coordinate) + { + if (_coordinates.TryGetValue(coordinate, out var limit)) + { + limit.Remove(); + } + } + + /// + /// Initializes the field depth tracker with the specified limits. + /// + /// + /// A collection of field coordinates and their cycle depth limits. + /// + /// + /// The default cycle depth limit for coordinates that were not explicitly defined. + /// + public void Initialize( + IEnumerable<(FieldCoordinate Coordinate, ushort MaxAllowed)> limits, + ushort? defaultMaxAllowed = null) + { + foreach (var (coordinate, maxAllowed) in limits) + { + _limits.TryPop(out var limit); + limit ??= new CoordinateLimit(); + limit.Reset(maxAllowed); + _coordinates.Add(coordinate, limit); + } + + _defaultMaxAllowed = defaultMaxAllowed; + } + + /// + /// Resets the field depth tracker. + /// + public void Reset() + { + _limits.AddRange(_coordinates.Values); + _coordinates.Clear(); + } +} diff --git a/src/HotChocolate/Core/src/Validation/IDocumentValidatorContext.cs b/src/HotChocolate/Core/src/Validation/IDocumentValidatorContext.cs index ec0062cc053..2f55e796d96 100644 --- a/src/HotChocolate/Core/src/Validation/IDocumentValidatorContext.cs +++ b/src/HotChocolate/Core/src/Validation/IDocumentValidatorContext.cs @@ -155,6 +155,11 @@ public interface IDocumentValidatorContext : ISyntaxVisitorContext /// bool UnexpectedErrorsDetected { get; set; } + /// + /// Defines that a fatal error was detected and that the analyzer will be aborted. + /// + bool FatalErrorDetected { get; set; } + /// /// A map to store arbitrary visitor data. /// @@ -175,6 +180,11 @@ public interface IDocumentValidatorContext : ISyntaxVisitorContext /// HashSet ProcessedFieldPairs { get; } + /// + /// Gets the field depth cycle tracker. + /// + FieldDepthCycleTracker FieldDepth { get; } + /// /// Rents a list of field infos. /// diff --git a/src/HotChocolate/Core/src/Validation/Rules/IntrospectionDepthVisitor.cs b/src/HotChocolate/Core/src/Validation/Rules/IntrospectionDepthVisitor.cs new file mode 100644 index 00000000000..2dd1913b501 --- /dev/null +++ b/src/HotChocolate/Core/src/Validation/Rules/IntrospectionDepthVisitor.cs @@ -0,0 +1,77 @@ +using HotChocolate.Language; +using HotChocolate.Language.Visitors; +using HotChocolate.Types; +using HotChocolate.Types.Introspection; +using HotChocolate.Utilities; + +namespace HotChocolate.Validation.Rules; + +/// +/// This rules ensures that recursive introspection fields cannot be used +/// to create endless cycles. +/// +internal sealed class IntrospectionDepthVisitor : TypeDocumentValidatorVisitor +{ + private readonly (FieldCoordinate Coordinate, ushort MaxAllowed)[] _limits = + [ + (new FieldCoordinate("__Type", "fields"), 1), + (new FieldCoordinate("__Type", "inputFields"), 1), + (new FieldCoordinate("__Type", "interfaces"), 1), + (new FieldCoordinate("__Type", "possibleTypes"), 1), + (new FieldCoordinate("__Type", "ofType"), 8), + ]; + + protected override ISyntaxVisitorAction Enter( + DocumentNode node, + IDocumentValidatorContext context) + { + context.FieldDepth.Initialize(_limits); + return base.Enter(node, context); + } + + protected override ISyntaxVisitorAction Enter( + FieldNode node, + IDocumentValidatorContext context) + { + if (IntrospectionFields.TypeName.EqualsOrdinal(node.Name.Value)) + { + return Skip; + } + + if (context.Types.TryPeek(out var type) + && type.NamedType() is IComplexOutputType ot + && ot.Fields.TryGetField(node.Name.Value, out var of)) + { + // we are only interested in fields if the root field is either + // __type or __schema. + if (context.OutputFields.Count == 0 + && !of.IsIntrospectionField) + { + return Skip; + } + + if (!context.FieldDepth.Add(of.Coordinate)) + { + context.ReportMaxIntrospectionDepthOverflow(node); + return Break; + } + + context.OutputFields.Push(of); + context.Types.Push(of.Type); + return Continue; + } + + context.UnexpectedErrorsDetected = true; + return Skip; + } + + protected override ISyntaxVisitorAction Leave( + FieldNode node, + IDocumentValidatorContext context) + { + context.FieldDepth.Remove(context.OutputFields.Peek().Coordinate); + context.Types.Pop(); + context.OutputFields.Pop(); + return Continue; + } +} diff --git a/src/HotChocolate/Core/test/Validation.Tests/DocumentValidatorTests.cs b/src/HotChocolate/Core/test/Validation.Tests/DocumentValidatorTests.cs index 348b66acf71..706f5ee8219 100644 --- a/src/HotChocolate/Core/test/Validation.Tests/DocumentValidatorTests.cs +++ b/src/HotChocolate/Core/test/Validation.Tests/DocumentValidatorTests.cs @@ -865,6 +865,12 @@ public async Task Produce_Many_Errors_50000_query() await ExpectErrors(FileResource.Open("50000_query.graphql")); } + [Fact] + public async Task Introspection_Cycle_Detected() + { + await ExpectErrors(FileResource.Open("introspection_with_cycle.graphql")); + } + private Task ExpectValid(string sourceText) => ExpectValid(null, null, sourceText); private async Task ExpectValid(ISchema schema, IDocumentValidator validator, string sourceText) diff --git a/src/HotChocolate/Core/test/Validation.Tests/__resources__/introspection_with_cycle.graphql b/src/HotChocolate/Core/test/Validation.Tests/__resources__/introspection_with_cycle.graphql new file mode 100644 index 00000000000..ac0a3e54237 --- /dev/null +++ b/src/HotChocolate/Core/test/Validation.Tests/__resources__/introspection_with_cycle.graphql @@ -0,0 +1,93 @@ +query IntrospectionQuery { + __schema { + queryType { + name + } + mutationType { + name + } + types { + ... FullType + } + directives { + name + description + args { + ... InputValue + } + onOperation + onFragment + onField + } + } +} + +fragment FullType on __Type { + kind + name + description + fields(includeDeprecated: true) { + name + description + args { + ... InputValue + } + type { + ... TypeRef + fields { + name + } + } + isDeprecated + deprecationReason + } + inputFields { + ... InputValue + } + interfaces { + ... TypeRef + } + enumValues(includeDeprecated: true) { + name + description + isDeprecated + deprecationReason + } + possibleTypes { + ... TypeRef + } +} + +fragment InputValue on __InputValue { + name + description + type { + ... TypeRef + } + defaultValue +} + +fragment TypeRef on __Type { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + ofType { + kind + name + } + } + } + } + } +} diff --git a/src/HotChocolate/Core/test/Validation.Tests/__snapshots__/DocumentValidatorTests.Introspection_Cycle_Detected.snap b/src/HotChocolate/Core/test/Validation.Tests/__snapshots__/DocumentValidatorTests.Introspection_Cycle_Detected.snap new file mode 100644 index 00000000000..66ab176ff48 --- /dev/null +++ b/src/HotChocolate/Core/test/Validation.Tests/__snapshots__/DocumentValidatorTests.Introspection_Cycle_Detected.snap @@ -0,0 +1,94 @@ +[ + { + "Message": "Maximum allowed introspection depth exceeded.", + "Code": "HC0086", + "Path": { + "Name": "type", + "Parent": { + "Name": "fields", + "Parent": { + "Name": "types", + "Parent": { + "Name": "__schema", + "Parent": { + "Parent": null, + "Length": 0, + "IsRoot": true + }, + "Length": 1, + "IsRoot": false + }, + "Length": 2, + "IsRoot": false + }, + "Length": 3, + "IsRoot": false + }, + "Length": 4, + "IsRoot": false + }, + "Locations": null, + "Extensions": { + "code": "HC0086" + }, + "Exception": null, + "SyntaxNode": { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "Required": null, + "SelectionSet": { + "Kind": "SelectionSet", + "Location": { + "Start": 497, + "End": 525, + "Line": 37, + "Column": 14 + }, + "Selections": [ + { + "Kind": "Field", + "Alias": null, + "Arguments": [], + "Required": null, + "SelectionSet": null, + "Location": { + "Start": 507, + "End": 519, + "Line": 38, + "Column": 9 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 507, + "End": 519, + "Line": 38, + "Column": 9 + }, + "Value": "name" + }, + "Directives": [] + } + ] + }, + "Location": { + "Start": 490, + "End": 525, + "Line": 37, + "Column": 7 + }, + "Name": { + "Kind": "Name", + "Location": { + "Start": 490, + "End": 498, + "Line": 37, + "Column": 7 + }, + "Value": "fields" + }, + "Directives": [] + } + } +] \ No newline at end of file diff --git a/src/HotChocolate/Fusion/src/Abstractions/packages.lock.json b/src/HotChocolate/Fusion/src/Abstractions/packages.lock.json index d462e54c0f8..0f42f4ca6a8 100644 --- a/src/HotChocolate/Fusion/src/Abstractions/packages.lock.json +++ b/src/HotChocolate/Fusion/src/Abstractions/packages.lock.json @@ -73,9 +73,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Fusion/src/CommandLine/packages.lock.json b/src/HotChocolate/Fusion/src/CommandLine/packages.lock.json index 7f61364a5ea..6d8073fbb3d 100644 --- a/src/HotChocolate/Fusion/src/CommandLine/packages.lock.json +++ b/src/HotChocolate/Fusion/src/CommandLine/packages.lock.json @@ -481,9 +481,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Fusion/src/Composition/packages.lock.json b/src/HotChocolate/Fusion/src/Composition/packages.lock.json index 0f73354e50f..6b4fa729109 100644 --- a/src/HotChocolate/Fusion/src/Composition/packages.lock.json +++ b/src/HotChocolate/Fusion/src/Composition/packages.lock.json @@ -100,9 +100,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Language/src/Language.SyntaxTree/packages.lock.json b/src/HotChocolate/Language/src/Language.SyntaxTree/packages.lock.json index 3cb41bc67ec..fb8d1e4c80d 100644 --- a/src/HotChocolate/Language/src/Language.SyntaxTree/packages.lock.json +++ b/src/HotChocolate/Language/src/Language.SyntaxTree/packages.lock.json @@ -149,9 +149,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Language/src/Language.Utf8/packages.lock.json b/src/HotChocolate/Language/src/Language.Utf8/packages.lock.json index bd23a6b2c1b..37244c9fc4c 100644 --- a/src/HotChocolate/Language/src/Language.Utf8/packages.lock.json +++ b/src/HotChocolate/Language/src/Language.Utf8/packages.lock.json @@ -158,9 +158,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Language/src/Language.Visitors/packages.lock.json b/src/HotChocolate/Language/src/Language.Visitors/packages.lock.json index bd23a6b2c1b..37244c9fc4c 100644 --- a/src/HotChocolate/Language/src/Language.Visitors/packages.lock.json +++ b/src/HotChocolate/Language/src/Language.Visitors/packages.lock.json @@ -158,9 +158,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Language/src/Language.Web/packages.lock.json b/src/HotChocolate/Language/src/Language.Web/packages.lock.json index 546c954e862..2ea5af42b13 100644 --- a/src/HotChocolate/Language/src/Language.Web/packages.lock.json +++ b/src/HotChocolate/Language/src/Language.Web/packages.lock.json @@ -176,9 +176,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Language/src/Language/ListExtensions.cs b/src/HotChocolate/Language/src/Language/ListExtensions.cs index 10977318852..4706cf0916d 100644 --- a/src/HotChocolate/Language/src/Language/ListExtensions.cs +++ b/src/HotChocolate/Language/src/Language/ListExtensions.cs @@ -17,7 +17,7 @@ public static T Pop(this IList list) return p; } - public static bool TryPop(this IList list, [NotNullWhen(true)] out T item) + public static bool TryPop(this IList list, [MaybeNullWhen(false)] out T item) { if (list.Count > 0) { diff --git a/src/HotChocolate/Language/src/Language/packages.lock.json b/src/HotChocolate/Language/src/Language/packages.lock.json index 12493afaaab..59baf299330 100644 --- a/src/HotChocolate/Language/src/Language/packages.lock.json +++ b/src/HotChocolate/Language/src/Language/packages.lock.json @@ -212,9 +212,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Skimmed/src/Skimmed/packages.lock.json b/src/HotChocolate/Skimmed/src/Skimmed/packages.lock.json index 02864153fab..8755f1ddfb3 100644 --- a/src/HotChocolate/Skimmed/src/Skimmed/packages.lock.json +++ b/src/HotChocolate/Skimmed/src/Skimmed/packages.lock.json @@ -79,9 +79,9 @@ "net8.0": { "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/src/HotChocolate/Utilities/src/Utilities/packages.lock.json b/src/HotChocolate/Utilities/src/Utilities/packages.lock.json index aab22b3b5e9..c8e80b30fdc 100644 --- a/src/HotChocolate/Utilities/src/Utilities/packages.lock.json +++ b/src/HotChocolate/Utilities/src/Utilities/packages.lock.json @@ -236,9 +236,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct",