From c0a2108c25c36f4f6dcf0915ac3c6de8c781229c Mon Sep 17 00:00:00 2001 From: Robert Wolff Date: Thu, 30 Jan 2025 08:20:05 +0000 Subject: [PATCH] fix inline file preview for files with encoded URL, fix #5069 (#6525) ### Screenshot #### Before See #5069. #### After ![image](/attachments/d57c2ff8-d29e-41b8-9280-c884ac43f12e) ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I added test coverage for JavaScript changes... - [ ] in `web_src/js/*.test.js` if it can be unit tested. - [ ] in `tests/e2e/*.test.e2e.js` if it requires interactions with a live Forgejo server (see also the [developer guide for JavaScript testing](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/tests/e2e/README.md#end-to-end-tests)). - Manual testing: see https://codeberg.org/forgejo/forgejo/pulls/6525#issuecomment-2578814. Thanks @earl-warren. ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [ ] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/.md` to be be used for the release notes instead of the title. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6525 Reviewed-by: Otto Co-authored-by: Robert Wolff Co-committed-by: Robert Wolff --- modules/markup/file_preview.go | 5 +++ modules/markup/html_test.go | 31 ++++++++++++++++++ .../18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec | Bin 0 -> 90 bytes .../2a/4032b49cff56d6d4921133e087d9dc0341a2c5 | Bin 0 -> 108 bytes .../2d/2f8eaa17b17359ee1c73222065575d50d9a157 | Bin 0 -> 108 bytes .../2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd | Bin 0 -> 45 bytes .../2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 | Bin 0 -> 90 bytes .../3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca | 1 + .../8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 | Bin 0 -> 90 bytes .../95/31b649823095acf5d79ab9e4f8b8d86046352f | Bin 0 -> 108 bytes .../ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 | Bin 0 -> 176 bytes .../c5/3110b1957cefc56c4b2d879476ddbe905980bf | Bin 0 -> 44 bytes .../e7/99b34ea867a0364d0df33f382562db9ff39084 | Bin 0 -> 45 bytes .../ee/b243c3395e1921c5d90e73bd739827251fc99d | Bin 0 -> 175 bytes .../f7/0f10e4db19068f79bc43844b49f3eece45c4e8 | Bin 0 -> 17 bytes .../repo/repo1_filepreview/refs/heads/master | 2 +- 16 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d create mode 100644 modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 diff --git a/modules/markup/file_preview.go b/modules/markup/file_preview.go index 3caf08f7bb..2171f6097b 100644 --- a/modules/markup/file_preview.go +++ b/modules/markup/file_preview.go @@ -8,6 +8,7 @@ import ( "bytes" "html/template" "io" + "net/url" "regexp" "slices" "strconv" @@ -83,6 +84,10 @@ func newFilePreview(ctx *RenderContext, node *html.Node, locale translation.Loca } else if Type(filePath) != "" { urlFullSource = node.Data[m[0]:m[6]] + filePath + "?display=source#" + node.Data[m[8]:m[1]] } + filePath, err := url.QueryUnescape(filePath) + if err != nil { + return nil + } hash := node.Data[m[8]:m[9]] preview.start = m[0] diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index 702c5a716d..05ba321548 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -1129,4 +1129,35 @@ func TestRender_FilePreview(t *testing.T) { localMetas, ) }) + + commitFileURL = util.URLJoin(markup.TestRepoURL, "src", "commit", "eeb243c3395e1921c5d90e73bd739827251fc99d", "path", "to", "file%20%23.txt") + + t.Run("file with strange characters in name", func(t *testing.T) { + testRender( + commitFileURL+"#L1", + `

`+ + `
`+ + `
`+ + `
`+ + `path/to/file #.txt`+ + `
`+ + ``+ + `Line 1 in eeb243c`+ + ``+ + `
`+ + `
`+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + ``+ + `
A`+"\n"+`
`+ + `
`+ + `
`+ + `

`, + localMetas, + ) + }) } diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec b/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec new file mode 100644 index 0000000000000000000000000000000000000000..c8b99f906b521d61dc9016cd7da2405c14400b62 GIT binary patch literal 90 zcmV-g0HyzU0V^p=O;s>AVK6ZO0)>Lak_-m@o#9n|Q@FTVmUo`LvLu#YT+jZlp@D&! wiHSmSW?p(us%}nZUaDS6MF~SsT~u1Vbh(84zm5YkwvSze7j9Aj0D87uwXDWFfcPQQAo?oNma1dE2$`9_|7lz4gGzbn;_D>e53 literal 0 HcmV?d00001 diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 b/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 new file mode 100644 index 0000000000000000000000000000000000000000..7f4c451d0049897020a600fced28ca0096226b4e GIT binary patch literal 108 zcmV-y0F(cC0V^p=O;s>7uwXDWFfcPQQAo?oNmWqRE2$`9_|7lz4g6KP$OxGc@o3 literal 0 HcmV?d00001 diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd b/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd new file mode 100644 index 0000000000000000000000000000000000000000..fc97712911748ce487ee2f7ffa6f4833a3cc9d6d GIT binary patch literal 45 zcmb)5VqnO?)HAVK6ZO0)>Lak_?8Uh5{R>*1SKOY~!>rOPGU|8*RYv3=|!yl|5O0N}?TYrBXkL;wH) literal 0 HcmV?d00001 diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca new file mode 100644 index 0000000000..78189a52f6 --- /dev/null +++ b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca @@ -0,0 +1 @@ +xAN0EYGB;a U=D9=&r}7ҌB^yY8:A X}RXks";uF9x EdВ%~**Z3\v9Й>n8fxk=[9K%L>{7s;av4hXOHԓՆ`K \ No newline at end of file diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 b/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 new file mode 100644 index 0000000000000000000000000000000000000000..0ea93376dcb1c114b81b06768e82bb507d9477e6 GIT binary patch literal 90 zcmV-g0HyzU0V^p=O;s>AVK6ZO0)>Lak_?9DGdKIKNMB&)%lp~hLN)33{Ld3w3=Is- wOiUDtGxO4OQgw4O^HTLnDoPl7>Y~!>rOPGU|8*RYv3=|!yl|5O0Ln2Q>HQWeB>(^b literal 0 HcmV?d00001 diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f b/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f new file mode 100644 index 0000000000000000000000000000000000000000..ab36311f6f3dc9a2d9f9bf894b34fd8b64dfffa1 GIT binary patch literal 108 zcmV-y0F(cC0V^p=O;s>7uwXDWFfcPQQAo?oNmWqME2$`9_|7lz4g6pDVg+ur*8o literal 0 HcmV?d00001 diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 b/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 new file mode 100644 index 0000000000000000000000000000000000000000..59afaebf4aec3790bab4cf98a2f72438ea5785e1 GIT binary patch literal 176 zcmV;h08jsT0gcW#BfDrkE8a@GP|~sy?T}sO!Q(lb3a#N>Fj1+;umQoH1hXT7#el60Ahi zQK*G@@~H|Pq^RS&ZMP2ZLp#Fh{uAfXOkdjm;7hBofD~y7$;S-O9=&(+`_1$}Y9{(q e?oEfm+Aa!T%{Ca;dH+z5jXTS+HrzM7a7&w&6)5VqnO?)H09Y~) A#{d8T literal 0 HcmV?d00001 diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 b/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 new file mode 100644 index 0000000000000000000000000000000000000000..ef73ed1791d5d093c18d99b89dcc126f024efd4d GIT binary patch literal 45 zcmb)5VqnO?)H?FBzU+=if$>##hObTh4FHUI B64n3! literal 0 HcmV?d00001 diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d b/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d new file mode 100644 index 0000000000000000000000000000000000000000..5515b07d4ab96b7655d5c080f7416496daaef3e8 GIT binary patch literal 175 zcmV;g08syU0gaA9ZUQk3MZ3-^yho}WXJ$gA3ULT}0LO7UkzlA21J^G_JwR7~^WM{! z>*dl6C`@nGRe@^VYhD6#!5Jk~LQRq>VnWU_#62yMGr4c>x*14HKKLh8NW4-MUt*j| zrR2ynPDP^BC9C6`t=A5pL%WBM+wUAlGktH{ozJZtz`yDfh6FqGh)!PLO#flcl$Jls dopcz~c2;;aTVYt|?Mp#c?kvyRa6e4UO8Y(EQJVk& literal 0 HcmV?d00001 diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 b/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 new file mode 100644 index 0000000000000000000000000000000000000000..2e15b4fb0a3915335f8dded678ddb7150d75b5b4 GIT binary patch literal 17 Ycmb