feat(drivers/sjtu_netdisk): add SJTU Netdisk driver implementation - #2990
feat(drivers/sjtu_netdisk): add SJTU Netdisk driver implementation#2990asky88 wants to merge 2 commits into
Conversation
pikachuren
left a comment
There was a problem hiding this comment.
🙏 感谢 @SnowMonkey1 提交!
🤖 AI 自动审核声明:本评审报告由 AI 自动生成,当前使用 Claude Opus 5 模型进行分析。
🎯 结论
🔄 Request Changes — 驱动实现完整,但 access_token 通过 URL 查询参数传递存在泄漏风险
📖 概要
feat(drivers/sjtu_netdisk): add SJTU Netdisk driver implementation · 新增上海交通大学云盘驱动。
核心改动:新增 drivers/sjtu_netdisk 包,实现列目录、上传下载、增删改等操作,含带互斥锁的 token 缓存刷新。
🧭 整体方案
技术路线是标准的网盘驱动实现:用用户提供的 UserToken cookie 换取短期 access_token,缓存复用并在临近过期时刷新。refreshToken 用 tokenMutex 保护、提前 2 分钟刷新、服务端未返回有效期时回退到 1800 秒——这几处边界处理得不错。主要顾虑是 token 的传递方式。
📊 变更统计
5 个文件(+937 / -0 行) | 功能 ⭐⭐⭐⭐ | 最小改动 ⭐⭐⭐⭐ | 前向兼容 ⭐⭐⭐⭐⭐ | 方案设计 ⭐⭐⭐
🚨 关键问题
P0(阻塞合并):无
P1(建议修复):
⚠️ drivers/sjtu_netdisk/driver.go— 全文有 10 余处SetQueryParam("access_token", d.accessToken),即把访问令牌放在 URL 查询字符串中。这带来几个风险:令牌会出现在服务端访问日志、代理日志、浏览器/客户端历史,以及跨站跳转时的Referer头中。请问该 API 是否支持通过请求头传递(例如Authorization: Bearer或自定义头)呢?如果服务端只接受查询参数那属于上游限制、无法规避,但建议在代码中加注释说明,避免后续维护者误以为是疏忽~⚠️ refreshToken中,若服务端返回成功但resp.AccessToken为空字符串,代码不会报错,而是把空值缓存起来并设置过期时间。后续所有请求都会带着空 token 发出,报错信息会很难理解。建议补一个非空校验:
if resp.AccessToken == "" {
return errors.New("sjtu_netdisk: empty access_token in response")
}P2(可选):
- 💡
newClient()在每次调用时都新建一个 resty client。resty client 内部持有连接池,频繁创建会导致连接无法复用、TLS 握手开销增加。是否考虑在Init时创建一次并复用呢? - 💡
API_URL与TOKEN_URL使用全大写命名,Go 惯例是驼峰(apiURL/tokenURL)且包级私有。建议与项目其他驱动保持一致~ - 💡
meta.go中残留一行注释掉的//OnlyLocal: false,建议删除~ - 💡
encodePath用url.PathEscape处理路径,但它不会转义/。若路径片段本身含有/或特殊字符,可能产生歧义。是否考虑逐段转义后再拼接? - 💡
Addition中UserToken、UserId、KeepAlive三项均为必填,用户需要自行从浏览器抓取。建议在help标签中说明获取方式,降低使用门槛~
🔐 安全审查
- 审查方式:扫描
exec.Command、os/exec、InsecureSkipVerify、硬编码凭证、可疑外连等模式 - 安全评估:✅ 未发现恶意代码
- 详细结论:所有外部请求均指向
pan.sjtu.edu.cn官方域名;无命令执行、无 TLS 校验绕过、无硬编码密钥;token 全部来自用户配置。唯一的安全改进点是上述查询参数传递问题。
📂 逐文件分析
drivers/sjtu_netdisk/driver.go
改动意图:实现驱动主体操作。
问题分析:功能覆盖完整;token 经查询参数传递(P1)。
drivers/sjtu_netdisk/types.go
改动意图:token 刷新与客户端构造。
代码逻辑:加锁 → 检查是否临近过期 → 请求新 token → 缓存并计算过期时间。
问题分析:并发保护与提前刷新逻辑正确;缺少空 token 校验(P1);client 未复用(P2)。
drivers/sjtu_netdisk/meta.go / util.go / drivers/all.go
问题分析:注册方式与项目约定一致,无问题。
✅ 待处理清单
- [P1] 评估改用请求头传递 access_token,若受上游限制请加注释说明
- [P1] 为
refreshToken增加空 token 校验 - [P2] 复用 resty client 而非每次新建
- [P2] 常量改为 Go 惯例命名并删除注释残留
- [P2] 为
Addition各字段补充获取方式说明
🎯 结论:🔄 Request Changes — 驱动实现质量不错、无安全隐患,建议先处理 token 传递方式与空值校验。
摘要
添加了对 上海交大网盘 的支持
-支持分页的文件列表
-通过 S3 预签名 URL 进行下载,并解析 X-Amz-Expires TTL
-使用三步 S3 预签名流程上传
-创建目录、重命名、移动(支持冲突合并)、复制、删除
-令牌自动刷新,带过期缓存和备用机制
/ 此 PR 包含破坏性变更。
/ 此 PR 修改了公开 API、配置、存储格式或迁移行为。
/ 此 PR 需要关联仓库同步修改。
Related repository PRs / 关联仓库 PR:
Testing / 测试
go test ./...Checklist / 检查清单
/ 我已阅读 CONTRIBUTING。
/ 我确认此贡献符合仓库许可证、贡献规范和行为准则。
gofmt,go fmt, orprettierwhere applicable./ 我已按适用情况使用
gofmt、go fmt或prettier格式化变更代码。/ 我已在适用情况下请求相关维护者或代码所有者审查。