Skip to content

Commit 8a9fbd9

Browse files
authored
Guard against null value rendering (#842)
1 parent df22e98 commit 8a9fbd9

File tree

3 files changed

+69
-3
lines changed

3 files changed

+69
-3
lines changed

Fluid.Tests/TemplateTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,47 @@ public async Task ShouldEvaluateStringValue()
206206
Assert.Equal("abc", result);
207207
}
208208

209+
[Fact]
210+
public async Task ShouldRenderNullValueFromContext()
211+
{
212+
_parser.TryParse("{{ x }}", out var template, out var error);
213+
var context = new TemplateContext();
214+
context.SetValue("x", (object)null);
215+
216+
var result = await template.RenderAsync(context);
217+
Assert.Equal(string.Empty, result);
218+
}
219+
220+
[Fact]
221+
public async Task ShouldRenderNullValueFromProperty()
222+
{
223+
_parser.TryParse("{{ c.Value }}", out var template, out var error);
224+
225+
var options = new TemplateOptions();
226+
options.MemberAccessStrategy.Register<NullStringContainer>();
227+
228+
var context = new TemplateContext(options);
229+
context.SetValue("c", new NullStringContainer());
230+
231+
var result = await template.RenderAsync(context);
232+
Assert.Equal(string.Empty, result);
233+
}
234+
235+
[Fact]
236+
public async Task ShouldRenderNullValueFromToString()
237+
{
238+
_parser.TryParse("{{ c }}", out var template, out var error);
239+
240+
var options = new TemplateOptions();
241+
options.MemberAccessStrategy.Register<NullStringContainer>();
242+
243+
var context = new TemplateContext(options);
244+
context.SetValue("c", new NullStringContainer());
245+
246+
var result = await template.RenderAsync(context);
247+
Assert.Equal(string.Empty, result);
248+
}
249+
209250
[Fact]
210251
public async Task ShouldEvaluateNumberValue()
211252
{
@@ -401,6 +442,13 @@ public async Task FirstLastSizeShouldUseGetValue()
401442
Assert.Equal("123 456 789", result);
402443
}
403444

445+
private sealed class NullStringContainer
446+
{
447+
public string Value => null;
448+
449+
public override string ToString() => null;
450+
}
451+
404452
private class PersonValue : ObjectValueBase
405453
{
406454
public PersonValue(Person value) : base(value)
@@ -1309,5 +1357,7 @@ public async Task InlineCommentShouldWorkBetweenTags()
13091357
Assert.Contains("Success", result);
13101358
Assert.DoesNotContain("This is between if tags", result);
13111359
}
1360+
1361+
13121362
}
13131363
}

Fluid/Filters/MiscFilters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ private static async ValueTask WriteJson(Utf8JsonWriter writer, FluidValue input
778778
}
779779
break;
780780
case FluidValues.String:
781-
writer.WriteStringValue(JsonEncodedText.Encode(input.ToStringValue(), ctx.Options.JavaScriptEncoder));
781+
writer.WriteStringValue(JsonEncodedText.Encode(input.ToStringValue() ?? "", ctx.Options.JavaScriptEncoder));
782782
break;
783783
case FluidValues.Blank:
784784
case FluidValues.Empty:

Fluid/Values/ObjectValueBase.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,29 @@ public override decimal ToNumberValue()
153153
public override void WriteTo(TextWriter writer, TextEncoder encoder, CultureInfo cultureInfo)
154154
{
155155
AssertWriteToParameters(writer, encoder, cultureInfo);
156-
writer.Write(encoder.Encode(ToStringValue()));
156+
157+
var value = ToStringValue();
158+
159+
if (string.IsNullOrEmpty(value))
160+
{
161+
return;
162+
}
163+
164+
writer.Write(encoder.Encode(value));
157165
}
158166

159167
public override ValueTask WriteToAsync(TextWriter writer, TextEncoder encoder, CultureInfo cultureInfo)
160168
{
161169
AssertWriteToParameters(writer, encoder, cultureInfo);
162-
var task = writer.WriteAsync(encoder.Encode(ToStringValue()));
170+
171+
var value = ToStringValue();
172+
173+
if (string.IsNullOrEmpty(value))
174+
{
175+
return default;
176+
}
177+
178+
var task = writer.WriteAsync(encoder.Encode(value));
163179

164180
if (task.IsCompletedSuccessfully())
165181
{

0 commit comments

Comments
 (0)