From c1f76aea45f11e1d5ae22c047cf3bda9c681de8d Mon Sep 17 00:00:00 2001
From: Rafael
Date: Wed, 10 Apr 2024 18:49:57 +0100
Subject: Use raw Wiki links for non-renderable Wiki files (#30273)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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
Co-authored-by: silverwind
---
modules/markup/html.go | 22 +++++++++++++++++++---
modules/markup/html_test.go | 12 ++++++++++++
modules/markup/markdown/markdown_test.go | 24 ++++++++++++------------
modules/markup/markdown/transform_link.go | 13 ++++++++++++-
4 files changed, 55 insertions(+), 16 deletions(-)
(limited to 'modules/markup')
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(
@@ -481,6 +485,14 @@ func TestRender_ShortLinks(t *testing.T) {
"[[Link]] [[Other Link]] [[Link?]]",
`Link Other Link Link?
`,
`Link Other Link Link?
`)
+ test(
+ "[[markdown_file.md]]",
+ `markdown_file.md
`,
+ `markdown_file.md
`)
+ test(
+ "[[file.zip]]",
+ `file.zip
`,
+ `file.zip
`)
test(
"[[Link #.jpg]]",
`
`,
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
Expected: `space @mention-user
/just/a/path.bin
https://example.com/file.bin
-local link
+local link
remote link
-local link
+local link
remote link


@@ -711,9 +711,9 @@ space
Expected: `space @mention-user
/just/a/path.bin
https://example.com/file.bin
-local link
+local link
remote link
-local link
+local link
remote link


@@ -769,9 +769,9 @@ space
Expected: `space @mention-user
/just/a/path.bin
https://example.com/file.bin
-local link
+local link
remote link
-local link
+local link
remote link


@@ -829,9 +829,9 @@ space
Expected: `space @mention-user
/just/a/path.bin
https://example.com/file.bin
-local link
+local link
remote link
-local link
+local link
remote link


@@ -889,9 +889,9 @@ space
Expected: `space @mention-user
/just/a/path.bin
https://example.com/file.bin
-local link
+local link
remote link
-local link
+local link
remote link


@@ -951,9 +951,9 @@ space
Expected: `space @mention-user
/just/a/path.bin
https://example.com/file.bin
-local link
+local link
remote link
-local link
+local link
remote link


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()
}
--
cgit v1.2.3