From d74ad7bac53f8140449870da0635dfa22f52f383 Mon Sep 17 00:00:00 2001 From: bia-pain-bache Date: Thu, 28 Nov 2024 22:27:10 +0330 Subject: [PATCH] Revised error handling. --- src/authentication/auth.js | 3 +-- src/cores-configs/clash.js | 7 ++----- src/cores-configs/normalConfigs.js | 4 +--- src/cores-configs/sing-box.js | 7 ++----- src/cores-configs/xray.js | 7 ++----- src/helpers/helpers.js | 4 +--- src/helpers/init.js | 6 +++--- src/kv/handlers.js | 8 +++----- src/pages/error.js | 14 ++++---------- src/worker.js | 4 ++-- 10 files changed, 21 insertions(+), 43 deletions(-) diff --git a/src/authentication/auth.js b/src/authentication/auth.js index b58b3bab0..a4a97c80d 100644 --- a/src/authentication/auth.js +++ b/src/authentication/auth.js @@ -2,7 +2,6 @@ import { SignJWT, jwtVerify } from 'jose'; import nacl from 'tweetnacl'; import { initializeParams, userID, origin } from "../helpers/init"; import { renderLoginPage } from '../pages/login'; -import { renderErrorPage } from '../pages/error'; async function generateJWTToken (request, env) { await initializeParams(request, env); @@ -84,7 +83,7 @@ export async function resetPassword(request, env) { export async function login(request, env) { await initializeParams(request, env); - if (typeof env.bpb !== 'object') return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + if (typeof env.bpb !== 'object') throw new Error('KV Dataset is not properly set!', { cause: "init"}); const auth = await Authenticate(request, env); if (auth) return Response.redirect(`${origin}/panel`, 302); if (request.method === 'POST') return await generateJWTToken(request, env); diff --git a/src/cores-configs/clash.js b/src/cores-configs/clash.js index 22b041a45..09ff5a6fd 100644 --- a/src/cores-configs/clash.js +++ b/src/cores-configs/clash.js @@ -1,7 +1,6 @@ import { getConfigAddresses, extractWireguardParams, generateRemark, randomUpperCase, getRandomPath, isIPv6, isIPv4 } from './helpers'; import { initializeParams, userID, trojanPassword, hostName, defaultHttpsPorts } from "../helpers/init"; import { getDataset } from '../kv/handlers'; -import { renderErrorPage } from '../pages/error'; import { isDomain } from '../helpers/helpers'; async function buildClashDNS (proxySettings, isChain, isWarp) { @@ -415,8 +414,7 @@ function buildClashChainOutbound(chainProxyParams) { } export async function getClashWarpConfig(request, env) { - const { kvNotFound, proxySettings, warpConfigs } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings, warpConfigs } = await getDataset(request, env); const { warpEndpoints } = proxySettings; const config = structuredClone(clashConfigTemp); config.dns = await buildClashDNS(proxySettings, true, true); @@ -458,8 +456,7 @@ export async function getClashWarpConfig(request, env) { export async function getClashNormalConfig (request, env) { await initializeParams(request, env); - const { kvNotFound, proxySettings } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings } = await getDataset(request, env); let chainProxy; const { resolvedRemoteDNS, diff --git a/src/cores-configs/normalConfigs.js b/src/cores-configs/normalConfigs.js index 31c5142ec..170af571a 100644 --- a/src/cores-configs/normalConfigs.js +++ b/src/cores-configs/normalConfigs.js @@ -1,12 +1,10 @@ import { getConfigAddresses, generateRemark, randomUpperCase, getRandomPath } from './helpers'; import { initializeParams, userID, trojanPassword, hostName, client, defaultHttpsPorts } from "../helpers/init"; import { getDataset } from '../kv/handlers'; -import { renderErrorPage } from '../pages/error'; export async function getNormalConfigs(request, env) { await initializeParams(request, env); - const { kvNotFound, proxySettings } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings } = await getDataset(request, env); const { cleanIPs, proxyIP, diff --git a/src/cores-configs/sing-box.js b/src/cores-configs/sing-box.js index b237b3a91..a45eeed79 100644 --- a/src/cores-configs/sing-box.js +++ b/src/cores-configs/sing-box.js @@ -1,6 +1,5 @@ import { getConfigAddresses, extractWireguardParams, generateRemark, randomUpperCase, getRandomPath, isIPv6 } from './helpers'; import { initializeParams, userID, trojanPassword, hostName, defaultHttpsPorts } from "../helpers/init"; -import { renderErrorPage } from '../pages/error'; import { getDataset } from '../kv/handlers'; import { isDomain } from '../helpers/helpers'; @@ -574,8 +573,7 @@ function buildSingBoxChainOutbound (chainProxyParams, enableIPv6) { } export async function getSingBoxWarpConfig (request, env, client) { - const { kvNotFound, proxySettings, warpConfigs } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings, warpConfigs } = await getDataset(request, env); const { warpEndpoints } = proxySettings; const config = structuredClone(singboxConfigTemp); const proIndicator = client === 'hiddify' ? ' Pro ' : ' '; @@ -622,8 +620,7 @@ export async function getSingBoxWarpConfig (request, env, client) { export async function getSingBoxCustomConfig(request, env, isFragment) { await initializeParams(request, env); - const { kvNotFound, proxySettings } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings } = await getDataset(request, env); let chainProxy; const { cleanIPs, diff --git a/src/cores-configs/xray.js b/src/cores-configs/xray.js index a360848b5..7f5cf1185 100644 --- a/src/cores-configs/xray.js +++ b/src/cores-configs/xray.js @@ -2,7 +2,6 @@ import { resolveDNS, isDomain } from '../helpers/helpers'; import { getConfigAddresses, extractWireguardParams, base64ToDecimal, generateRemark, randomUpperCase, getRandomPath } from './helpers'; import { initializeParams, userID, trojanPassword, hostName, defaultHttpsPorts } from "../helpers/init"; import { getDataset } from '../kv/handlers'; -import { renderErrorPage } from '../pages/error'; async function buildXrayDNS (proxySettings, outboundAddrs, domainToStaticIPs, isWorkerLess, isWarp) { const { @@ -706,8 +705,7 @@ async function buildXrayWorkerLessConfig(proxySettings) { export async function getXrayCustomConfigs(request, env, isFragment) { await initializeParams(request, env); - const { kvNotFound, proxySettings } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings } = await getDataset(request, env); let configs = []; let outbounds = []; let protocols = []; @@ -802,8 +800,7 @@ export async function getXrayCustomConfigs(request, env, isFragment) { } export async function getXrayWarpConfigs (request, env, client) { - const { kvNotFound, proxySettings, warpConfigs } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings, warpConfigs } = await getDataset(request, env); const xrayWarpConfigs = []; const xrayWoWConfigs = []; const xrayWarpOutbounds = []; diff --git a/src/helpers/helpers.js b/src/helpers/helpers.js index e2842c048..ee314ce70 100644 --- a/src/helpers/helpers.js +++ b/src/helpers/helpers.js @@ -1,6 +1,5 @@ import { Authenticate } from "../authentication/auth"; import { getDataset, updateDataset } from "../kv/handlers"; -import { renderErrorPage } from "../pages/error"; import { renderHomePage } from "../pages/home"; import { initializeParams, origin } from "./init"; @@ -51,8 +50,7 @@ export async function handlePanel(request, env) { return new Response('Success', { status: 200 }); } - const { kvNotFound, proxySettings } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings } = await getDataset(request, env); const pwd = await env.bpb.get('pwd'); if (pwd && !auth) return Response.redirect(`${origin}/login`, 302); const isPassSet = pwd?.length >= 8; diff --git a/src/helpers/init.js b/src/helpers/init.js index a617ed02d..09a7b4a0d 100644 --- a/src/helpers/init.js +++ b/src/helpers/init.js @@ -9,16 +9,16 @@ function initParams(request, env) { trojanPassword = env.TROJAN_PASS; const url = new URL(request.url); pathName = url.pathname; + hostName = request.headers.get('Host'); if (pathName !== '/secrets') { - if (!userID || !trojanPassword) throw new Error("Please set UUID and Trojan password first."); - if (userID && !isValidUUID(userID)) throw new Error(`Invalid UUID: ${userID}`); + if (!userID || !trojanPassword) throw new Error(`Please set UUID and Trojan password first. Please go to 🟢 https://${hostName}/secrets 🟢`, { cause: "init"}); + if (userID && !isValidUUID(userID)) throw new Error(`Invalid UUID: ${userID}`, { cause: "init"}); } dohURL = env.DOH_URL || 'https://cloudflare-dns.com/dns-query'; proxyIP = proxyIPs ? proxyIPs[Math.floor(Math.random() * proxyIPs.length)] : defaultProxyIP; defaultHttpPorts = ['80', '8080', '2052', '2082', '2086', '2095', '8880']; defaultHttpsPorts = ['443', '8443', '2053', '2083', '2087', '2096']; panelVersion = '2.7.7'; - hostName = request.headers.get('Host'); const searchParams = new URLSearchParams(url.search); client = searchParams.get('app'); origin = url.origin; diff --git a/src/kv/handlers.js b/src/kv/handlers.js index 7eb801e99..00032e0df 100644 --- a/src/kv/handlers.js +++ b/src/kv/handlers.js @@ -2,13 +2,12 @@ import { fetchWarpConfigs } from '../protocols/warp'; import { isDomain, resolveDNS } from '../helpers/helpers'; import { initializeParams, panelVersion } from '../helpers/init'; import { Authenticate } from '../authentication/auth'; -import { renderErrorPage } from '../pages/error'; export async function getDataset(request, env) { await initializeParams(request, env); let proxySettings, warpConfigs; if (typeof env.bpb !== 'object') { - return {kvNotFound: true, proxySettings: null, warpConfigs: null} + throw new Error('KV Dataset is not properly set!', { cause: "init"}); } try { @@ -27,7 +26,7 @@ export async function getDataset(request, env) { } if (panelVersion !== proxySettings.panelVersion) proxySettings = await updateDataset(request, env); - return {kvNotFound: false, proxySettings, warpConfigs} + return { proxySettings, warpConfigs } } export async function updateDataset (request, env) { @@ -166,8 +165,7 @@ export async function updateWarpConfigs(request, env) { if (!auth) return new Response('Unauthorized', { status: 401 }); if (request.method === 'POST') { try { - const { kvNotFound, proxySettings } = await getDataset(request, env); - if (kvNotFound) return await renderErrorPage(request, env, 'KV Dataset is not properly set!', null, true); + const { proxySettings } = await getDataset(request, env); const { error: warpPlusError } = await fetchWarpConfigs(env, proxySettings); if (warpPlusError) return new Response(warpPlusError, { status: 400 }); return new Response('Warp configs updated successfully', { status: 200 }); diff --git a/src/pages/error.js b/src/pages/error.js index fa1574fe0..370d8dff1 100644 --- a/src/pages/error.js +++ b/src/pages/error.js @@ -1,7 +1,4 @@ -import { initializeParams, panelVersion } from "../helpers/init"; - -export async function renderErrorPage (request, env, message, error, refer) { - await initializeParams(request, env); +export async function renderErrorPage (error) { const errorPage = ` @@ -40,13 +37,10 @@ export async function renderErrorPage (request, env, message, error, refer) {
-

BPB Panel ${panelVersion} 💦

+

BPB Panel 💦

-

${message} ${refer - ? 'Please try again or refer to documents' - : ''} -

-

${error ? `⚠️ ${error.stack.toString()}` : ''}

+

❌ Something went wrong!

+

${error ? `⚠️ ${error.cause ? error.message.toString() : error.stack.toString()}` : ''}