From 0280dcd6a822ce96e9bc92b9023d6756e972db4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Wed, 8 May 2024 14:29:18 +0800 Subject: [PATCH] fix: webui Confi&webui Login --- src/webui/src/api/Auth.ts | 10 +++-- src/webui/src/helper/config.ts | 66 ++++++++++++++++++--------------- src/webui/src/router/QQLogin.ts | 4 +- static/QQLogin.html | 28 +++++--------- 4 files changed, 53 insertions(+), 55 deletions(-) diff --git a/src/webui/src/api/Auth.ts b/src/webui/src/api/Auth.ts index 709d9d4e..c39ae360 100644 --- a/src/webui/src/api/Auth.ts +++ b/src/webui/src/api/Auth.ts @@ -4,6 +4,7 @@ import { WebUiConfig } from "../helper/config"; import { DataRuntime } from "../helper/Data"; const isEmpty = (data: any) => data === undefined || data === null || data === ''; export const LoginHandler: RequestHandler = async (req, res) => { + let WebUiConfigData = await WebUiConfig.GetWebUIConfig(); const { token } = req.body; if (isEmpty(token)) { res.json({ @@ -12,7 +13,7 @@ export const LoginHandler: RequestHandler = async (req, res) => { }); return; } - if (!await DataRuntime.checkLoginRate(WebUiConfig.loginRate)) { + if (!await DataRuntime.checkLoginRate(WebUiConfigData.loginRate)) { res.json({ code: -1, message: 'login rate limit' @@ -20,14 +21,14 @@ export const LoginHandler: RequestHandler = async (req, res) => { return; } //验证config.token是否等于token - if (WebUiConfig.token !== token) { + if (WebUiConfigData.token !== token) { res.json({ code: -1, message: 'token is invalid' }); return; } - let signCredential = Buffer.from(JSON.stringify(await AuthHelper.signCredential(WebUiConfig.token))).toString('base64'); + let signCredential = Buffer.from(JSON.stringify(await AuthHelper.signCredential(WebUiConfigData.token))).toString('base64'); res.json({ code: 0, message: 'success', @@ -46,11 +47,12 @@ export const LogoutHandler: RequestHandler = (req, res) => { return; }; export const checkHandler: RequestHandler = async (req, res) => { + let WebUiConfigData = await WebUiConfig.GetWebUIConfig(); const authorization = req.headers.authorization; try { let CredentialBase64:string = authorization?.split(' ')[1] as string; let Credential = JSON.parse(Buffer.from(CredentialBase64, 'base64').toString()); - await AuthHelper.validateCredentialWithinOneHour(WebUiConfig.token,Credential) + await AuthHelper.validateCredentialWithinOneHour(WebUiConfigData.token,Credential) res.json({ code: 0, message: 'success' diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index 775c84e0..463507c4 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -41,34 +41,40 @@ export interface WebUiConfigType { token: string; loginRate: number } -async function GetWebUIConfig(): Promise { - try { - let configPath = resolve(__dirname, "./config/webui.json"); - let config: WebUiConfigType = { - port: 6099, - token: Math.random().toString(36).slice(2),//生成随机密码 - loginRate: 3 - }; - - if (!existsSync(configPath)) { - writeFileSync(configPath, JSON.stringify(config, null, 4)); - } - - let fileContent = readFileSync(configPath, "utf-8"); - let parsedConfig = JSON.parse(fileContent) as WebUiConfigType; - - // 修正端口占用情况 - const [err, data] = await tryUsePort(parsedConfig.port).then(data => [null, data as number]).catch(err => [err, null]); - parsedConfig.port = data; - if (err) { - //一般没那么离谱 如果真有这么离谱 考虑下 向外抛出异常 - } - return parsedConfig; - } catch (e) { - console.error("读取配置文件失败", e); - } - return {} as WebUiConfigType; // 理论上这行代码到不了,为了保持函数完整性而保留 -} - // 读取当前目录下名为 webui.json 的配置文件,如果不存在则创建初始化配置文件 -export const WebUiConfig = await GetWebUIConfig(); \ No newline at end of file +class WebUiConfigWrapper { + WebUiConfigData: WebUiConfigType | undefined = undefined; + async GetWebUIConfig(): Promise { + if (this.WebUiConfigData) { + return this.WebUiConfigData; + } + try { + let configPath = resolve(__dirname, "./config/webui.json"); + let config: WebUiConfigType = { + port: 6099, + token: Math.random().toString(36).slice(2),//生成随机密码 + loginRate: 3 + }; + + if (!existsSync(configPath)) { + writeFileSync(configPath, JSON.stringify(config, null, 4)); + } + + let fileContent = readFileSync(configPath, "utf-8"); + let parsedConfig = JSON.parse(fileContent) as WebUiConfigType; + + // 修正端口占用情况 + const [err, data] = await tryUsePort(parsedConfig.port).then(data => [null, data as number]).catch(err => [err, null]); + parsedConfig.port = data; + if (err) { + //一般没那么离谱 如果真有这么离谱 考虑下 向外抛出异常 + } + this.WebUiConfigData = parsedConfig; + return this.WebUiConfigData; + } catch (e) { + console.error("读取配置文件失败", e); + } + return {} as WebUiConfigType; // 理论上这行代码到不了,为了保持函数完整性而保留 + } +} +export const WebUiConfig = new WebUiConfigWrapper(); \ No newline at end of file diff --git a/src/webui/src/router/QQLogin.ts b/src/webui/src/router/QQLogin.ts index 7bc7253e..7370d578 100644 --- a/src/webui/src/router/QQLogin.ts +++ b/src/webui/src/router/QQLogin.ts @@ -1,7 +1,7 @@ import { Router } from 'express'; -import { QQCheckLoginStatusHandler } from '../api/QQLogin'; +import { QQCheckLoginStatusHandler, QQGetQuickLoginListHandler } from '../api/QQLogin'; const router = Router(); - +router.all('/GetQuickLoginList', QQGetQuickLoginListHandler) router.post('/CheckLoginStatus', QQCheckLoginStatusHandler); export { router as QQLoginRouter }; \ No newline at end of file diff --git a/static/QQLogin.html b/static/QQLogin.html index 6fa79860..a2f176e4 100644 --- a/static/QQLogin.html +++ b/static/QQLogin.html @@ -150,9 +150,6 @@