-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path修复审计报告.txt
More file actions
103 lines (81 loc) · 6.79 KB
/
Copy path修复审计报告.txt
File metadata and controls
103 lines (81 loc) · 6.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
百度网盘自动转存修复审计报告
日期:2026-08-06
基线提交:018ca55545521cedce827d80bac86f3e7487dd9b
标记说明:
【P0-硬性必须】不修会导致运行错误、数据串任务、安全问题或部署得到错误版本。
【P1-必须】功能不完整、行为不一致或存在明显边界错误。
【P2-建议】兼容性、可维护性或用户体验改进。
一、已完成的 P0 修复
1.【P0-硬性必须】docker-compose.yml 原来引用上游镜像
问题:即使下载了修改后的源码,docker compose 仍可能启动 kokojacket/baidu-autosave:latest,所有修复都不会生效。
正确更改:改为 build 当前目录,并使用 baidu-autosave-fixed:local 本地镜像名。
2.【P0-硬性必须】任务用数组下标/order 定位
问题:拖拽排序、删除或并发执行后,下标会变化,可能执行、删除或显示另一个任务。
正确更改:所有新增前端请求使用不可变 task_uid;order 只用于展示排序;保留旧接口仅作兼容。
涉及:web_app.py、storage.py、scheduler.py、frontend/src/services/api.ts、stores/tasks.ts、TasksView.vue、TaskRunnerDialog.vue。
3.【P0-硬性必须】运行状态写回 config.json
问题:每个进度更新都写配置,多个执行线程可能互相覆盖,造成配置损坏、状态回退和磁盘写入风暴。
正确更改:新增 run_store.py,将 status/message/progress/run_id 放入加锁的内存状态;读取任务时覆盖显示,持久任务配置不变。
额外修复:旧 run_id 的迟到回调不能覆盖新一轮执行状态。
4.【P0-硬性必须】配置写入不是完整事务
问题:验证或磁盘写入失败后,内存可能已经换成无效配置,造成“磁盘一份、内存另一份”。
正确更改:候选配置深复制 → 全量验证 → 备份 → 临时文件写入并 fsync → 原子替换 → 最后更新内存;失败时恢复管理器快照。
配置文件权限固定为 0600。
5.【P0-硬性必须】旧配置迁移可能改变 Cron 语义
问题:无法解析的复杂 Cron 如果被猜成简单时间,会在错误日期执行。
正确更改:只做可无损转换;复杂 Cron 原样存入 raw_cron;迁移失败不写盘;迁移前自动备份。
6.【P0-硬性必须】signal.alarm 在线程/gevent 中崩溃
问题:signal only works in main thread。
正确更改:storage.py 使用 threading.Timer + threading.Event;所有阶段设置取消检查点;等待/重试使用 Event.wait;finally 必定 cancel Timer。
7.【P0-硬性必须】生产会话密钥与管理员密码
问题:硬编码、空密钥或明文密码会导致会话伪造或凭据泄露。
正确更改:生产环境强制 SESSION_SECRET 至少 32 字符;ADMIN_PASSWORD 只在首次启动哈希保存;配置/API 不返回 password_hash;禁止通过通用配置接口写密码;新密码至少 8 位。
8.【P0-硬性必须】Docker 非 root 用户无法初始化挂载配置
问题:直接 USER appuser 时,宿主挂载目录可能没有写权限,首次复制模板失败。
正确更改:root entrypoint 只负责创建/修复 config、权限和属主,然后用 gosu 降权到 appuser 运行 Web 服务。
9.【P0-硬性必须】扁平化同名覆盖
问题:a/同名.mp4 与 b/同名.mp4 扁平化后目标相同,可能覆盖或产生不可预测结果。
正确更改:生成转存计划时建立目标路径索引;发现不同源映射到同一目标就立即失败,不执行转存。
二、已完成的 P1 功能与修复
1.【P1-必须】分享链接文件树接口与始终可见的勾选树。
2.【P1-必须】编辑任务自动加载文件树并恢复勾选。
3.【P1-必须】save_name 独立字段、单目录名安全验证和最终路径预览。
4.【P1-必须】真实百度网盘目录浏览接口、逐级进入和面包屑导航。
5.【P1-必须】preserve/flatten 明确分离;save_name 不再隐式决定扁平化。
6.【P1-必须】中文定时支持继承、简单定时、不启用;支持多个规则和单规则多星期。
7.【P1-必须】schedule_rule 使用稳定 rule_uid;调度 Job ID 使用 task_uid + rule_uid。
8.【P1-必须】四步骤结构化进度:step、total_steps、code、percent。
9.【P1-必须】统一终态:success、skipped、partial、failed、timed_out、cancelled;不再根据中文消息猜状态。
10.【P1-必须】任务 timeout_seconds 写入 schema、前后端字段及 30~86400 范围验证。
11.【P1-必须】分享链接 /s/ 与 /share/init?surl= 两种格式在文件树接口中统一处理。
12.【P1-必须】提取码、Cookie、BDUSS、STOKEN、Authorization 等日志脱敏;不再打印 pwd 原值或完整任务字典。
13.【P1-必须】CORS 默认关闭;只有显式提供 CORS_ORIGINS 才启用白名单。
三、关键文件更改位置
config_manager.py:配置 v2、全量校验、备份、原子写、失败回滚、禁止明文密码。
task_schema.py:任务 schema、迁移、星期/时间规则、raw_cron、超时验证。
run_store.py:线程安全运行态、run_id 防迟到覆盖。
path_utils.py:百度网盘 POSIX 路径、save_name 安全拼接、选择范围判定。
storage.py:UID CRUD、文件树、网盘目录、勾选过滤、save_name、扁平化、冲突检测、Timer/Event、四步进度。
scheduler.py:多规则调度、禁用定时、稳定 Job ID、终态更新。
web_app.py:新 API、UID 接口、认证、日志脱敏、运行进度。
frontend/src/components/business/AddTaskDialog.vue:全部新增操作界面。
frontend/src/views/tasks/TasksView.vue:UID 操作、状态显示。
Dockerfile、docker-entrypoint.sh、docker-compose.yml、.env.example:可正确启动的安全容器部署。
tests/test_core.py:14 项核心回归测试。
四、验证结果
通过:python3 -m unittest discover -s tests -v(14/14)
通过:python3 -m py_compile *.py
通过:sh -n docker-entrypoint.sh
通过:frontend/npm run build(vue-tsc + Vite)
通过:git diff --check
未执行:真实百度网盘端到端转存测试;原因是未使用用户 Cookie,避免对真实数据产生写操作。
未执行:docker compose build;原因是本次验证环境未安装 docker 命令。Compose 已改为本地源码构建,不能再换回上游 image。
五、后续合并到 GitHub 的正确方法
本压缩包先在测试目录运行并做一次小文件验收。确认后再由你自己的已登录 GitHub 会话上传或推送;不要在聊天中发送密码、Cookie 或访问令牌。
如果使用 Git:
git checkout -b fixed-v2
git add .
git commit -m "fix: stable task uid, safe config and complete v2 features"
git remote -v
git push -u origin fixed-v2
先推分支并检查差异,不建议直接覆盖 main。确认无误后再在 GitHub 创建 Pull Request 合并。