no message
This commit is contained in:
+52
-35
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user