From 12f10408843e259a15d50e9fe3066bdc35a4ae17 Mon Sep 17 00:00:00 2001 From: Minoricew <154642983+Minoricew@users.noreply.github.com> Date: Sun, 25 May 2025 22:40:12 +0800 Subject: [PATCH] [Feat] Early support for PLS & Use JSDoc (Partially) --- LICENSE | 0 README.md | 0 jsconfig.json | 9 + scripts/cd.bat | 0 scripts/kad.bat | 0 scripts/kar.bat | 0 src/aura/init/main/ipcHandler.js | 56 +++- .../init/main/ipcModules/plsIpcHandler.js | 190 +++++++++++ src/aura/init/preload/webpackHook.js | 0 src/aura/init/rendererHook/hooksManager.js | 32 +- src/aura/init/rendererHook/injection.js | 0 src/aura/init/rendererHook/networkHook.js | 0 src/aura/init/shared/configManager.js | 0 src/aura/init/shared/default.json | 1 + src/aura/init/zeron/hookWS.js | 0 .../jsRewrite/network/disableBehaviorAudit.js | 0 src/aura/jsRewrite/network/disableFriday.js | 0 .../jsRewrite/vendor/passwordValidation.js | 0 src/aura/types/main/core.d.ts | 33 ++ src/aura/types/main/electron.d.ts | 10 + src/aura/types/render/global.d.ts | 14 + src/aura/types/render/uiHook.d.ts | 25 ++ src/aura/types/shared/pls/status.d.ts | 9 + src/aura/types/shared/pls/websocket.d.ts | 18 ++ src/aura/ui/bootstrap/bootstrap.bundle.min.js | 0 src/aura/ui/bootstrap/bootstrap.min.css | 0 src/aura/ui/composables/plsConfigManager.js | 93 ++++++ src/aura/ui/composables/settingsRenderer.js | 49 ++- src/aura/ui/css/assistant.css | 0 src/aura/ui/css/form.css | 0 src/aura/ui/css/global.css | 0 .../{hooks => hookDefinitions}/assistant.js | 25 +- .../ui/hookDefinitions/desktopAssistant.js | 15 + src/aura/ui/js/global.js | 0 src/aura/ui/js/plsConnectionManager.js | 192 +++++++++++ src/aura/ui/layui/css/layui.css | 0 src/aura/ui/layui/font/iconfont.eot | Bin src/aura/ui/layui/font/iconfont.svg | 0 src/aura/ui/layui/font/iconfont.ttf | Bin src/aura/ui/layui/font/iconfont.woff | Bin src/aura/ui/layui/font/iconfont.woff2 | Bin src/aura/ui/pages/config/config.css | 0 src/aura/ui/pages/config/config.html | 27 +- src/aura/ui/pages/config/config.js | 22 +- .../behaviourCtrl/behaviourCtrl.css | 8 + .../behaviourCtrl/behaviourCtrl.html | 69 ++++ .../behaviourCtrl/behaviourCtrl.js | 44 +++ .../behaviourCtrl/plsStatus.css | 78 +++++ .../behaviourCtrl/plsStatus.html | 51 +++ .../configSubPages/behaviourCtrl/plsStatus.js | 86 +++++ .../behaviourCtrl/settings/basic.js | 45 +++ .../disableLimitations/disableLimitations.css | 1 - .../disableLimitations.html | 0 .../disableLimitations/disableLimitations.js | 0 .../disableLimitations/settings/audit.js | 0 .../disableLimitations/settings/auth.js | 4 +- src/aura/ui/pages/headerIcon/headerIcon.css | 0 src/aura/ui/pages/headerIcon/headerIcon.html | 0 src/aura/ui/pages/headerIcon/headerIcon.js | 0 src/aura/ui/pls/pushHandler.js | 30 ++ src/aura/ui/pls/routes/basic.js | 33 ++ src/aura/ui/pls/routes/config.js | 32 ++ src/aura/ui/static/aura.svg | 0 src/aura/ui/static/aura_pls.png | Bin 0 -> 21320 bytes src/aura/ui/static/config/about.svg | 0 src/aura/ui/static/config/behaviour_mon.svg | 0 src/aura/ui/static/config/no_limitations.svg | 0 src/aura/ui/static/config/plugin.svg | 0 src/core/hook.js | 300 ++++++++++-------- src/core/preload.js | 0 src/core/zeron.js | 54 ++-- 71 files changed, 1470 insertions(+), 185 deletions(-) mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md create mode 100755 jsconfig.json mode change 100644 => 100755 scripts/cd.bat mode change 100644 => 100755 scripts/kad.bat mode change 100644 => 100755 scripts/kar.bat mode change 100644 => 100755 src/aura/init/main/ipcHandler.js create mode 100755 src/aura/init/main/ipcModules/plsIpcHandler.js mode change 100644 => 100755 src/aura/init/preload/webpackHook.js mode change 100644 => 100755 src/aura/init/rendererHook/hooksManager.js mode change 100644 => 100755 src/aura/init/rendererHook/injection.js mode change 100644 => 100755 src/aura/init/rendererHook/networkHook.js mode change 100644 => 100755 src/aura/init/shared/configManager.js mode change 100644 => 100755 src/aura/init/shared/default.json mode change 100644 => 100755 src/aura/init/zeron/hookWS.js mode change 100644 => 100755 src/aura/jsRewrite/network/disableBehaviorAudit.js mode change 100644 => 100755 src/aura/jsRewrite/network/disableFriday.js mode change 100644 => 100755 src/aura/jsRewrite/vendor/passwordValidation.js create mode 100755 src/aura/types/main/core.d.ts create mode 100755 src/aura/types/main/electron.d.ts create mode 100755 src/aura/types/render/global.d.ts create mode 100755 src/aura/types/render/uiHook.d.ts create mode 100755 src/aura/types/shared/pls/status.d.ts create mode 100755 src/aura/types/shared/pls/websocket.d.ts mode change 100644 => 100755 src/aura/ui/bootstrap/bootstrap.bundle.min.js mode change 100644 => 100755 src/aura/ui/bootstrap/bootstrap.min.css create mode 100755 src/aura/ui/composables/plsConfigManager.js mode change 100644 => 100755 src/aura/ui/composables/settingsRenderer.js mode change 100644 => 100755 src/aura/ui/css/assistant.css mode change 100644 => 100755 src/aura/ui/css/form.css mode change 100644 => 100755 src/aura/ui/css/global.css rename src/aura/ui/{hooks => hookDefinitions}/assistant.js (61%) mode change 100644 => 100755 create mode 100755 src/aura/ui/hookDefinitions/desktopAssistant.js mode change 100644 => 100755 src/aura/ui/js/global.js create mode 100755 src/aura/ui/js/plsConnectionManager.js mode change 100644 => 100755 src/aura/ui/layui/css/layui.css mode change 100644 => 100755 src/aura/ui/layui/font/iconfont.eot mode change 100644 => 100755 src/aura/ui/layui/font/iconfont.svg mode change 100644 => 100755 src/aura/ui/layui/font/iconfont.ttf mode change 100644 => 100755 src/aura/ui/layui/font/iconfont.woff mode change 100644 => 100755 src/aura/ui/layui/font/iconfont.woff2 mode change 100644 => 100755 src/aura/ui/pages/config/config.css mode change 100644 => 100755 src/aura/ui/pages/config/config.html mode change 100644 => 100755 src/aura/ui/pages/config/config.js create mode 100755 src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.css create mode 100755 src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.html create mode 100755 src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.js create mode 100755 src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.css create mode 100755 src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.html create mode 100755 src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.js create mode 100755 src/aura/ui/pages/configSubPages/behaviourCtrl/settings/basic.js mode change 100644 => 100755 src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.css mode change 100644 => 100755 src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.html mode change 100644 => 100755 src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.js mode change 100644 => 100755 src/aura/ui/pages/configSubPages/disableLimitations/settings/audit.js mode change 100644 => 100755 src/aura/ui/pages/configSubPages/disableLimitations/settings/auth.js mode change 100644 => 100755 src/aura/ui/pages/headerIcon/headerIcon.css mode change 100644 => 100755 src/aura/ui/pages/headerIcon/headerIcon.html mode change 100644 => 100755 src/aura/ui/pages/headerIcon/headerIcon.js create mode 100755 src/aura/ui/pls/pushHandler.js create mode 100755 src/aura/ui/pls/routes/basic.js create mode 100755 src/aura/ui/pls/routes/config.js mode change 100644 => 100755 src/aura/ui/static/aura.svg create mode 100755 src/aura/ui/static/aura_pls.png mode change 100644 => 100755 src/aura/ui/static/config/about.svg mode change 100644 => 100755 src/aura/ui/static/config/behaviour_mon.svg mode change 100644 => 100755 src/aura/ui/static/config/no_limitations.svg mode change 100644 => 100755 src/aura/ui/static/config/plugin.svg mode change 100644 => 100755 src/core/hook.js mode change 100644 => 100755 src/core/preload.js mode change 100644 => 100755 src/core/zeron.js diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/jsconfig.json b/jsconfig.json new file mode 100755 index 0000000..7f3328e --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "module": "CommonJS", + "target": "ES2015", + "allowImportingTsExtensions": false, + "strictNullChecks": true, + "strictFunctionTypes": true + } +} \ No newline at end of file diff --git a/scripts/cd.bat b/scripts/cd.bat old mode 100644 new mode 100755 diff --git a/scripts/kad.bat b/scripts/kad.bat old mode 100644 new mode 100755 diff --git a/scripts/kar.bat b/scripts/kar.bat old mode 100644 new mode 100755 diff --git a/src/aura/init/main/ipcHandler.js b/src/aura/init/main/ipcHandler.js old mode 100644 new mode 100755 index bc4b181..5d4f69b --- a/src/aura/init/main/ipcHandler.js +++ b/src/aura/init/main/ipcHandler.js @@ -1,10 +1,64 @@ +// @ts-check + +const __SCOPE = "main"; + +/** + * + * @param {import("electron")} electron + */ const buildIpcMain = (electron) => { - const { app, ipcMain } = electron; + const { app } = electron; + /** + * @type {import("../../types/main/electron").AuraIPCMain} + */ + // @ts-ignore + const ipcMain = electron.ipcMain; + + /** + * + * @param {string} windowKey + * @param {string} channel + * @param {any} data + * @param {import("electron").WebContents?} grep + */ + ipcMain.send = (windowKey, channel, data, grep = null) => { + /** + * + * @param {string} key + * @param {string} chan + * @param {any} targetData + */ + const sendDataToWebContents = (key, chan, targetData) => { + const webContents = + global.__HUGO_AURA__.hookedWindows.get(key).webContents; + + if (grep !== webContents) webContents.send(chan, targetData); + }; + + if (windowKey === "*") { + for (const perWindow of global.__HUGO_AURA__.hookedWindows.keys()) { + sendDataToWebContents(perWindow, channel, data); + } + } else { + const isWindowValid = global.__HUGO_AURA__.hookedWindows.has(windowKey); + if (!isWindowValid) { + throw new Error( + `[HugoAura / Main / IPC / ERROR] Unknown windowKey: ${windowKey}` + ); + } + + sendDataToWebContents(windowKey, channel, data); + } + }; + + const { applyPlsIpcHandler } = require("./ipcModules/plsIpcHandler"); ipcMain.handle("$aura.base.restartApplication", async () => { app.relaunch(); app.exit(0); }); + + applyPlsIpcHandler(ipcMain); }; module.exports = { buildIpcMain }; diff --git a/src/aura/init/main/ipcModules/plsIpcHandler.js b/src/aura/init/main/ipcModules/plsIpcHandler.js new file mode 100755 index 0000000..cb27fff --- /dev/null +++ b/src/aura/init/main/ipcModules/plsIpcHandler.js @@ -0,0 +1,190 @@ +// @ts-check + +const __SCOPE = "main"; + +const fs = require("fs"); +const path = require("path"); + +/** + * + * @param {import("../../../types/main/electron").AuraIPCMain} ipcMain + */ +const applyPlsIpcHandler = (ipcMain) => { + const methodBase = "$aura.pls"; + + const isPlsDetached = process.argv.includes("--pls-detach"); + + global.__HUGO_AURA__.plsStats = { + installed: false, + launched: false, + detached: isPlsDetached, + connected: false, + version: "未知", + status: "dead", + authToken: global.__HUGO_AURA_CONFIG__.plsToken, + }; + + ipcMain.handle( + `${methodBase}.getPlsFolderExists`, + /** + * + * @returns {{ success: boolean; data: { isExists: boolean }; error?: Error }} + */ + (_event, _arg) => { + const plsFolderPath = path.join(__dirname, "../../../proxy"); + try { + const result = fs.existsSync(plsFolderPath); + return { + success: true, + data: { isExists: result }, + }; + } catch (e) { + return { + success: false, + data: { isExists: false }, + error: e, + }; + } + } + ); + + ipcMain.handle( + `${methodBase}.getPlsStats`, + /** + * + * @returns {{ success: boolean; data: PLSStatus; }} + */ + (_event, _arg) => { + return { + success: true, + data: global.__HUGO_AURA__.plsStats, + }; + } + ); + + ipcMain.handle( + `${methodBase}.updatePlsStats`, + /** + * + * @param {import("electron").IpcMainInvokeEvent} _event + * @param {PLSStatus} arg + * @returns + */ + (_event, arg) => { + global.__HUGO_AURA__.plsStats = arg; + ipcMain.send("assistant", `${methodBase}.post.onPlsStatsUpdate`, arg); + return { + success: true, + }; + } + ); + + ipcMain.handle( + `${methodBase}.getPlsSettings`, + /** + * + * @returns {{ success: boolean; data: Record }} + */ + (_event, _arg) => { + return { + success: true, + data: global.__HUGO_AURA__.plsSettings, + }; + } + ); + + ipcMain.handle( + `${methodBase}.updatePlsSettings`, + /** + * + * @param {import("electron").IpcMainInvokeEvent} _event + * @param {Record} arg + * @returns + */ + (_event, arg) => { + global.__HUGO_AURA__.plsSettings = arg; + return { + success: true, + }; + } + ); + + ipcMain.handle( + `${methodBase}.getPlsRules`, + /** + * + * @returns {{ success: boolean; data: Record }} + */ + (_event, _arg) => { + return { + success: true, + data: global.__HUGO_AURA__.plsRules, + }; + } + ); + + ipcMain.handle( + `${methodBase}.updatePlsRules`, + /** + * + * @param {import("electron").IpcMainInvokeEvent} _event + * @param {Record} arg + * @returns + */ + (_event, arg) => { + global.__HUGO_AURA__.plsRules = arg; + return { + success: true, + }; + } + ); + + ipcMain.on( + `${methodBase}.ws.broadcastMessageRecv`, + /** + * + * @param {import("electron").IpcMainEvent} _event + * @param {PLSResponse} arg + */ + (_event, arg) => { + ipcMain.send("assistant", `${methodBase}.ws.post.onNewMsgRecv`, arg); + } + ); + + ipcMain.handle( + `${methodBase}.ws.sendWsMessage`, + /** + * + * @param {import("electron").IpcMainInvokeEvent} _event + * @param {ClientPLSRequest} arg + */ + (_event, arg) => { + ipcMain.send( + "desktopAssistant", + `${methodBase}.ws.post.onReqSendMsg`, + arg + ); + } + ); + + ipcMain.handle( + `${methodBase}.syncPlsConfig`, + /** + * + * @param {import("electron").IpcMainInvokeEvent} event + * @param {{ basic: Record, rules: Record }} arg + */ + (event, arg) => { + global.__HUGO_AURA__.plsRules = arg.rules; + global.__HUGO_AURA__.plsSettings = arg.basic; + + ipcMain.send("*", `${methodBase}.syncPlsConfig`, arg, event.sender); + + return { + success: true, + }; + } + ); +}; + +module.exports = { applyPlsIpcHandler }; diff --git a/src/aura/init/preload/webpackHook.js b/src/aura/init/preload/webpackHook.js old mode 100644 new mode 100755 diff --git a/src/aura/init/rendererHook/hooksManager.js b/src/aura/init/rendererHook/hooksManager.js old mode 100644 new mode 100755 index ad68e83..bf9a766 --- a/src/aura/init/rendererHook/hooksManager.js +++ b/src/aura/init/rendererHook/hooksManager.js @@ -1,13 +1,20 @@ +// @ts-check + const fs = require("fs"); const path = require("path"); class HooksManager { loadHooks() { - if (global.__HUGO_AURA__.hooks) { + if ( + global.__HUGO_AURA__.hooks && + Object.keys(global.__HUGO_AURA__.hooks).length !== 0 + ) { return global.__HUGO_AURA__.hooks; } - const hooksPath = path.join(__dirname, "../../../aura/ui/hooks"); + const hooksPath = path.join(__dirname, "../../../aura/ui/hookDefinitions"); + + /** @type {import("../../types/main/core").HooksMap} */ const hooks = new Map(); try { @@ -17,6 +24,7 @@ class HooksManager { try { const hook = require(path.join(hooksPath, file)); + /** @type {import("../../types/main/core").WindowName} */ const targetWindow = hook.windowName || path.basename(file, ".js"); hooks.set(targetWindow, hook); console.log( @@ -40,13 +48,19 @@ class HooksManager { return hooks; } - cleanupWindow(windowKey, listeners) { + /** + * + * @param {import("../../types/main/core").WindowName} windowKey + * @param {import("../../types/main/core").HookedWindow} hookedWindowProps + */ + cleanupWindow(windowKey, hookedWindowProps) { console.log( `[HugoAura / Cleanup / ${windowKey}] Window destroyed, cleaning up...` ); - if (listeners) { - const { webContents, domReadyListener, destroyedListener } = listeners; + if (hookedWindowProps) { + const { webContents, domReadyListener, destroyedListener } = + hookedWindowProps; webContents.removeListener("dom-ready", domReadyListener); webContents.removeListener("destroyed", destroyedListener); } @@ -54,9 +68,17 @@ class HooksManager { global.__HUGO_AURA__.hookedWindows.delete(windowKey); } + /** + * + * @param {import("electron").WebContents} webContents + * @param {import("../../types/render/uiHook").UIHookConfigFin} hookConfig + * @param {import("../../types/main/core").WindowName} windowName + * @returns + */ handleWindowHook(webContents, hookConfig, windowName) { if (!hookConfig) return; + /** @type {import("../../types/main/core").WindowName} */ const windowKey = `${hookConfig.windowName || windowName}`; if (global.__HUGO_AURA__.hookedWindows.has(windowKey)) { console.log( diff --git a/src/aura/init/rendererHook/injection.js b/src/aura/init/rendererHook/injection.js old mode 100644 new mode 100755 diff --git a/src/aura/init/rendererHook/networkHook.js b/src/aura/init/rendererHook/networkHook.js old mode 100644 new mode 100755 diff --git a/src/aura/init/shared/configManager.js b/src/aura/init/shared/configManager.js old mode 100644 new mode 100755 diff --git a/src/aura/init/shared/default.json b/src/aura/init/shared/default.json old mode 100644 new mode 100755 index e27f0fd..e5fa983 --- a/src/aura/init/shared/default.json +++ b/src/aura/init/shared/default.json @@ -18,5 +18,6 @@ "enabled": true } }, + "plsToken": "66ccff0d000721114514191981023333", "devTools": false } diff --git a/src/aura/init/zeron/hookWS.js b/src/aura/init/zeron/hookWS.js old mode 100644 new mode 100755 diff --git a/src/aura/jsRewrite/network/disableBehaviorAudit.js b/src/aura/jsRewrite/network/disableBehaviorAudit.js old mode 100644 new mode 100755 diff --git a/src/aura/jsRewrite/network/disableFriday.js b/src/aura/jsRewrite/network/disableFriday.js old mode 100644 new mode 100755 diff --git a/src/aura/jsRewrite/vendor/passwordValidation.js b/src/aura/jsRewrite/vendor/passwordValidation.js old mode 100644 new mode 100755 diff --git a/src/aura/types/main/core.d.ts b/src/aura/types/main/core.d.ts new file mode 100755 index 0000000..6940586 --- /dev/null +++ b/src/aura/types/main/core.d.ts @@ -0,0 +1,33 @@ +import { WebContents } from "electron"; + +type SeewoHugoCentralLambda = any; +type SeewoHugoGlobalConfig = Record; + +type WindowName = string; + +interface LauncherArgs { + central: SeewoHugoCentralLambda; + windowName: WindowName; + config: SeewoHugoGlobalConfig; +} + +interface HookedWindow { + webContents: WebContents; + domReadyListener: any; + destroyedListener: any; +} + +type HookedWindowsMap = Map; + +type HookRequire = any; + +type HooksMap = Map; + +interface MainProcessGlobal { + hookedWindows: HookedWindowsMap; + hooks: HooksMap; + configInit: boolean; + plsStats: PLSStatus | null; + plsSettings: Record | null; + plsRules: Record | null; +} diff --git a/src/aura/types/main/electron.d.ts b/src/aura/types/main/electron.d.ts new file mode 100755 index 0000000..0ffe4e0 --- /dev/null +++ b/src/aura/types/main/electron.d.ts @@ -0,0 +1,10 @@ +import { IpcMain, WebContents } from "electron"; + +interface AuraIPCMain extends IpcMain { + send: ( + windowKey: string, + channel: string, + data: any, + grep?: WebContents + ) => void; +} diff --git a/src/aura/types/render/global.d.ts b/src/aura/types/render/global.d.ts new file mode 100755 index 0000000..14d9161 --- /dev/null +++ b/src/aura/types/render/global.d.ts @@ -0,0 +1,14 @@ +interface HugoAuraGlobal { + utils: Record; +} + +interface AssistantHugoAuraGlobal extends HugoAuraGlobal { + plsStatus: PLSStatus; + plsRules: Record; + plsSettings: Record; +} + +interface DesktopAssistantHugoAuraGlobal extends HugoAuraGlobal { + plsWs: WebSocket | null; + plsStats: PLSStatus; +} diff --git a/src/aura/types/render/uiHook.d.ts b/src/aura/types/render/uiHook.d.ts new file mode 100755 index 0000000..198b026 --- /dev/null +++ b/src/aura/types/render/uiHook.d.ts @@ -0,0 +1,25 @@ +import { WindowName } from "../main/core"; + +interface UIHookTarget { + active: boolean; + pageURI: string; + pageScript: string; + pageSelector: string; + selectorMode: "insertAfter" | "insertBefore" | "appendChild"; + pageCSS: string; + revive?: boolean; +} + +type AuraElementUID = string; +type OnLoadedEvalJS = string; + +interface UIHookConfig { + targets: Record; + globalStyles: string[]; + globalJS: string[]; + onLoaded: OnLoadedEvalJS; +} + +interface UIHookConfigFin extends UIHookConfig { + windowName: WindowName; +} diff --git a/src/aura/types/shared/pls/status.d.ts b/src/aura/types/shared/pls/status.d.ts new file mode 100755 index 0000000..a1bae3f --- /dev/null +++ b/src/aura/types/shared/pls/status.d.ts @@ -0,0 +1,9 @@ +interface PLSStatus { + installed: boolean; + detached: boolean; + connected: boolean; + launched: boolean; + status: string; + version: string; + authToken: string; +} diff --git a/src/aura/types/shared/pls/websocket.d.ts b/src/aura/types/shared/pls/websocket.d.ts new file mode 100755 index 0000000..9533b70 --- /dev/null +++ b/src/aura/types/shared/pls/websocket.d.ts @@ -0,0 +1,18 @@ +interface ClientPLSRequest { + method: string; + data: Record; + eventId: string; +} + +interface PLSResponse { + success: boolean; + code: number; + data: Record; + eventId: string; +} + +interface PLSPush { + success: boolean; + type: string; + data: Record; +} diff --git a/src/aura/ui/bootstrap/bootstrap.bundle.min.js b/src/aura/ui/bootstrap/bootstrap.bundle.min.js old mode 100644 new mode 100755 diff --git a/src/aura/ui/bootstrap/bootstrap.min.css b/src/aura/ui/bootstrap/bootstrap.min.css old mode 100644 new mode 100755 diff --git a/src/aura/ui/composables/plsConfigManager.js b/src/aura/ui/composables/plsConfigManager.js new file mode 100755 index 0000000..18aa464 --- /dev/null +++ b/src/aura/ui/composables/plsConfigManager.js @@ -0,0 +1,93 @@ +// @ts-check + +const __SCOPE = "assistant / rendererCommon"; + +const IPC_METHOD_BASE = "$aura.pls"; + +const updatePlsStatusFromLocal = async () => { + const plsStatus = ( + await global.ipcRenderer.invoke(`${IPC_METHOD_BASE}.getPlsStats`) + ).data; + global.__HUGO_AURA_GLOBAL__.plsStatus = plsStatus; + return plsStatus; +}; + +const updatePlsSettingsFromLocal = async () => { + const plsSettings = ( + await global.ipcRenderer.invoke(`${IPC_METHOD_BASE}.getPlsSettings`) + ).data; + global.__HUGO_AURA_GLOBAL__.plsSettings = plsSettings; + return plsSettings; +}; + +const updatePlsRulesFromLocal = async () => { + const plsRules = ( + await global.ipcRenderer.invoke(`${IPC_METHOD_BASE}.getPlsRules`) + ).data; + global.__HUGO_AURA_GLOBAL__.plsRules = plsRules; + return plsRules; +}; + +/** + * + * @returns {string} + */ +const genRandomHex = () => { + let result = ""; + for (let i = 0; i < 8; i++) { + const randomNum = Math.floor(Math.random() * 0x10000); + result += randomNum.toString(16).padStart(4, "0"); + } + return result; +}; + +/** + * + * @param {string} configKey + * @param {any} configValue + */ +const updatePlsConfigToRemote = async (configKey, configValue) => { + const configLevels = configKey.split("."); + /** @type {Record} */ + let localUpdateTarget = + configLevels[0] === "ruleSettings" + ? global.__HUGO_AURA_GLOBAL__.plsRules + : global.__HUGO_AURA_GLOBAL__.plsSettings; + for (const level of configLevels.slice(0, -1)) { + localUpdateTarget = localUpdateTarget[level]; + } + localUpdateTarget[configLevels.slice(-1)[0]] = configValue; + + const plsConfigUpdateEvent = new CustomEvent("onPLSConfigUpdate", { + detail: { + path: configKey, + value: configValue, + }, + }); + document.dispatchEvent(plsConfigUpdateEvent); + + /** + * @type {ClientPLSRequest} + */ + const data = { + method: "config.action.updateConfig", + data: { + key: configKey, + value: configValue, + }, + eventId: genRandomHex(), // 不用 crypto, 因为会带来不必要的性能开销 + }; + + global.ipcRenderer.invoke(`${IPC_METHOD_BASE}.ws.sendWsMessage`, data); + global.ipcRenderer.invoke(`${IPC_METHOD_BASE}.syncPlsConfig`, { + basic: global.__HUGO_AURA_GLOBAL__.plsSettings, + rules: global.__HUGO_AURA_GLOBAL__.plsRules, + }); +}; + +module.exports = { + updatePlsRulesFromLocal, + updatePlsStatusFromLocal, + updatePlsSettingsFromLocal, + updatePlsConfigToRemote, +}; diff --git a/src/aura/ui/composables/settingsRenderer.js b/src/aura/ui/composables/settingsRenderer.js old mode 100644 new mode 100755 index d8c90d0..a9a783e --- a/src/aura/ui/composables/settingsRenderer.js +++ b/src/aura/ui/composables/settingsRenderer.js @@ -18,15 +18,30 @@ const showRelaunchToast = () => { if (!toastBs.isShown()) toastBs.show(); }; +const showRelaunchPLSToast = () => { + const toast = document.getElementById("relaunchPlsNotifyToast"); + const toastBs = bootstrap.Toast.getOrCreateInstance(toast); + + if (global.__HUGO_AURA_GLOBAL__.plsStatus.detached) { + const relaunchBtn = document.getElementById("plsRelaunchBtn"); + relaunchBtn.disabled = true; + relaunchBtn.textContent = "分离模式下无法执行" + } + + if (!toastBs.isShown()) toastBs.show(); +}; + const showToast = (entry) => { if (entry.reload) { showReloadToast(); } else if (entry.restart) { showRelaunchToast(); + } else if (entry.restartPLS) { + showRelaunchPLSToast(); } }; -const settingsRenderer = (pendingEl, settingsObj) => { +const settingsRenderer = (pendingEl, settingsObj, isPls = false) => { const formEl = document.createElement("form"); formEl.classList.add("aura-settings-form"); for (const category of settingsObj) { @@ -56,6 +71,18 @@ const settingsRenderer = (pendingEl, settingsObj) => { powerIcon.setAttribute("data-bs-title", "需要重启 Electron 进程"); entryTitle.appendChild(powerIcon); } + if (entry.restartPLS) { + const plsIcon = document.createElement("i"); + plsIcon.classList.add( + "layui-icon", + "layui-icon-logout", + "aura-settings-entry-property-icon" + ); + plsIcon.setAttribute("data-bs-toggle", "tooltip"); + plsIcon.setAttribute("data-bs-placement", "top"); + plsIcon.setAttribute("data-bs-title", "需要重启 PLS 进程"); + entryTitle.appendChild(plsIcon); + } if (entry.reload) { const reloadIcon = document.createElement("i"); reloadIcon.classList.add( @@ -182,14 +209,18 @@ const settingsRenderer = (pendingEl, settingsObj) => { if (!isShow) entryContainerEl.classList.add("aura-settings-entry-hidden"); if (entry.associateVal) { - document.addEventListener("onHugoAuraConfigUpdate", (event) => { - if (!entry.associateVal.includes(event.detail.path.join("."))) return; - const cls = entryContainerEl.classList; - const isShow = entry.auraIf(); - isShow - ? cls.remove("aura-settings-entry-hidden") - : cls.add("aura-settings-entry-hidden"); - }); + document.addEventListener( + isPls ? "onPLSConfigUpdate" : "onHugoAuraConfigUpdate", + (event) => { + if (!entry.associateVal.includes(event.detail.path.join("."))) + return; + const cls = entryContainerEl.classList; + const isShow = entry.auraIf(); + isShow + ? cls.remove("aura-settings-entry-hidden") + : cls.add("aura-settings-entry-hidden"); + } + ); } formEl.appendChild(entryContainerEl); diff --git a/src/aura/ui/css/assistant.css b/src/aura/ui/css/assistant.css old mode 100644 new mode 100755 diff --git a/src/aura/ui/css/form.css b/src/aura/ui/css/form.css old mode 100644 new mode 100755 diff --git a/src/aura/ui/css/global.css b/src/aura/ui/css/global.css old mode 100644 new mode 100755 diff --git a/src/aura/ui/hooks/assistant.js b/src/aura/ui/hookDefinitions/assistant.js old mode 100644 new mode 100755 similarity index 61% rename from src/aura/ui/hooks/assistant.js rename to src/aura/ui/hookDefinitions/assistant.js index 933e7a8..fd3aff8 --- a/src/aura/ui/hooks/assistant.js +++ b/src/aura/ui/hookDefinitions/assistant.js @@ -1,4 +1,9 @@ -module.exports = { +// @ts-check + +/** + * @type {import("../../types/render/uiHook").UIHookConfig} + */ +const def = { targets: { "Aura.UI.Assistant.HeaderEntry": { active: true, @@ -28,6 +33,22 @@ module.exports = { pageCSS: "ui/pages/configSubPages/disableLimitations/disableLimitations.css", }, + "Aura.UI.Assistant.Config.BehaviourCtrl": { + active: false, + pageURI: "ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.html", + pageScript: "ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.js", + pageSelector: ".aura-config-page-subpage-container", + selectorMode: "appendChild", + pageCSS: "ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.css", + }, + "Aura.UI.Assistant.Config.BehaviourCtrl.PlsStatus": { + active: false, + pageURI: "ui/pages/configSubPages/behaviourCtrl/plsStatus.html", + pageScript: "ui/pages/configSubPages/behaviourCtrl/plsStatus.js", + pageSelector: "#status-subpage", + selectorMode: "appendChild", + pageCSS: "ui/pages/configSubPages/behaviourCtrl/plsStatus.css", + }, }, globalStyles: [ "ui/css/global.css", @@ -41,3 +62,5 @@ module.exports = { console.log('[HugoAura / UI / Hooks / Assistant] Page loaded.'); `, }; + +module.exports = def; diff --git a/src/aura/ui/hookDefinitions/desktopAssistant.js b/src/aura/ui/hookDefinitions/desktopAssistant.js new file mode 100755 index 0000000..40fa0de --- /dev/null +++ b/src/aura/ui/hookDefinitions/desktopAssistant.js @@ -0,0 +1,15 @@ +// @ts-check + +/** + * @type {import("../../types/render/uiHook").UIHookConfig} + */ +const def = { + targets: {}, + globalStyles: ["ui/css/global.css"], + globalJS: ["ui/js/global.js", "ui/js/plsConnectionManager.js"], + onLoaded: ` + console.log('[HugoAura / UI / Hooks / Desktop Assistant] Page loaded.'); + `, +}; + +module.exports = def; diff --git a/src/aura/ui/js/global.js b/src/aura/ui/js/global.js old mode 100644 new mode 100755 diff --git a/src/aura/ui/js/plsConnectionManager.js b/src/aura/ui/js/plsConnectionManager.js new file mode 100755 index 0000000..6229dc4 --- /dev/null +++ b/src/aura/ui/js/plsConnectionManager.js @@ -0,0 +1,192 @@ +// @ts-check + +const IPC_METHOD_BASE = "$aura.pls"; +const REQUIRE_BASE = "../../aura/ui"; +const __SCOPE = "desktopAssistant"; + +const { pushMsgHandler } = require(`${REQUIRE_BASE}/pls/pushHandler`); + +/** @type {number} */ +let failedCounter = 0; +/** @type {boolean} */ +let isErrorOccurred = false; + +/** + * + * @param {string} authToken + * @param {any} callback + * @returns + */ +const createPlsConnection = (authToken, callback) => { + if (failedCounter >= 3) { + console.error( + `[HugoAura / UI / PLS Manager / ERROR] Failed connecting to PLS WebSocket server, please check the status of PLS process.` + ); + return; + } + + /** @type {WebSocket} */ + const plsWs = new WebSocket( + `wss://pls.hugoaura.local:22077/?auth=${authToken}` + ); + + plsWs.onopen = () => { + callback(true, plsWs); + }; + + plsWs.onerror = () => { + isErrorOccurred = true; + failedCounter += 1; + callback(false, plsWs); + }; + + plsWs.onclose = () => { + console.error( + "[HugoAura / UI / PLS Manager / ERROR] WebSocket connection closed." + ); + if (isErrorOccurred) return; + failedCounter += 1; + callback(false, plsWs); + }; +}; + +/** + * + * @param {WebSocket} wsObj + */ +const registerSendReqListener = (wsObj) => { + global.ipcRenderer.on( + `${IPC_METHOD_BASE}.ws.post.onReqSendMsg`, + /** + * + * @param {Event} _evt + * @param {any} arg + */ + (_evt, arg) => { + wsObj.send(JSON.stringify(arg)); + } + ); +}; + +/** + * + * @param {boolean} result + * @param {WebSocket} wsObj + * @returns + */ +const connectionResultCallback = (result, wsObj) => { + global.__HUGO_AURA_GLOBAL__.plsStats.launched = result; + global.__HUGO_AURA_GLOBAL__.plsStats.connected = result; + global.ipcRenderer.invoke( + `${IPC_METHOD_BASE}.updatePlsStats`, + global.__HUGO_AURA_GLOBAL__.plsStats + ); + if (!result) { + console.error( + `[HugoAura / UI / PLS Manager / ERROR] Failed connecting to PLS WebSocket server, retrying ...` + ); + createPlsConnection( + global.__HUGO_AURA_GLOBAL__.plsStats.authToken, + connectionResultCallback + ); + return; + } + global.__HUGO_AURA_GLOBAL__.plsWs = wsObj; + registerSendReqListener(wsObj); + wsObj.onmessage = plsPushHandler; +}; + +/** + * + * @param {MessageEvent} event + */ +const plsPushHandler = (event) => { + try { + /** @type {Record} */ + const parsedEvent = JSON.parse(event.data); + console.debug( + "[HugoAura / UI / PLS Manager / DEBUG] Received new server message: " + ); + if (!parsedEvent.eventId) { + // Push + pushMsgHandler(parsedEvent); + } else { + // Not push + global.ipcRenderer.send( + `${IPC_METHOD_BASE}.ws.broadcastMessageRecv`, + parsedEvent + ); + } + } catch { + console.error( + "[HugoAura / UI / PLS Manager / ERROR] Failed to resolve server message: ", + event.data + ); + } +}; + +const initPlsConnection = async () => { + failedCounter = 0; + isErrorOccurred = false; + + const curPlsStats = await global.ipcRenderer.invoke( + `${IPC_METHOD_BASE}.getPlsStats` + ); + let updatedPlsStats = {}; + if (curPlsStats === null || !curPlsStats.success) { + updatedPlsStats = { + installed: false, + launched: false, + detached: false, + connected: false, + version: "未知", + status: "dead", + authToken: "66ccff0d000721114514191981023333", + }; + } else { + updatedPlsStats = curPlsStats.data; + } + + const isPlsFolderExists = ( + await global.ipcRenderer.invoke(`${IPC_METHOD_BASE}.getPlsFolderExists`) + ).data.isExists; + updatedPlsStats.installed = isPlsFolderExists; + + global.__HUGO_AURA_GLOBAL__.plsStats = updatedPlsStats; + console.debug( + "[HugoAura / UI / PLS Manager / DEBUG] Updated plsStats:", + global.__HUGO_AURA_GLOBAL__.plsStats + ); + + global.ipcRenderer.invoke( + `${IPC_METHOD_BASE}.updatePlsStats`, + updatedPlsStats + ); + + const startConnPls = () => { + createPlsConnection(updatedPlsStats.authToken, connectionResultCallback); + }; + + if (updatedPlsStats.detached && updatedPlsStats.installed) { + startConnPls(); + } + + global.ipcRenderer.on(`${IPC_METHOD_BASE}.post.onPlsLaunched`, (_event) => { + setTimeout(() => { + startConnPls(); + }, 5000); + }); +}; + +const onSetup = () => { + if (!global.global.ipcRenderer) { + // @ts-ignore + global.global.ipcRenderer = require("electron").global.ipcRenderer; + } + + initPlsConnection(); +}; + +(() => { + onSetup(); +})(); diff --git a/src/aura/ui/layui/css/layui.css b/src/aura/ui/layui/css/layui.css old mode 100644 new mode 100755 diff --git a/src/aura/ui/layui/font/iconfont.eot b/src/aura/ui/layui/font/iconfont.eot old mode 100644 new mode 100755 diff --git a/src/aura/ui/layui/font/iconfont.svg b/src/aura/ui/layui/font/iconfont.svg old mode 100644 new mode 100755 diff --git a/src/aura/ui/layui/font/iconfont.ttf b/src/aura/ui/layui/font/iconfont.ttf old mode 100644 new mode 100755 diff --git a/src/aura/ui/layui/font/iconfont.woff b/src/aura/ui/layui/font/iconfont.woff old mode 100644 new mode 100755 diff --git a/src/aura/ui/layui/font/iconfont.woff2 b/src/aura/ui/layui/font/iconfont.woff2 old mode 100644 new mode 100755 diff --git a/src/aura/ui/pages/config/config.css b/src/aura/ui/pages/config/config.css old mode 100644 new mode 100755 diff --git a/src/aura/ui/pages/config/config.html b/src/aura/ui/pages/config/config.html old mode 100644 new mode 100755 index 1ad336d..42d7c99 --- a/src/aura/ui/pages/config/config.html +++ b/src/aura/ui/pages/config/config.html @@ -80,7 +80,7 @@
@@ -162,5 +162,30 @@
+ +
+
+
+ + 重启 PLS 进程以应用设置 +
+
+

请重启 PLS 进程以应用修改的设置

+ +
+
+
diff --git a/src/aura/ui/pages/config/config.js b/src/aura/ui/pages/config/config.js old mode 100644 new mode 100755 index 9c66509..3953a2b --- a/src/aura/ui/pages/config/config.js +++ b/src/aura/ui/pages/config/config.js @@ -49,17 +49,33 @@ global.__HUGO_AURA_UI_FUNCTIONS__.config = { "aura-config-page-operation-el" ); let pendingSubPageId = ""; + let preserveOperationIdx = 0; switch (subPage) { case "disableLimitations": - side - ? operationElArr[0].classList.add("preserve-operation") - : operationElArr[0].classList.remove("preserve-operation"); + preserveOperationIdx = 0; pendingSubPageId = "Aura.UI.Assistant.Config.DisableLimitations"; break; + case "behaviourCtrl": + preserveOperationIdx = 1; + pendingSubPageId = "Aura.UI.Assistant.Config.BehaviourCtrl"; + if (!side) { + setTimeout(() => { + global.__HUGO_AURA_LOADER__[ + "Aura.UI.Assistant.Config.BehaviourCtrl.PlsStatus" + ].active = false; + }, 500); + } + break; default: break; } + side + ? operationElArr[preserveOperationIdx].classList.add("preserve-operation") + : operationElArr[preserveOperationIdx].classList.remove( + "preserve-operation" + ); + const operationAreaEl = document.getElementsByClassName( "aura-config-page-operation-area" )[0]; diff --git a/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.css b/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.css new file mode 100755 index 0000000..373b100 --- /dev/null +++ b/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.css @@ -0,0 +1,8 @@ +.aura-config-subpage-behaviour-control { + opacity: 1; + transition: opacity 0.5s; +} + +.aura-config-subpage-behaviour-control.acs-behaviour-control-hidden { + opacity: 0; +} diff --git a/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.html b/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.html new file mode 100755 index 0000000..69ce598 --- /dev/null +++ b/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.html @@ -0,0 +1,69 @@ +
+ +
+
+
+
+
+
diff --git a/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.js b/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.js new file mode 100755 index 0000000..5eee61a --- /dev/null +++ b/src/aura/ui/pages/configSubPages/behaviourCtrl/behaviourCtrl.js @@ -0,0 +1,44 @@ +(() => { + const REQUIRE_BASE = + "../../aura/ui/pages/configSubPages/behaviourCtrl/settings"; + + const { + settingsRenderer, + } = require(`${REQUIRE_BASE}/../../../../composables/settingsRenderer`); + + const { basicSettings } = require(`${REQUIRE_BASE}/basic`); + + const { + updatePlsSettingsFromLocal, + updatePlsRulesFromLocal, + } = require(`${REQUIRE_BASE}/../../../../composables/plsConfigManager`); + + const initStatusPage = () => { + global.__HUGO_AURA_LOADER__[ + "Aura.UI.Assistant.Config.BehaviourCtrl.PlsStatus" + ].active = true; + }; + + const initBasicSettingsPage = () => { + const basicSubPageEl = document.getElementById("basic-config-subpage"); + settingsRenderer(basicSubPageEl, basicSettings); + }; + + const renderSubPages = async () => { + await updatePlsSettingsFromLocal(); + await updatePlsRulesFromLocal(); + + initBasicSettingsPage(); + }; + + const onMounted = () => { + const rootEl = document.getElementById("acs-behaviour-control-el"); + initStatusPage(); + renderSubPages(); + setTimeout(() => { + rootEl.classList.remove("acs-behaviour-control-hidden"); + }, 500); + }; + + onMounted(); +})(); diff --git a/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.css b/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.css new file mode 100755 index 0000000..bfda3c5 --- /dev/null +++ b/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.css @@ -0,0 +1,78 @@ +.acs-behaviour-control-pls-status-page { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.acs-behaviour-control-pls-status-page p { + font-family: sans-serif; +} + +.acs-bc-pls-status-page-pls-description { + margin-top: 0.5rem; + max-width: 80%; + opacity: 0.35; + font-size: small; + text-align: center; +} + +.acs-bc-pls-status-page-main-logo { + max-width: 13.5%; + opacity: 0.45; + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} + +.acs-bc-pls-status-page-status-el { + display: flex; + align-items: center; + width: 40%; + padding: 0.625rem 0.25rem; + border-bottom: 1px solid rgba(0, 0, 0, 0.25); +} + +.acs-bc-pls-status-page-status-el div { + display: flex; + align-items: center; +} + +.acs-bc-pls-status-page-status-area { + flex-grow: 1; + justify-content: flex-end; +} + +.acs-bc-pls-status-page-status-area-circle { + height: 10px; + width: 10px; + border-radius: 100%; + margin-right: 8px; + margin-top: 2px; +} + +.acs-bc-pls-status-page-status-area.pending + .acs-bc-pls-status-page-status-area-circle { + background-color: rgba(0, 0, 0, 0.375); +} + +.acs-bc-pls-status-page-status-area.pending p { + opacity: 0.5; +} + +.acs-bc-pls-status-page-status-area.success + .acs-bc-pls-status-page-status-area-circle { + background-color: rgb(0, 175, 38); +} + +.acs-bc-pls-status-page-status-area.success p { + color: rgb(0, 150, 33); +} + +.acs-bc-pls-status-page-status-area.failed + .acs-bc-pls-status-page-status-area-circle { + background-color: rgb(175, 0, 0); +} + +.acs-bc-pls-status-page-status-area.failed p { + color: rgb(175, 0, 0); +} diff --git a/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.html b/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.html new file mode 100755 index 0000000..7038397 --- /dev/null +++ b/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.html @@ -0,0 +1,51 @@ +
+

+ HugoAura ProxyLayerServices (Aura-PLS) 是基于 Python + MITMProxy 实现的代理服务, + 用于解密并修改希沃基础服务 (SeewoCore) 的 MQTT 数据包, + 实现行为监控、伪造上报等功能 +

+ + +
+

安装状态

+
+ +

未安装

+
+
+ +
+

启动状态

+
+ +

未启动

+
+
+ +
+

连接状态

+
+ +

已断开

+
+
+ +
+

版本

+
+

不可用

+
+
+
diff --git a/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.js b/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.js new file mode 100755 index 0000000..14fdae0 --- /dev/null +++ b/src/aura/ui/pages/configSubPages/behaviourCtrl/plsStatus.js @@ -0,0 +1,86 @@ +(() => { + const REQUIRE_BASE = "../../aura/ui/pages/configSubPages/behaviourCtrl"; + const IPC_METHOD_BASE = "$aura.pls"; + + const { + updatePlsStatusFromLocal, + } = require(`${REQUIRE_BASE}/../../../composables/plsConfigManager`); + + const updateStatusEl = ( + areaContainerId, + areaTextId, + target, + text = false + ) => { + const areaContainerEl = document.getElementById(areaContainerId); + const areaContainerText = document.getElementById(areaTextId); + switch (target) { + case "PENDING": + areaContainerEl.className = + "acs-bc-pls-status-page-status-area pending"; + break; + case "SUCCESS": + areaContainerEl.className = + "acs-bc-pls-status-page-status-area success"; + break; + case "FAILED": + areaContainerEl.className = "acs-bc-pls-status-page-status-area failed"; + break; + case "WARNING": + areaContainerEl.className = + "acs-bc-pls-status-page-status-area warning"; + break; + default: + return false; + } + areaContainerText.textContent = text ? text : ""; + return true; + }; + + const updateStatus = async () => { + const curPlsStats = await updatePlsStatusFromLocal(); + + const acIdInst = "acs-bc-psp-installStatus-container"; + const atIdInst = "acs-bc-psp-installStatus-text"; + switch (curPlsStats.installed) { + case true: + updateStatusEl(acIdInst, atIdInst, "SUCCESS", "已安装"); + break; + case false: + updateStatusEl(acIdInst, atIdInst, "PENDING", "未安装"); + } + + const acIdLaunch = "acs-bc-psp-launchStatus-container"; + const atIdLaunch = "acs-bc-psp-launchStatus-text"; + switch (curPlsStats.launched) { + case true: + updateStatusEl(acIdLaunch, atIdLaunch, "SUCCESS", "已启动"); + break; + case false: + updateStatusEl(acIdLaunch, atIdLaunch, "PENDING", "未启动"); + break; + } + + const acIdConn = "acs-bc-psp-connStatus-container"; + const atIdConn = "acs-bc-psp-connStatus-text"; + switch (curPlsStats.connected) { + case true: + updateStatusEl(acIdConn, atIdConn, "SUCCESS", "已连接"); + break; + case false: + updateStatusEl(acIdConn, atIdConn, "FAILED", "连接失败"); + break; + } + + if (curPlsStats.version && curPlsStats.version !== "未知") { + const versionTextEl = document.getElementById("acs-bc-psp-version-text"); + versionTextEl.textContent = "v" + curPlsStats.version; + } + }; + + const onMounted = () => { + updateStatus(); + }; + + onMounted(); +})(); diff --git a/src/aura/ui/pages/configSubPages/behaviourCtrl/settings/basic.js b/src/aura/ui/pages/configSubPages/behaviourCtrl/settings/basic.js new file mode 100755 index 0000000..d1baa92 --- /dev/null +++ b/src/aura/ui/pages/configSubPages/behaviourCtrl/settings/basic.js @@ -0,0 +1,45 @@ +const REQUIRE_BASE = "."; + +const { + updatePlsConfigToRemote, +} = require(`${REQUIRE_BASE}/../../../../composables/plsConfigManager`); + +const basicSettings = [ + { + id: 0, + categoryName: "可访问性", + child: [ + { + index: 0, + id: "authToken", + type: "input", + subType: "text", + name: "WebSocket 认证密钥", + description: "选择一个安全的密钥, 用于 PLS 侧验证 Aura 前端身份", + restart: true, + reload: false, + restartPLS: false, + associateVal: null, + auraIf: () => true, + defaultValue: "", + placeHolder: "输入一个密钥", + valueGetter: () => { + return global.__HUGO_AURA_CONFIG__.plsToken; + }, + callbackFn: (newVal) => { + if (newVal === "" || !newVal) + return { valid: false, hint: "请输入认证密钥" }; + + if (newVal.length < 8) { + return { valid: false, hint: "至少输入 8 位字符" }; + } + + global.__HUGO_AURA_CONFIG__.plsToken = newVal; + return { valid: true }; + }, + }, + ], + }, +]; + +module.exports = { basicSettings }; diff --git a/src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.css b/src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.css old mode 100644 new mode 100755 index 709f5e1..f90de5c --- a/src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.css +++ b/src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.css @@ -1,6 +1,5 @@ .aura-config-subpage-disable-limit-root { opacity: 1; - transition: opacity 0.5s; } diff --git a/src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.html b/src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.html old mode 100644 new mode 100755 diff --git a/src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.js b/src/aura/ui/pages/configSubPages/disableLimitations/disableLimitations.js old mode 100644 new mode 100755 diff --git a/src/aura/ui/pages/configSubPages/disableLimitations/settings/audit.js b/src/aura/ui/pages/configSubPages/disableLimitations/settings/audit.js old mode 100644 new mode 100755 diff --git a/src/aura/ui/pages/configSubPages/disableLimitations/settings/auth.js b/src/aura/ui/pages/configSubPages/disableLimitations/settings/auth.js old mode 100644 new mode 100755 index 21b92ea..b10f9e4 --- a/src/aura/ui/pages/configSubPages/disableLimitations/settings/auth.js +++ b/src/aura/ui/pages/configSubPages/disableLimitations/settings/auth.js @@ -114,8 +114,8 @@ const authSettings = [ ].enabled; }, defaultValue: "hybrid", - templates: ["hybrid", "remoteOnly", "passwordOnly"], - templateLabels: ["混合", "仅二维码", "仅密码"], + templates: ["default", "hybrid", "remoteOnly", "passwordOnly"], + templateLabels: ["默认", "混合", "仅二维码", "仅密码"], valueGetter: () => { return global.__HUGO_AURA_CONFIG__.rewrite[ "vendor/passwordValidation" diff --git a/src/aura/ui/pages/headerIcon/headerIcon.css b/src/aura/ui/pages/headerIcon/headerIcon.css old mode 100644 new mode 100755 diff --git a/src/aura/ui/pages/headerIcon/headerIcon.html b/src/aura/ui/pages/headerIcon/headerIcon.html old mode 100644 new mode 100755 diff --git a/src/aura/ui/pages/headerIcon/headerIcon.js b/src/aura/ui/pages/headerIcon/headerIcon.js old mode 100644 new mode 100755 diff --git a/src/aura/ui/pls/pushHandler.js b/src/aura/ui/pls/pushHandler.js new file mode 100755 index 0000000..bf33426 --- /dev/null +++ b/src/aura/ui/pls/pushHandler.js @@ -0,0 +1,30 @@ +// @ts-check + +const REQUIRE_BASE = "."; + +const { basicRouteHandler } = require(`${REQUIRE_BASE}/routes/basic`); +const { configRouteHandler } = require(`${REQUIRE_BASE}/routes/config`); + +/** + * + * @param {PLSPush} parsedWsMsg + * @returns + */ +const pushMsgHandler = (parsedWsMsg) => { + if (!parsedWsMsg.type) return false; + + const msgCategory = parsedWsMsg.type.split(".")[0]; + + switch (msgCategory) { + case "basic": + basicRouteHandler(parsedWsMsg); + break; + case "config": + configRouteHandler(parsedWsMsg); + break; + default: + break; + } +}; + +module.exports = { pushMsgHandler }; diff --git a/src/aura/ui/pls/routes/basic.js b/src/aura/ui/pls/routes/basic.js new file mode 100755 index 0000000..ffdf4be --- /dev/null +++ b/src/aura/ui/pls/routes/basic.js @@ -0,0 +1,33 @@ +// @ts-check + +const IPC_METHOD_BASE = "$aura.pls"; + +/** + * + * @param {PLSPush} parsedWsMsg + * @returns + */ +const basicRouteHandler = (parsedWsMsg) => { + const target = parsedWsMsg.type.split(".").slice(-1)[0]; + switch (target) { + case "pushPlsInfo": + global.__HUGO_AURA_GLOBAL__.plsStats.status = parsedWsMsg.data.status; + global.__HUGO_AURA_GLOBAL__.plsStats.version = parsedWsMsg.data.version; + + global.ipcRenderer.invoke( + `${IPC_METHOD_BASE}.updatePlsStats`, + global.__HUGO_AURA_GLOBAL__.plsStats + ); + + console.debug( + "[HugoAura / UI / PLS Routes / DEBUG] Updated plsStats basic info:", + global.__HUGO_AURA_GLOBAL__.plsStats + ); + break; + default: + return false; + } + return true; +}; + +module.exports = { basicRouteHandler }; diff --git a/src/aura/ui/pls/routes/config.js b/src/aura/ui/pls/routes/config.js new file mode 100755 index 0000000..2d8bdae --- /dev/null +++ b/src/aura/ui/pls/routes/config.js @@ -0,0 +1,32 @@ +// @ts-check + +const IPC_METHOD_BASE = "$aura.pls"; + +/** + * + * @param {PLSPush} parsedWsMsg + * @returns + */ +const configRouteHandler = (parsedWsMsg) => { + const target = parsedWsMsg.type.split(".").slice(-1)[0]; + switch (target) { + case "pushBasicConfig": + global.ipcRenderer.invoke( + `${IPC_METHOD_BASE}.updatePlsSettings`, + parsedWsMsg.data + ); + break; + case "pushRuleSettings": + global.ipcRenderer.invoke( + `${IPC_METHOD_BASE}.updatePlsRules`, + parsedWsMsg.data + ); + break; + default: + return false; + } + + return true; +}; + +module.exports = { configRouteHandler }; diff --git a/src/aura/ui/static/aura.svg b/src/aura/ui/static/aura.svg old mode 100644 new mode 100755 diff --git a/src/aura/ui/static/aura_pls.png b/src/aura/ui/static/aura_pls.png new file mode 100755 index 0000000000000000000000000000000000000000..d2bb2bf3da7ec11d1185ac972e0f0ca2c322c67e GIT binary patch literal 21320 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 literal 0 HcmV?d00001 diff --git a/src/aura/ui/static/config/about.svg b/src/aura/ui/static/config/about.svg old mode 100644 new mode 100755 diff --git a/src/aura/ui/static/config/behaviour_mon.svg b/src/aura/ui/static/config/behaviour_mon.svg old mode 100644 new mode 100755 diff --git a/src/aura/ui/static/config/no_limitations.svg b/src/aura/ui/static/config/no_limitations.svg old mode 100644 new mode 100755 diff --git a/src/aura/ui/static/config/plugin.svg b/src/aura/ui/static/config/plugin.svg old mode 100644 new mode 100755 diff --git a/src/core/hook.js b/src/core/hook.js old mode 100644 new mode 100755 index 7777931..68a1668 --- a/src/core/hook.js +++ b/src/core/hook.js @@ -1,139 +1,161 @@ -if (!global.__HUGO_AURA__) { - global.__HUGO_AURA__ = { - hookedWindows: new Map(), - hooks: null, - configInit: false, - }; -} - -const fs = require("fs"); -const util = require("util"); -const path = require("path"); -const os = require("os"); - -const HooksManager = require("../aura/init/rendererHook/hooksManager"); -const NetworkHook = require("../aura/init/rendererHook/networkHook"); -const configManager = require("../aura/init/shared/configManager"); -const { buildIpcMain } = require("../aura/init/main/ipcHandler"); - -const initLogger = () => { - const logDir = path.join(os.homedir(), "Documents", "HugoAura", "logs"); - if (!fs.existsSync(logDir)) { - fs.mkdirSync(logDir, { recursive: true }); - } - - const logFile = path.join( - logDir, - `main-process-${new Date().toISOString().replace(/:/g, "-")}.log` - ); - const logStream = fs.createWriteStream(logFile, { flags: "a" }); - - const originalConsole = { - log: console.log, - error: console.error, - warn: console.warn, - info: console.info, - debug: console.debug, - }; - - console.log = function (...args) { - const msg = util.format("[LOG] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.log.apply(console, args); - }; - - console.error = function (...args) { - const msg = util.format("[ERROR] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.error.apply(console, args); - }; - - console.warn = function (...args) { - const msg = util.format("[WARN] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.warn.apply(console, args); - }; - - console.info = function (...args) { - const msg = util.format("[INFO] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.info.apply(console, args); - }; - - console.debug = function (...args) { - if (!process.argv.includes("--aura-debug")) return; - const msg = util.format("[DEBUG] ", ...args) + "\n"; - logStream.write(msg); - originalConsole.debug.apply(console, args); - }; - - process.on("uncaughtException", (err) => { - console.error("UNCAUGHT EXCEPTION:", err); - }); - - console.log("Logger initialized. Log file:", logFile); -}; - -module.exports = function ({ central, windowName, config }) { - process.stdout.isTTY = true; - process.stderr.isTTY = true; - - const electron = central(1); - const app = electron.app; - if (!global.__HUGO_AURA__.central) global.__HUGO_AURA__.central = central; - - global.reloadApp = () => { - app.relaunch({ args: process.argv.slice(1).concat(["--inspect 5858"]) }); - app.exit(0); - }; - - initLogger(); - - console.log("[HugoAura / Loaded] Aura is loaded!"); - - if (!global.__HUGO_AURA__.ipcInit) { - buildIpcMain(electron); - global.__HUGO_AURA__.ipcInit = true; - } - - const hooksManager = new HooksManager(); - - configManager.ensureConfigExists(); - const loadedConfig = configManager.loadConfig(); - if (!global.__HUGO_AURA__.configInit) global.__HUGO_AURA__.configInit = true; - - const hooks = hooksManager.loadHooks(); - - if (loadedConfig.devTools && !config.canOpenDevTool) { - config.canOpenDevTool = true; - } - - const webContentsCreatedListener = (_event, webContents) => { - const hookConfig = hooks.get(windowName); - - const initNetworkHook = () => { - const networkHook = new NetworkHook(); - networkHook.installHook(webContents.session, loadedConfig); - - console.debug( - `[HugoAura / Init / Done / NetworkHook] Network Hook for ${windowName} installed.` - ); - }; - - initNetworkHook(); - - if (hookConfig) { - hooksManager.handleWindowHook(webContents, hookConfig, windowName); - } else { - console.debug( - `[HugoAura / Init] Window ${windowName} has no corresponding hook, ignoring...` - ); - } - }; - - app.once("web-contents-created", webContentsCreatedListener); - - return () => { - app.removeListener("web-contents-created", webContentsCreatedListener); - }; -}; +// @ts-check + +if (!global.__HUGO_AURA__) { + /** + * @type {import("../aura/types/main/core").MainProcessGlobal} + */ + const __HUGO_AURA__ = { + hookedWindows: new Map(), + hooks: new Map(), + configInit: false, + plsStats: null, + plsSettings: null, + plsRules: null, + }; + global.__HUGO_AURA__ = __HUGO_AURA__; +} + +if (!global.__HUGO_AURA_CONFIG__) { + global.__HUGO_AURA_CONFIG__ = {}; +} + +const fs = require("fs"); +const util = require("util"); +const path = require("path"); +const os = require("os"); + +const HooksManager = require("../aura/init/rendererHook/hooksManager"); +const NetworkHook = require("../aura/init/rendererHook/networkHook"); +const configManager = require("../aura/init/shared/configManager"); +const { buildIpcMain } = require("../aura/init/main/ipcHandler"); + +const initLogger = () => { + const logDir = path.join(os.homedir(), "Documents", "HugoAura", "logs"); + if (!fs.existsSync(logDir)) { + fs.mkdirSync(logDir, { recursive: true }); + } + + const logFile = path.join( + logDir, + `main-process-${new Date().toISOString().replace(/:/g, "-")}.log` + ); + const logStream = fs.createWriteStream(logFile, { flags: "a" }); + + const originalConsole = { + log: console.log, + error: console.error, + warn: console.warn, + info: console.info, + debug: console.debug, + }; + + console.log = function (...args) { + const msg = util.format("[LOG] ", ...args) + "\n"; + logStream.write(msg); + originalConsole.log.apply(console, args); + }; + + console.error = function (...args) { + const msg = util.format("[ERROR] ", ...args) + "\n"; + logStream.write(msg); + originalConsole.error.apply(console, args); + }; + + console.warn = function (...args) { + const msg = util.format("[WARN] ", ...args) + "\n"; + logStream.write(msg); + originalConsole.warn.apply(console, args); + }; + + console.info = function (...args) { + const msg = util.format("[INFO] ", ...args) + "\n"; + logStream.write(msg); + originalConsole.info.apply(console, args); + }; + + console.debug = function (...args) { + if (!process.argv.includes("--aura-debug")) return; + const msg = util.format("[DEBUG] ", ...args) + "\n"; + logStream.write(msg); + originalConsole.debug.apply(console, args); + }; + + process.on("uncaughtException", (err) => { + console.error("UNCAUGHT EXCEPTION:", err); + }); + + console.log("Logger initialized. Log file:", logFile); +}; + +/** + * + * @param {import("../aura/types/main/core").LauncherArgs} param0 + * @returns + */ +const launcher = ({ central, windowName, config }) => { + process.stdout.isTTY = true; + process.stderr.isTTY = true; + + const electron = central(1); + const app = electron.app; + if (!global.__HUGO_AURA__.central) global.__HUGO_AURA__.central = central; + + global.reloadApp = () => { + app.relaunch({ args: process.argv.slice(1).concat(["--inspect 5858"]) }); + app.exit(0); + }; + + initLogger(); + + console.log("[HugoAura / Loaded] Aura is loaded!"); + + configManager.ensureConfigExists(); + const loadedConfig = configManager.loadConfig(); + if (!global.__HUGO_AURA__.configInit) global.__HUGO_AURA__.configInit = true; + + global.__HUGO_AURA_CONFIG__ = loadedConfig; + + if (!global.__HUGO_AURA__.ipcInit) { + buildIpcMain(electron); + global.__HUGO_AURA__.ipcInit = true; + } + + const hooksManager = new HooksManager(); + + const hooks = hooksManager.loadHooks(); + + if (loadedConfig.devTools && !config.canOpenDevTool) { + config.canOpenDevTool = true; + } + + const webContentsCreatedListener = (_event, webContents) => { + const hookConfig = hooks.get(windowName); + + const initNetworkHook = () => { + const networkHook = new NetworkHook(); + networkHook.installHook(webContents.session, loadedConfig); + + console.debug( + `[HugoAura / Init / Done / NetworkHook] Network Hook for ${windowName} installed.` + ); + }; + + initNetworkHook(); + + if (hookConfig) { + hooksManager.handleWindowHook(webContents, hookConfig, windowName); + } else { + console.debug( + `[HugoAura / Init] Window ${windowName} has no corresponding hook, ignoring...` + ); + } + }; + + app.once("web-contents-created", webContentsCreatedListener); + + return () => { + app.removeListener("web-contents-created", webContentsCreatedListener); + }; +}; + +module.exports = launcher; diff --git a/src/core/preload.js b/src/core/preload.js old mode 100644 new mode 100755 diff --git a/src/core/zeron.js b/src/core/zeron.js old mode 100644 new mode 100755 index aaa5512..082f372 --- a/src/core/zeron.js +++ b/src/core/zeron.js @@ -1,23 +1,31 @@ -// Ex-Early Load Pro Plus Max ++ - -console.debug("[HugoAura / Zeron] Early load script loaded."); - -module.exports = function (central) { - const originalCentral = { ...central }; - const genHookedWS = require("../aura/init/zeron/hookWS"); - - console.debug( - "[HugoAura / Zeron / WebSocket Hook] WebSocket hooked class generated." - ); - - return new Proxy(central, { - apply(target, thisArg, args) { - switch (args[0]) { - case 18: - return genHookedWS(central); - default: - return Reflect.apply(target, thisArg, args); - } - }, - }); -}; +// Ex-Early Load Pro Plus Max ++ + +console.debug("[HugoAura / Zeron] Early load script loaded."); + +const appendSwitch = () => { + const { app } = require("electron"); + app.commandLine.appendSwitch("host-rules", "MAP *.hugoaura.local 127.0.0.1"); +}; + +module.exports = function (central) { + const originalCentral = { ...central }; + + appendSwitch(); + + const genHookedWS = require("../aura/init/zeron/hookWS"); + + console.debug( + "[HugoAura / Zeron / WebSocket Hook] WebSocket hooked class generated." + ); + + return new Proxy(central, { + apply(target, thisArg, args) { + switch (args[0]) { + case 18: + return genHookedWS(central); + default: + return Reflect.apply(target, thisArg, args); + } + }, + }); +};