Merge pull request '[BUG] Restrict when to make link absolute in markdown' (#2403) from gusted/forgejo-custom-url into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/2403
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Reviewed-by: Otto <otto@codeberg.org>
This commit is contained in:
Gusted 2024-02-19 22:16:23 +00:00
commit f128b6efc9
2 changed files with 38 additions and 4 deletions

View file

@ -7,6 +7,7 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"regexp" "regexp"
"slices"
"strings" "strings"
"code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/container"
@ -129,11 +130,17 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
case *ast.Link: case *ast.Link:
// Links need their href to munged to be a real value // Links need their href to munged to be a real value
link := v.Destination link := v.Destination
if len(link) > 0 && !markup.IsLink(link) &&
link[0] != '#' && !bytes.HasPrefix(link, byteMailto) {
// special case: this is not a link, a hash link or a mailto:, so it's a
// relative URL
// Do not process the link if it's not a link, starts with an hashtag
// (indicating it's an anchor link), starts with `mailto:` or any of the
// custom markdown URLs.
processLink := len(link) > 0 && !markup.IsLink(link) &&
link[0] != '#' && !bytes.HasPrefix(link, byteMailto) &&
!slices.ContainsFunc(setting.Markdown.CustomURLSchemes, func(s string) bool {
return bytes.HasPrefix(link, []byte(s+":"))
})
if processLink {
var base string var base string
if ctx.IsWiki { if ctx.IsWiki {
base = ctx.Links.WikiLink() base = ctx.Links.WikiLink()

View file

@ -15,6 +15,7 @@ import (
"code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
"code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/util"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -1170,3 +1171,29 @@ space</p>
assert.Equal(t, c.Expected, result, "Unexpected result in testcase %v", i) assert.Equal(t, c.Expected, result, "Unexpected result in testcase %v", i)
} }
} }
func TestCustomMarkdownURL(t *testing.T) {
defer test.MockVariableValue(&setting.Markdown.CustomURLSchemes, []string{"abp"})()
setting.AppURL = AppURL
setting.AppSubURL = AppSubURL
test := func(input, expected string) {
buffer, err := markdown.RenderString(&markup.RenderContext{
Ctx: git.DefaultContext,
Links: markup.Links{
Base: setting.AppSubURL,
BranchPath: "branch/main",
},
}, input)
assert.NoError(t, err)
assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
}
test("[test](abp:subscribe?location=https://codeberg.org/filters.txt&amp;title=joy)",
`<p><a href="abp:subscribe?location=https://codeberg.org/filters.txt&amp;title=joy" rel="nofollow">test</a></p>`)
// Ensure that the schema itself without `:` is still made absolute.
test("[test](abp)",
`<p><a href="http://localhost:3000/gogits/gogs/src/branch/main/abp" rel="nofollow">test</a></p>`)
}