Matrix Music Bot Dev
|
ecc40beed8
|
feat(secret_store): Argon2id + AES-256-GCM 加密的会话密钥存储(M1.3a)
依赖新增:
- aes-gcm 0.11
- argon2 0.5.3
- getrandom 0.3 (std feature)
- base64 0.22.1
- serde_json 1.0
- zeroize 1.9
- rand_core (尝试后移除:rand 0.10 / 0.9 的 OsRng API 都复杂,改为更底层的 getrandom)
文件格式(JSON 包装):
{
"version": 1,
"kdf": "argon2id",
"salt_b64": "...", // 16 bytes
"nonce_b64": "...", // 12 bytes
"ciphertext_b64": "..." // AES-256-GCM(plaintext, AAD="matrix-music-bot secret v1")
}
安全参数:
- KDF: Argon2id (m=19456 KiB, t=2, p=1) — OWASP 推荐
- 加密: AES-256-GCM(认证加密,任何篡改都会被检测)
- AAD: 标识文件版本与 KDF,防止 ciphertext 重放到不同上下文
- 每次加密随机 salt + nonce,确保同样明文产生不同 ciphertext
- 写入采用 .bin.tmp → rename 原子操作,避免半写状态
API:
save(path, &secrets, passphrase) -> AppResult<()>
load(path, passphrase) -> AppResult<SessionSecrets>
exists(path) -> bool
SessionSecrets 包含 access_token / device_id / user_id 三个字段,
实现 Zeroize on drop。
测试:
cargo test → 4 passed
- secret_store::roundtrip_via_disk: 加密 + 解密往返,错误口令被 AES-GCM 拒绝
- secret_store::ciphertext_differs_each_time: 同样明文两次加密 ciphertext 不同
后续 M1.3b:在 src/bootstrap.rs 中调用 matrix-sdk 的 Client::builder() + login_username,
拿到 access_token 后调 secret_store::save() 写入 ./data/secret.bin。
|
2026-07-02 19:50:56 +08:00 |
|
Matrix Music Bot Dev
|
19e724444b
|
feat: 实现 config + clap CLI + 错误处理(M1.2)
新增依赖(与 matrix-sdk 0.18.0 兼容):
- tokio 1.52 (full)
- clap 4.6 (derive + env)
- serde 1.0 (derive) + toml 1.1
- thiserror 2.0 + anyhow 1.0
- tracing 0.1 + tracing-subscriber 0.3 (env-filter)
- async-trait 0.1
推迟到对应 milestone(M3 / M5)添加以避免 libsqlite3-sys 与
matrix-sdk-sqlite 冲突:rusqlite、reqwest。详见 Cargo.toml 注释。
新增模块:
src/config.rs ── AppConfig 结构(Homeserver/Bot/Data/Commands/Crypto/Music)+ TOML 加载/序列化 + 自动发现路径
src/error.rs ── AppError 枚举(thiserror)+ AppResult 别名
src/main.rs ── clap CLI 骨架:login / run / config / version 子命令
CLI 子命令状态:
- version ✅ 打印版本 + matrix-sdk 版本
- config init ✅ 在 ./config/bot.toml 生成示例配置
- config path ✅ 打印当前配置文件路径
- config print ✅ 打印当前配置
- login ⚠️ M1.3 占位(返回错误)
- run ⚠️ M2 占位(读取配置后返回错误)
配置默认值(plan 已确认的选型):
- [crypto] auto_enable_cross_signing = true
- [commands] prefix = !, mention_required_in_rooms = true
- [music] ytdlp_path = 'yt-dlp'(PATH 中查找),search_limit = 5
gitignore 增补:排除 /config/bot.toml(操作员真实配置含凭证)
测试:
- cargo build 通过(仅 dead_code warning,未使用的 AppError 变体将在后续 milestone 引用)
- cargo test 2 passed(最小配置解析 + 示例配置往返)
- CLI 实测:version / config init / config print / login / run 均按预期
后续 M1.3:在 src/bootstrap.rs 实现 matrix-sdk Client::builder() + login_username
+ secret_store 加密保存 access_token/device_id。
|
2026-07-02 01:35:54 +08:00 |
|