From fc760d09781e3934ea0567a150831d83d4ace22f Mon Sep 17 00:00:00 2001 From: "yinjun.chen1" Date: Wed, 16 Sep 2026 14:07:22 +0800 Subject: [PATCH] no message --- background.js | 87 ++++++++++++++++++++++++++++++--------------------- popup.js | 18 ++++++++--- 2 files changed, 66 insertions(+), 39 deletions(-) diff --git a/background.js b/background.js index cf2b980..f4d09e3 100644 --- a/background.js +++ b/background.js @@ -19,30 +19,38 @@ chrome.action.onClicked.addListener((tab) => { } }); -// 明文数据无法在无口令下加密,暂存为 pendingImport,待用户设置口令时由 setupVault 导入 +// 旧版明文数据迁移:把 loginConfigs 转为 environments 明文结构 async function migrateLegacyVault() { const data = await chrome.storage.local.get(["environments", "loginConfigs", "vaultMeta"]); - const hasVault = !!data.vaultMeta; - if (hasVault) return; + if (data.vaultMeta) return; + if (Array.isArray(data.environments) && data.environments.length > 0) return; + if (Array.isArray(data.loginConfigs) && data.loginConfigs.length > 0) { + const envs = [{ id: "env_legacy", name: "默认", configs: data.loginConfigs }]; + await chrome.storage.local.set({ environments: envs }); + await chrome.storage.local.remove("loginConfigs"); + console.log("[AutoLogin] 旧版 loginConfigs 已迁移为明文 environments"); + } +} - const legacyEnvs = data.environments; - const legacyConfigs = data.loginConfigs; - if (legacyEnvs || legacyConfigs) { - let pending = null; - if (Array.isArray(legacyEnvs) && legacyEnvs.length > 0) { - pending = { type: "environments", data: legacyEnvs }; - } else if (Array.isArray(legacyConfigs) && legacyConfigs.length > 0) { - pending = { - type: "configs", - data: [{ id: "env_legacy", name: "默认", configs: legacyConfigs }], - }; - } - if (pending) { - await chrome.storage.local.set({ pendingImport: pending }); - // 清掉明文,避免继续以明文存在 - await chrome.storage.local.remove(["environments", "loginConfigs"]); - console.log("[AutoLogin] 旧版明文数据已标记为待导入,等待设置口令后加密"); - } +// 无 vault 明文模式:确保 session 有 environments(从 local 加载或创建预设) +async function ensurePlainEnvironments() { + const data = await chrome.storage.local.get("environments"); + let envs = data.environments; + if (!Array.isArray(envs) || envs.length === 0) { + const PRESET = ["个人", "测试", "生产"]; + envs = PRESET.map((name) => ({ + id: "env_" + Date.now().toString(36) + Math.random().toString(36).slice(2, 8), + name, + configs: [], + })); + await chrome.storage.local.set({ environments: envs }); + } + const session = await chrome.storage.session.get("environments"); + if (!session.environments) { + await chrome.storage.session.set({ + environments: envs, + activeEnvId: envs[0]?.id || null, + }); } } @@ -66,13 +74,18 @@ async function doLock() { // session 中 environments 变化时用内存密钥重新加密写回 local chrome.storage.onChanged.addListener(async (changes, areaName) => { if (areaName !== "session") return; - if (!changes.environments || !masterKey) return; + if (!changes.environments) return; + const environments = changes.environments.newValue; + if (!environments) return; // 锁定时被清除,无需持久化 try { - const environments = changes.environments.newValue; - if (!environments) return; // 锁定时被清除,无需加密 - await CryptoStore.persistEncrypted(environments, masterKey); + if (masterKey) { + await CryptoStore.persistEncrypted(environments, masterKey); + } else { + // 无 vault 明文模式:明文回写 local + await chrome.storage.local.set({ environments }); + } } catch (err) { - console.warn("[AutoLogin] 加密回写失败:", err); + console.warn("[AutoLogin] 持久化失败:", err); } }); @@ -83,18 +96,22 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { switch (message.action) { case "getVaultStatus": { const hasVault = await CryptoStore.hasVault(); - const unlocked = hasVault ? !!masterKey : false; - const pending = (await chrome.storage.local.get("pendingImport")).pendingImport || null; - sendResponse({ hasVault, unlocked, pendingImport: !!pending }); + if (!hasVault) { + await ensurePlainEnvironments(); + sendResponse({ hasVault: false, unlocked: true, pendingImport: false }); + break; + } + const unlocked = !!masterKey; + sendResponse({ hasVault, unlocked, pendingImport: false }); break; } case "setupVault": { - // 首次设置口令,若有待导入的旧数据则一并加密 - const pendingData = await chrome.storage.local.get("pendingImport"); - let initialEnvs = []; - if (pendingData.pendingImport) { - initialEnvs = pendingData.pendingImport.data; + // 设置口令:若已有明文 environments 则加密它,否则创建预设 + const localData = await chrome.storage.local.get("environments"); + let initialEnvs; + if (Array.isArray(localData.environments) && localData.environments.length > 0) { + initialEnvs = localData.environments; } else { const PRESET = ["个人", "测试", "生产"]; initialEnvs = PRESET.map((name) => ({ @@ -104,7 +121,7 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { })); } masterKey = await CryptoStore.setupVault(message.password, initialEnvs); - await chrome.storage.local.remove("pendingImport"); + await chrome.storage.local.remove("environments"); // 已加密,明文不再需要 resetAutoLockTimer(); sendResponse({ success: true }); break; diff --git a/popup.js b/popup.js index f8b14a1..eac0c07 100644 --- a/popup.js +++ b/popup.js @@ -1336,10 +1336,17 @@ document.addEventListener("DOMContentLoaded", () => { try { const resp = await sendMessage({ action: "getVaultStatus" }); if (!resp.hasVault) { - showLockScreen("setup"); + // 无 vault:明文模式,直接进入,不锁定 + lockBtn.hidden = true; + showMainUI(); + loadDraft(); + renderEnvSelect(); + renderConfigList(); } else if (!resp.unlocked) { + lockBtn.hidden = false; showLockScreen("unlock"); } else { + lockBtn.hidden = false; showMainUI(); loadDraft(); renderEnvSelect(); @@ -1347,9 +1354,12 @@ document.addEventListener("DOMContentLoaded", () => { } } catch (err) { console.warn("[AutoLogin]", t("logGetLockStatusFail"), err); - lockWarn.textContent = t("lockWarnNoService"); - lockWarn.style.display = "block"; - showLockScreen("setup"); + // background 不可用时不阻塞用户,直接进入主界面 + lockBtn.hidden = true; + showMainUI(); + loadDraft(); + renderEnvSelect(); + renderConfigList(); } }