Skip to content

Commit bd9027a

Browse files
faddivmichaelstaib
authored andcommitted
Fixed invalid base64 ID parsing (#8101)
1 parent 836f58e commit bd9027a

File tree

4 files changed

+65
-4
lines changed

4 files changed

+65
-4
lines changed

src/HotChocolate/Core/src/Types/Types/Relay/Serialization/DefaultNodeIdSerializer.cs

+12-2
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,12 @@ public NodeId Parse(string formattedId, INodeIdRuntimeTypeLookup runtimeTypeLook
204204
}
205205
}
206206

207-
Base64.DecodeFromUtf8InPlace(span, out var written);
207+
var operationStatus = Base64.DecodeFromUtf8InPlace(span, out var written);
208+
if (operationStatus != OperationStatus.Done)
209+
{
210+
throw new NodeIdInvalidFormatException(formattedId);
211+
}
212+
208213
span = span.Slice(0, written);
209214

210215
var delimiterIndex = FindDelimiterIndex(span);
@@ -275,7 +280,12 @@ public NodeId Parse(string formattedId, Type runtimeType)
275280
}
276281
}
277282

278-
Base64.DecodeFromUtf8InPlace(span, out var written);
283+
var operationStatus = Base64.DecodeFromUtf8InPlace(span, out var written);
284+
if (operationStatus != OperationStatus.Done)
285+
{
286+
throw new NodeIdInvalidFormatException(formattedId);
287+
}
288+
279289
span = span.Slice(0, written);
280290

281291
var delimiterIndex = FindDelimiterIndex(span);

src/HotChocolate/Core/src/Types/Types/Relay/Serialization/OptimizedNodeIdSerializer.cs

+12-2
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ public unsafe NodeId Parse(string formattedId, INodeIdRuntimeTypeLookup runtimeT
106106
}
107107
}
108108

109-
Base64.DecodeFromUtf8InPlace(span, out var written);
109+
var operationStatus = Base64.DecodeFromUtf8InPlace(span, out var written);
110+
if (operationStatus != OperationStatus.Done)
111+
{
112+
throw new NodeIdInvalidFormatException(formattedId);
113+
}
114+
110115
span = span.Slice(0, written);
111116

112117
var delimiterIndex = FindDelimiterIndex(span);
@@ -176,7 +181,12 @@ public unsafe NodeId Parse(string formattedId, Type runtimeType)
176181
}
177182
}
178183

179-
Base64.DecodeFromUtf8InPlace(span, out var written);
184+
var operationStatus = Base64.DecodeFromUtf8InPlace(span, out var written);
185+
if (operationStatus != OperationStatus.Done)
186+
{
187+
throw new NodeIdInvalidFormatException(formattedId);
188+
}
189+
180190
span = span.Slice(0, written);
181191

182192
var delimiterIndex = FindDelimiterIndex(span);

src/HotChocolate/Core/test/Types.Tests/Types/Relay/DefaultNodeIdSerializerTests.cs

+20
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,26 @@ public void Parse_Legacy_StronglyTypedId()
518518
Assert.Equal(stronglyTypedId, parsed.InternalId);
519519
}
520520

521+
[Fact]
522+
public void Parse_Throws_NodeIdInvalidFormatException_On_InvalidBase64Input()
523+
{
524+
var serializer = CreateSerializer(new StringNodeIdValueSerializer());
525+
526+
Assert.Throws<NodeIdInvalidFormatException>(
527+
() => serializer.Parse("Rm9vOkJhcg", typeof(string)));
528+
}
529+
530+
[Fact]
531+
public void ParseOnRuntimeLookup_Throws_NodeIdInvalidFormatException_On_InvalidBase64Input()
532+
{
533+
var lookup = new Mock<INodeIdRuntimeTypeLookup>();
534+
lookup.Setup(t => t.GetNodeIdRuntimeType(default)).Returns(default(Type));
535+
var serializer = CreateSerializer(new StringNodeIdValueSerializer());
536+
537+
Assert.Throws<NodeIdInvalidFormatException>(
538+
() => serializer.Parse("Rm9vOkJhcg", lookup.Object));
539+
}
540+
521541
[Fact]
522542
public void Ensure_Lookup_Works_With_HashCollision()
523543
{

src/HotChocolate/Core/test/Types.Tests/Types/Relay/OptimizedNodeIdSerializerTests.cs

+21
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,27 @@ public void Parse_CompositeId()
440440
Assert.Equal(compositeId, parsed.InternalId);
441441
}
442442

443+
[Fact]
444+
public void Parse_Throws_NodeIdInvalidFormatException_On_InvalidBase64Input()
445+
{
446+
var serializer = CreateSerializer("Foo", new StringNodeIdValueSerializer());
447+
448+
Assert.Throws<NodeIdInvalidFormatException>(
449+
() => serializer.Parse("Rm9vOkJhcg", typeof(string)));
450+
}
451+
452+
[Fact]
453+
public void ParseOnRuntimeLookup_Throws_NodeIdInvalidFormatException_On_InvalidBase64Input()
454+
{
455+
var lookup = new Mock<INodeIdRuntimeTypeLookup>();
456+
lookup.Setup(t => t.GetNodeIdRuntimeType(default)).Returns(default(Type));
457+
458+
var serializer = CreateSerializer("Foo", new StringNodeIdValueSerializer());
459+
460+
Assert.Throws<NodeIdInvalidFormatException>(
461+
() => serializer.Parse("Rm9vOkJhcg", lookup.Object));
462+
}
463+
443464
[Fact]
444465
public void Ensure_Lookup_Works_With_HashCollision()
445466
{

0 commit comments

Comments
 (0)