Files
2026-07-15 18:01:56 +08:00

67 lines
1.7 KiB
JavaScript

// 密钥安全存储:用 Electron safeStorage 加密后写入 userData/secrets.json
// name 取 "github" / "registry"。读时解密;无则返回空串。
const fs = require("fs");
const path = require("path");
const { app, safeStorage } = require("electron");
function secretsPath() {
return path.join(app.getPath("userData"), "secrets.json");
}
function readStore() {
try {
const txt = fs.readFileSync(secretsPath(), "utf-8");
return JSON.parse(txt || "{}");
} catch (e) {
return {};
}
}
function writeStore(store) {
const p = secretsPath();
fs.mkdirSync(path.dirname(p), { recursive: true });
fs.writeFileSync(p, JSON.stringify(store, null, 2), { encoding: "utf-8" });
try {
fs.chmodSync(p, 0o600);
} catch (e) {
/* 忽略权限设置失败(非 POSIX 平台) */
}
}
// 取密钥;无则空串
function getSecret(name) {
const store = readStore();
const enc = store[name];
if (!enc) return "";
try {
if (safeStorage.isEncryptionAvailable()) {
return safeStorage.decryptString(Buffer.from(enc, "base64"));
}
// 加密不可用时的降级:明文(base64)存储
return Buffer.from(enc, "base64").toString("utf-8");
} catch (e) {
return "";
}
}
// 存密钥;空值视为删除
function setSecret(name, value) {
const store = readStore();
if (!value) {
delete store[name];
writeStore(store);
return { ok: true };
}
let encB64;
if (safeStorage.isEncryptionAvailable()) {
encB64 = safeStorage.encryptString(value).toString("base64");
} else {
encB64 = Buffer.from(value, "utf-8").toString("base64");
}
store[name] = encB64;
writeStore(store);
return { ok: true };
}
module.exports = { getSecret, setSecret };