From 87062437b66f96e528ee5d2acaefd3259f7b1f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krystian=20Chachu=C5=82a?= Date: Mon, 7 Jul 2025 23:33:56 +0200 Subject: [PATCH] webdav: return multistatus with 403 on PROPPATCH This fixes a "The file cannot be accessed by the system" error when uploading some files with Windows Explorer. --- server.go | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/server.go b/server.go index 1b18be0..959d789 100644 --- a/server.go +++ b/server.go @@ -189,8 +189,51 @@ func (b *backend) propFindFile(propfind *internal.PropFind, fi *FileInfo) (*inte } func (b *backend) PropPatch(r *http.Request, update *internal.PropertyUpdate) (*internal.Response, error) { - // TODO: return a failed Response instead - return nil, internal.HTTPErrorf(http.StatusForbidden, "webdav: PROPPATCH is unsupported") + fi, err := b.FileSystem.Stat(r.Context(), r.URL.Path) + if err != nil { + return nil, err + } + + resp := &internal.Response{Hrefs: []internal.Href{internal.Href{Path: fi.Path}}} + + for _, set := range update.Set { + for _, raw := range set.Prop.Raw { + xmlName, ok := raw.XMLName() + if !ok { + continue + } + + emptyVal := internal.NewRawXMLElement(xmlName, nil, nil) + + if err := resp.EncodeProp(http.StatusForbidden, emptyVal); err != nil { + return nil, err + } + } + + } + + for _, remove := range update.Remove { + for _, raw := range remove.Prop.Raw { + xmlName, ok := raw.XMLName() + if !ok { + continue + } + + emptyVal := internal.NewRawXMLElement(xmlName, nil, nil) + + if err := resp.EncodeProp(http.StatusForbidden, emptyVal); err != nil { + return nil, err + } + } + + } + + if len(resp.PropStats) == 0 { + return nil, internal.HTTPErrorf(http.StatusBadRequest, + "webdav: request missing properties to update") + } + + return resp, nil } func (b *backend) Put(w http.ResponseWriter, r *http.Request) error {