Skip to content

[BUG] base_path 限制用户通过 WebDAV 访问 /dav/ 返回 404(附代码分析) #2528

@Leoin1

Description

@Leoin1

OpenList 版本(必填)

v4.2.2

使用的存储驱动(必填)

189CloudPC / 天翼云盘

问题描述(必填)

当用户的 base_path 设为非根目录(如 /天翼云盘/天翼盘电影)时,通过 WebDAV 访问 /dav/ 返回 404 Not Found。

复现步骤:

  1. 新建用户 mov,设 base_path/天翼云盘/天翼盘电影,权限包含 WebDAV 读
  2. WebDAV 客户端访问 https://host:port/dav/,使用 mov 的账密
  3. 返回 404 Not Found

预期: 应返回 207,列出 base_path 目录下的内容

代码分析:
此 bug 由 commit d85f084a (feat(permissions): implement fine-grained permission control #2145) 引入。

该 commit 在 server/webdav/webdav.gohandlePropfind 中新增了 GetNearestMeta + CanAccess 权限检查,同时修改了 WebDAVAuthMetaPassKey 的设置逻辑。降级到 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.gohandlePropfind 中新增了 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.goWebDAVAuth 中,对非 guest 用户设置了空的 MetaPassKey

if user.IsGuest() {
    common.GinWithValue(c, conf.MetaPassKey, password)
} else {
    common.GinWithValue(c, conf.MetaPassKey, "")
}

当用户设置了 base_path(如 /天翼云盘/天翼盘电影)时:

  1. WebDAV 对 /dav/ 发起 PROPFIND
  2. stripPrefix("/dav/")/
  3. JoinBasePath("/天翼云盘/天翼盘电影", "/")/天翼云盘/天翼盘电影
  4. 新增的 GetNearestMeta + CanAccess⚠️ 问题在此
  5. fs.Get(ctx, "/天翼云盘/天翼盘电影", ...) → Not Found

v4.1.8 中没有这些检查,base_path 限制的用户可以通过 /dav/ 正常访问。

降级验证

将 OpenList 降级到 v4.1.8(2025-11-25)后,base_path 限制的用户可以正常通过 WebDAV 访问 /dav/

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions