Notion Files Management v2.0.0-Beta-5
Windows 迁移包
- 新增
deploy/windows_entry.py作为 PyInstaller/Windows exe 专用入口:默认使用%LOCALAPPDATA%\Notion-Files-Management数据目录,启动窗口打印 config/logs/staging 路径,监听统一后端端口127.0.0.1:18765(可用NFM_PORT覆盖),并在启动后打开默认浏览器。 deploy/nfm.spec改为使用 Windows 专用入口,产物名为NOTION_FILES_MANAGEMENT_v<版本>-<渠道>.exe。Docker/systemd/源码运行仍使用原服务端入口,不受影响。
安全加固(API Key 开放能力)
- 移除
?api_key=query 用法:长期 API Key 永远只走Authorization: Bearer,任何接口都不再接受 URL query 参数(避免明文进访问日志/Referer)。deps._resolve_token删除,resolve_auth/require_events_access不再读 query。 - 短期 SSE token:新增
app/ssetokens.py与POST /api/tasks/{tid}/events-token(需 session 或tasksscope),返回nfmsse_token,10 分钟有效、绑定单个 task_id、进程内存储。GET /{tid}/events改用deps.require_events_access(session / Bearer+tasks / events_token 三选一),不再挂路由级require_scope。?events_token=是唯一允许出现在 URL 的凭据。 - hash 常量时间比较:
apikeys.verify_key改用secrets.compare_digest。 - 弱 bootstrap key 拒绝:
NFM_BOOTSTRAP_API_KEY必须是nfm_前缀 + 负载 ≥ 32 字符;不合格忽略并 warning,不自动补前缀。 - 严格 scope 校验:
_normalize_scopes遇到未知 scope 直接抛 ValueError(路由转 400),不再静默过滤。 - PATCH 清空过期时间:
PATCH /api/apikeys/{id}改用body.model_fields_set+update_key的_UNSET哨兵,{"expires_at": null}可清空过期时间。过期时间统一存 UTC ISO。 - 动态 CORS:新增
app/cors.pyDynamicCORSMiddleware,常驻、每次请求实时读config["api_cors_allowed_origins"],改设置无需重启。仅放行http(s)origin,拒绝*/null/带 path 的值;preflight 只对白名单 origin 返回 CORS 头。SettingsIn增加api_cors_allowed_origins字段及校验。
前端
ApiKeys.vue:过期时间按本地时间选择、提交转 UTC ISO(toISOString)、展示本地;创建明文弹窗关闭后立即清空plaintext;--text-muted修正为项目已有的--app-muted;新增「跨域允许源」面板(读/api/settings、增删、PUT保存)。- SSE 示例改为先换
events_token,不展示长期 key 放 URL 的用法。
文档
- 更新
AI/ARCHITECTURE.md、AI/COMMANDS.md、AI/GOTCHAS.md(第 24-27 条)、AI/SECURITY_AUDIT.md、CLAUDE.md:明确「长期 API Key 永远只走 Bearer;URL query 只允许短期 SSE token」。
