From a638a29cc6e7e206cc172f18027aa27039c6f731 Mon Sep 17 00:00:00 2001 From: Minoricew <154642983+Minoricew@users.noreply.github.com> Date: Mon, 16 Jun 2025 21:24:10 +0800 Subject: [PATCH] =?UTF-8?q?[=F0=9F=9B=A0=EF=B8=8F=20Fix]=20Invalid=20log?= =?UTF-8?q?=20dir=20path=20(#24)=20&=20Remove=20PLS=20trust=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. [-] 删除了 PLS 的 Trust token 认证机制 2. [+] 现在可以在 `偏好设置` - `调试选项` 中直接打开日志文件夹了 3. [/] 日志目录不再使用 `%USERPROFILE%\Documents\HugoAura\logs` 为基准, 而是从注册表获取值 4. [/] 配置文件目录同理, 旧版配置文件将会自动迁移到新位置 --- src/aura/init/main/ipcHandler.js | 2 + .../init/main/ipcModules/baseIpcHandler.js | 118 +++++++++--------- .../init/main/ipcModules/debugIpcHandler.js | 20 +++ src/aura/init/main/logger.js | 48 +++++-- src/aura/init/shared/configManager.js | 29 ++++- src/aura/init/shared/registryManager.js | 50 +++++--- src/aura/types/shared/global.d.ts | 1 + src/aura/ui/composables/settingsRenderer.js | 17 +++ src/aura/ui/js/plsConnectionManager.js | 3 +- .../preferences/preferences.html | 22 +++- .../configSubPages/preferences/preferences.js | 8 ++ .../preferences/settings/debug.js | 40 ++++++ src/core/hook.js | 4 +- 13 files changed, 274 insertions(+), 88 deletions(-) create mode 100644 src/aura/init/main/ipcModules/debugIpcHandler.js create mode 100644 src/aura/ui/pages/configSubPages/preferences/settings/debug.js diff --git a/src/aura/init/main/ipcHandler.js b/src/aura/init/main/ipcHandler.js index 10d68c4..066ce4c 100755 --- a/src/aura/init/main/ipcHandler.js +++ b/src/aura/init/main/ipcHandler.js @@ -77,6 +77,7 @@ const buildIpcMain = (electron) => { }; const { applyBaseIpcHandler } = require("./ipcModules/baseIpcHandler"); + const { applyDebugIpcHandler } = require("./ipcModules/debugIpcHandler"); const { applyConfigIpcHandler } = require("./ipcModules/configIpcHandler"); const { applyFsIpcHandler } = require("./ipcModules/fsIpcHandler"); const { applyPlsIpcHandler } = require("./ipcModules/plsIpcHandler"); @@ -87,6 +88,7 @@ const buildIpcMain = (electron) => { }); applyBaseIpcHandler(ipcMain); + applyDebugIpcHandler(ipcMain); applyConfigIpcHandler(ipcMain); applyFsIpcHandler(ipcMain); applyPlsIpcHandler(ipcMain); diff --git a/src/aura/init/main/ipcModules/baseIpcHandler.js b/src/aura/init/main/ipcModules/baseIpcHandler.js index 7f358e0..96f4a3b 100644 --- a/src/aura/init/main/ipcModules/baseIpcHandler.js +++ b/src/aura/init/main/ipcModules/baseIpcHandler.js @@ -1,59 +1,59 @@ -// @ts-check - -const { BrowserWindow } = require("electron"); - -const composables = { - getBrowserWindowInstance: (windowKey) => { - if (!global.__HUGO_AURA__.hookedWindows) return null; - const hookedWindowIns = global.__HUGO_AURA__.hookedWindows.get(windowKey); - if (!hookedWindowIns) return undefined; - const browserWindowIns = BrowserWindow.fromWebContents( - hookedWindowIns.webContents - ); - return browserWindowIns; - }, -}; - -/** - * - * @param {import("electron").IpcMain} ipcMain - */ -const applyBaseIpcHandler = (ipcMain) => { - const methodBase = "$aura.base"; - - ipcMain.on( - `${methodBase}.minimizeWindow`, - /** - * - * @param {import("electron").IpcMainEvent} _event - * @param {{ targetWindowKey: string }} arg - */ - (_event, arg) => { - const browserWindowIns = composables.getBrowserWindowInstance( - arg.targetWindowKey - ); - if (!browserWindowIns) return; - - browserWindowIns.minimize(); - } - ); - - ipcMain.on( - `${methodBase}.closeWindow`, - /** - * - * @param {import("electron").IpcMainEvent} _event - * @param {{ targetWindowKey: string }} arg - */ - (_event, arg) => { - const browserWindowIns = composables.getBrowserWindowInstance( - arg.targetWindowKey - ); - if (!browserWindowIns) return; - - browserWindowIns.close(); - } - ); -}; - -module.exports = { applyBaseIpcHandler }; +// @ts-check + +const { BrowserWindow } = require("electron"); + +const composables = { + getBrowserWindowInstance: (windowKey) => { + if (!global.__HUGO_AURA__.hookedWindows) return null; + const hookedWindowIns = global.__HUGO_AURA__.hookedWindows.get(windowKey); + if (!hookedWindowIns) return undefined; + const browserWindowIns = BrowserWindow.fromWebContents( + hookedWindowIns.webContents + ); + return browserWindowIns; + }, +}; + +/** + * + * @param {import("electron").IpcMain} ipcMain + */ +const applyBaseIpcHandler = (ipcMain) => { + const methodBase = "$aura.base"; + + ipcMain.on( + `${methodBase}.minimizeWindow`, + /** + * + * @param {import("electron").IpcMainEvent} _event + * @param {{ targetWindowKey: string }} arg + */ + (_event, arg) => { + const browserWindowIns = composables.getBrowserWindowInstance( + arg.targetWindowKey + ); + if (!browserWindowIns) return; + + browserWindowIns.minimize(); + } + ); + + ipcMain.on( + `${methodBase}.closeWindow`, + /** + * + * @param {import("electron").IpcMainEvent} _event + * @param {{ targetWindowKey: string }} arg + */ + (_event, arg) => { + const browserWindowIns = composables.getBrowserWindowInstance( + arg.targetWindowKey + ); + if (!browserWindowIns) return; + + browserWindowIns.close(); + } + ); +}; + +module.exports = { applyBaseIpcHandler }; diff --git a/src/aura/init/main/ipcModules/debugIpcHandler.js b/src/aura/init/main/ipcModules/debugIpcHandler.js new file mode 100644 index 0000000..0376d07 --- /dev/null +++ b/src/aura/init/main/ipcModules/debugIpcHandler.js @@ -0,0 +1,20 @@ +// @ts-check + +const __SCOPE = "main"; + +/** + * + * @param {import("electron").IpcMain} ipcMain + */ +const applyDebugIpcHandler = (ipcMain) => { + const methodBase = "$aura.debug"; + + ipcMain.handle(`${methodBase}.getLogDirAsync`, (_evt, _arg) => { + return { + success: true, + data: global.__HUGO_AURA__.logDir, + }; + }); +}; + +module.exports = { applyDebugIpcHandler }; diff --git a/src/aura/init/main/logger.js b/src/aura/init/main/logger.js index a59d0b8..1fd52ba 100644 --- a/src/aura/init/main/logger.js +++ b/src/aura/init/main/logger.js @@ -2,13 +2,43 @@ const path = require("path"); const fs = require("fs"); const os = require("os"); const util = require("util"); +const RegistryManager = require("../shared/registryManager"); + +const getUserDocumentsDirPath = () => { + const registryManager = new RegistryManager(); + const pathInfo = registryManager.readRegKeySync( + '"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"', + "Personal", + false, + true, + /REG_EXPAND_SZ\s+(.+)/ + ); + if (pathInfo.success) { + const resolvedPath = pathInfo.data.replace( + /%([^%]+)%/g, + (match, varName) => { + return process.env[varName] || match; + } + ); + + return resolvedPath; + } else { + console.error( + "[HugoAura / Init / Logger] Failed to get the path of documents dir, using default val." + ); + return path.join(os.homedir(), "Documents"); + } +}; /** * * @param {import("../aura/types/main/core").WindowName} windowName */ const initLogger = (windowName) => { - const logDir = path.join(os.homedir(), "Documents", "HugoAura", "logs"); + const logDir = path.join(getUserDocumentsDirPath(), "HugoAura", "logs"); + + global.__HUGO_AURA__.logDir = logDir; + if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir, { recursive: true }); } @@ -64,25 +94,22 @@ const initLogger = (windowName) => { console.error("[CRITICAL] UNCAUGHT EXCEPTION:", err); }); - console.log( - "[HugoAura / Logger] Logger initialized. Log file:", - logFile - ); + console.log("[HugoAura / Logger] Logger initialized. Log file:", logFile); }; const cleanupOldLogs = (logDir) => { try { const files = fs.readdirSync(logDir); const now = new Date(); - const sevenDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000); + const daysAgo = new Date(now.getTime() - 15 * 24 * 60 * 60 * 1000); files.forEach((file) => { if (file.endsWith(".log")) { const filePath = path.join(logDir, file); const stats = fs.statSync(filePath); - // 如果文件创建时间超过 30 天, 则删除 - if (stats.birthtime < sevenDaysAgo) { + // 如果文件创建时间超过两周, 则删除 + if (stats.birthtime < daysAgo) { fs.unlinkSync(filePath); console.log( `[HugoAura / Logger / Cleanup] Cleaned log file: ${file}` @@ -91,7 +118,10 @@ const cleanupOldLogs = (logDir) => { } }); } catch (error) { - console.error("[HugoAura / Logger / Cleanup] Unexpected error occurred cleaning log file:", error); + console.error( + "[HugoAura / Logger / Cleanup] Unexpected error occurred cleaning log file:", + error + ); } }; diff --git a/src/aura/init/shared/configManager.js b/src/aura/init/shared/configManager.js index cc66709..58158b6 100755 --- a/src/aura/init/shared/configManager.js +++ b/src/aura/init/shared/configManager.js @@ -69,7 +69,7 @@ const deepMerge = (target, source) => { class ConfigManager { constructor() { - this.configDir = path.join(os.homedir(), "Documents", "HugoAura"); + this.configDir = path.join(global.__HUGO_AURA__.logDir, ".."); this.configPath = path.join(this.configDir, "config.json"); this.encConfigPath = path.join(this.configDir, ".cache_2eafc8d0.dat"); // (雾 /* ↑ 不使用 .tmp 扩展名, 不然容易真被清理了 */ @@ -95,6 +95,33 @@ class ConfigManager { } } + migrateOldConfigFile() { + const oldConfigPath = path.join( + os.homedir(), + "Documents", + "HugoAura", + "config.json" + ); + const oldEncConfigPath = path.join( + os.homedir(), + "Documents", + "HugoAura", + ".cache_2eafc8d0.dat" + ); + if (fs.existsSync(oldConfigPath)) { + fs.copyFileSync(oldConfigPath, this.configPath); + fs.unlinkSync(oldConfigPath); + } else if (fs.existsSync(oldEncConfigPath)) { + fs.copyFileSync(oldEncConfigPath, this.encConfigPath); + fs.unlinkSync(oldEncConfigPath); + this.useEncConfig = true; + } + + console.log( + `[HugoAura / Config] Moved old config file to ${this.configDir}` + ); + } + getHugoAuraConfigPath() { return path.dirname( this.useEncConfig ? this.encConfigPath : this.configPath diff --git a/src/aura/init/shared/registryManager.js b/src/aura/init/shared/registryManager.js index 6a552ae..0d4afc4 100755 --- a/src/aura/init/shared/registryManager.js +++ b/src/aura/init/shared/registryManager.js @@ -6,7 +6,12 @@ const { exec, execSync } = require("child_process"); const LOG_PREFIX = "[HugoAura / Init / Reg"; const LOG_PREFIX_FUNC = "[HugoAura / Reg"; -const AURA_REGISTRY_PATH = ["HKEY_USERS", ".DEFAULT", "SOFTWARE", "HugoAura"].join("\\"); +const AURA_REGISTRY_PATH = [ + "HKEY_USERS", + ".DEFAULT", + "SOFTWARE", + "HugoAura", +].join("\\"); class RegistryManager { /** @@ -341,19 +346,27 @@ class RegistryManager { } /** - * @param {string} relativePath + * @param {string} keyPath * @param {string} keyName * @param {boolean | undefined} silent + * @param {boolean} absolute + * @param {any} regex * @returns {Promise<{ success: boolean, data: string | null, error: Error | null }>} */ - async readRegKey(relativePath, keyName, silent = false) { + async readRegKey( + keyPath, + keyName, + silent = false, + absolute = false, + regex = null + ) { try { const { stdout } = await new Promise((resolve, reject) => { exec( [ "reg", "query", - [AURA_REGISTRY_PATH, relativePath].join("\\"), + absolute ? keyPath : [AURA_REGISTRY_PATH, keyPath].join("\\"), "/v", `\"${keyName}\"`, ].join(" "), @@ -367,12 +380,12 @@ class RegistryManager { if (!silent) { console.debug( - `${LOG_PREFIX_FUNC} / SUCCESS] Successfully read reg key ${relativePath}/${keyName}, stdout:`, + `${LOG_PREFIX_FUNC} / SUCCESS] Successfully read reg key ${keyPath}/${keyName}, stdout:`, stdout ); } - const match = stdout.match(/REG_SZ\s+(.+)/); + const match = regex ? stdout.match(regex) : stdout.match(/REG_SZ\s+(.+)/); if (!match) { console.warn(`${LOG_PREFIX} / WARN] Data not found in stdout`); @@ -390,10 +403,7 @@ class RegistryManager { error: null, }; } catch (e) { - console.error( - `${LOG_PREFIX} / ERROR] Failed to read reg key, error:`, - e - ); + console.error(`${LOG_PREFIX} / ERROR] Failed to read reg key, error:`, e); return { success: false, data: null, @@ -403,18 +413,26 @@ class RegistryManager { } /** - * @param {string} relativePath + * @param {string} keyPath * @param {string} keyName * @param {boolean | undefined} silent + * @param {boolean} absolute + * @param {any} regex * @returns {{ success: boolean, data: string | null, error: Error | null }} */ - readRegKeySync(relativePath, keyName, silent = false) { + readRegKeySync( + keyPath, + keyName, + silent = false, + absolute = false, + regex = null + ) { try { const readResult = execSync( [ "reg", "query", - [AURA_REGISTRY_PATH, relativePath].join("\\"), + absolute ? keyPath : [AURA_REGISTRY_PATH, keyPath].join("\\"), "/v", `\"${keyName}\"`, ].join(" "), @@ -424,11 +442,13 @@ class RegistryManager { if (readResult) { if (!silent) { console.debug( - `${LOG_PREFIX_FUNC} / SUCCESS] Successfully read reg key ${relativePath}/${keyName}, stdout:`, + `${LOG_PREFIX_FUNC} / SUCCESS] Successfully read reg key ${keyPath}/${keyName}, stdout:`, readResult ); } - const match = readResult.match(/REG_SZ\s+(.+)/); + const match = regex + ? readResult.match(regex) + : readResult.match(/REG_SZ\s+(.+)/); if (!match) { console.warn(`${LOG_PREFIX} / WARN] Data not found in stdout`); diff --git a/src/aura/types/shared/global.d.ts b/src/aura/types/shared/global.d.ts index 12f7fcd..80b977c 100755 --- a/src/aura/types/shared/global.d.ts +++ b/src/aura/types/shared/global.d.ts @@ -14,6 +14,7 @@ interface GlobalHugoAuraInfo { fsTasks?: MainProcessOnlyVal; hookedWindows?: MainProcessOnlyVal; ipcInit?: MainProcessOnlyVal; + logDir: MainProcessOnlyVal; plsRules?: Record | null; plsSettings?: Record | null; plsStats?: PLSStatus | null; diff --git a/src/aura/ui/composables/settingsRenderer.js b/src/aura/ui/composables/settingsRenderer.js index eabe406..548efe1 100755 --- a/src/aura/ui/composables/settingsRenderer.js +++ b/src/aura/ui/composables/settingsRenderer.js @@ -170,6 +170,23 @@ const renderInputArea = (entry, operationArea, descriptionArea) => { operationArea.classList.add("ase-operation-area-expanded"); return inputEl; } + case "button": { + const btnEl = document.createElement("button"); + btnEl.type = "button"; + btnEl.classList.add("btn"); + switch (entry.style) { + case "outline": + default: + btnEl.classList.add("btn-outline-primary"); + break; + } + btnEl.innerHTML = entry.buttonContent; + btnEl.onclick = entry.callbackFn; + (async () => { + descriptionArea.innerHTML = await entry.valueGetter(); + })(); + return btnEl; + } default: break; } diff --git a/src/aura/ui/js/plsConnectionManager.js b/src/aura/ui/js/plsConnectionManager.js index d6626d3..20bec23 100755 --- a/src/aura/ui/js/plsConnectionManager.js +++ b/src/aura/ui/js/plsConnectionManager.js @@ -45,8 +45,7 @@ }; const calcFullAuthToken = (/** @type {string} */ authToken) => { - const trustToken = window._ACCEPT_DATA.getData("deviceId"); - const conjToken = authToken + "AuraXAuth" + trustToken + "NeverEnds"; + const conjToken = authToken + "AuraXAuth 0xFFFFFF NeverEnds"; const crypto = require("crypto"); return crypto.createHash("sha512").update(conjToken).digest("hex"); }; diff --git a/src/aura/ui/pages/configSubPages/preferences/preferences.html b/src/aura/ui/pages/configSubPages/preferences/preferences.html index 976d1cc..f6d1c22 100755 --- a/src/aura/ui/pages/configSubPages/preferences/preferences.html +++ b/src/aura/ui/pages/configSubPages/preferences/preferences.html @@ -17,6 +17,20 @@ Aura 设置 +