From d72bc5c6354e2605e360fdd6e51e21a4c15cee0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=83=E7=9F=B3?= Date: Sat, 16 Aug 2025 14:50:03 +0800 Subject: [PATCH] fix: resolve webdav handshake error in permission checks - Updated role permission logic to handle bidirectional subpaths, fixing handshake termination by remote host due to path mismatch. - Refactored function naming for consistency and clarity. - Enhanced filtering of objects based on user permissions. - Modified `makePropstatResponse` to preserve encoded href paths. - Added test for `makePropstatResponse` to ensure href encoding. --- server/webdav/makepropstatresponse_test.go | 33 ++++++++++++++++++++++ server/webdav/webdav.go | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 server/webdav/makepropstatresponse_test.go diff --git a/server/webdav/makepropstatresponse_test.go b/server/webdav/makepropstatresponse_test.go new file mode 100644 index 00000000..9f72b234 --- /dev/null +++ b/server/webdav/makepropstatresponse_test.go @@ -0,0 +1,33 @@ +package webdav + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/alist-org/alist/v3/pkg/utils" +) + +func TestMakePropstatResponseKeepsEncodedHref(t *testing.T) { + // Non-ASCII directory path + dir := "/测试" + href := utils.EncodePath(dir, true) + ps := []Propstat{{Status: http.StatusOK}} + + rec := httptest.NewRecorder() + mw := multistatusWriter{w: rec} + if err := mw.write(makePropstatResponse(href, ps)); err != nil { + t.Fatalf("write: %v", err) + } + if err := mw.close(); err != nil { + t.Fatalf("close: %v", err) + } + if rec.Code != StatusMulti { + t.Fatalf("status = %d, want %d", rec.Code, StatusMulti) + } + body := rec.Body.String() + if !strings.Contains(body, ""+href+"") { + t.Fatalf("href not preserved: got body %q", body) + } +} diff --git a/server/webdav/webdav.go b/server/webdav/webdav.go index dde73559..93211e8a 100644 --- a/server/webdav/webdav.go +++ b/server/webdav/webdav.go @@ -833,7 +833,7 @@ func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (statu func makePropstatResponse(href string, pstats []Propstat) *response { resp := response{ - Href: []string{(&url.URL{Path: href}).EscapedPath()}, + Href: []string{href}, Propstat: make([]propstat, 0, len(pstats)), } for _, p := range pstats {