Skip to content

Readest Lite v8.18.4 — 加密设置同步(持久化密钥)

Choose a tag to compare

@cshdotcom cshdotcom released this 05 Sep 12:16
· 61 commits to main since this release

Readest Lite v8.18.4 — 加密设置同步(客户端+服务端完整实现)

✨ 主要功能

1. 分享过期时间 — 永久 + 自定义日历

  • 1 天 / 3 天 / 7 天 — 预设(原有)
  • Permanent(永久)— expiresAt 设为 9999-12-31
  • Custom(自定义)— <input type='date'> 日历选择器,计算 1-365 天

2. 接收方副本完全独立 + owner 删除自动失效

  • 接收方 import 时字节级复制到独立命名空间 + 独立 DB row
  • 原 owner 删除不影响接收方已保存的副本
  • delete.ts 自动 revoke 所有活跃 BookShare 行 → 410 revoked

3. 加密设置同步(完整实现 — 持久化密钥,不是一次性)

用户原话:「每个用户的用户前端设置和配置全部加密存储服务端实现同步」
「加密方式要用可以持久化,而不是一次性的」

加密密钥持久化机制:

  • K(256-bit AES-GCM 密钥)在首次登录时随机生成
  • K 用密码派生的 KE(PBKDF2-600k-SHA256)加密 → K_enc 存服务端 User.encryptedVaultKey
  • 每次登录:密码 → KE → 解密 K_enc → K 存内存
  • K 在跨会话间持久化 — 不是一次性的,每次登录都能恢复同一个 K

同步流程:

  • 保存设置时:settingsStore.saveSettings() → 3s 防抖 → pushEncryptedSettings()
    → JSON.stringify(settings) → encryptToEnvelope(plaintext, K) → base64 → PUT /api/settings
  • 启动时拉取:useLibrary hook → pullEncryptedSettings() → GET /api/settings
    → atob → decryptFromEnvelope(envelope, K) → JSON.parse → 合并到本地

3 个 scope:

  • system — SystemSettings(KOSync、Readwise、OPDS、proxy 等)
  • global_view — globalViewSettings(字体大小、主题、布局)
  • global_read — globalReadSettings(翻页、自动滚动、TTS)

安全性:服务端只存密文,永远不解密。密钥 K 只在客户端内存中。

4. ITERATION_PROMPT.md 完整更新

12 个设计决策 + 完整自定义文件清单 + 安全清单 + CI 排查 + Migration 清单。

5. feed:// source_deleted bug 修复

shareServer.ts 先检查 row.revokedAt,feed:// 分享 owner 删除后正确返回 410。

📦 升级方式

docker compose pull && docker compose up -d

包含数据库 schema 变更:user_settings 新表 + book_shares.book_url 列。

✅ CI 状态

  • ✅ CI workflow: success
  • ✅ Docker Image workflow: success
  • ❌ CodeQL Advanced: pre-existing failure (不阻塞)