Repository navigation
Releases: BuvkB/dsh-vaultwarden
Releases · BuvkB/dsh-vaultwarden
Release list
v0.9.8
[0.9.8] — 2026-10-24
面板交互与字面统一对齐宿主,一处悬停缺陷修复。无破坏性变更。
优化
- 选中与悬停对齐宿主:条目行换 12px 圆角芯片,侧栏栏目、条目行、全部按钮静止透明无框,悬停/选中显示宿主 interactive 洗色;行内浮层按钮悬停加深一阶。
- 全面板字体继承宿主字面:面板根与表单控件恢复继承,仅密码/密钥等宽值保留代码字体;侧栏栏目字号/行高/间距对照官方设置导航对齐(14px/22px/400)。
- 同步徽章只留「实时同步」四字,同步时间移到徽章外;手动同步后「同步 x 条」临时显示 10 秒,切回时间用翻牌动效;系统减少动效时直接切换。
- 移除工具栏常显条目总数,仅在刷新进行中显示「刷新中…」。
修复
- 行内复制按钮读取密码期间不再短暂失去悬停效果:读取中改用 aria-busy 标记,防重入由引用承担,不再把按钮踢出悬停规则。
- 补上行内收藏星标与右侧箭头缺失的 React key。
v0.9.7:修复会话 userKey 持久化与刷新令牌轮换,收口边界缺陷并优化热路径
v0.9.7
修复(安全 / 会话)
- 修复会话文件 userKey 持久化从未生效的缺陷:解锁后令牌刷新不再使调用失败,重启后不再被迫重输主密码。
- 切换账户或收紧会话保留期时立即清理旧会话文件与内存令牌。
- /api 收到 401 时自动过期内存访问令牌,走一次刷新而不是反复失败到自然过期。
- 通知升级重连加入指数退避,令牌缺失时不再空转重连。
- 修复共享解锁误用首个调用者的取消信号、httpJson 读响应体阶段失去超时保护、换账户后连通性探针残留 5 分钟。
- 登出时同步清理面板分区缓存与总览缓存。
优化
- 轮询同步先探测 revision,未变化不再整库下载+解密+落盘。
- 动态验证码改为每个 30 秒窗口取一次,列表多行不再每秒每行一次调用。
- 列表行组件 memo 化,搜索与轮询不再整树重建。
- 系统提示注入从 1280 字符瘦身到约 300 字符。
- 面板快照写盘增加指纹去重;搜索打分、总览统计、网关序列化等热路径多项优化。
测试
- 12 套离线测试 915 项断言全部通过,新增 P0 与动态码窗口回归。
v0.9.6:徽章换盾加对勾,骨架与动态码行对齐,侧栏不再重放入场动画
[0.9.6] — 2026-10-23
Panel polish, no behaviour changes to the vault itself. No breaking changes.
界面
- 设置页导航行「凭据库」的徽章从「盾牌 + 锁孔」换成「盾牌 + 对勾」:外框仍是那枚空心盾牌,内里改成一条圆头圆角的对勾(16 单位画布,描边 1.5,比盾牌自身的 1.3 重一档,17px 下才立得住)。锁孔是旧版答案——一个圆加一条锥形杆,在 16 单位里两个形状挤在一起,缩到侧栏徽章的 17px 就糊成一块墨;对勾是一笔,负空间比图形本身大,缩到 17px 仍读得出。设定页导航、插件列表徽章同一枚字形,纯
currentColor跟随主题。 - 侧栏(分区菜单)不再做入场动画。它是常驻框架而不是内容:同一串「全部条目 / 收藏 / 验证码 / 类型 / 文件夹 / 归档 / 回收站」只要面板开着就在屏幕上,变的是它们背后的答案,不是它们自己。此前真行按 DOM 顺序每行错开 18ms 淡入上移,于是每一帧重新插入侧栏都会把整段入场重放——手机上的钻取态正是如此:打开条目时侧栏移出布局,点「返回列表」再放回来,11 行重新淡入一次,看起来就是侧栏闪了一下。现在真行与骨架槽在同一帧出现,面板唯一保留的错峰入场留给真正新出现的东西(条目列表的行)。
- 手机窄屏下的「动态码」行不再被推到卡片最右边。窄屏布局会把字段行的末格钉到右缘(那里是显示/复制那两枚 28px 方形字形槽的位置),而动态码不是控件、是读的东西——被推到最右后它孤零零落在卡片另一角,离命名它的「动态码」四百像素。现在它从值列的起点开始,与每一行别的值一样。
- 桌面上的「动态码」行改成垂直居中。这一行的值是 30px 圆环里垂直居中的 14px 码,而行本身顶对齐,于是「动态码」的基线比码高 8px——整张卡片里唯一一行两列对不上同一条线。居中之后同一条线穿过两者。
- 详情骨架的字段行改用真实字段行的列(
92px minmax(0,1fr) auto,顶对齐),删掉此前为「控件位」预留的那一列 28px 空占位。旧列把值列压窄 40px,占位条与真实值的起止位置对不上,答案落地的那一刻卡片会重新排一次——正是此前「骨架设计有错位」的直接原因。 - 骨架占位条改成坐在与真实文字同字号的 line box 里(新
skeletonLine(font, bar):外层 13.5px / 12px 的行盒,内层圆条inline-block; vertical-align:middle)。此前占位条是没有行盒的裸 span,高度就是条本身(10px 或 18px),骨架行高因此由常量猜出来而不是由排版算出来:列表骨架原来 56px,它要变成的真实行是 63px,答案落地时整列会缩一下。现在骨架行高直接由与真实行相同的字号 + 相同的 3px 行距算出——真机实测 11 行骨架全为 63.0px,与真实行完全一致。 - 列表骨架的文本列补到 30px 高(与真实行的头像同高)。两根占位条(10 + 6 + 8)只有 24px,于是每个骨架行比它将要变成的 54px 行矮 6px,答案落地时整列会缩一下。
- 侧栏占位行补上
box-sizing: border-box。真行是<button>(浏览器默认给 border-box),占位行是<div>(content-box),于是只占位行宽出 20px,右侧的计数短条越过侧栏的右边线——加载态侧栏错位的直接原因。 - 修掉手机窄屏「动态码」例外规则的特异性不足:它的选择器原来是
.vw-root [data-vw-field] > [data-vw-totp-cell](0,3,0),被它想压住的.vw-root [data-vw-field] > *:last-child:not(:first-child)(0,4,0,:not()里的伪类计入特异性)压回来,手机上一整轮都没生效、码值仍被画在远角。改成同形的> [data-vw-totp-cell]:last-child:not(:first-child)(0,4,0),两者同级、由文档顺序决定,本规则在后。真机复测:390×844 视口下justify-self已是start,码格左缘与值列左缘同为 253px。
测试
- 侧栏动效的断言反过来写:从「真行按 18ms 阶梯到达」改成「侧栏行没有入场动画、也没有延迟阶梯」,并新增一条守着列表行错峰(防止「侧栏让位」被实现成整段删除)。徽章断言从「盾牌 + 锁孔」改成「盾牌 + 对勾」:两个形状、对勾居中在盾牌中轴且落在轮廓内、不再有圆孔元素(
cx)。
v0.9.5
安全
- 彻底删除(
permanent: true)不再由模型自行确认。写入门禁原来只看accessMode是不是 readonly,把 mutation 层传来的动作名丢掉了——于是auto档下模型一次bitwarden_delete调用就能不可恢复地删掉凭据,confirm: true是模型自己填的,等于自己给自己盖章。现在门禁认动作:purge只在ask档放行,auto与readonly一律拒绝;ask档对彻底删除单独用一句"此操作不可恢复"的审批文案。 - 重新验证(reprompt)的授权窗口绑定到条目。原来输一次主密码,5 分钟内全部 reprompt 条目的全部字段(密码、TOTP 种子、卡号、SSH 私钥、笔记正文)都能读,等于一次授权开放整库。现在授权记录目标条目,只有那一条能读到;不指定条目时仍保持原有的账号级语义。
- 主密码验证加了失败退避。每次验证要跑一遍 KDF(PBKDF2 默认 60 万轮,或 Argon2id),原先没有次数限制。现在连错 5 次后按 1s / 2s / 4s… 退避,上限 60 秒,退避期内直接返回"尝试过多"且不跑 KDF;验证成功即清零。
- 令牌刷新加了单飞与换代守卫。Vaultwarden 每用一次刷新令牌就轮换,面板首次渲染与实时同步通道会同时拿同一个过期令牌去刷新,后到的一路必然收到
invalid_grant——这看起来与被吊销的凭据一模一样,于是它把刚刷新成功的好会话连同磁盘上的session.json一起清掉了。另外刷新返回后直接读this.token,并发的登出会把它置空,那里原本会抛一个不带错误码的TypeError。 - 解锁失败的冷却不再跨会话残留。显式登出后立刻重新登录会被
session_expired挡住一分钟:登出没清掉上一次失败装上的冷却,而被登出取消的那次登录又把它重新装上。 - 条目名不再出现在"没找到"的错误消息里;
status()不再回传缓存文件的绝对路径;数据目录显式 chmod 0700(mkdir的 mode 只作用末级且被 umask 削弱);会话落盘失败不再静默吞掉。
修复
- 同步载荷里
ciphers/folders/collections/profile.organizations给成非数组时,按字段降级为空列表。原来for…of抛出的TypeError不是本插件的错误类型,会绕过所有调用方的处理,用户只看到「凭据库操作失败:<内部消息>」且没有错误码。 - 缓存信任窗口与内存保险库的 TTL 改按绝对时间差判断。原来都用
now - 写入时间 <= 窗口,时间戳一旦落在未来(时钟回拨、或缓存从走快的机器拷来)差值是负数,负数小于任何上界,于是这条缓存永远可信、这份保险库永远不用再向服务器核一遍。 - TOTP 的等待精确到窗口边界(原来按"剩余秒数 + 1"整秒睡,最坏多睡一秒);
otpauth://里的畸形百分号转义不再抛裸URIError;digits/period必须是整数;base32 里的非法字符不再被原样回显进错误消息。 httpJson的超时定时器补上unref,挂住的请求不再拖住进程退出。
优化
- 侧栏图标入队改微任务批量通知。
iconFor在渲染中对每个未探测的 host 调一次通知,首屏 50 行就是 50 次同步 setState——50 遍整面板重渲,外加 React "渲染期间更新另一个组件"的告警。 - 列表容器不再把搜索词放进 key。原来每敲一次键都把整棵列表卸载重挂:50 行约 750 个节点、每行两个复制按钮的状态、错峰入场动画全部重来。
- 冷启动的 RPC 从三段串行变两段:文件夹与侧栏统计不再排在列表之后;命中上一次的统计缓存时连那次请求也省掉。
- TOTP 倒计时改成面板级一个时钟,不再每行一个 1 秒定时器(50 行就是 50 个相位不同的 timer、50 次独立渲染);没有验证码行时定时器根本不存在。
- 每次 RPC 不再重写一遍会话文件。
touchSession原来每次取令牌都落盘,而落盘是带 fsync 的持久写(本机实测约 50ms),面板一次打开就付四五次;它维护的只是闲置截止时间,分钟级粒度看不出差别。 - 一批每帧重建的东西做了记忆化或提到模块级:徽章样式按色调缓存、
hostOf/monogram/absoluteTime按输入缓存、身份字段集合与提示文案表提到模块级、侧栏计数查找改用 Map、行数据与匹配总数每次渲染只算一次;删掉不再使用的样式键、21 组词典条目与一层纯别名。
测试
新增 5 个压力套件(缓存链路、并发与竞态、畸形载荷、规模、时钟回拨与跳变),并并入 scripts/build.sh。共 20 个套件、1161 项断言全部通过。
v0.9.3:首次加载侧栏不再卡在占位块
修复
- 首次加载时侧栏不再卡在占位块。之前侧栏可能只剩「全部条目 / 收藏 / 验证码」三行,下方留一大片空白,状态还停在「未同步」——根因是「读资料夹」和「读侧栏统计」被放在同一个等待里,前者只服务于「移动到文件夹」,可它一旦变慢,就把已经返回的统计一起扣住。
- 两次读取改为各自结算:各带超时,谁先到谁先渲染,互不等待(资料夹 5 秒、侧栏统计 6 秒)。
- 统计读取失败时侧栏落到三个结构项并退出忙碌态,不再保留永远不会兑现的占位块。
- 占位骨架条改用边框色,浅色面板上不再是几乎看不见的一片空白。
安装:dsh plugin add dsh-vaultwarden
v0.9.2:标题排版与徽章调整
变更
- 面板标题改为纯文字「凭据库」,去掉标题前的徽章。
- 标题字号由 17px 提升到 19px。
- 侧栏与设置导航的分区徽章改为盾牌加锁孔,纯黑白,跟随主题明暗。
修复
- 修复标题与后面的版本号、GitHub 链接文字高度不齐的问题。
- 修复 GitHub 链接内图标与文字未对齐的问题。
v0.9.1:面板图标化、加载态骨架屏与过渡动效(修复打开时闪烁)
新增
- 面板按钮改为图标:字段行的「显示 / 复制」改为眼睛与双页图标,显示中换成闭眼、复制成功后换成对勾,位置仍在值那一行的右侧。
- 详情底部的四个写操作(编辑 / 归档 / 移入回收站 / 移动到文件夹,回收站条目为恢复)改为底部一条工具条,一行 28px 图标方格。
- 每个图标按钮都带悬停提示,说明该动作对条目做了什么(例如「移入回收站:软删除,之后仍可恢复」)。
- 新增过渡规范:三级时长(120 / 180 / 260ms)、位移上限 6px、列表行 18ms 错峰入场、详情卡按宽窄屏分别从右侧 / 下方进入、整面切换淡入。
- 新增统一键盘焦点环,修复编辑器输入框看不到焦点的问题。
修复
- 修复打开凭据库面板时闪烁的问题。实测打开过程 14 帧采样中 rootHeight 由 392→624、navHeight 由 48→418,现已恒定。
- 修复工具栏要等第一次读取才出现的问题,改为首帧常驻。
- 修复内容区与详情的「同步中」白屏,改为等高骨架屏。
- 修复侧栏在 overview 到达前先画一行再补到九行的问题。
- 修复分区切换时列表被清空的问题,改为旧行保留并淡化。
- 修复手机端字段行的「显示 / 复制」换行占位的问题,每个密码行省下约 34px 高度。
- 修复侧栏「全部条目 / 收藏 / 验证码」三个图标大小不一致的问题,统一光学跨度到约 12.0。
- 修复全部动效在 prefers-reduced-motion 下仍然播放的问题。
v0.8.9:修复重新验证授权过期后的明文残留,落盘写入改为独占创建 + fsync
安全
- 修复「重新验证」授权过期后条目明文仍留在面板上的问题:窗口一失效,详情页立即收回为门禁态,并重新向宿主取一次答案。
- 修复「重新验证」授权过期后不再轮询倒计时的问题:解锁后的答案不含
repromptRequired,轮询因此提前停止,授权窗口永远到不了点。 bitwarden_get的field=all不再返回「隐藏」型自定义字段的值(占位<hidden>),需要时用field=fields显式取;面板自身的读取不受影响。- 检索结果不再回传排序分
score。 - 网络错误消息只报服务器 origin,不再回带完整接口路径。
修复
- 落盘写入改为独占创建 + 随机临时名 + fsync + 目录 fsync:临时文件被预置为 0644 时权限不再被沿用,崩溃不再可能留下 0 字节记录。
- 修正面板自定义字段注释与宿主投影不符的问题。
验证
- 全量离线门禁 1,134 项通过(新增 43 项:独占创建 / 权限收窄 / symlink 不跟随 / 授权过期收回明文)。
v0.8.8:标题行显示版本号与 GitHub 链接,图标与徽章重绘,修复移动端排版
v0.8.8
新增
- 面板标题行显示「Vaultwarden 凭据库 + dsh-vaultwarden + 版本号 + GitHub 链接」,版本号构建时写入、宿主回报时以宿主为准。
- 侧栏与条目图标按宿主图标语言重绘(16 网格 / 1px 描边 / 0.16 淡体块)。
- 统一徽章体系:19px 扁平五档语义配色,底色随明暗主题翻转。
修复
- 修复移动端字段行竖排规则从未生效,密码掩码折两行、显示/复制按钮漂出卡片。
- 修复面板横向溢出。
- 修复手机窄面板下详情头部与操作按钮溢出卡片。
- 修复「显示」与「复制」按钮高度字号不一致。
- 修复字段行未顶端对齐。
- 修复掩码点在窄屏折成两行。
- 修复标题行折行时只拆下半截。
v0.8.7:安全加固——TOTP 门禁、面板明文收窄、RPC 写权限
安全
- TOTP 读取曾绕过「重新验证」门禁:
vw/totp→totpEntry()直接从种子算码,完全不查 reprompt 授权,而同族路径(get()、draftEntry()、getFreshTotp())都查。面板「验证码」分区每一行都在调它(每秒一次),等于开了「重新验证」的条目把实时二次验证码交给任何走到屏幕前的人。现在与其它字段同一道门:没有主密码证明时返回repromptRequired,面板显示「需重新验证」而不是码。 - 面板 RPC 曾可自行提升写权限:
vw/configure接受accessMode,而门禁闭包读的是同一份实时设置——一次面板调用就能把readonly抬到auto,进而让模型工具开始无审批写入每一个凭据。该参数不再生效(签名保留但忽略),只能在 DSH 设置里改。 - RPC 侧的彻底删除已移除:
vw/remove以前接受permanent+confirm,两个布尔由同一个调用方在同一次调用里给出,"不可逆且经人确认"实际是"自己确认自己"。彻底删除现在只有bitwarden_delete工具能发起(ask档带真实审批),面板与 RPC 只能移入回收站。 - 面板曾明文展示自定义字段与备注正文:打开条目就把每条自定义字段的值、每条备注的正文渲染成文本节点。Bitwarden 的 hidden 字段专放 PIN、API key、恢复码,安全笔记正文常常是某个凭据的唯一副本——现在与卡号、SSH 私钥同一档:默认圆点,点「显示」才展开,复制按钮不必展开即可用。
- 授权到期会收回已展开的明文:reprompt 的 5 分钟窗口以前只在轮询里更新一个数字,已展开的密码/卡号/私钥、已取回的窄字段、打开着的编辑器都不会关。现在窗口一失效就收起。
- 编辑器保存后不再长期持有整条明文:编辑保存后基线仍是宿主返回的完整 draft(含
passwordHistory里每一条旧密码),一直留在 React state 里。现在改用表单值重建基线,并清空密码/TOTP 输入。 - 剪贴板 20 秒后自动清除:复制密码/验证码/私钥后以前只改按钮文案,系统剪贴板里的值永久留存(剪贴板管理器、其它应用都能读)。现在写入后定时回读,确认仍是自己写的那一段才清除——读者中途复制了别的东西就不动。
- 本地快照过期即擦除:
localStorage里的列表快照(条目名、用户名、网址、自定义字段名)过期只返回 null 不删除,切换账号时也只在内存里丢弃。现在过期即删、账号不匹配即删。 vw/config不再回传会话文件绝对路径:这条元数据给出了数据目录与会话落点,面板渲染用不到。passwordHistory不再随field=all明文返回:历史密码每一条都可能仍能登录同一账号。all只回passwordHistoryCount与时间,取明文需field=passwordHistory。- 写入层缺门禁时拒绝构造:
VaultMutations缺guard以前等于放行,现在直接抛guard_missing(测试显式传guard: () => null表示"不限制")。彻底删除的 confirm 检查也移到任何网络调用之前。