]> source.dussan.org Git - gitea.git/commitdiff
Fix relative links in postprocessed images (#16334)
authorzeripath <art27@cantab.net>
Sun, 4 Jul 2021 09:26:04 +0000 (10:26 +0100)
committerGitHub <noreply@github.com>
Sun, 4 Jul 2021 09:26:04 +0000 (10:26 +0100)
If a pre-post-processed file contains relative img tags these need to be updated
and joined correctly with the prefix. Finally, the node attributes need to be updated.

Fix #16308

Signed-off-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: 6543 <6543@obermui.de>
modules/markup/html.go
modules/markup/html_test.go

index 1e55629ab5dd721cb2fed66d4236799bba8973b1..7afd8114c1b321da741c18aa0adae4ad919e77df 100644 (file)
@@ -364,7 +364,7 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText
                }
        case html.ElementNode:
                if node.Data == "img" {
-                       for _, attr := range node.Attr {
+                       for i, attr := range node.Attr {
                                if attr.Key != "src" {
                                        continue
                                }
@@ -377,6 +377,7 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText
 
                                        attr.Val = util.URLJoin(prefix, attr.Val)
                                }
+                               node.Attr[i] = attr
                        }
                } else if node.Data == "a" {
                        visitText = false
index 85418892ef7f1c09815a8dcce9d1f80bebd0b88e..a494c5bd1831bb2cfe339b6dd71c26f80cd39341 100644 (file)
@@ -425,6 +425,41 @@ func TestRender_ShortLinks(t *testing.T) {
                `<p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p>`)
 }
 
+func TestRender_RelativeImages(t *testing.T) {
+       setting.AppURL = AppURL
+       setting.AppSubURL = AppSubURL
+       tree := util.URLJoin(AppSubURL, "src", "master")
+
+       test := func(input, expected, expectedWiki string) {
+               buffer, err := markdown.RenderString(&RenderContext{
+                       URLPrefix: tree,
+                       Metas:     localMetas,
+               }, input)
+               assert.NoError(t, err)
+               assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
+               buffer, err = markdown.RenderString(&RenderContext{
+                       URLPrefix: setting.AppSubURL,
+                       Metas:     localMetas,
+                       IsWiki:    true,
+               }, input)
+               assert.NoError(t, err)
+               assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(buffer))
+       }
+
+       rawwiki := util.URLJoin(AppSubURL, "wiki", "raw")
+       mediatree := util.URLJoin(AppSubURL, "media", "master")
+
+       test(
+               `<img src="Link">`,
+               `<img src="`+util.URLJoin(mediatree, "Link")+`"/>`,
+               `<img src="`+util.URLJoin(rawwiki, "Link")+`"/>`)
+
+       test(
+               `<img src="./icon.png">`,
+               `<img src="`+util.URLJoin(mediatree, "icon.png")+`"/>`,
+               `<img src="`+util.URLJoin(rawwiki, "icon.png")+`"/>`)
+}
+
 func Test_ParseClusterFuzz(t *testing.T) {
        setting.AppURL = AppURL
        setting.AppSubURL = AppSubURL