[BUG] Restrict when to make link absolute in markdown
- Backport of #2403
- In markdown, links are proccessed to be made absolute against the
relevant base in that context. Such that `./src` will be transformed
into `http://example.com/owner/repo/src/branch/main/src`.
- Don't try to make the link absolute if the link has a schema that's
defined in `[markdown].CUSTOM_URL_SCHEMES`, because they can't be made
absolute and doing so could lead to problems (see test case, double
slash was transformed to single slash).
- Adds unit test.
- Resolves https://codeberg.org/Codeberg/Community/issues/1489
(cherry picked from commit 65b9a959b8
)
This commit is contained in:
parent
6c5121aac5
commit
6c100083c2
2 changed files with 38 additions and 4 deletions
|
@ -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"
|
||||||
|
@ -131,11 +132,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()
|
||||||
|
|
|
@ -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"
|
||||||
|
@ -960,3 +961,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 := 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&title=joy)",
|
||||||
|
`<p><a href="abp:subscribe?location=https://codeberg.org/filters.txt&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>`)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue