Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Connection 设置页会按 Proxy bundle、loopback 端点、本地 CA、系统

## 签名更新

桌面设置页通过 Tauri updater 检查固定的 GitHub Release `latest.json`。安装命令会重新核对版本、切回 Gateway、恢复受管系统代理,并在应用数据目录写入 SQLCipher 备份和版本化恢复 journal 后才下载签名制品。未配置可信公钥的构建会明确禁用更新。
桌面设置页通过 Tauri updater 检查固定的 GitHub Release `latest.json`。安装命令会重新核对版本、切回 Gateway、恢复受管系统代理,并在应用数据目录写入 SQLCipher 备份和版本化恢复 journal 后才下载签名制品。若升级后主库无法打开,应用只接受版本、固定文件名和字节数均匹配的加密快照,并以禁止捕获和系统变更的只读模式开放搜索、检查与脱敏导出。未配置可信公钥的构建会明确禁用更新。

正式 bundle 构建必须在环境中提供:

Expand Down
29 changes: 29 additions & 0 deletions apps/desktop/e2e/workbench.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,33 @@ test.describe("desktop workbench quality baseline", () => {
expect(layout.scrollWidth).toBe(layout.clientWidth);
expect(layout.scrollHeight).toBeLessThanOrEqual(layout.clientHeight);
});

test("keeps validated update recovery read-only and exportable", async ({ page }) => {
await page.setViewportSize(MINIMUM_VIEWPORT);
await page.goto("/?recoveryMode=1");

await expect(page.getByRole("status", { name: "Read-only update recovery mode" }))
.toBeVisible();
await expect(page.getByRole("button", { name: "Resume capture" })).toBeDisabled();
await expect(page.getByRole("button", { name: "Gateway" })).toBeDisabled();
await expect(page.getByRole("button", { name: "Proxy" })).toBeDisabled();

await page.getByRole("button", { name: "Export request" }).click();
await expect(page.getByRole("dialog", { name: "Export request" })).toBeVisible();
await page.getByRole("button", { name: "Close export" }).click();
await page.getByRole("button", { name: "Settings" }).click();
const dialog = page.getByRole("dialog", { name: "Settings & diagnostics" });
await dialog.getByRole("tab", { name: "Updates" }).click();
await expect(dialog.getByText("Updates are disabled")).toBeVisible();
await expect(dialog.getByRole("button", { name: "Check" })).toBeDisabled();

const layout = await page.evaluate(() => ({
clientWidth: document.documentElement.clientWidth,
scrollWidth: document.documentElement.scrollWidth,
clientHeight: document.documentElement.clientHeight,
scrollHeight: document.documentElement.scrollHeight,
}));
expect(layout.scrollWidth).toBe(layout.clientWidth);
expect(layout.scrollHeight).toBe(layout.clientHeight);
});
});
Loading
Loading