Skip to content

fix(webdav/driver): href 需带挂载前缀;光鸭云盘上传凭据应读 data.creds - #106

Open
SXFVCS wants to merge 1 commit into
OpenListTeam:mainfrom
SXFVCS:fix/webdav-href-and-guangyapan-creds
Open

SXFVCS wants to merge 1 commit into
OpenListTeam:mainfrom
SXFVCS:fix/webdav-href-and-guangyapan-creds

Conversation

@SXFVCS

@SXFVCS SXFVCS commented Oct 4, 2026

Copy link
Copy Markdown

Summary / 摘要

修复两处独立缺陷,均已在真实 Cloudflare Workers 部署上验证:

1. WebDAV PROPFIND 的 D:href 缺少挂载前缀

davPathOf() 剥掉了 /dav 前缀得到虚拟路径,PROPFIND 却直接把该虚拟路径当作
href 输出,违反 RFC 4918(D:href 必须是完整请求 URI)。按请求路径解析 href 的
客户端会丢弃全部条目:rclone 打印 Item with unknown path received: "/wewe/70rop/", "/dav/wewe/"
并显示空目录;Windows 资源管理器、RaiDrive 同样。GET 下载不受影响(走 302),
所以表现为「能下不能列」,容易被误判为客户端问题。

修复:从请求 URL 推导前缀,而不硬编码 /dav——index.ts 会把发往任意路径的
WebDAV 方法也交给本 router(为兼容把用户填写的地址当 WebDAV 根的客户端),此时前缀为空。

2. GuangYaPan 上传凭据读取位置错误

get_res_center_token 把 OSS 凭据嵌套在 data.creds 下,而 GypUploadTokenData
与 put() 的校验都按平铺在 data 上读取,导致 accessKeyID/secretAccessKey
恒为 undefined,任何写入(WebDAV PUT、MKCOL、网页端上传)都失败并抛
upload token is incomplete。凭据字段其实一个都不缺。

修复:优先读 creds,保留平铺回退;并把 OSS 签名与 x-oss-security-token 头也改用
取到的局部变量——只改校验处会留下隐蔽的 STS header 缺失。

Related Issues / 关联 Issue

Fixes #104
Fixes #105

Testing / 测试

在自建 Cloudflare Workers 部署(DB_DRIVER=kv、DB_FORMAT=map、DB_CIPHER=aes-256-gcm)上实测:

WebDAV href

检查 修复前 修复后
PROPFIND /dav/ 的 href /、/WESSSDQ、/wewe /dav/、/dav/WESSSDQ、/dav/wewe
rclone lsd 空输出 + unknown path 日志 正常列出
rclone size 0 objects 780 objects / 16.768 GiB
Windows 资源管理器 / RaiDrive 目录为空 正常

GuangYaPan 上传

检查 修复前 修复后
WebDAV PUT 500 upload token is incomplete 201
文件是否出现在 PROPFIND 否 是
回读内容一致性 — 逐字节一致
DELETE — 204,云端无残留
经 rclone 挂载盘写入 — 成功
  • node scripts/build-edge.mjs 构建通过
  • npx tsc -p tsconfig.json --noEmit 无新增错误(仍为仓库既有的 2 个 db_cipher.test.ts 重复标识符)
  • 驱动单测 driver.test.ts 6/6 通过
  • 已在真实 Workers 环境端到端验证(非仅本地模拟)

未做的验证:未在 Node.js 容器模式下跑端到端;两处改动均不涉及运行时差异,
但建议合并前由维护者确认。

Checklist / 检查清单

  • 我已阅读 CONTRIBUTING
  • 我确认此贡献符合仓库许可证、贡献规范和行为准则
  • 已使用 Prettier 兼容格式(2 空格缩进、无分号风格保持一致)
  • 已请求相关维护者审查

AI Disclosure / AI 使用声明

  • This PR includes AI-assisted content. / 此 PR 包含 AI 辅助内容。

Tools used / 使用工具:

  • Other (please specify) / 其他(请注明): DeepSeek Harness(deepseek-flash)

Usage scope / 使用范围:

  • Code generation / 代码生成

  • Review assistance / 审查辅助

  • 我已审核并验证本 PR 中所有 AI 辅助内容(两处缺陷的根因定位、修复方案、
    以及上表中的全部实测数据,均由我在真实部署上复现与验证)

PROPFIND 返回的 D:href 由 davPath 拼出,而 davPathOf() 已经把 /dav 挂载
前缀剥掉。RFC 4918 要求 D:href 是完整请求 URI,因此按请求路径解析 href 的客户端
(rclone、Windows 资源管理器、RaiDrive 等)会丢弃全部条目,表现为目录为空。

改为从请求 URL 推导前缀,而不是硬编码 /dav —— index.ts 还会把发往任意路径的
WebDAV 方法交给同一个 router,此时前缀为空。

GuangYaPan 的 get_res_center_token 把 OSS 凭据嵌套在 data.creds 下,而类型定义
与校验都按平铺在 data 上读取,于是 accessKeyID / secretAccessKey 恒为 undefined,
所有上传都抛 "upload token is incomplete"。改为优先取 creds 并保留平铺回退,同时
把 OSS 签名与 x-oss-security-token 头也改用取到的局部变量。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant