问题描述 (Bug Description)
在在线同步模式下,用户在编辑或新建密码条目时,标签输入框无法展示并复用已有标签。当点击输入框时,下方的推荐面板(“输入新标签,或从已有标签中选择”)始终为空,导致每次编辑条目或添加标签都必须手动重新完整输入,而无法像离线本地模式那样直接选择已保存过的历史标签。
复现步骤 (Reproduction Steps)
- 运行并登录已连接服务端的 BearPassword 桌面端。
- 新增或编辑一个密码条目,在“标签”栏中输入并保存一个新的标签(例如
Work 或 Personal)。
- 保存该密码条目。
- 再次打开该条目(或新建另一个条目),点击“标签”输入框。
- 观察输入框下方的下拉候选面板(始终显示空提示,无法选择到刚存的标签)。
预期行为 (Expected Behavior)
当点击标签输入框时,下方的下拉推荐面板应正确列出当前用户在其他密码条目中已经创建并使用过的所有标签(如 Work, Personal),以便直接点击复用,而不是每次都需要手动重新打字。
运行环境 (Environment)
- 操作系统:Windows 11
- 应用版本:bear-password-desktop v26.6.20
初步排查 (Possible Cause)
该问题是由于端到端加密(E2EE)设计与服务端的解析逻辑冲突导致的:
- 客户端加密上传:
在端到端加密设计中,客户端在保存条目时,会通过前端方法(如 encryptPasswordEntryParams)将包含 passwordLabels(标签)的明文数据整体加密。最终上传并存储在服务端数据库中的 content 字段是加密后的信封对象。
- 服务端无法解密提取:
服务端提供了获取已用标签列表的接口(GET /passwords/labels),其对应的服务实现类方法(listUserLabels)会查询用户的全部密码记录,并尝试通过映射器方法(extractLabels)从 JSON 内容中提取明文的 passwordLabels 字段。由于服务端没有用户的主密码(Master Password),无法解密密文,因此它拿不到任何标签数据,接口始终只能返回空列表。
建议解决方案 (Suggested Solutions)
在端到端加密/零知识安全架构下,服务端不应获知明文数据(包括标签名称)。
建议不应调用服务端的 /passwords/labels 接口,而应修改前端 bear-password-desktop/src/api/vault.ts 中的 getPasswordLabelsApi 方法,使其在在线同步模式下也如同离线模式一样,直接从前端已经解密过的本地缓存(如 Pinia 状态管理 useVaultStore().allEntries)中收集并去重汇总已有标签。
问题描述 (Bug Description)
在在线同步模式下,用户在编辑或新建密码条目时,标签输入框无法展示并复用已有标签。当点击输入框时,下方的推荐面板(“输入新标签,或从已有标签中选择”)始终为空,导致每次编辑条目或添加标签都必须手动重新完整输入,而无法像离线本地模式那样直接选择已保存过的历史标签。
复现步骤 (Reproduction Steps)
Work或Personal)。预期行为 (Expected Behavior)
当点击标签输入框时,下方的下拉推荐面板应正确列出当前用户在其他密码条目中已经创建并使用过的所有标签(如
Work,Personal),以便直接点击复用,而不是每次都需要手动重新打字。运行环境 (Environment)
初步排查 (Possible Cause)
该问题是由于端到端加密(E2EE)设计与服务端的解析逻辑冲突导致的:
在端到端加密设计中,客户端在保存条目时,会通过前端方法(如
encryptPasswordEntryParams)将包含passwordLabels(标签)的明文数据整体加密。最终上传并存储在服务端数据库中的content字段是加密后的信封对象。服务端提供了获取已用标签列表的接口(
GET /passwords/labels),其对应的服务实现类方法(listUserLabels)会查询用户的全部密码记录,并尝试通过映射器方法(extractLabels)从 JSON 内容中提取明文的passwordLabels字段。由于服务端没有用户的主密码(Master Password),无法解密密文,因此它拿不到任何标签数据,接口始终只能返回空列表。建议解决方案 (Suggested Solutions)
在端到端加密/零知识安全架构下,服务端不应获知明文数据(包括标签名称)。
建议不应调用服务端的
/passwords/labels接口,而应修改前端bear-password-desktop/src/api/vault.ts中的getPasswordLabelsApi方法,使其在在线同步模式下也如同离线模式一样,直接从前端已经解密过的本地缓存(如 Pinia 状态管理useVaultStore().allEntries)中收集并去重汇总已有标签。