From 385c0db94fd46b79a7d68034e7a1f97e1ede767c Mon Sep 17 00:00:00 2001 From: Gusted Date: Mon, 25 May 2026 14:51:04 +0200 Subject: [PATCH] feat: fsck incoming objects (#12695) Weirdly, git doesn't verify the consistency of objects when receiving new objects. Enable that git verifies this, so we don't allow a repository to get in a weird or even corrupt state. We've already dealt with a few cases of inconsistent objects, the most notable one being mode of objects (forgejo/forgejo!9161). This can be risky, as such ignore 3 consistency checks that are not harmful to ignore and is battle tested by Gitlab. bad timezone: https://gitlab.com/gitlab-org/gitaly/-/commit/692a0d3476a5fe5832ec78df5a6d9d5e1d780364 missing space: https://gitlab.com/gitlab-org/gitaly/-/commit/2da0b393998d394b743c70e7cf9cd0757a8f2733 non-zero padded filemode: https://gitlab.com/gitlab-org/gitaly/-/commit/db8f2e8da5e7ff9cf84a99195481303016cd2138 Typically we set these settings in `modules/git/git.go`, but that means a instance administrator wouldn't be able to override it. Given we don't strictly require these settings to be set. A instance admin could choose to disable the consistency checks or override our set of ignores this would allow them to do so via the `[git.config]` section. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12695 Reviewed-by: Mathieu Fenniak Reviewed-by: elle <0xllx0@noreply.codeberg.org> --- modules/setting/git.go | 11 +++ modules/setting/git_test.go | 26 ++++++ routers/web/repo/wiki_test.go | 4 +- .../user2/repo1.wiki.git/description | 1 - .../user2/repo1.wiki.git/info/refs | 1 + .../0c/f15c3f66ec8384480ed9c3cf87c9e97fbb0ec3 | 2 - .../0d/ca5bd9b5d7ef937710e056f575e86c0184ba85 | Bin 820 -> 0 bytes .../2c/54faec6c45d31c1abfaecdab471eac6633738a | Bin 131 -> 0 bytes .../32/5dc4f8e9344e6668f21536a69d5f1d4ed53ca3 | Bin 63 -> 0 bytes .../42/3313fbd38093bb10d0c8387db9105409c6f196 | Bin 830 -> 0 bytes .../53/0ab3e043bf2295fd1cec3129bf203a4349597a | Bin 236 -> 0 bytes .../71/911bf48766c7181518c1070911019fbb00b1fc | 1 - .../72/fc6251cc648e914c10009d31431fa2e38b9a20 | Bin 94 -> 0 bytes .../74/d5a0d73db9b9ef7aa9978eb7a099b08f54d45e | Bin 53 -> 0 bytes .../7c/d7c8fa852973c72c66eb120a6677c54a8697f7 | Bin 95 -> 0 bytes .../89/43a1d5f93c00439d5ffc0f8e36f5d60abae46c | Bin 206 -> 0 bytes .../a6/dc41d9e96df65286a79f5625ec51635e47f752 | Bin 33 -> 0 bytes .../bf/29486462016efad8872371078932d8c2cb5253 | Bin 1075 -> 0 bytes .../c0/b5b381e2df9f66d11e8c95fe7467b8fb7f3e4e | Bin 1064 -> 0 bytes .../c1/0d10b7e655b3dab1f53176db57c8219a5488d6 | 2 - .../c4/b38c3e1395393f75bbbc2ed10c7eeb577d3b64 | Bin 189 -> 0 bytes .../d4/9ac742d44063dcf69d4e0afe725813b777dd89 | 1 - .../df/6b6d9a97608bc8b56d4f30cde5af00f0681ccf | Bin 262 -> 0 bytes .../e5/3d079e581fbfdea1075a54d5b621eab0090e52 | Bin 52 -> 0 bytes .../ea/82fc8777a24b07c26b3a4bf4e2742c03733eab | Bin 44 -> 0 bytes .../f5/05ec9b5c7a45a10259c1dda7f18434e5d55940 | Bin 157 -> 0 bytes .../f5/4f5a6b7c4f83b606600e43186165854f189530 | Bin 195 -> 0 bytes .../user2/repo1.wiki.git/objects/info/packs | 2 + ...bdfa327da7644d88ee8f092b02a7bb210d4.bitmap | Bin 0 -> 432 bytes ...d8abdfa327da7644d88ee8f092b02a7bb210d4.idx | Bin 0 -> 1576 bytes ...8abdfa327da7644d88ee8f092b02a7bb210d4.pack | Bin 0 -> 4208 bytes ...d8abdfa327da7644d88ee8f092b02a7bb210d4.rev | Bin 0 -> 124 bytes .../user2/repo1.wiki.git/packed-refs | 2 + .../user2/repo1.wiki.git/refs/heads/.gitkeep | 0 .../user2/repo1.wiki.git/refs/heads/master | 1 - tests/integration/api_wiki_test.go | 23 ------ tests/integration/git_test.go | 77 ++++++++++++++++++ tests/integration/xss_test.go | 27 ------ 38 files changed, 121 insertions(+), 60 deletions(-) delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/description create mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/info/refs delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/0c/f15c3f66ec8384480ed9c3cf87c9e97fbb0ec3 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/0d/ca5bd9b5d7ef937710e056f575e86c0184ba85 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/2c/54faec6c45d31c1abfaecdab471eac6633738a delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/32/5dc4f8e9344e6668f21536a69d5f1d4ed53ca3 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/42/3313fbd38093bb10d0c8387db9105409c6f196 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/53/0ab3e043bf2295fd1cec3129bf203a4349597a delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/71/911bf48766c7181518c1070911019fbb00b1fc delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/72/fc6251cc648e914c10009d31431fa2e38b9a20 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/74/d5a0d73db9b9ef7aa9978eb7a099b08f54d45e delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/7c/d7c8fa852973c72c66eb120a6677c54a8697f7 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/89/43a1d5f93c00439d5ffc0f8e36f5d60abae46c delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/a6/dc41d9e96df65286a79f5625ec51635e47f752 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/bf/29486462016efad8872371078932d8c2cb5253 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c0/b5b381e2df9f66d11e8c95fe7467b8fb7f3e4e delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c1/0d10b7e655b3dab1f53176db57c8219a5488d6 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c4/b38c3e1395393f75bbbc2ed10c7eeb577d3b64 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/d4/9ac742d44063dcf69d4e0afe725813b777dd89 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/df/6b6d9a97608bc8b56d4f30cde5af00f0681ccf delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/e5/3d079e581fbfdea1075a54d5b621eab0090e52 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/ea/82fc8777a24b07c26b3a4bf4e2742c03733eab delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/05ec9b5c7a45a10259c1dda7f18434e5d55940 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/4f5a6b7c4f83b606600e43186165854f189530 create mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/info/packs create mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.bitmap create mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.idx create mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.pack create mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.rev create mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/packed-refs create mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/.gitkeep delete mode 100644 tests/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master diff --git a/modules/setting/git.go b/modules/setting/git.go index 3dfec787bf..123ba515a7 100644 --- a/modules/setting/git.go +++ b/modules/setting/git.go @@ -95,6 +95,17 @@ func loadGitFrom(rootCfg ConfigProvider) { GitConfig.SetOption("core.logAllRefUpdates", "true") GitConfig.SetOption("gc.reflogExpire", "90") + GitConfig.SetOption("transfer.fsckObjects", "true") + // To ignore specific warnings they have to be set for all of the three + // scenarios. Per git-config(1): "To uniformly configure the same fsck + // settings in different circumstances, all three of them must be set to the + // same values." + for _, prefix := range []string{"fsck.", "fetch.fsck.", "receive.fsck."} { + GitConfig.SetOption(prefix+"badTimezone", "ignore") + GitConfig.SetOption(prefix+"missingSpaceBeforeDate", "ignore") + GitConfig.SetOption(prefix+"zeroPaddedFilemode", "ignore") + } + for _, key := range secGitConfig.Keys() { GitConfig.SetOption(key.Name(), key.String()) } diff --git a/modules/setting/git_test.go b/modules/setting/git_test.go index 7cbf1d70a3..e1cac8ff19 100644 --- a/modules/setting/git_test.go +++ b/modules/setting/git_test.go @@ -32,6 +32,32 @@ diff.algorithm = other require.NoError(t, err) loadGitFrom(cfg) assert.Equal(t, "other", GitConfig.Options["diff.algorithm"]) + + t.Run("Fsck options", func(t *testing.T) { + cfg, err := NewConfigProviderFromData(` +[git.config] +receive.fsckObjects = false +fetch.fsck.zeroPaddedFilemode = warn +fsck.missingSpaceBeforeDate = error +`) + require.NoError(t, err) + loadGitFrom(cfg) + assert.Equal(t, "false", GitConfig.Options["receive.fsckobjects"]) + assert.Equal(t, "true", GitConfig.Options["transfer.fsckobjects"]) + assert.NotContains(t, GitConfig.Options, "fetch.fsckobjects") + + assert.Equal(t, "ignore", GitConfig.Options["fsck.badtimezone"]) + assert.Equal(t, "error", GitConfig.Options["fsck.missingspacebeforedate"]) + assert.Equal(t, "ignore", GitConfig.Options["fsck.zeropaddedfilemode"]) + + assert.Equal(t, "ignore", GitConfig.Options["receive.fsck.badtimezone"]) + assert.Equal(t, "ignore", GitConfig.Options["receive.fsck.missingspacebeforedate"]) + assert.Equal(t, "ignore", GitConfig.Options["receive.fsck.zeropaddedfilemode"]) + + assert.Equal(t, "ignore", GitConfig.Options["fetch.fsck.badtimezone"]) + assert.Equal(t, "ignore", GitConfig.Options["fetch.fsck.missingspacebeforedate"]) + assert.Equal(t, "warn", GitConfig.Options["fetch.fsck.zeropaddedfilemode"]) + }) } func TestGitReflog(t *testing.T) { diff --git a/routers/web/repo/wiki_test.go b/routers/web/repo/wiki_test.go index 5709b32257..4a8195e04e 100644 --- a/routers/web/repo/wiki_test.go +++ b/routers/web/repo/wiki_test.go @@ -86,7 +86,7 @@ func TestWiki(t *testing.T) { Wiki(ctx) assert.Equal(t, http.StatusOK, ctx.Resp.Status()) assert.EqualValues(t, "Home", ctx.Data["Title"]) - assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"]) + assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"]) } func TestWikiPages(t *testing.T) { @@ -96,7 +96,7 @@ func TestWikiPages(t *testing.T) { contexttest.LoadRepo(t, ctx, 1) WikiPages(ctx) assert.Equal(t, http.StatusOK, ctx.Resp.Status()) - assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"]) + assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"]) } func TestNewWiki(t *testing.T) { diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/description b/tests/gitea-repositories-meta/user2/repo1.wiki.git/description deleted file mode 100644 index 498b267a8c..0000000000 --- a/tests/gitea-repositories-meta/user2/repo1.wiki.git/description +++ /dev/null @@ -1 +0,0 @@ -Unnamed repository; edit this file 'description' to name the repository. diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/info/refs b/tests/gitea-repositories-meta/user2/repo1.wiki.git/info/refs new file mode 100644 index 0000000000..a06031a5e0 --- /dev/null +++ b/tests/gitea-repositories-meta/user2/repo1.wiki.git/info/refs @@ -0,0 +1 @@ +d49ac742d44063dcf69d4e0afe725813b777dd89 refs/heads/master diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/0c/f15c3f66ec8384480ed9c3cf87c9e97fbb0ec3 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/0c/f15c3f66ec8384480ed9c3cf87c9e97fbb0ec3 deleted file mode 100644 index c0314c5584..0000000000 --- a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/0c/f15c3f66ec8384480ed9c3cf87c9e97fbb0ec3 +++ /dev/null @@ -1,2 +0,0 @@ -x­ŽÑmÄ DóMÛÀY¬Í�¢(ùJ©`�5ÇÉœ-›K*Ki,Hi!?£Ñ<éiâVki0ZÿÔXH“D(Z6ĨGòSb» 3“JDÞhµó!÷uB¬ÌDaJp¡ íœÙèFôLƹ4+~´ëvÀ;‡£È -eýäžõç[Nx>KÝäÎü‡_så²q«/€]09MHpѤµêk¿Üä_dê-%¸í’‡Ûž�ï vÎ_¥]¡Ô^Õ/èI[t \ No newline at end of file diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/0d/ca5bd9b5d7ef937710e056f575e86c0184ba85 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/0d/ca5bd9b5d7ef937710e056f575e86c0184ba85 deleted file mode 100644 index a46c1925ece0ae2f91ef1421487c87707a484509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 820 zcmV-41Izq)0gaPM&!a{dgmdOs^c^KMZZ=DqQJTdV8=B2{yRq*!X0zef&o>k0mc!Jc zRI1V|y_Y9`wrx2A77D^2W1pr#+Hxpl6F%Fb7(xzhzhV}{OiGcE@reM#C`>sarn<0C zA0yy42(c)O5+uPbiXs*!FqV)cCefCKJO{V2kg;2V3a7Dn_CVk{1pfZ%|2(6#Z>RFF zB>fIpVIzp_W-ADQh8qZ}_}61&`ui7omk(tQ{`@If(+vU~-2uL#6MPCh?N?6$3Y4y~ z${5QE#>uYKv@uh>i%iZZ)s)%$Ls{;V!s9_n1#X91m3?tHtmL)(Ur&LrWjtVpwv+HR zwHRSxZ!PY2!^qlus*oOMufW(%>vimT$spRm@9o~r&g`kT?o%;PpwaEMTi;ox?%>Ql zwcTsiXknR=s;Hqi(B}C*?yC9xvEDjy%(1H`E$&SV>K8k?H5&?CDi({4Qi`y^tXXoW z>d*!IE<2PGQR8w#rZamr9*5ha)q}3;RVOL)^7oi+?1#ySRkp$;lr@-6wUWteeI(O8=rzh?X(LP<| zD%Iw%LxqQrYTcyBy9&dM#_ch0_ng-hXG^N|-<{%{( zj&{#>p9eur%jqU_Tb?j$2q|6G$>Mv(%1}UH&YHEK_OmrE{Bv)%E-gPv=0Hrxm&jO- zagKMnvoc=R%~|NUxg|=pe+g6LuDNtifvKINKvJl^Sth#Yr%N4} yiLRDvvqX)ps6oPgqrkU*I^C&%nbC;)f5cE>l7Q)v4sqC}3CPMOrG5Z%Nltm)tb(<7K^dJbnV$*EfpxZ!+|F`-Ck28mvp_t_g z6uMnqRYCcX(D%xL#yBPwLeIj-#Ib8hB_j5y+&X#JxvX%jvn=o^y5tE?`lb5((Pc8p luVyHA24W)59({m421K{nZCmy4fV-vy_hQ;uav#L=JhPa@LgD}b diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/32/5dc4f8e9344e6668f21536a69d5f1d4ed53ca3 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/32/5dc4f8e9344e6668f21536a69d5f1d4ed53ca3 deleted file mode 100644 index d52aa8e1ff18454d3079d249bfb7900779fff7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63 zcmV-F0Korv0ZYosPf{?kWKdQJNK8*v2+u6ZQ1HwJGP$@Equn!0QWF(?^3(HUHT3k0 V63g|o3R2VcvI^2Qxd87p5qfeO9YO#A diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/42/3313fbd38093bb10d0c8387db9105409c6f196 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/42/3313fbd38093bb10d0c8387db9105409c6f196 deleted file mode 100644 index bf4ae859f6d05b74726565e3269517d32a6fd1aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@w0iBb{4y#5GMYHBBdXExD8<6s%fX!qZ493{t9dtMIWCk;Q{c{p!msM(U zRXVDYN>_DZTi5vr7+Ms68GDQYb89M zZ|dKi00hWgb5mqlImj~7a#fw`m`x-|L9GbX(K2TtIq9tRfqbjU6+iiHD<9I*{g)G8 z=enUuDe>^SYAf&KIW=I`ltB|F6nu&btD;rwk`xzxChes)B41oA-cFvONDJyu1fZDX z^$9n44<3WDj;Vdq8H(OAwTP$pedOjnHrHGpHq(`3j(=WQv`KXlC>O1DwD&}S2Z<(2 zkjX;RTaL+c&tR0+`?y79cm2QST(~azM7+#vyZUUcmrMP;fX%UcPy?l}^mnoh;;T{8GMZQTy66N@^7*ZPGxNq6oKw$6l8dwsB};kv2a!>es-nT7_NWd_p8DBR<@j-h#U-NRf1=s_XIeYx8p#C{rQ?#?>jXv zr&r#aN&tf)z(MYnw12TtW4hyn{j?3&{7{s0dF87p@26fNfN(6r&pI0;yXh&SE%ifb zg=EhAcA-;5jY?mgpFYi18+*2yk9@igPUm{NJ1S>kf4mbweb5%lyYIL14r|zCn2?T~ zAjfCzo5MFo({F(&P(rWzqL-DV`)Yp>;76xy2Jug3RQvc}i6J6{z%a#KG-e>LqZALs IPp$}Hf}ajosIgVpWV^hil!%=>ktUAd6G)9A*b(?P*dbs#0W;h7~Fx}LdE)kd*L ze!MjCOUw8qYPM`{ysY0(w=r)LR8`)JEtJy{M`&2{{R5YC2$`_g?3v2 diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/71/911bf48766c7181518c1070911019fbb00b1fc b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/71/911bf48766c7181518c1070911019fbb00b1fc deleted file mode 100644 index 84ade81980..0000000000 --- a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/71/911bf48766c7181518c1070911019fbb00b1fc +++ /dev/null @@ -1 +0,0 @@ -xÆM‚@ †á¯MÛ àºré›°6ñœ&&&¬ü9LežÅ›w½Ý×åt<#ÞñÃÍ¡ªmv-·•0w¬b¦¢jyÌ–†¤Ú—~Ý‹[žæÉçý=HÄ ÷.¾"à‚íµÄçÇ�= \ No newline at end of file diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/72/fc6251cc648e914c10009d31431fa2e38b9a20 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/72/fc6251cc648e914c10009d31431fa2e38b9a20 deleted file mode 100644 index 052fdf35a5187b8394a864cdfc77302a393de45e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94 zcmV-k0HObQ0ZYosPg1b7U{F>FNK8*v2+u6ZPzWwaOioQv@Jq~1<>Cs-$ShU>qC|xP zkb-iMf<%Qppd5r<3{qUIpi!QYnVbO>%E?hkN>wOIEyw{I0#>iCtFFlf03OpKVH4IR AzyJUM diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/74/d5a0d73db9b9ef7aa9978eb7a099b08f54d45e b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/74/d5a0d73db9b9ef7aa9978eb7a099b08f54d45e deleted file mode 100644 index bcb0e0075c7f18769b25eb9bb639e743e9565f51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53 zcmV-50LuS(0V^p=O;s>9V=y!@Ff%bx$SO!p*UKtMXDFN~{iQwaxP++0L3U0-#`(J$ LHvRzsDiRKo_5~D3 diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/7c/d7c8fa852973c72c66eb120a6677c54a8697f7 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/7c/d7c8fa852973c72c66eb120a6677c54a8697f7 deleted file mode 100644 index 9c264956058d3ff89dbc06f2827f281603892050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmV-l0HFVP0V^p=O;xZkXD~D{Ff%bx@W{_i)yqv`c-8c$y?l{3`=M+r?=O!^beN0n zRzsBpB&Mh8hG&*!=mr-gCa0$8`Xxg26#YpGJd@Hl(MNz`uA#I1qQ~8{6aX>eB7Gjp BEph+= diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/89/43a1d5f93c00439d5ffc0f8e36f5d60abae46c b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/89/43a1d5f93c00439d5ffc0f8e36f5d60abae46c deleted file mode 100644 index 062641bee7da16a4831be6464c6f1373f097cb40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmV;<05Sh~0V^p=O;s>5F=sF|FfcPQQSivmP1VayVR+T_r@efUH~XP%EAKClN_3cu z?N&pT1SF=X>V{{QWaxV40+}GyMzKeJyfpDk%lIT}wrp;^tlw3e#TcrC3lfu4Q*`|j zAvP5KNeVoZ(l^mZfMKqov;3mR-Ln*+dP4J3i<1)zQd1P%GIMY`$HV{#6f!|>C}t?R zy5PF)&Ykb8R!;BRzF_8t{*WtiP}8ysQq%Ra3ep)0CrW>5PdhFlDshmVQ;>1~ZibD2 I03Qiqbs5QEzyJUM diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/a6/dc41d9e96df65286a79f5625ec51635e47f752 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/a6/dc41d9e96df65286a79f5625ec51635e47f752 deleted file mode 100644 index 1aecac1f1b5c4bb92c58e2b2e2177cb51d8fc9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33 pcmb6S!Rv8vd!k2C%F)6buO_(Wf0c+v|$<#ziTldPm$t}89k$3$5R@has`E`}_w zNU4c<(M_{cTokWmqF<}#^DG5;7iw?UlxwCf z<|;|Z>$7^E=#Nk&E$BrG?t00U7p4dL$;6HrUyo+Dq^ms{@NIQE*F4ehH9H~vTYv*K zQA~waz0)rKJV!~bv^*Z_)UZjN=r6!A2xzetu?yB~mUWY4RP5X^)Ix6ty<`2x6|YgM zC86n}!Rb;1uJNW4?)Kb+odP^gy;TMRtp#DYJWmq z17w8|?q~DBx5ZQ#y1&zCWE6!>1(W+0)2ts{>S0#{WyUrAP@8j~Ab5amc1~&(n~^d< zwEzk%JJ20=Y%1gA>fLDGqpxMdYp|6$>y)sDiGHbx=Vl}8wrI1S@os)y`5BlBJY;j& zs^1k_A0PBlT*|>)9&tgu6=;?Ud{dNibQ&RQBoJ7{>v%6FSQSTxGwZA{M$9FFKKl$d zl&!=}uL{+$L_lmlLQAGXdM4g=!Rev#ttK>VxpZQK`Nt)B!g-gAM^xQzFYg@(_wE)q zbM*)Ut{D2bj!5!?kg#-V#i803ix|_o#s!|U!5q{hkPx(e^h4JLw+jp{^pN^g3}WcC zOYor8OeYR_Ga>6S3_LT;d!T~L5=%DjEZ{~hb5c-jfg^kmo1@cX8w>@bqiEfthZZo0 zRRxgR;;}ZAj4RqCZO}L_Y;JE~dind-xx_)4ID7WVhG6EuBY`jRf6R%NjVR%gI z>f(%z_B>*_OEbsC@{UGe9`HVdX}7p7gTn~eC(Zmv&h+(JJqG1eu0_;!fE|LghnXcs`6=JMs8Z;xX{I6PQ>4HQ$5)9MBVLGdyq8`&_sQR)dQV9Kh ze<#&KGr}p@(uF2$p?shn!Z!cH_O{RuO^@FQWY3w=`)J3SzhD9Y+G}cmCq3AycMIZ| titP+Fy<4zI!T&c3x`aE=O$P0!&e-p#;13fRe}}wnlZ*v&`wtf$X*!0Y2bBN- diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c0/b5b381e2df9f66d11e8c95fe7467b8fb7f3e4e b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c0/b5b381e2df9f66d11e8c95fe7467b8fb7f3e4e deleted file mode 100644 index 0474927fd24d33ed559b6039277d6b3a5e125814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1064 zcmV+@1lRj`0ku}m&f_)=>^V=t2MB!F0=+M`El{9aY*AqEw9MpVAxr-BW9;L1D9Lud z2k0q?Ba58j%rLW$GkyB`mrp)9@tm zS|<9nYCg|WkoPJSH2aA@OArnelT%tbXTH-Ky~lA~NOGZecTKrw+G4JfguFhh=ZXFZ zMbd&^q~KjIx$?sFKtGw-5##64?3Q%3D+7M5PUo5@`n_f+gs%lSP!q*eXw^II;?HxG z)Jn_ap-v5()QSEE9D{%sTM>J~dd;$Kl8lO-8-`lw-Jo}@U%BEoO0^_3T{JjdYQSr} zsf4>-_h6?0k5liJ0nCd&B%lmP{Hq2Bq5^{gAhA2qO(!0w%XGW7Bc3rPP{MXZ!L}nn za2QFu#CxVqycf{ZP_Wmd*oudBo#?lssD4}&tgsz1%15{4C1O-3>jRVrouCVZ01mr4 z2H6o#^p9Yu^#yv+`E8;>Ory&6S;s|VKObVaFm~BZ^zDr^FrXCEzcrWGV6L6uholaK zHqTBH7s4P=w+U~kk)5k+hV%}UP;t$7vT_Gq)SgZBU3XqlYxFigx(qK_Z%K-Rz1!{c zV04GL0~btl*TN<)43ZuR#!!smy7&^#6SDF;OX`UB>bF|BNLTw4>KY&`gm6Eb2fi() z!qEMlMkAvrY$}-C*O+Gg;8G8}8YnZa>4(~!`vk!QWV3Tpqu7j;`Kbj^VA+B0uwzph zCs*%A^B#RI8*YQG%vq;|HB9uSCZ3y(tlOf^dd9o?b>(MZD)5laVXJ;uXnj2BqqvlV zyFB88cq`B>75Jto<>)j*)JPz(h}&^rOt31B3}@C^VT_nd0)6%jHk7TzOm7O+utY#? zK0-^TLV70Nb;0SO@vSB_Y`Jt|gZalx@`Up)7mujA-M+m#4({D8ZszI{1Y9xn@j4>O z3qr!ur4@&2TP$Ks>lzn$&IWT(k3d4u_R$Yr7rb3yXrYJHr(zI8r(J>vt!6rLz?%v2 zj$z=MVcr83T$Wg}ac2QHYMGOQVhbGMd)OSE9@}6j7#&6H7Cp3pIjky(L}0&ORKvcB#GSc+}!$Y|}caRYf`C{Wmx}A89atp&_T2~imY_#hU%Uzl| zE|zyR0`q|PAxyi)Z5bR!z&>f_KXRt8&+0KKr*bW#t^@24q&>`p@tr9)f~74yi-2o& zJkTLFtE>=XJ=35WdF3B!p`{BF=}0h44~OZjeu{cbm!ay*nn)q^_x(kxg=U0Pu%!!4 z*h2Y0JA`fih3##jADSNj5y-AHqxaE{HGjbb0JPWC{vtitsdo$Fmx}ESHN7lYq~QM> i1zp0O=O%;pS7+?^Q}BlgjK4$Pwn@eUx%~%4bY-%3Q4Lf8 diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c1/0d10b7e655b3dab1f53176db57c8219a5488d6 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c1/0d10b7e655b3dab1f53176db57c8219a5488d6 deleted file mode 100644 index 8a6345dfa5..0000000000 --- a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c1/0d10b7e655b3dab1f53176db57c8219a5488d6 +++ /dev/null @@ -1,2 +0,0 @@ -x­ŽÝmÃ0ƒû¬)n�ú±t2íSèçÓÙ`ņ¥¶“e‚,VY¡/Hâ#È[)¹�EûÒ@NÈq¦è툎Ñr2«)DöÅ0âŒj§C®ìÑLÂ�ŸœaCÓÃ&š4B�v]$Eßí²ðIÓ‘e…¯¼þP×r¿I…sÍe“zªË³~_ -åõÄ[yã‡è¢v£�WíµV=í—›ü˘úH vZ~s»@݉%Á•Ѝ?TÊZH \ No newline at end of file diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c4/b38c3e1395393f75bbbc2ed10c7eeb577d3b64 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/c4/b38c3e1395393f75bbbc2ed10c7eeb577d3b64 deleted file mode 100644 index 6dcfc9667644d517a48b0b24e3c975afe97bb4cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmV;u07CzG0V^p=O;s>5Fk&z?FfcPQQSivmP1VayVR+T_r@efUH~XP%EAKClN_3cu z?N&pT1SF=X>V{{QWaxV40+}GyMzKeJyfpDk%lIT}wrp;^tlw3e#TcrC3lfu4Q*`|j zAvP5KNeVoZ(l^mZfMKqov;3mR-Ln)-41ho(6J%^LL&?éHç˺¶­5˜6}§¥€3”)Sh²´0 —9ÍTƨáž;2i2Óå®-É^j§óLò4wSžÛªp™mSTÈ­‚Û\9V†Ô1Sép"�ºê¸Õ¼|ùùëÇ“„�î.Z>É법us™uíG 63˜…¥ð)"9ÓóG­Þ¶.÷å¡.áâO¦ž¬ ò#XþJ$›ØûË ¨?o<1½_Š)nƒ/±~æá6¹ëÕcS­ûl<ÔXŽiÒ–b3{@Ÿ÷B,g±øÏ ” ¯‘ÛËK|½ÆEÐ[ß0\ïƒÉ�aWñÝ¢Ræ|¤øi{º¹žxd… �ÃÉßô9<ÐÙÒ�šg>»¨Š KOvÉ"D§J„sEàêØœzòÏÆ[Í_s!2Ï¡év%ìe©Èo(½” \ No newline at end of file diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/df/6b6d9a97608bc8b56d4f30cde5af00f0681ccf b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/df/6b6d9a97608bc8b56d4f30cde5af00f0681ccf deleted file mode 100644 index 3927778ddfd4feb4d2a0d6b1e068c42ad5b6fcb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmV+h0r~!T0V^p=O;s>9GGs6`FfcPQQSivmP1VayVR+T_r@efUH~XP%EAKClN_3cu z?N&pT_~hrM>josIgVpWV^hil!%=>ktUAd6G)9A*b(?P*dbs#0W;h7~Fx}LdE)kd*L ze!MjCOUw8qYPM`{ysY0OAf2IbqV$*cwBr(@5(n8i1sUh> MX4v=#0GNJ$Z}5_Y{r~^~ diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/e5/3d079e581fbfdea1075a54d5b621eab0090e52 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/e5/3d079e581fbfdea1075a54d5b621eab0090e52 deleted file mode 100644 index ecdea7f6946e39426869f3ac54b8c6f182c1a04e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52 zcmV-40L%Y)0V^p=O;s>9WiT`_Ff%bx@W{_i)yqv`c-8c$y?l{3`=M+r?=O!^beN0n KRs#SwJ`eFJzZQf5 diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/ea/82fc8777a24b07c26b3a4bf4e2742c03733eab b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/ea/82fc8777a24b07c26b3a4bf4e2742c03733eab deleted file mode 100644 index 42a8258dbd4ba8d23de0ee6f2f773f32dc6f6aeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 zcmbJNEy0I1>; ACjbBd diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/05ec9b5c7a45a10259c1dda7f18434e5d55940 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/05ec9b5c7a45a10259c1dda7f18434e5d55940 deleted file mode 100644 index eaeadaeaeed58b613a4e57382398712273e1fbfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmV;O0Al}m0V^p=O;s>7vt%$dFfcPQQSivmP1VayVR+T_r@efUH~XP%EAKClN_3cu z?N&pT1SF=X>V{{QWaxV40+}GyMzKeJyfpDk%lIT}wrp;^tlw3e#TcrC3lfu4Q*`|j zAvP5KNeVoZ(l^mZfMKqov;3mR-Ln*+da?>q)Ah0n(isXTN`GljJ1!wAagd!;ka7NQ LhK+v!Aca6I!9qzZ diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/4f5a6b7c4f83b606600e43186165854f189530 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/4f5a6b7c4f83b606600e43186165854f189530 deleted file mode 100644 index a69fc579963ab58a63ad9706a917237d556f3540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmV;!06hPA0kx02PQySD0IB^IOPYX?U~Ql8A&f;wNs$K1_3j?AbdIg_C4#>P!8b7V zNTcCpo~Hs$2v;Smf`WuZplyYt z4Pq22s%tu5x1)1T#D|K`<+x;cId4U!-#AZe0Zz1SPdmL#X*W>PTyFNSM>s9l``gF< x;m;bNzfhXwSwCrBlin}+V}RPBwOwcs;SPVO`1hpfe>SRj`hvH^;Ty%~V015GVL<=@ diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/info/packs b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/info/packs new file mode 100644 index 0000000000..e8c040e505 --- /dev/null +++ b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/info/packs @@ -0,0 +1,2 @@ +P pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.pack + diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.bitmap b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.bitmap new file mode 100644 index 0000000000000000000000000000000000000000..0aad4bc1453ead9db7e31d60d303739c26af75c5 GIT binary patch literal 432 zcmZ?r4Dn@PWME}rU|_p*WA**T>bJ^VZuGtQFlmEU^(KKUAaNjOf?^;A2KG=|2uP#K zF~4wt%JE{zF^D%nV)1%$$) zV%iR<3LY?xMFq}u5s`Sm8p^|FlA{&il&J zyfM_=uVCfu8Cg|0QTj`J+Hna{iG%E%f{gQbGi>}*^d~9sOiJHG9|4BBhR*Vf9(T`D zD7m`ey6w)L@2gf$@7um$=7#=|D{(c~PyA}tEIzK2_F9N5t^BB0+w||9&I_;pv|(_b z8~=yD&+O|pu3b-Z_G@~iBr)dwy3wv&$lhsmC4zS_Xa7xb#>PkZ?yZ}vmkR^DG8mFO@R+pYe}`et@amFq&L$b)y6e{3;% zdNtDF{$|C~@@WEl8&}TIW#4ox>}IW-UZPFcrpP7g@+*_(A26&fRp}LZ%KZFU|>JZz`&RX%;J{7WV#Vpv2px9g>&3xy^>idh;Z+=zH;D(gv;S cO#)Zi^MV#~JI|{7R}|J88=bRIyhrmY0C@iZbN~PV literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.pack b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.pack new file mode 100644 index 0000000000000000000000000000000000000000..ab624246bf42ea3944814144d4c27600cdc521a9 GIT binary patch literal 4208 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 literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.rev b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/pack/pack-dcd8abdfa327da7644d88ee8f092b02a7bb210d4.rev new file mode 100644 index 0000000000000000000000000000000000000000..14fa6a1e0beb9d203d974a24416a2e73bb242a9c GIT binary patch literal 124 zcmWIYbctYKU|@t|J}Ausq(OiOh?#(x6^I3Zm>Yalert('Oh no!');", - Email: "valid@example.org", - }, - Date: "2024-01-31T00:00:00Z", - }, - Committer: &api.CommitUser{ - Identity: api.Identity{ - Name: "Gusted", - Email: "valid@example.org", - }, - Date: "2024-01-31T00:00:00Z", - }, - Message: "Yay XSS", - }, - }, } assert.Equal(t, dummymeta, meta) diff --git a/tests/integration/git_test.go b/tests/integration/git_test.go index 83853883c1..40ca4d7539 100644 --- a/tests/integration/git_test.go +++ b/tests/integration/git_test.go @@ -121,6 +121,7 @@ func testGit(t *testing.T, u *url.URL) { t.Run("PushForkRemoteMessages", doTestForkPushMessages(httpContext, dstPath)) t.Run("CreateAgitFlowPull", doCreateAgitFlowPull(dstPath, &httpContext, "test/head")) t.Run("InternalReferences", doInternalReferences(&httpContext, dstPath)) + t.Run("FsckConsistencyChecks", doFsckConsistencyChecks(dstPath)) t.Run("BranchProtect", doBranchProtect(&httpContext, dstPath)) t.Run("AutoMerge", doAutoPRMerge(&httpContext, dstPath)) t.Run("CreatePRAndSetManuallyMerged", doCreatePRAndSetManuallyMerged(httpContext, httpContext, dstPath, "master", "test-manually-merge")) @@ -170,6 +171,7 @@ func testGit(t *testing.T, u *url.URL) { t.Run("PushForkRemoteMessages", doTestForkPushMessages(sshContext, dstPath)) t.Run("CreateAgitFlowPull", doCreateAgitFlowPull(dstPath, &sshContext, "test/head2")) t.Run("InternalReferences", doInternalReferences(&sshContext, dstPath)) + t.Run("FsckConsistencyChecks", doFsckConsistencyChecks(dstPath)) t.Run("BranchProtect", doBranchProtect(&sshContext, dstPath)) t.Run("MergeFork", func(t *testing.T) { defer tests.PrintCurrentTest(t)() @@ -1337,3 +1339,78 @@ func TestCloneAccessTokenResources(t *testing.T) { }) }) } + +func doFsckConsistencyChecks(dstPath string) func(t *testing.T) { + return func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + tree, _, err := git.NewCommand(git.DefaultContext, "rev-parse", "HEAD^{tree}").RunStdString(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) + head, _, err := git.NewCommand(git.DefaultContext, "rev-parse", "HEAD^{commit}").RunStdString(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) + + // Is checked for and should error. + t.Run("badName", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + var buf bytes.Buffer + buf.WriteString("tree ") + buf.WriteString(tree) + buf.WriteString("parent ") + buf.WriteString(head) + buf.WriteString("author @>\n") + buf.WriteString("committer @>\n") + buf.WriteString("\n") + + commitID, _, err := git.NewCommand(git.DefaultContext, "hash-object", "-t", "commit", "--literally", "--stdin", "-w").RunStdString(&git.RunOpts{Dir: dstPath, Stdin: &buf}) + require.NoError(t, err) + commitID = strings.TrimSpace(commitID) + + _, stdErr, gitErr := git.NewCommand(git.DefaultContext, "push", "origin").AddDynamicArguments(commitID + ":refs/heads/consistency-check").RunStdString(&git.RunOpts{Dir: dstPath}) + require.Error(t, gitErr) + assert.Contains(t, stdErr, "badName: invalid author/committer line - bad name") + }) + + t.Run("missingSpaceBeforeEmail", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + var buf bytes.Buffer + buf.WriteString("tree ") + buf.WriteString(tree) + buf.WriteString("parent ") + buf.WriteString(head) + buf.WriteString(`author Gusted 1706659200 +0000`) + buf.WriteRune('\n') + buf.WriteString(`committer Gusted 1706659200 +0000`) + buf.WriteString("\n\n") + + commitID, _, err := git.NewCommand(git.DefaultContext, "hash-object", "-t", "commit", "--literally", "--stdin", "-w").RunStdString(&git.RunOpts{Dir: dstPath, Stdin: &buf}) + require.NoError(t, err) + commitID = strings.TrimSpace(commitID) + + _, stdErr, gitErr := git.NewCommand(git.DefaultContext, "push", "origin").AddDynamicArguments(commitID + ":refs/heads/consistency-check").RunStdString(&git.RunOpts{Dir: dstPath}) + require.Error(t, gitErr) + assert.Contains(t, stdErr, "missingSpaceBeforeEmail: invalid author/committer line - missing space before email") + }) + + // Is set to be ignored. + t.Run("badTimezone", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + var buf bytes.Buffer + buf.WriteString("tree ") + buf.WriteString(tree) + buf.WriteString("parent ") + buf.WriteString(head) + buf.WriteString("author name 1234 +\n") + buf.WriteString("committer name 1234 +\n") + buf.WriteString("\n") + + commitID, _, err := git.NewCommand(git.DefaultContext, "hash-object", "-t", "commit", "--literally", "--stdin", "-w").RunStdString(&git.RunOpts{Dir: dstPath, Stdin: &buf}) + require.NoError(t, err) + commitID = strings.TrimSpace(commitID) + + require.NoError(t, git.NewCommand(git.DefaultContext, "push", "origin").AddDynamicArguments(commitID+":refs/heads/consistency-check").Run(&git.RunOpts{Dir: dstPath})) + }) + } +} diff --git a/tests/integration/xss_test.go b/tests/integration/xss_test.go index 4eb7bc65b1..0b1ba43e02 100644 --- a/tests/integration/xss_test.go +++ b/tests/integration/xss_test.go @@ -39,33 +39,6 @@ func TestXSSUserFullName(t *testing.T) { ) } -func TestXSSWikiLastCommitInfo(t *testing.T) { - defer tests.PrepareTestEnv(t)() - // Check on page view. - t.Run("Page view", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, http.MethodGet, "/user2/repo1/wiki/XSS") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - htmlDoc.AssertElement(t, "script.evil", false) - assert.Contains(t, htmlDoc.Find(".ui.sub.header").Text(), `Gusted edited this page 2024-01-31`) - }) - - // Check on revisions page. - t.Run("Revision page", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, http.MethodGet, "/user2/repo1/wiki/XSS?action=_revision") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - htmlDoc.AssertElement(t, "script.evil", false) - assert.Contains(t, htmlDoc.Find(".ui.sub.header").Text(), `Gusted edited this page 2024-01-31`) - }) -} - func TestXSSReviewDismissed(t *testing.T) { defer unittest.OverrideFixtures("tests/integration/fixtures/TestXSSReviewDismissed")() defer tests.PrepareTestEnv(t)()