fix: 落实测试反馈五项并优化分发配置
- 色带余量 RibbonAmount 独立展示与轮询刷新 - 加密狗授权码 UI、校验、auth_code 提交及 secrets 持久化 - 打印机状态全局轮询(前台 1.5s / 后台 8s) - 网络路径:列表仅映射目录,凭据单独配置,net_info 对齐 SoonWoker - 标签打印面:点击正/反面选择,print_flag 1/2/3 与模板校验 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
import fs from 'fs'
|
||||
import path from 'path'
|
||||
import { app, safeStorage } from 'electron'
|
||||
import log from 'electron-log'
|
||||
|
||||
export interface StoredNetworkCredential {
|
||||
userName: string
|
||||
password: string
|
||||
lastUsed: string
|
||||
}
|
||||
|
||||
export interface SecretsPayload {
|
||||
networkCredentials: Record<string, StoredNetworkCredential>
|
||||
dongleAuthCode: string
|
||||
}
|
||||
|
||||
const FILE_NAME = 'secrets.bin'
|
||||
|
||||
function secretsPath(): string {
|
||||
return path.join(app.getPath('userData'), FILE_NAME)
|
||||
}
|
||||
|
||||
function emptyPayload(): SecretsPayload {
|
||||
return { networkCredentials: {}, dongleAuthCode: '' }
|
||||
}
|
||||
|
||||
function canEncrypt(): boolean {
|
||||
try {
|
||||
return safeStorage.isEncryptionAvailable()
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
function readRaw(): SecretsPayload {
|
||||
const file = secretsPath()
|
||||
if (!fs.existsSync(file)) return emptyPayload()
|
||||
try {
|
||||
const buf = fs.readFileSync(file)
|
||||
if (!buf.length) return emptyPayload()
|
||||
let text: string
|
||||
if (canEncrypt()) {
|
||||
text = safeStorage.decryptString(buf)
|
||||
} else {
|
||||
text = buf.toString('utf8')
|
||||
}
|
||||
const parsed = JSON.parse(text) as Partial<SecretsPayload>
|
||||
return {
|
||||
networkCredentials:
|
||||
parsed.networkCredentials && typeof parsed.networkCredentials === 'object'
|
||||
? parsed.networkCredentials
|
||||
: {},
|
||||
dongleAuthCode: typeof parsed.dongleAuthCode === 'string' ? parsed.dongleAuthCode : ''
|
||||
}
|
||||
} catch (e) {
|
||||
log.warn('[secrets-store] read failed', e)
|
||||
return emptyPayload()
|
||||
}
|
||||
}
|
||||
|
||||
function writeRaw(payload: SecretsPayload): void {
|
||||
const text = JSON.stringify(payload)
|
||||
try {
|
||||
const buf = canEncrypt() ? safeStorage.encryptString(text) : Buffer.from(text, 'utf8')
|
||||
fs.writeFileSync(secretsPath(), buf)
|
||||
} catch (e) {
|
||||
log.warn('[secrets-store] write failed', e)
|
||||
}
|
||||
}
|
||||
|
||||
let cache: SecretsPayload | null = null
|
||||
|
||||
export function getSecrets(): SecretsPayload {
|
||||
if (!cache) cache = readRaw()
|
||||
return {
|
||||
networkCredentials: { ...cache.networkCredentials },
|
||||
dongleAuthCode: cache.dongleAuthCode
|
||||
}
|
||||
}
|
||||
|
||||
export function setSecrets(patch: Partial<SecretsPayload>): SecretsPayload {
|
||||
const current = getSecrets()
|
||||
if (patch.networkCredentials !== undefined) {
|
||||
current.networkCredentials = { ...patch.networkCredentials }
|
||||
}
|
||||
if (patch.dongleAuthCode !== undefined) {
|
||||
current.dongleAuthCode = patch.dongleAuthCode
|
||||
}
|
||||
cache = current
|
||||
writeRaw(current)
|
||||
return getSecrets()
|
||||
}
|
||||
Reference in New Issue
Block a user