diff --git a/napcat.webui/src/controllers/webui_manager.ts b/napcat.webui/src/controllers/webui_manager.ts index 6476a190..35cb4ed4 100644 --- a/napcat.webui/src/controllers/webui_manager.ts +++ b/napcat.webui/src/controllers/webui_manager.ts @@ -9,14 +9,6 @@ export interface Log { message: string } -export interface TerminalSession { - id: string -} - -export interface TerminalInfo { - id: string -} - export default class WebUIManager { public static async checkWebUiLogined() { const { data } = @@ -40,6 +32,13 @@ export default class WebUIManager { return data.data } + public static async checkUsingDefaultToken() { + const { data } = await serverRequest.get>( + '/auth/check_using_default_token' + ) + return data.data + } + public static async proxy(url = '') { const data = await serverRequest.get>( '/base/proxy?url=' + encodeURIComponent(url) diff --git a/napcat.webui/src/pages/dashboard/config/index.tsx b/napcat.webui/src/pages/dashboard/config/index.tsx index 54ef7e80..b90558d3 100644 --- a/napcat.webui/src/pages/dashboard/config/index.tsx +++ b/napcat.webui/src/pages/dashboard/config/index.tsx @@ -1,6 +1,7 @@ import { Card, CardBody } from '@heroui/card' import { Tab, Tabs } from '@heroui/tabs' import { useMediaQuery } from 'react-responsive' +import { useNavigate, useSearchParams } from 'react-router-dom' import ChangePasswordCard from './change_password' import OneBotConfigCard from './onebot' @@ -22,6 +23,11 @@ const ConfingPageItem: React.FC = ({ children }) => { export default function ConfigPage() { const isMediumUp = useMediaQuery({ minWidth: 768 }) + const navigate = useNavigate() + const search = useSearchParams({ + tab: 'onebot' + })[0] + const tab = search.get('tab') ?? 'onebot' return (
@@ -30,6 +36,10 @@ export default function ConfigPage() { fullWidth className="w-full" isVertical={isMediumUp} + selectedKey={tab} + onSelectionChange={(key) => { + navigate(`/config?tab=${key}`) + }} classNames={{ tabList: 'sticky flex top-14 bg-opacity-50 backdrop-blur-sm', panel: 'w-full relative', diff --git a/napcat.webui/src/pages/index.tsx b/napcat.webui/src/pages/index.tsx index 88ebec7f..b3f2f114 100644 --- a/napcat.webui/src/pages/index.tsx +++ b/napcat.webui/src/pages/index.tsx @@ -1,14 +1,46 @@ import { Spinner } from '@heroui/spinner' import { AnimatePresence, motion } from 'motion/react' -import { Suspense } from 'react' -import { Outlet, useLocation } from 'react-router-dom' +import { Suspense, useEffect } from 'react' +import { Outlet, useLocation, useNavigate } from 'react-router-dom' +import useAuth from '@/hooks/auth' +import useDialog from '@/hooks/use-dialog' + +import WebUIManager from '@/controllers/webui_manager' import DefaultLayout from '@/layouts/default' +const CheckDefaultPassword = () => { + const { isAuth } = useAuth() + const dialog = useDialog() + const navigate = useNavigate() + const checkDefaultPassword = async () => { + const data = await WebUIManager.checkUsingDefaultToken() + if (data) { + dialog.confirm({ + title: '修改默认密码', + content: '检测到当前密码为默认密码,请尽快修改密码。', + confirmText: '前往修改', + onConfirm: () => { + navigate('/config?tab=token') + } + }) + } + } + + useEffect(() => { + if (isAuth) { + checkDefaultPassword() + } + }, [isAuth]) + return null +} + export default function IndexPage() { const location = useLocation() + return ( + diff --git a/src/webui/index.ts b/src/webui/index.ts index d202195e..1fbc4a25 100644 --- a/src/webui/index.ts +++ b/src/webui/index.ts @@ -10,7 +10,7 @@ import { WebUiConfigWrapper } from '@webapi/helper/config'; import { ALLRouter } from '@webapi/router'; import { cors } from '@webapi/middleware/cors'; import { createUrl } from '@webapi/utils/url'; -import { sendError, sendSuccess } from '@webapi/utils/response'; +import { sendError } from '@webapi/utils/response'; import { join } from 'node:path'; import { terminalManager } from '@webapi/terminal/terminal_manager'; import multer from 'multer'; // 新增:引入multer用于错误捕获 @@ -112,7 +112,9 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp `[NapCat] [WebUi] WebUi User Panel Url: ${createUrl(host, port.toString(), '/webui', searchParams)}` ); } - logger.log(`[NapCat] [WebUi] WebUi Local Panel Url: ${createUrl('127.0.0.1', port.toString(), '/webui', searchParams)}`); + logger.log( + `[NapCat] [WebUi] WebUi Local Panel Url: ${createUrl('127.0.0.1', port.toString(), '/webui', searchParams)}` + ); }); // ------------Over!------------ } @@ -172,4 +174,4 @@ async function tryUsePort(port: number, host: string, tryCount: number = 0): Pro reject(new Error(`服务器启动时发生错误: ${error}`)); } }); -} \ No newline at end of file +} diff --git a/src/webui/src/api/Auth.ts b/src/webui/src/api/Auth.ts index d347f1a7..53e06315 100644 --- a/src/webui/src/api/Auth.ts +++ b/src/webui/src/api/Auth.ts @@ -7,6 +7,15 @@ import { WebUiDataRuntime } from '@webapi/helper/Data'; import { sendSuccess, sendError } from '@webapi/utils/response'; import { isEmpty } from '@webapi/utils/check'; +// 检查是否使用默认Token +export const CheckDefaultTokenHandler: RequestHandler = async (_, res) => { + const webuiToken = await WebUiConfig.GetWebUIConfig(); + if (webuiToken.token === 'napcat') { + return sendSuccess(res, true); + } + return sendSuccess(res, false); +}; + // 登录 export const LoginHandler: RequestHandler = async (req, res) => { // 获取WebUI配置 @@ -93,7 +102,7 @@ export const UpdateTokenHandler: RequestHandler = async (req, res) => { try { // 注销当前的Token if (authorization) { - const CredentialBase64: string = authorization.split(' ')[1]; + const CredentialBase64: string = authorization.split(' ')[1] as string; const Credential = JSON.parse(Buffer.from(CredentialBase64, 'base64').toString()); AuthHelper.revokeCredential(Credential); } diff --git a/src/webui/src/api/Log.ts b/src/webui/src/api/Log.ts index 1272ef70..a531d275 100644 --- a/src/webui/src/api/Log.ts +++ b/src/webui/src/api/Log.ts @@ -3,7 +3,8 @@ import { sendError, sendSuccess } from '../utils/response'; import { WebUiConfigWrapper } from '../helper/config'; import { logSubscription } from '@/common/log'; import { terminalManager } from '../terminal/terminal_manager'; - +// 判断是否是 macos +const isMacOS = process.platform === 'darwin'; // 日志记录 export const LogHandler: RequestHandler = async (req, res) => { const filename = req.query['id']; @@ -43,6 +44,9 @@ export const LogRealTimeHandler: RequestHandler = async (req, res) => { // 终端相关处理器 export const CreateTerminalHandler: RequestHandler = async (req, res) => { + if (isMacOS) { + return sendError(res, 'MacOS不支持终端'); + } try { const { cols, rows } = req.body; const { id } = terminalManager.createTerminal(cols, rows); diff --git a/src/webui/src/router/auth.ts b/src/webui/src/router/auth.ts index 4ab3a89b..79dcacb0 100644 --- a/src/webui/src/router/auth.ts +++ b/src/webui/src/router/auth.ts @@ -1,6 +1,12 @@ import { Router } from 'express'; -import { checkHandler, LoginHandler, LogoutHandler, UpdateTokenHandler } from '@webapi/api/Auth'; +import { + CheckDefaultTokenHandler, + checkHandler, + LoginHandler, + LogoutHandler, + UpdateTokenHandler, +} from '@webapi/api/Auth'; const router = Router(); // router:登录 @@ -11,5 +17,7 @@ router.post('/check', checkHandler); router.post('/logout', LogoutHandler); // router:更新token router.post('/update_token', UpdateTokenHandler); +// router:检查默认token +router.get('/check_using_default_token', CheckDefaultTokenHandler); export { router as AuthRouter };