diff options
author | Rafael <git@rafael.ovh> | 2024-04-10 18:49:57 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-10 17:49:57 +0000 |
commit | c1f76aea45f11e1d5ae22c047cf3bda9c681de8d (patch) | |
tree | ebf837b7b527c2eb79a27dbb08803a1c696f930b /modules/markup | |
parent | 50099d7af436785daf66a3a9f27bd5c009f90684 (diff) | |
download | gitea-c1f76aea45f11e1d5ae22c047cf3bda9c681de8d.tar.gz gitea-c1f76aea45f11e1d5ae22c047cf3bda9c681de8d.zip |
Use raw Wiki links for non-renderable Wiki files (#30273)
In Wiki pages, short-links created to local Wiki files were always
expanded as regular Wiki Links. In particular, if a link wanted to point
to a file that Gitea doesn't know how to render (e.g, a .zip file), a
user following the link would be silently redirected to the Wiki's home
page.
This change makes short-links* in Wiki pages be expanded to raw wiki
links, so these local wiki files may be accessed without manually
accessing their URL.
* only short-links ending in a file extension that isn't renderable are
affected.
Closes #27121.
Signed-off-by: Rafael GirĂ£o <rafael.s.girao@tecnico.ulisboa.pt>
Co-authored-by: silverwind <me@silverwind.io>
Diffstat (limited to 'modules/markup')
-rw-r--r-- | modules/markup/html.go | 22 | ||||
-rw-r--r-- | modules/markup/html_test.go | 12 | ||||
-rw-r--r-- | modules/markup/markdown/markdown_test.go | 24 | ||||
-rw-r--r-- | modules/markup/markdown/transform_link.go | 13 |
4 files changed, 55 insertions, 16 deletions
diff --git a/modules/markup/html.go b/modules/markup/html.go index 56aa1cb49c..cef643bf18 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -709,7 +709,8 @@ func shortLinkProcessor(ctx *RenderContext, node *html.Node) { name += tail image := false - switch ext := filepath.Ext(link); ext { + ext := filepath.Ext(link) + switch ext { // fast path: empty string, ignore case "": // leave image as false @@ -767,11 +768,26 @@ func shortLinkProcessor(ctx *RenderContext, node *html.Node) { } } else { if !absoluteLink { + var base string if ctx.IsWiki { - link = util.URLJoin(ctx.Links.WikiLink(), link) + switch ext { + case "": + // no file extension, create a regular wiki link + base = ctx.Links.WikiLink() + default: + // we have a file extension: + // return a regular wiki link if it's a renderable file (extension), + // raw link otherwise + if Type(link) != "" { + base = ctx.Links.WikiLink() + } else { + base = ctx.Links.WikiRawLink() + } + } } else { - link = util.URLJoin(ctx.Links.SrcLink(), link) + base = ctx.Links.SrcLink() } + link = util.URLJoin(base, link) } childNode.Type = html.TextNode childNode.Data = name diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index 55de65d196..916e74fb62 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -427,6 +427,10 @@ func TestRender_ShortLinks(t *testing.T) { otherImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "Link+Other.jpg") encodedImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "Link+%23.jpg") notencodedImgurlWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "some", "path", "Link+#.jpg") + renderableFileURL := util.URLJoin(tree, "markdown_file.md") + renderableFileURLWiki := util.URLJoin(markup.TestRepoURL, "wiki", "markdown_file.md") + unrenderableFileURL := util.URLJoin(tree, "file.zip") + unrenderableFileURLWiki := util.URLJoin(markup.TestRepoURL, "wiki", "raw", "file.zip") favicon := "http://google.com/favicon.ico" test( @@ -482,6 +486,14 @@ func TestRender_ShortLinks(t *testing.T) { `<p><a href="`+url+`" rel="nofollow">Link</a> <a href="`+otherURL+`" rel="nofollow">Other Link</a> <a href="`+encodedURL+`" rel="nofollow">Link?</a></p>`, `<p><a href="`+urlWiki+`" rel="nofollow">Link</a> <a href="`+otherURLWiki+`" rel="nofollow">Other Link</a> <a href="`+encodedURLWiki+`" rel="nofollow">Link?</a></p>`) test( + "[[markdown_file.md]]", + `<p><a href="`+renderableFileURL+`" rel="nofollow">markdown_file.md</a></p>`, + `<p><a href="`+renderableFileURLWiki+`" rel="nofollow">markdown_file.md</a></p>`) + test( + "[[file.zip]]", + `<p><a href="`+unrenderableFileURL+`" rel="nofollow">file.zip</a></p>`, + `<p><a href="`+unrenderableFileURLWiki+`" rel="nofollow">file.zip</a></p>`) + test( "[[Link #.jpg]]", `<p><a href="`+encodedImgurl+`" rel="nofollow"><img src="`+encodedImgurl+`" title="Link #.jpg" alt="Link #.jpg"/></a></p>`, `<p><a href="`+encodedImgurlWiki+`" rel="nofollow"><img src="`+encodedImgurlWiki+`" title="Link #.jpg" alt="Link #.jpg"/></a></p>`) diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index a9c9024982..d9b67e43af 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -653,9 +653,9 @@ space</p> Expected: `<p>space @mention-user<br/> /just/a/path.bin<br/> <a href="https://example.com/file.bin" rel="nofollow">https://example.com/file.bin</a><br/> -<a href="/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> -<a href="/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> <a href="/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/wiki/raw/image.jpg" alt="local image"/></a><br/> <a href="/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/wiki/raw/path/file" alt="local image"/></a><br/> @@ -711,9 +711,9 @@ space</p> Expected: `<p>space @mention-user<br/> /just/a/path.bin<br/> <a href="https://example.com/file.bin" rel="nofollow">https://example.com/file.bin</a><br/> -<a href="https://gitea.io/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="https://gitea.io/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> -<a href="https://gitea.io/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="https://gitea.io/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> <a href="https://gitea.io/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/wiki/raw/image.jpg" alt="local image"/></a><br/> <a href="https://gitea.io/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="https://gitea.io/wiki/raw/path/file" alt="local image"/></a><br/> @@ -769,9 +769,9 @@ space</p> Expected: `<p>space @mention-user<br/> /just/a/path.bin<br/> <a href="https://example.com/file.bin" rel="nofollow">https://example.com/file.bin</a><br/> -<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/relative/path/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> -<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/relative/path/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> <a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image"/></a><br/> <a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/> @@ -829,9 +829,9 @@ space</p> Expected: `<p>space @mention-user<br/> /just/a/path.bin<br/> <a href="https://example.com/file.bin" rel="nofollow">https://example.com/file.bin</a><br/> -<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/relative/path/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> -<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/relative/path/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> <a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image"/></a><br/> <a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/> @@ -889,9 +889,9 @@ space</p> Expected: `<p>space @mention-user<br/> /just/a/path.bin<br/> <a href="https://example.com/file.bin" rel="nofollow">https://example.com/file.bin</a><br/> -<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/relative/path/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> -<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/relative/path/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> <a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image"/></a><br/> <a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/> @@ -951,9 +951,9 @@ space</p> Expected: `<p>space @mention-user<br/> /just/a/path.bin<br/> <a href="https://example.com/file.bin" rel="nofollow">https://example.com/file.bin</a><br/> -<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/relative/path/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> -<a href="/relative/path/wiki/file.bin" rel="nofollow">local link</a><br/> +<a href="/relative/path/wiki/raw/file.bin" rel="nofollow">local link</a><br/> <a href="https://example.com" rel="nofollow">remote link</a><br/> <a href="/relative/path/wiki/raw/image.jpg" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/image.jpg" alt="local image"/></a><br/> <a href="/relative/path/wiki/raw/path/file" target="_blank" rel="nofollow noopener"><img src="/relative/path/wiki/raw/path/file" alt="local image"/></a><br/> diff --git a/modules/markup/markdown/transform_link.go b/modules/markup/markdown/transform_link.go index 8bf19ea4ce..7e305b74bc 100644 --- a/modules/markup/markdown/transform_link.go +++ b/modules/markup/markdown/transform_link.go @@ -4,6 +4,8 @@ package markdown import ( + "path/filepath" + "code.gitea.io/gitea/modules/markup" giteautil "code.gitea.io/gitea/modules/util" @@ -18,7 +20,16 @@ func (g *ASTTransformer) transformLink(ctx *markup.RenderContext, v *ast.Link, r if !isAnchorFragment && !markup.IsFullURLBytes(link) { base := ctx.Links.Base if ctx.IsWiki { - base = ctx.Links.WikiLink() + if filepath.Ext(string(link)) == "" { + // This link doesn't have a file extension - assume a regular wiki link + base = ctx.Links.WikiLink() + } else if markup.Type(string(link)) != "" { + // If it's a file type we can render, use a regular wiki link + base = ctx.Links.WikiLink() + } else { + // Otherwise, use a raw link instead + base = ctx.Links.WikiRawLink() + } } else if ctx.Links.HasBranchInfo() { base = ctx.Links.SrcLink() } |