mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Fix markdown URL parsing (#17924)
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
		@@ -25,13 +25,11 @@ var localMetas = map[string]string{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRender_Commits(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
	test := func(input, expected string) {
 | 
			
		||||
		buffer, err := RenderString(&RenderContext{
 | 
			
		||||
			Filename:  ".md",
 | 
			
		||||
			URLPrefix: setting.AppSubURL,
 | 
			
		||||
			URLPrefix: TestRepoURL,
 | 
			
		||||
			Metas:     localMetas,
 | 
			
		||||
		}, input)
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
@@ -39,15 +37,30 @@ func TestRender_Commits(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var sha = "65f1bf27bc3bf70f64657658635e66094edbcb4d"
 | 
			
		||||
	var commit = util.URLJoin(AppSubURL, "commit", sha)
 | 
			
		||||
	var subtree = util.URLJoin(commit, "src")
 | 
			
		||||
	var tree = strings.ReplaceAll(subtree, "/commit/", "/tree/")
 | 
			
		||||
	var repo = TestRepoURL
 | 
			
		||||
	var commit = util.URLJoin(repo, "commit", sha)
 | 
			
		||||
	var tree = util.URLJoin(repo, "tree", sha, "src")
 | 
			
		||||
 | 
			
		||||
	var file = util.URLJoin(repo, "commit", sha, "example.txt")
 | 
			
		||||
	var fileWithExtra = file + ":"
 | 
			
		||||
	var fileWithHash = file + "#L2"
 | 
			
		||||
	var fileWithHasExtra = file + "#L2:"
 | 
			
		||||
	var commitCompare = util.URLJoin(repo, "compare", sha+"..."+sha)
 | 
			
		||||
	var commitCompareWithHash = commitCompare + "#L2"
 | 
			
		||||
 | 
			
		||||
	test(sha, `<p><a href="`+commit+`" rel="nofollow"><code>65f1bf27bc</code></a></p>`)
 | 
			
		||||
	test(sha[:7], `<p><a href="`+commit[:len(commit)-(40-7)]+`" rel="nofollow"><code>65f1bf2</code></a></p>`)
 | 
			
		||||
	test(sha[:39], `<p><a href="`+commit[:len(commit)-(40-39)]+`" rel="nofollow"><code>65f1bf27bc</code></a></p>`)
 | 
			
		||||
	test(commit, `<p><a href="`+commit+`" rel="nofollow"><code>65f1bf27bc</code></a></p>`)
 | 
			
		||||
	test(tree, `<p><a href="`+tree+`" rel="nofollow"><code>65f1bf27bc/src</code></a></p>`)
 | 
			
		||||
 | 
			
		||||
	test(file, `<p><a href="`+file+`" rel="nofollow"><code>65f1bf27bc/example.txt</code></a></p>`)
 | 
			
		||||
	test(fileWithExtra, `<p><a href="`+file+`" rel="nofollow"><code>65f1bf27bc/example.txt</code></a>:</p>`)
 | 
			
		||||
	test(fileWithHash, `<p><a href="`+fileWithHash+`" rel="nofollow"><code>65f1bf27bc/example.txt (L2)</code></a></p>`)
 | 
			
		||||
	test(fileWithHasExtra, `<p><a href="`+fileWithHash+`" rel="nofollow"><code>65f1bf27bc/example.txt (L2)</code></a>:</p>`)
 | 
			
		||||
	test(commitCompare, `<p><a href="`+commitCompare+`" rel="nofollow"><code>65f1bf27bc...65f1bf27bc</code></a></p>`)
 | 
			
		||||
	test(commitCompareWithHash, `<p><a href="`+commitCompareWithHash+`" rel="nofollow"><code>65f1bf27bc...65f1bf27bc (L2)</code></a></p>`)
 | 
			
		||||
 | 
			
		||||
	test("commit "+sha, `<p>commit <a href="`+commit+`" rel="nofollow"><code>65f1bf27bc</code></a></p>`)
 | 
			
		||||
	test("/home/gitea/"+sha, "<p>/home/gitea/"+sha+"</p>")
 | 
			
		||||
	test("deadbeef", `<p>deadbeef</p>`)
 | 
			
		||||
@@ -61,8 +74,7 @@ func TestRender_Commits(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRender_CrossReferences(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
 | 
			
		||||
	test := func(input, expected string) {
 | 
			
		||||
		buffer, err := RenderString(&RenderContext{
 | 
			
		||||
@@ -76,21 +88,20 @@ func TestRender_CrossReferences(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	test(
 | 
			
		||||
		"gogits/gogs#12345",
 | 
			
		||||
		`<p><a href="`+util.URLJoin(AppURL, "gogits", "gogs", "issues", "12345")+`" class="ref-issue" rel="nofollow">gogits/gogs#12345</a></p>`)
 | 
			
		||||
		`<p><a href="`+util.URLJoin(TestAppURL, "gogits", "gogs", "issues", "12345")+`" class="ref-issue" rel="nofollow">gogits/gogs#12345</a></p>`)
 | 
			
		||||
	test(
 | 
			
		||||
		"go-gitea/gitea#12345",
 | 
			
		||||
		`<p><a href="`+util.URLJoin(AppURL, "go-gitea", "gitea", "issues", "12345")+`" class="ref-issue" rel="nofollow">go-gitea/gitea#12345</a></p>`)
 | 
			
		||||
		`<p><a href="`+util.URLJoin(TestAppURL, "go-gitea", "gitea", "issues", "12345")+`" class="ref-issue" rel="nofollow">go-gitea/gitea#12345</a></p>`)
 | 
			
		||||
	test(
 | 
			
		||||
		"/home/gitea/go-gitea/gitea#12345",
 | 
			
		||||
		`<p>/home/gitea/go-gitea/gitea#12345</p>`)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMisc_IsSameDomain(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
 | 
			
		||||
	var sha = "b6dd6210eaebc915fd5be5579c58cce4da2e2579"
 | 
			
		||||
	var commit = util.URLJoin(AppSubURL, "commit", sha)
 | 
			
		||||
	var commit = util.URLJoin(TestRepoURL, "commit", sha)
 | 
			
		||||
 | 
			
		||||
	assert.True(t, IsSameDomain(commit))
 | 
			
		||||
	assert.False(t, IsSameDomain("http://google.com/ncr"))
 | 
			
		||||
@@ -98,13 +109,12 @@ func TestMisc_IsSameDomain(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRender_links(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
 | 
			
		||||
	test := func(input, expected string) {
 | 
			
		||||
		buffer, err := RenderString(&RenderContext{
 | 
			
		||||
			Filename:  "a.md",
 | 
			
		||||
			URLPrefix: setting.AppSubURL,
 | 
			
		||||
			URLPrefix: TestRepoURL,
 | 
			
		||||
		}, input)
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
 | 
			
		||||
@@ -198,13 +208,12 @@ func TestRender_links(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRender_email(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
 | 
			
		||||
	test := func(input, expected string) {
 | 
			
		||||
		res, err := RenderString(&RenderContext{
 | 
			
		||||
			Filename:  "a.md",
 | 
			
		||||
			URLPrefix: setting.AppSubURL,
 | 
			
		||||
			URLPrefix: TestRepoURL,
 | 
			
		||||
		}, input)
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(res))
 | 
			
		||||
@@ -255,15 +264,14 @@ func TestRender_email(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRender_emoji(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	setting.StaticURLPrefix = AppURL
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
	setting.StaticURLPrefix = TestAppURL
 | 
			
		||||
 | 
			
		||||
	test := func(input, expected string) {
 | 
			
		||||
		expected = strings.ReplaceAll(expected, "&", "&")
 | 
			
		||||
		buffer, err := RenderString(&RenderContext{
 | 
			
		||||
			Filename:  "a.md",
 | 
			
		||||
			URLPrefix: setting.AppSubURL,
 | 
			
		||||
			URLPrefix: TestRepoURL,
 | 
			
		||||
		}, input)
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
 | 
			
		||||
@@ -320,9 +328,8 @@ func TestRender_emoji(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRender_ShortLinks(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	tree := util.URLJoin(AppSubURL, "src", "master")
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
	tree := util.URLJoin(TestRepoURL, "src", "master")
 | 
			
		||||
 | 
			
		||||
	test := func(input, expected, expectedWiki string) {
 | 
			
		||||
		buffer, err := markdown.RenderString(&RenderContext{
 | 
			
		||||
@@ -331,7 +338,7 @@ func TestRender_ShortLinks(t *testing.T) {
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
 | 
			
		||||
		buffer, err = markdown.RenderString(&RenderContext{
 | 
			
		||||
			URLPrefix: setting.AppSubURL,
 | 
			
		||||
			URLPrefix: TestRepoURL,
 | 
			
		||||
			Metas:     localMetas,
 | 
			
		||||
			IsWiki:    true,
 | 
			
		||||
		}, input)
 | 
			
		||||
@@ -339,7 +346,7 @@ func TestRender_ShortLinks(t *testing.T) {
 | 
			
		||||
		assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(buffer))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rawtree := util.URLJoin(AppSubURL, "raw", "master")
 | 
			
		||||
	rawtree := util.URLJoin(TestRepoURL, "raw", "master")
 | 
			
		||||
	url := util.URLJoin(tree, "Link")
 | 
			
		||||
	otherURL := util.URLJoin(tree, "Other-Link")
 | 
			
		||||
	encodedURL := util.URLJoin(tree, "Link%3F")
 | 
			
		||||
@@ -347,13 +354,13 @@ func TestRender_ShortLinks(t *testing.T) {
 | 
			
		||||
	otherImgurl := util.URLJoin(rawtree, "Link+Other.jpg")
 | 
			
		||||
	encodedImgurl := util.URLJoin(rawtree, "Link+%23.jpg")
 | 
			
		||||
	notencodedImgurl := util.URLJoin(rawtree, "some", "path", "Link+#.jpg")
 | 
			
		||||
	urlWiki := util.URLJoin(AppSubURL, "wiki", "Link")
 | 
			
		||||
	otherURLWiki := util.URLJoin(AppSubURL, "wiki", "Other-Link")
 | 
			
		||||
	encodedURLWiki := util.URLJoin(AppSubURL, "wiki", "Link%3F")
 | 
			
		||||
	imgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg")
 | 
			
		||||
	otherImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+Other.jpg")
 | 
			
		||||
	encodedImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+%23.jpg")
 | 
			
		||||
	notencodedImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "some", "path", "Link+#.jpg")
 | 
			
		||||
	urlWiki := util.URLJoin(TestRepoURL, "wiki", "Link")
 | 
			
		||||
	otherURLWiki := util.URLJoin(TestRepoURL, "wiki", "Other-Link")
 | 
			
		||||
	encodedURLWiki := util.URLJoin(TestRepoURL, "wiki", "Link%3F")
 | 
			
		||||
	imgurlWiki := util.URLJoin(TestRepoURL, "wiki", "raw", "Link.jpg")
 | 
			
		||||
	otherImgurlWiki := util.URLJoin(TestRepoURL, "wiki", "raw", "Link+Other.jpg")
 | 
			
		||||
	encodedImgurlWiki := util.URLJoin(TestRepoURL, "wiki", "raw", "Link+%23.jpg")
 | 
			
		||||
	notencodedImgurlWiki := util.URLJoin(TestRepoURL, "wiki", "raw", "some", "path", "Link+#.jpg")
 | 
			
		||||
	favicon := "http://google.com/favicon.ico"
 | 
			
		||||
 | 
			
		||||
	test(
 | 
			
		||||
@@ -427,9 +434,8 @@ func TestRender_ShortLinks(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRender_RelativeImages(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	tree := util.URLJoin(AppSubURL, "src", "master")
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
	tree := util.URLJoin(TestRepoURL, "src", "master")
 | 
			
		||||
 | 
			
		||||
	test := func(input, expected, expectedWiki string) {
 | 
			
		||||
		buffer, err := markdown.RenderString(&RenderContext{
 | 
			
		||||
@@ -439,7 +445,7 @@ func TestRender_RelativeImages(t *testing.T) {
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(buffer))
 | 
			
		||||
		buffer, err = markdown.RenderString(&RenderContext{
 | 
			
		||||
			URLPrefix: setting.AppSubURL,
 | 
			
		||||
			URLPrefix: TestRepoURL,
 | 
			
		||||
			Metas:     localMetas,
 | 
			
		||||
			IsWiki:    true,
 | 
			
		||||
		}, input)
 | 
			
		||||
@@ -447,8 +453,8 @@ func TestRender_RelativeImages(t *testing.T) {
 | 
			
		||||
		assert.Equal(t, strings.TrimSpace(expectedWiki), strings.TrimSpace(buffer))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rawwiki := util.URLJoin(AppSubURL, "wiki", "raw")
 | 
			
		||||
	mediatree := util.URLJoin(AppSubURL, "media", "master")
 | 
			
		||||
	rawwiki := util.URLJoin(TestRepoURL, "wiki", "raw")
 | 
			
		||||
	mediatree := util.URLJoin(TestRepoURL, "media", "master")
 | 
			
		||||
 | 
			
		||||
	test(
 | 
			
		||||
		`<img src="Link">`,
 | 
			
		||||
@@ -462,8 +468,7 @@ func TestRender_RelativeImages(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Test_ParseClusterFuzz(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
 | 
			
		||||
	var localMetas = map[string]string{
 | 
			
		||||
		"user": "go-gitea",
 | 
			
		||||
@@ -493,8 +498,7 @@ func Test_ParseClusterFuzz(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestIssue16020(t *testing.T) {
 | 
			
		||||
	setting.AppURL = AppURL
 | 
			
		||||
	setting.AppSubURL = AppSubURL
 | 
			
		||||
	setting.AppURL = TestAppURL
 | 
			
		||||
 | 
			
		||||
	var localMetas = map[string]string{
 | 
			
		||||
		"user": "go-gitea",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user