From a572784de8a3411ddbf698054c28cfd99eab646e Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 11 Mar 2023 05:56:40 +0100 Subject: [PATCH] handle relative symlinks --- integration/get_test.go | 11 +++++++++++ server/gitea/client.go | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/integration/get_test.go b/integration/get_test.go index 3a7190a..a826958 100644 --- a/integration/get_test.go +++ b/integration/get_test.go @@ -154,6 +154,7 @@ func TestGetNotFound(t *testing.T) { func TestFollowSymlink(t *testing.T) { log.Printf("=== TestFollowSymlink ===\n") + // file symlink resp, err := getTestHTTPSClient().Get("https://cb_pages_tests.localhost.mock.directory:4430/tests_for_pages-server/@main/link") assert.NoError(t, err) if !assert.NotNil(t, resp) { @@ -165,6 +166,16 @@ func TestFollowSymlink(t *testing.T) { body := getBytes(resp.Body) assert.EqualValues(t, 4, len(body)) assert.EqualValues(t, "abc\n", string(body)) + + // relative file links (../index.html file in this case) + resp, err = getTestHTTPSClient().Get("https://cb_pages_tests.localhost.mock.directory:4430/tests_for_pages-server/@main/dir_aim/some/") + assert.NoError(t, err) + if !assert.NotNil(t, resp) { + t.FailNow() + } + assert.EqualValues(t, http.StatusOK, resp.StatusCode) + assert.EqualValues(t, "text/html; charset=utf-8", resp.Header.Get("Content-Type")) + assert.EqualValues(t, "an index\n", string(getBytes(resp.Body))) } func TestLFSSupport(t *testing.T) { diff --git a/server/gitea/client.go b/server/gitea/client.go index 51647ba..bfc4de7 100644 --- a/server/gitea/client.go +++ b/server/gitea/client.go @@ -145,6 +145,10 @@ func (client *Client) ServeRawContent(targetOwner, targetRepo, ref, resource str } linkDest := strings.TrimSpace(string(linkDestBytes)) + // handle relative links + // we first remove the link from the path, and make a relative join (resolve parent paths like "/../" too) + linkDest = path.Join(path.Dir(resource), linkDest) + // we store symlink not content to reduce duplicates in cache if err := client.responseCache.Set(cacheKey, FileResponse{ Exists: true,