Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/Umbraco.Core/Templates/HtmlImageSourceParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,11 @@ public string EnsureImageSources(string text)

// Re-sign the URL so a rotated HMAC secret key doesn't break previously-authored images.
// No-op when HMAC isn't configured.
var refreshedSrc = _imageUrlTokenGenerator.RefreshSignature($"{mediaUrl}{src.Groups[2].Value}");
var queryString = src.Groups[2].Value;
var composedUrl = queryString.IsNullOrWhiteSpace()
? mediaUrl
: mediaUrl.AppendQueryStringToUrl(queryString);
var refreshedSrc = _imageUrlTokenGenerator.RefreshSignature(composedUrl);

return match.Value.Replace(src.Value, $"src=\"{refreshedSrc}\"");
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,10 @@ private void ReplaceLocalImages(HtmlDocument doc, IPublishedMediaCache mediaCach

// Re-sign the URL so a rotated HMAC secret key doesn't break previously-authored images.
// No-op when HMAC isn't configured.
var refreshedSrc = _imageUrlTokenGenerator.RefreshSignature($"{mediaUrl}{currentImageQueryString}");
var refreshedSrc = _imageUrlTokenGenerator.RefreshSignature(
currentImageQueryString.IsNullOrWhiteSpace()
? mediaUrl
: mediaUrl.AppendQueryStringToUrl(currentImageQueryString));
image.SetAttributeValue("src", refreshedSrc);
image.Attributes.Remove("data-udi");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,4 +264,46 @@
@"<img src=""/media/1001/image.jpg?width=100"" data-udi=""umb://media/81BB2036034F418BB61FC7160D68DCD4""/>",
result);
}

[Test]
public void Ensure_ImageSources_Processing_With_Cache_Buster()
{
var sourceHtml = """<div><img data-udi="umb://media/81BB2036034F418BB61FC7160D68DCD4" src="?width=100&height=500" /></div>""";
var fakeMediaUrl = "/media/1001/image.jpg?rand=1234";

var parser = new HtmlImageSourceParser(guid => fakeMediaUrl, NoopSigner());
var actual = parser.EnsureImageSources(sourceHtml);

Assert.AreEqual(
"""<div><img data-udi="umb://media/81BB2036034F418BB61FC7160D68DCD4" src="/media/1001/image.jpg?rand=1234&width=100&height=500" /></div>""",
actual);
}

[Test]
public void Ensure_ImageSources_With_Cache_Buster_And_No_Query_String()
{
var sourceHtml = """<div><img data-udi="umb://media/81BB2036034F418BB61FC7160D68DCD4" src="" /></div>""";
var fakeMediaUrl = "/media/1001/image.jpg?rand=1234";

var parser = new HtmlImageSourceParser(guid => fakeMediaUrl, NoopSigner());
var actual = parser.EnsureImageSources(sourceHtml);

Assert.AreEqual(
"""<div><img data-udi="umb://media/81BB2036034F418BB61FC7160D68DCD4" src="/media/1001/image.jpg?rand=1234" /></div>""",
actual);
}

[Test]
public void Ensure_ImageSources_With_No_Query_String_Does_Not_Append_Trailing_Query()
{
var sourceHtml = """<div><img data-udi="umb://media/81BB2036034F418BB61FC7160D68DCD4" src="" /></div>""";
var fakeMediaUrl = "/media/1001/image.jpg";

var parser = new HtmlImageSourceParser(guid => fakeMediaUrl, NoopSigner());
var actual = parser.EnsureImageSources(sourceHtml);

Assert.AreEqual(
"""<div><img data-udi="umb://media/81BB2036034F418BB61FC7160D68DCD4" src="/media/1001/image.jpg" /></div>""",
actual);
}

Check warning on line 308 in tests/Umbraco.Tests.UnitTests/Umbraco.Core/Templates/HtmlImageSourceParserTests.cs

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (v17/dev)

❌ New issue: Code Duplication

The module contains 3 functions with similar structure: Ensure_ImageSources_Processing_With_Cache_Buster,Ensure_ImageSources_With_Cache_Buster_And_No_Query_String,Ensure_ImageSources_With_No_Query_String_Does_Not_Append_Trailing_Query Avoid duplicated, aka copy-pasted, code inside the module. More duplication lowers the code health.
}
Comment thread
kjac marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,31 @@ public void Can_Parse_Inline_LocalImages()
Assert.AreEqual(expectedOutput, parsedHtml);
}

[Test]
public void Can_Parse_Inline_LocalImages_With_Cache_Buster()
{
var key1 = Guid.Parse("395bdc0e8f4d4ad4af7f3a3f6265651e");
var data1 = new MockData()
.WithKey(key1)
.WithMediaUrl("https://localhost:44331/media/bdofwokn/77gtp8fbrxmgkefatp10aw.webp?rand=1234");

var mockData = new Dictionary<Guid, MockData>
{
{ key1, data1 },
};
var parser = BuildDefaultSut(mockData);

var markup =
@"<p>An image</p>\n<p><img src=""?rmode=max&amp;width=500&amp;height=500"" alt="""" width=""500"" height=""500"" data-udi=""umb://media/395bdc0e8f4d4ad4af7f3a3f6265651e""></p>";

var expectedOutput =
@"<p>An image</p>\n<p><img src=""https://localhost:44331/media/bdofwokn/77gtp8fbrxmgkefatp10aw.webp?rand=1234&rmode=max&amp;width=500&amp;height=500"" alt="""" width=""500"" height=""500""></p>";

var parsedHtml = parser.Parse(markup);

Assert.AreEqual(expectedOutput, parsedHtml);
}

[Test]
public void LocalImages_Are_ReSigned_Via_TokenGenerator()
{
Expand Down
Loading