From 8be7f74e9fb81bd6965d38a823b8fcc56b5d8d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=B6=E7=91=BE?= <74231782+sj817@users.noreply.github.com> Date: Fri, 12 Sep 2025 18:50:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=20`defaultToken`=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=8C=E5=BD=BB=E5=BA=95=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E7=A1=AC=E7=BC=96=E7=A0=81=E7=9A=84=E9=BB=98=E8=AE=A4=E5=AF=86?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E9=87=87=E7=94=A8=E5=85=A8=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/webui/index.ts | 10 +++++----- src/webui/src/api/Auth.ts | 2 +- src/webui/src/api/File.ts | 4 ---- src/webui/src/api/Log.ts | 3 --- src/webui/src/api/OB11Config.ts | 8 ++------ src/webui/src/helper/config.ts | 17 +++++++++-------- src/webui/src/utils/url.ts | 11 +++++++++++ 7 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/webui/index.ts b/src/webui/index.ts index a6bfd0f3..7c3388f3 100644 --- a/src/webui/index.ts +++ b/src/webui/index.ts @@ -4,14 +4,14 @@ import express from 'express'; import { createServer } from 'http'; -import { randomUUID, randomBytes } from 'node:crypto' +import { randomUUID } from 'node:crypto' import { createServer as createHttpsServer } from 'https'; import { LogWrapper } from '@/common/log'; import { NapCatPathWrapper } from '@/common/path'; import { WebUiConfigWrapper } from '@webapi/helper/config'; import { ALLRouter } from '@webapi/router'; import { cors } from '@webapi/middleware/cors'; -import { createUrl } from '@webapi/utils/url'; +import { createUrl, getRandomToken } from '@webapi/utils/url'; import { sendError } from '@webapi/utils/response'; import { join } from 'node:path'; import { terminalManager } from '@webapi/terminal/terminal_manager'; @@ -90,9 +90,9 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp let config = await WebUiConfig.GetWebUIConfig(); // 检查并更新默认密码 - 最高优先级 - if (config.defaultToken || config.token === 'napcat' || !config.token) { - const randomToken = randomBytes(6).toString('hex'); - await WebUiConfig.UpdateWebUIConfig({ token: randomToken, defaultToken: false }); + if (config.token === 'napcat' || !config.token) { + const randomToken = getRandomToken(8); + await WebUiConfig.UpdateWebUIConfig({ token: randomToken }); logger.log(`[NapCat] [WebUi] 🔐 检测到默认密码,已自动更新为安全密码`); // 存储token到全局变量,等待QQ登录成功后发送 diff --git a/src/webui/src/api/Auth.ts b/src/webui/src/api/Auth.ts index 54a8dfda..d7f9c8ce 100644 --- a/src/webui/src/api/Auth.ts +++ b/src/webui/src/api/Auth.ts @@ -141,7 +141,7 @@ export const UpdateTokenHandler: RequestHandler = async (req, res) => { return sendError(res, '旧 token 不匹配'); } // 直接更新配置文件中的token,不需要通过WebUiConfig.UpdateToken方法 - await WebUiConfig.UpdateWebUIConfig({ token: newToken, defaultToken: false }); + await WebUiConfig.UpdateWebUIConfig({ token: newToken }); // 更新内存中的缓存token,使新密码立即生效 setInitialWebUiToken(newToken); diff --git a/src/webui/src/api/File.ts b/src/webui/src/api/File.ts index b7b0f4f2..c90c7886 100644 --- a/src/webui/src/api/File.ts +++ b/src/webui/src/api/File.ts @@ -156,10 +156,6 @@ const checkSameTypeExists = async (pathToCheck: string, isDirectory: boolean): P // 获取目录内容 export const ListFilesHandler: RequestHandler = async (req, res) => { - const webuiToken = await WebUiConfig.GetWebUIConfig(); - if (webuiToken.defaultToken) { - return sendError(res, '默认密码禁止使用'); - } try { const requestPath = getQueryStringParam(req.query['path']) || (isWindows ? process.env['USERPROFILE'] || 'C:\\' : '/'); diff --git a/src/webui/src/api/Log.ts b/src/webui/src/api/Log.ts index 275fb713..6f08cf9d 100644 --- a/src/webui/src/api/Log.ts +++ b/src/webui/src/api/Log.ts @@ -55,9 +55,6 @@ export const CreateTerminalHandler: RequestHandler = async (req, res) => { if (isMacOS) { return sendError(res, 'MacOS不支持终端'); } - if ((await WebUiConfig.GetWebUIConfig()).defaultToken) { - return sendError(res, '该密码禁止创建终端'); - } try { const { cols, rows } = req.body; const { id } = terminalManager.createTerminal(cols, rows); diff --git a/src/webui/src/api/OB11Config.ts b/src/webui/src/api/OB11Config.ts index fd05057f..dad6f7ba 100644 --- a/src/webui/src/api/OB11Config.ts +++ b/src/webui/src/api/OB11Config.ts @@ -2,7 +2,7 @@ import { RequestHandler } from 'express'; import { existsSync, readFileSync } from 'node:fs'; import { resolve } from 'node:path'; import { loadConfig, OneBotConfig } from '@/onebot/config/config'; -import { WebUiConfig, webUiPathWrapper } from '@/webui'; +import { webUiPathWrapper } from '@/webui'; import { WebUiDataRuntime } from '@webapi/helper/Data'; import { sendError, sendSuccess } from '@webapi/utils/response'; import { isEmpty } from '@webapi/utils/check'; @@ -47,10 +47,6 @@ export const OB11SetConfigHandler: RequestHandler = async (req, res) => { if (isEmpty(req.body.config)) { return sendError(res, 'config is empty'); } - const webuiToken = await WebUiConfig.GetWebUIConfig(); - if (webuiToken.defaultToken) { - return sendError(res, '默认密码禁止写入配置'); - } // 写入配置 try { // 解析并加载配置 @@ -61,4 +57,4 @@ export const OB11SetConfigHandler: RequestHandler = async (req, res) => { } catch (e) { return sendError(res, 'Error: ' + e); } -}; \ No newline at end of file +}; diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index bfbdffad..c03d8535 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -7,17 +7,17 @@ import { resolve } from 'node:path'; import { deepMerge } from '../utils/object'; import { themeType } from '../types/theme'; +import { getRandomToken } from '../utils/url' // 限制尝试端口的次数,避免死循环 // 定义配置的类型 const WebUiConfigSchema = Type.Object({ - host: Type.String({ default: '0.0.0.0' }), + host: Type.String({ default: '127.0.0.1' }), port: Type.Number({ default: 6099 }), - token: Type.String({ default: 'napcat' }), + token: Type.String({ default: getRandomToken(8) }), loginRate: Type.Number({ default: 10 }), autoLoginAccount: Type.String({ default: '' }), theme: themeType, - defaultToken: Type.Boolean({ default: true }), // 是否关闭WebUI disableWebUI: Type.Boolean({ default: false }), // 是否关闭非局域网访问 @@ -75,16 +75,17 @@ export class WebUiConfigWrapper { this.WebUiConfigData = { ...parsedConfig, // 首次读取内存中是没有token的,需要进行一层兜底 - token: getInitialWebUiToken() || parsedConfig.token + token: getInitialWebUiToken() || parsedConfig.token, }; return this.WebUiConfigData; } catch (e) { console.log('读取配置文件失败', e); const defaultConfig = this.validateAndApplyDefaults({}); - return { + this.WebUiConfigData = { ...defaultConfig, - token: defaultConfig.token - }; + token: getInitialWebUiToken() || defaultConfig.token, + } + return this.WebUiConfigData; } } @@ -126,7 +127,7 @@ export class WebUiConfigWrapper { if (tokenToCheck !== oldToken) { throw new Error('旧 token 不匹配'); } - await this.UpdateWebUIConfig({ token: newToken, defaultToken: false }); + await this.UpdateWebUIConfig({ token: newToken }); } // 获取日志文件夹路径 diff --git a/src/webui/src/utils/url.ts b/src/webui/src/utils/url.ts index 55d6bde6..8edf6e96 100644 --- a/src/webui/src/utils/url.ts +++ b/src/webui/src/utils/url.ts @@ -3,6 +3,7 @@ */ import { isIP } from 'node:net'; +import { randomBytes } from 'node:crypto' /** * 将 host(主机地址) 转换为标准格式 @@ -44,3 +45,13 @@ export const createUrl = ( } return url.toString(); }; + +/** + * 生成随机Token + * @param length Token长度 默认8 + * @returns 随机Token字符串 + * @example getRandomToken + */ +export const getRandomToken = (length = 8) => { + return randomBytes(36).toString('hex').slice(0, length); +}