Skip to content

feat(lock): 增加本地应用锁 - #111

Merged
ranger1112 merged 4 commits into
mainfrom
feat/app-lock
Nov 8, 2026
Merged

ranger1112 merged 4 commits into
mainfrom
feat/app-lock

Conversation

@ranger1112

Copy link
Copy Markdown
Owner

功能

可选的本地应用锁:设置密码后,窗口打开先显示锁屏;解锁后在固定有效期内免密使用,标题栏和托盘都能主动上锁。

  • 有效期预设:30 分钟 / 2 小时 / 4 小时 / 8 小时 / 24 小时,默认 30 分钟。
  • 标题栏锁按钮 + 托盘「立即上锁」。
  • 设置页支持启用、修改密码、关闭应用锁;修改/关闭都要求当前密码。
  • 锁定时后端会拦截笔记、草稿、设置、Git、同步等敏感命令;托盘打开今日笔记/文件夹/日志/同步/历史/设置也被拦截。
  • 后台定时云同步与自动 Git 提交继续运行(不因上锁暂停)。

安全边界

  • 密码用 Argon2id 哈希,验证器只存 Windows 凭据管理器(flashnote-app-lock),不写 settings.json,也不返回给前端。
  • 解锁状态只在内存,重启后重新锁定;有效期同时参考单调时钟与墙上时钟,处理休眠/改时间。
  • 这是界面访问锁 + 命令拦截,不是笔记加密。锁定时磁盘上的笔记、草稿、备份、Git 历史与同步远端仍是明文;能访问磁盘或当前 Windows 用户凭据的人仍可读取。SECURITY.md 已写明。
  • 凭据管理器读取出错时本次启动按未启用处理并给出警告,避免凭据服务异常把应用锁死;忘记密码可在凭据管理器中删除 flashnote-app-lock 条目后重启恢复。

验证

  • cargo fmt --all -- --check
  • cargo clippy --all-targets --locked -- -D warnings
  • cargo test --locked:244 passed / 0 failed / 3 ignored
  • cargo test app_lock_keyring_round_trip -- --ignored:通过
  • npm test:85 passed
  • npm run build:通过

尚未在真实窗口中做人工端到端验证(启动、密码解锁、托盘上锁、重启后仍锁定);建议合并前补一次。

🤖 Generated with Claude Code

Copilot AI balanced review requested due to automatic review settings November 4, 2026 08:00

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

ranger1112 and others added 3 commits November 8, 2026 20:57
- Argon2id 验证器只存 Windows 凭据管理器
- 内存解锁有效期、休眠/改时钟防护与失败退避
- 锁定状态、托盘立即上锁与敏感命令拦截
- 设置项、锁状态命令与单元测试

Co-Authored-By: Claude Code <noreply@anthropic.com>
- 启动先判定锁定,解锁后才加载设置、草稿与同步状态
- 锁屏覆盖层、标题栏/托盘上锁、有效期倒计时与失败退避
- 设置页启用、修改、关闭应用锁与有效期选择
- DOM 测试、README/SECURITY/CHANGELOG

Co-Authored-By: Claude Code <noreply@anthropic.com>
- 启用/修改/关闭应用锁后同步应用锁状态,启用后立即排有效期计时器
- 解锁后把焦点还给输入框;hydration 期间再次上锁不会被旧解锁覆盖
- 有效期查询失败时重试,仍失败按锁定处理;窗口重新聚焦时补查状态
- 面板关闭动画与上锁重叠时清掉 panel-open,避免解锁后主界面不可见
- hydrate 失败后允许下次解锁重试
- 草稿保存不再被锁拦截,避免上锁瞬间丢掉最后输入的文字
- 锁定时清掉 last_source,解锁后保存的笔记不再带上锁前的来源

Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
@ranger1112
ranger1112 merged commit 7d971e6 into main Nov 8, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants