From 1e10f6f725189a371a923a329084f1c3f608ae38 Mon Sep 17 00:00:00 2001 From: Mohammed Al Sahaf Date: Tue, 23 Nov 2021 11:13:09 +0300 Subject: fileserver: browse: do not encode the paths in breadcrumbs and page title (#4410) --- modules/caddyhttp/fileserver/browsetplcontext.go | 9 ++++++--- modules/caddyhttp/fileserver/browsetplcontext_test.go | 13 +++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) (limited to 'modules') diff --git a/modules/caddyhttp/fileserver/browsetplcontext.go b/modules/caddyhttp/fileserver/browsetplcontext.go index 2c57e52..b1b8e9e 100644 --- a/modules/caddyhttp/fileserver/browsetplcontext.go +++ b/modules/caddyhttp/fileserver/browsetplcontext.go @@ -77,9 +77,9 @@ func (fsrv *FileServer) directoryListing(files []os.FileInfo, canGoUp bool, root Mode: f.Mode(), }) } - + name, _ := url.PathUnescape(urlPath) return browseTemplateContext{ - Name: path.Base(urlPath), + Name: path.Base(name), Path: urlPath, CanGoUp: canGoUp, Items: fileInfos, @@ -133,13 +133,16 @@ func (l browseTemplateContext) Breadcrumbs() []crumb { if lpath[len(lpath)-1] == '/' { lpath = lpath[:len(lpath)-1] } - parts := strings.Split(lpath, "/") result := make([]crumb, len(parts)) for i, p := range parts { if i == 0 && p == "" { p = "/" } + // the directory name could include an encoded slash in its path, + // so the item name should be unescaped in the loop rather than unescaping the + // entire path outside the loop. + p, _ = url.PathUnescape(p) lnk := strings.Repeat("../", len(parts)-i-1) result[i] = crumb{Link: lnk, Text: p} } diff --git a/modules/caddyhttp/fileserver/browsetplcontext_test.go b/modules/caddyhttp/fileserver/browsetplcontext_test.go index 01e6c8f..9f0d08e 100644 --- a/modules/caddyhttp/fileserver/browsetplcontext_test.go +++ b/modules/caddyhttp/fileserver/browsetplcontext_test.go @@ -36,6 +36,19 @@ func TestBreadcrumbs(t *testing.T) { {Link: "../", Text: "quux"}, {Link: "", Text: "corge"}, }}, + {"/مجلد/", []crumb{ + {Link: "../", Text: "/"}, + {Link: "", Text: "مجلد"}, + }}, + {"/مجلد-1/مجلد-2", []crumb{ + {Link: "../../", Text: "/"}, + {Link: "../", Text: "مجلد-1"}, + {Link: "", Text: "مجلد-2"}, + }}, + {"/مجلد%2F1", []crumb{ + {Link: "../", Text: "/"}, + {Link: "", Text: "مجلد/1"}, + }}, } for _, d := range testdata { -- cgit v1.2.3