security: 每人一把口令(口令即身份) + 随机会话token + 无配置拒绝启动 + 爆破节流
- STORY_WEB_PASSWORD(默认story) 废弃 → STORY_WEB_USERS=名字1:口令1,名字2:口令2; 未配置/口令<8位/口令或用户名重复 → 启动即退出,杜绝弱默认口令裸奔 - cookie 不再存口令原文:登录发 secrets.token_urlsafe(32) 随机token, 会话存 SQLite sessions 表(30天);登出删token;从 USERS 移除某人=吊销其全部会话 - updated_by 改由服务端按会话身份填写,前端自报 by 不再可信;登录框去掉昵称字段 - 登录失败全局递增节流(最多sleep 5s),口令比较用 secrets.compare_digest - Dockerfile/compose 移除一切口令默认值;compose 未设 STORY_WEB_USERS 直接报错 - 顺手修 playtest.js 走位/动画/out_ref 行未转义的存储型XSS(esc补齐)
This commit is contained in:
@ -3,7 +3,7 @@
|
||||
设计:`docs/plans/2026-06-06-story-event-pipeline-design.md`(§5.1/§6, D1–D4/D8)
|
||||
计划:`docs/plans/2026-06-08-story-event-M5-web-editor-plan.md`
|
||||
|
||||
少数人凭共享口令在网页里审校/编辑剧情事件 → 静态校验 + 剧本试走(零引擎)→ 一键编译
|
||||
少数人各凭专属口令(口令即身份,改动自动署名)在网页里审校/编辑剧情事件 → 静态校验 + 剧本试走(零引擎)→ 一键编译
|
||||
所有 confirmed 事件成 `.events.json` + `.i18n.tsv` 打包下载。校验/编译走 `ir_core`,与 CLI
|
||||
(`ir_compile.py`)逐字节同口径。
|
||||
|
||||
@ -12,12 +12,14 @@
|
||||
```bash
|
||||
cd tools/event_authoring/web
|
||||
pip install -r requirements.txt
|
||||
# Windows PowerShell: $env:STORY_WEB_PASSWORD="your-pass"
|
||||
set STORY_WEB_PASSWORD=your-pass # 默认 story
|
||||
# Windows PowerShell: $env:STORY_WEB_USERS="bia:口令A,ljl:口令B"
|
||||
set STORY_WEB_USERS=bia:口令A,ljl:口令B # 必填;未配置则拒绝启动
|
||||
uvicorn app:app --host 0.0.0.0 --port 8787
|
||||
```
|
||||
|
||||
浏览器打开 `http://<host>:8787`,输入共享口令进入。
|
||||
浏览器打开 `http://<host>:8787`,输入自己的专属口令进入(服务端按口令认人,
|
||||
`updated_by` 自动署名;口令要求 ≥8 位且互不相同,cookie 只存随机会话 token 不存口令;
|
||||
从 `STORY_WEB_USERS` 移除某人即吊销其所有会话)。
|
||||
|
||||
## 用法
|
||||
|
||||
@ -43,17 +45,18 @@ uvicorn app:app --host 0.0.0.0 --port 8787
|
||||
|
||||
```bash
|
||||
cd tools/event_authoring/web
|
||||
STORY_WEB_PASSWORD=your-pass docker compose up -d --build
|
||||
STORY_WEB_USERS="bia:口令A,ljl:口令B" docker compose up -d --build
|
||||
# 或不用 compose:
|
||||
# docker build -f web/Dockerfile -t story-event-web ..
|
||||
# docker run -d -p 8787:8787 -e STORY_WEB_PASSWORD=your-pass \
|
||||
# docker run -d -p 8787:8787 -e STORY_WEB_USERS="bia:口令A,ljl:口令B" \
|
||||
# -v "$PWD/web/data:/data" \
|
||||
# -v "$PWD/Assets/StreamingAssets/Story/PointSets:/pointsets:ro" story-event-web
|
||||
```
|
||||
|
||||
- **卷**:`./data:/data`(SQLite 持久化,容器重建不丢事件,**勿删**);
|
||||
`…/PointSets:/pointsets:ro`(开发侧点位集只读;缺失时坐标校验降级为警告)。
|
||||
- **环境变量**:`STORY_WEB_PASSWORD`(口令)、`STORY_WEB_PORT`(宿主端口,默认 8787)、
|
||||
- **环境变量**:`STORY_WEB_USERS`(必填,`名字1:口令1,名字2:口令2`,未配置拒绝启动)、
|
||||
`STORY_WEB_PORT`(宿主端口,默认 8787)、
|
||||
`STORY_DB_PATH`(默认 `/data/story_events.db`)、`STORY_POINTSETS_DIR`(默认 `/pointsets`)、
|
||||
可选 `TZ=Asia/Shanghai`(否则 `updated_at` 按 UTC 显示)。
|
||||
- **NAS + VPS**:NAS 跑容器,VPS 用反代/frp/Cloudflare Tunnel 把 8787 映射出去。点位集更新只需
|
||||
|
||||
Reference in New Issue
Block a user