-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Bug Report] Relative links in markdown #18592
Comments
This was fixed at some point and something has caused a regression!! |
Yes this was fixed in #15088 This is particularly irritating as there was even a test created to prevent this from happening YET AGAIN |
Let's just go through this again. The base url for an image link rendered in a file GH is:
Relative links may traverse out of the repo i.e. if a file that is in
then it would like to
Essentially a leading I'll do some more test cases in pathological and properly add tests to gitea to prevent this from happening yet again. Now in issues and presumably elsewhere the opposite happens: ../../../A |
OK I guess we need the following (this is for a gitea mounted on a suburl /gitea):
One slight problem is that this this is still not github compatible - githubs blob urls are: https://github.com/zeripath/pathological/blob/master/README.md Whereas the equivalent in Gitea: https://try.gitea.io/arandomer/pathological/src/branch/master/README.md So we're already slightly incompatible. However, the |
TestCase to add to modules/markup/markdown/markdown_test.gofunc TestRender_RelativeLinks(t *testing.T) {
setting.AppURL = "https://localhost:3000/gitea/"
setting.AppSubURL = "/gitea"
testcases := []struct {
name string
input string
expectedFile string
expectedFileInDir string
expectedWiki string
expectedIssue string
}{
{
name: "samedir",
input: "file",
expectedFile: "/gitea/gogits/gogs/src/branch/master/file",
expectedFileInDir: "/gitea/gogits/gogs/src/branch/master/subdir/file",
expectedWiki: "/gitea/gogits/gogs/wiki/file",
expectedIssue: "/gitea/gogits/gogs/issues/file",
},
{
name: "childir",
input: "subdir/file",
expectedFile: "/gitea/gogits/gogs/src/branch/master/subdir/file",
expectedFileInDir: "/gitea/gogits/gogs/src/branch/master/subdir/subdir/file",
expectedWiki: "/gitea/gogits/gogs/wiki/subdir/file",
expectedIssue: "/gitea/gogits/gogs/issues/subdir/file",
},
{
name: "/file",
input: "/file",
expectedFile: "/gitea/gogits/gogs/src/branch/master/file",
expectedFileInDir: "/gitea/gogits/gogs/src/branch/master/file",
expectedWiki: "/gitea/file",
expectedIssue: "/gitea/file",
},
{
name: "../file",
input: "../file",
expectedFile: "/gitea/gogits/gogs/src/branch/file",
expectedFileInDir: "/gitea/gogits/gogs/src/branch/master/file",
expectedWiki: "/gitea/gogits/gogs/file",
expectedIssue: "/gitea/gogits/gogs/file",
},
{
name: "/../file",
input: "/../file",
expectedFile: "/gitea/gogits/gogs/src/branch/file",
expectedFileInDir: "/gitea/gogits/gogs/src/branch/file",
expectedWiki: "/gitea/file",
expectedIssue: "/gitea/file",
},
{
name: "../../file",
input: "../../file",
expectedFile: "/gitea/gogits/gogs/src/file",
expectedFileInDir: "/gitea/gogits/gogs/src/branch/file",
expectedWiki: "/gitea/gogits/file",
expectedIssue: "/gitea/gogits/file",
},
{
name: "/../../file",
input: "/../../file",
expectedFile: "/gitea/gogits/gogs/src/file",
expectedFileInDir: "/gitea/gogits/gogs/src/file",
expectedWiki: "/gitea/file",
expectedIssue: "/gitea/file",
},
{
name: "../../../file",
input: "../../../file",
expectedFile: "/gitea/gogits/gogs/file",
expectedFileInDir: "/gitea/gogits/gogs/src/file",
expectedWiki: "/gitea/file",
expectedIssue: "/gitea/file",
},
{
name: "../../../../file",
input: "../../../../file",
expectedFile: "/gitea/gogits/file",
expectedFileInDir: "/gitea/gogits/gogs/file",
expectedWiki: "/gitea/file",
expectedIssue: "/gitea/file",
},
{
name: "../../../../../file",
input: "../../../../../file",
expectedFile: "/gitea/file",
expectedFileInDir: "/gitea/gogits/file",
expectedWiki: "/gitea/file",
expectedIssue: "/gitea/file",
},
{
name: "../../../../../../file",
input: "../../../../../../file",
expectedFile: "/gitea/file",
expectedFileInDir: "/gitea/file",
expectedWiki: "/gitea/file",
expectedIssue: "/gitea/file",
},
{
name: "../../../../../../../file",
input: "../../../../../../../file",
expectedFile: "/gitea/file",
expectedFileInDir: "/gitea/file",
expectedWiki: "/gitea/file",
expectedIssue: "/gitea/file",
},
}
for _, testcase := range testcases {
t.Run(testcase.name, func(t *testing.T) {
t.Run("file", func(t *testing.T) {
buffer, err := RenderString(&markup.RenderContext{
URLPrefix: setting.AppSubURL + "/" + Repo + "/src/branch/master/",
Filename: "test.md",
Metas: map[string]string{
"user": "gogits",
"repo": "gogs",
"repoPath": "../../../integrations/gitea-repositories-meta/user13/repo11.git/",
},
}, "["+testcase.input+"]("+testcase.input+")")
assert.NoError(t, err)
assert.Equal(t, fmt.Sprintf("<p><a href=\"%s\" rel=\"nofollow\">%s</a></p>", testcase.expectedFile, testcase.input), strings.TrimSpace(buffer), "Incorrect file path")
})
t.Run("fileInDir", func(t *testing.T) {
buffer, err := RenderString(&markup.RenderContext{
URLPrefix: setting.AppSubURL + "/" + Repo + "/src/branch/master/subdir/",
Filename: "test.md",
Metas: map[string]string{
"user": "gogits",
"repo": "gogs",
"repoPath": "../../../integrations/gitea-repositories-meta/user13/repo11.git/",
},
}, "["+testcase.input+"]("+testcase.input+")")
assert.NoError(t, err)
assert.Equal(t, fmt.Sprintf("<p><a href=\"%s\" rel=\"nofollow\">%s</a></p>", testcase.expectedFileInDir, testcase.input), strings.TrimSpace(buffer), "Incorrect subdir file path")
})
t.Run("wiki", func(t *testing.T) {
buffer, err := RenderString(&markup.RenderContext{
URLPrefix: setting.AppSubURL + "/" + Repo,
IsWiki: true,
Metas: map[string]string{
"user": "gogits",
"repo": "gogs",
"repoPath": "../../../integrations/gitea-repositories-meta/user13/repo11.git/",
},
}, "["+testcase.input+"]("+testcase.input+")")
assert.NoError(t, err)
assert.Equal(t, fmt.Sprintf("<p><a href=\"%s\" rel=\"nofollow\">%s</a></p>", testcase.expectedWiki, testcase.input), strings.TrimSpace(buffer), "Incorrect wiki path")
})
t.Run("comment", func(t *testing.T) {
buffer, err := RenderString(&markup.RenderContext{
URLPrefix: setting.AppSubURL + "/" + Repo + "/issues/",
Metas: map[string]string{
"user": "gogits",
"repo": "gogs",
"repoPath": "../../../integrations/gitea-repositories-meta/user13/repo11.git/",
"mode": "comment",
},
}, "["+testcase.input+"]("+testcase.input+")")
assert.NoError(t, err)
assert.Equal(t, fmt.Sprintf("<p><a href=\"%s\" rel=\"nofollow\">%s</a></p>", testcase.expectedIssue, testcase.input), strings.TrimSpace(buffer), "Incorrect issue path")
})
})
}
} |
Has there been any progress on this bug? This seems like a reasonably important feature-breaking bug! |
Same problem with using HTML A tag in markdown with relative file name Steps:
|
From https://try.gitea.io/aybe/markdown-branch/ , only relative link from a tag is wrong. Maybe it's accepted? |
I just ran into this, sadly it seems to break almost all links in my documentation so this is a really high impact bug in my opinion. Especially since with the GitHub mirror it works fine. Here's a demo file with a link that should work but it doesn't: https://try.gitea.io/blablablablab/BlaTest/src/branch/main/A%20B/outsidelink.md (The big bold (test link) is what you want to click. Expected behavior is that it gets you to the target file in the repository root, actual behavior is some nonsensical location.) |
In original post it is said that relative links such as I expect that a link such as |
The issue above seems to be a regression between 1.21.3 and 1.21.4, probably even by #28803 |
Thank you so much @vilunov, you saved my day. Downgrade to 1.21.3 solved this annoying issue. |
@KN4CK3R sorry, pinging for visibility since you made the MR and you seem to be responsible for that area. |
Can't reproduce it on current main. Was it fixed by #28909? |
Ok, that's not a regression of my PR 🎉 Gitea always rendered them like that. It's debatable what the root is for absolute links. Even Github is inconsistent with the links. Inside issue: Inside repo: A fix would be to strip the gitea/modules/markup/markdown/goldmark.go Line 148 in 3e84141
- link = []byte(giteautil.URLJoin(base, string(link)))
+ link = []byte(giteautil.URLJoin(base, strings.TrimLeft(string(link), "/"))) |
GitHub is not very consistent even when it comes to rendering Example: It really is tricky |
@vilunov the first one seems more like a bug, doesn't it? usually in almost all places on GitHub it behaves like the 2nd example. maybe they just forgot about this corner case of footnotes in the one location, that feels like the most likely reason. on gitea, sadly it still doesn't seem to work for links starting with edit: this also can't be just fixed on the user side by leaving the |
I am having (a variation of?) this problem on the latest version of Gitea (served at root, not at sub-path) — For example I write:
In the Release description field (which works fine on Github and Gitlab) and the link is replaced with:
And results in 404 error when clicked. Actual README.md link in the source tree shows as:
I don't think either would be correct for Releases though — it should link to specific tagged release version of the file. The only way I can produce a correct link is if I do it manually like this:
Which results in:
It would be nice if Gitea was smart enough to do that sort of expansion for me if I provide a relative path without leading |
Is this bug resolved now, I am facing the same issue with version 1.21.4. |
It is not really fixed. Because the "absolute path" link (starting with a slash And, if we change this behavior, it is a "breaking" change and will make all existing "absolute-path" links broken. |
Which means we need to use /src/branch/main/ as a prefix right? |
Or use relative path like Maybe I could take a try in 1.23 to "fix/improve" the path handling, but I can't promise at the moment. |
I moved recently to Forgejo, based on Gitea, and works fine. |
I just updated my installation to 1.22.0 and my issue got resolved, my issue was the 1st case referenced in comment #18592 (comment) |
There are some different path problems, some have been fixed, while some are still not. Pretty sure they do not have the proper fix either. Forgejo is still largely based on Gitea's work, but they skipped some Gitea's commits (even some are security related) so I guess it couldn't be more complete than Gitea. |
Made some tests on GitHub, I think we could just copy the behavior (and mark it as breaking) https://github.com/wxiaoguang/playground/blob/44cc37ef49eb827345dd0d9d510b319f81f63f16/test.md https://github.com/wxiaoguang/playground/blob/6bd6f1da05afc914abf452628d90c90b71093820/dir/test.md Actually, the rule is simple:
But not sure whether we should 100% follow it ........
|
I vote for using the same logic as GitHub — that makes it easier to have both private Gitea and public GitHub repo with correct links in both. Also please make sure that it works not just in issues and comments but in releases as well. Thanks for looking into it and taking time to fix it. |
Introduction
When using relative links in markdown files you have to use either
./file.md
orfile.md
. When trying to use/file.md
you will get redirected to the root of the gitea instance.Example
https://try.gitea.io/schorsch/relative-links-in-markdown
Proposal
Change
/file.md
from directing to the web root to the project rootCredits
The bug was discovered by the codeberg user ivan-paleo. For further information have a look at the issue at codeberg: https://codeberg.org/Codeberg/Community/issues/252
The text was updated successfully, but these errors were encountered: