OpenList 版本(必填)
v4.2.2
使用的存储驱动(必填)
189CloudPC / 天翼云盘
问题描述(必填)
当用户的 base_path 设为非根目录(如 /天翼云盘/天翼盘电影)时,通过 WebDAV 访问 /dav/ 返回 404 Not Found。
复现步骤:
- 新建用户
mov,设 base_path 为 /天翼云盘/天翼盘电影,权限包含 WebDAV 读
- WebDAV 客户端访问
https://host:port/dav/,使用 mov 的账密
- 返回 404 Not Found
预期: 应返回 207,列出 base_path 目录下的内容
代码分析:
此 bug 由 commit d85f084a (feat(permissions): implement fine-grained permission control #2145) 引入。
该 commit 在 server/webdav/webdav.go 的 handlePropfind 中新增了 GetNearestMeta + CanAccess 权限检查,同时修改了 WebDAVAuth 中 MetaPassKey 的设置逻辑。降级到 v4.1.8 后功能正常。
日志(必填)
[GIN] 2026/05/26 - 23:05:36 | 401 | 17.845µs | xxx.xxx.xxx.xxx | PROPFIND "/dav/"
ERRO PROPFIND /dav/ permission denied
[GIN] 2026/05/26 - 23:05:36 | 404 | 191.982µs | xxx.xxx.xxx.xxx | PROPFIND "/dav/"
配置文件内容(必填)
用户配置:
- username: mov
- base_path: /天翼云盘/天翼盘电影
- permission: 780
复现链接(可选)
AI生成内容(可选)
代码分析结果
通过对比 v4.1.8 和 v4.2.2 的代码,确认了引起该 bug 的 commit:
Commit: d85f084a (2026-03-26)
Title: feat(permissions): implement fine-grained permission control (#2145)
根因
该 commit 在 server/webdav/webdav.go 的 handlePropfind 中新增了 GetNearestMeta + CanAccess 权限检查:
meta, err := op.GetNearestMeta(reqPath)
if err != nil && !errors.Is(errors.Cause(err), errs.MetaNotFound) {
return http.StatusInternalServerError, err
}
if !common.CanAccess(user, meta, reqPath, password) {
return http.StatusForbidden, errs.PermissionDenied
}
同时在 server/webdav.go 的 WebDAVAuth 中,对非 guest 用户设置了空的 MetaPassKey:
if user.IsGuest() {
common.GinWithValue(c, conf.MetaPassKey, password)
} else {
common.GinWithValue(c, conf.MetaPassKey, "")
}
当用户设置了 base_path(如 /天翼云盘/天翼盘电影)时:
- WebDAV 对
/dav/ 发起 PROPFIND
stripPrefix("/dav/") → /
JoinBasePath("/天翼云盘/天翼盘电影", "/") → /天翼云盘/天翼盘电影
- 新增的
GetNearestMeta + CanAccess → ⚠️ 问题在此
fs.Get(ctx, "/天翼云盘/天翼盘电影", ...) → Not Found
v4.1.8 中没有这些检查,base_path 限制的用户可以通过 /dav/ 正常访问。
降级验证
将 OpenList 降级到 v4.1.8(2025-11-25)后,base_path 限制的用户可以正常通过 WebDAV 访问 /dav/。
OpenList 版本(必填)
v4.2.2
使用的存储驱动(必填)
189CloudPC / 天翼云盘
问题描述(必填)
当用户的
base_path设为非根目录(如/天翼云盘/天翼盘电影)时,通过 WebDAV 访问/dav/返回 404 Not Found。复现步骤:
mov,设base_path为/天翼云盘/天翼盘电影,权限包含 WebDAV 读https://host:port/dav/,使用mov的账密预期: 应返回 207,列出 base_path 目录下的内容
代码分析:
此 bug 由 commit
d85f084a(feat(permissions): implement fine-grained permission control #2145) 引入。该 commit 在
server/webdav/webdav.go的handlePropfind中新增了GetNearestMeta+CanAccess权限检查,同时修改了WebDAVAuth中MetaPassKey的设置逻辑。降级到 v4.1.8 后功能正常。日志(必填)
配置文件内容(必填)
用户配置:
复现链接(可选)
AI生成内容(可选)
代码分析结果
通过对比 v4.1.8 和 v4.2.2 的代码,确认了引起该 bug 的 commit:
Commit:
d85f084a(2026-03-26)Title: feat(permissions): implement fine-grained permission control (#2145)
根因
该 commit 在
server/webdav/webdav.go的handlePropfind中新增了GetNearestMeta+CanAccess权限检查:同时在
server/webdav.go的WebDAVAuth中,对非 guest 用户设置了空的MetaPassKey:当用户设置了
base_path(如/天翼云盘/天翼盘电影)时:/dav/发起 PROPFINDstripPrefix("/dav/")→/JoinBasePath("/天翼云盘/天翼盘电影", "/")→/天翼云盘/天翼盘电影GetNearestMeta+CanAccess→fs.Get(ctx, "/天翼云盘/天翼盘电影", ...)→ Not Foundv4.1.8 中没有这些检查,base_path 限制的用户可以通过
/dav/正常访问。降级验证
将 OpenList 降级到 v4.1.8(2025-11-25)后,base_path 限制的用户可以正常通过 WebDAV 访问
/dav/。