Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion server/webdav.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ func WebDAVAuth(c *gin.Context) {
reqPath = "/"
}
reqPath, _ = url.PathUnescape(reqPath)
reqPath, err = user.JoinPath(reqPath)
reqPath, err = webdav.ResolvePath(user, reqPath)
if err != nil {
c.Status(http.StatusForbidden)
c.Abort()
Expand Down
22 changes: 22 additions & 0 deletions server/webdav/path.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package webdav

import (
"path"
"strings"

"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/pkg/utils"
)

// ResolvePath normalizes the provided raw path and resolves it against the user's base path
// before delegating to the user-aware JoinPath permission checks.
func ResolvePath(user *model.User, raw string) (string, error) {
cleaned := utils.FixAndCleanPath(raw)
basePath := utils.FixAndCleanPath(user.BasePath)

if cleaned != "/" && basePath != "/" && !utils.IsSubPath(basePath, cleaned) {
cleaned = path.Join(basePath, strings.TrimPrefix(cleaned, "/"))
}

return user.JoinPath(cleaned)
}
20 changes: 10 additions & 10 deletions server/webdav/webdav.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) (status
}
ctx := r.Context()
user := ctx.Value("user").(*model.User)
reqPath, err = user.JoinPath(reqPath)
reqPath, err = ResolvePath(user, reqPath)
if err != nil {
return 403, err
}
Expand Down Expand Up @@ -222,7 +222,7 @@ func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (sta
// TODO: check locks for read-only access??
ctx := r.Context()
user := ctx.Value("user").(*model.User)
reqPath, err = user.JoinPath(reqPath)
reqPath, err = ResolvePath(user, reqPath)
if err != nil {
return http.StatusForbidden, err
}
Expand Down Expand Up @@ -282,7 +282,7 @@ func (h *Handler) handleDelete(w http.ResponseWriter, r *http.Request) (status i

ctx := r.Context()
user := ctx.Value("user").(*model.User)
reqPath, err = user.JoinPath(reqPath)
reqPath, err = ResolvePath(user, reqPath)
if err != nil {
return 403, err
}
Expand Down Expand Up @@ -321,7 +321,7 @@ func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int,
// comments in http.checkEtag.
ctx := r.Context()
user := ctx.Value("user").(*model.User)
reqPath, err = user.JoinPath(reqPath)
reqPath, err = ResolvePath(user, reqPath)
if err != nil {
return http.StatusForbidden, err
}
Expand Down Expand Up @@ -375,7 +375,7 @@ func (h *Handler) handleMkcol(w http.ResponseWriter, r *http.Request) (status in

ctx := r.Context()
user := ctx.Value("user").(*model.User)
reqPath, err = user.JoinPath(reqPath)
reqPath, err = ResolvePath(user, reqPath)
if err != nil {
return 403, err
}
Expand Down Expand Up @@ -439,11 +439,11 @@ func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status

ctx := r.Context()
user := ctx.Value("user").(*model.User)
src, err = user.JoinPath(src)
src, err = ResolvePath(user, src)
if err != nil {
return 403, err
}
dst, err = user.JoinPath(dst)
dst, err = ResolvePath(user, dst)
if err != nil {
return 403, err
}
Expand Down Expand Up @@ -540,7 +540,7 @@ func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus
if err != nil {
return status, err
}
reqPath, err = user.JoinPath(reqPath)
reqPath, err = ResolvePath(user, reqPath)
if err != nil {
return 403, err
}
Expand Down Expand Up @@ -623,7 +623,7 @@ func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status
userAgent := r.Header.Get("User-Agent")
ctx = context.WithValue(ctx, "userAgent", userAgent)
user := ctx.Value("user").(*model.User)
reqPath, err = user.JoinPath(reqPath)
reqPath, err = ResolvePath(user, reqPath)
if err != nil {
return 403, err
}
Expand Down Expand Up @@ -801,7 +801,7 @@ func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (statu

ctx := r.Context()
user := ctx.Value("user").(*model.User)
reqPath, err = user.JoinPath(reqPath)
reqPath, err = ResolvePath(user, reqPath)
if err != nil {
return 403, err
}
Expand Down