From 134f46c2743a868906b946ceb1a387bf5fc518f7 Mon Sep 17 00:00:00 2001 From: Tekaoh <45337851+Tekaoh@users.noreply.github.com> Date: Sun, 6 Oct 2019 20:48:21 -0500 Subject: [PATCH 1/2] Check for either escaped or unescaped wiki filenames + Gitea currently saves wiki pages with escaped filenames. + Wikis mirrored from other places like Github use unescaped filenames. + We need to be checking for filenames in either format to increase compatibility. --- routers/repo/wiki.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/routers/repo/wiki.go b/routers/repo/wiki.go index bf8ac658ae7c0..d1f838ca11392 100644 --- a/routers/repo/wiki.go +++ b/routers/repo/wiki.go @@ -8,6 +8,7 @@ package repo import ( "fmt" "io/ioutil" + "net/url" "path/filepath" "strings" @@ -65,11 +66,12 @@ type PageMeta struct { // findEntryForFile finds the tree entry for a target filepath. func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) { entries, err := commit.ListEntries() + unescapedTarget, _ := url.QueryUnescape(target) if err != nil { return nil, err } for _, entry := range entries { - if entry.IsRegular() && entry.Name() == target { + if entry.IsRegular() && (entry.Name() == target || entry.Name() == unescapedTarget) { return entry, nil } } From 46b351e37681c4bd93092da17db041a3f96c8b59 Mon Sep 17 00:00:00 2001 From: Tekaoh <45337851+Tekaoh@users.noreply.github.com> Date: Tue, 8 Oct 2019 17:34:47 -0500 Subject: [PATCH 2/2] Better logic for escaped and unescaped wiki filenames Co-Authored-By: null --- routers/repo/wiki.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/routers/repo/wiki.go b/routers/repo/wiki.go index d1f838ca11392..02fbe4a1ddad6 100644 --- a/routers/repo/wiki.go +++ b/routers/repo/wiki.go @@ -66,12 +66,22 @@ type PageMeta struct { // findEntryForFile finds the tree entry for a target filepath. func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) { entries, err := commit.ListEntries() - unescapedTarget, _ := url.QueryUnescape(target) if err != nil { return nil, err } + // The longest name should be checked first for _, entry := range entries { - if entry.IsRegular() && (entry.Name() == target || entry.Name() == unescapedTarget) { + if entry.IsRegular() && entry.Name() == target { + return entry, nil + } + } + // Then the unescaped, shortest alternative + var unescapedTarget string + if unescapedTarget, err = url.QueryUnescape(target); err != nil { + return nil, err + } + for _, entry := range entries { + if entry.IsRegular() && entry.Name() == unescapedTarget { return entry, nil } }