import { ArrowUpRightIcon, AxeIcon, CommandIcon, InfoIcon, NetworkIcon, ServerIcon, ShieldOffIcon, SwordIcon, WaypointsIcon, ZapIcon, } from "lucide-react"; import { type JSX, useCallback, useEffect, useState } from "react"; import { FormProvider, type UseFormReturn } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { AntSwordTabContent } from "@/components/memshell/tabs/antsword-tab"; import { BehinderTabContent } from "@/components/memshell/tabs/behinder-tab"; import { CommandTabContent } from "@/components/memshell/tabs/command-tab"; import CustomTabContent from "@/components/memshell/tabs/custom-tab"; import { GodzillaTabContent } from "@/components/memshell/tabs/godzilla-tab"; import { NeoRegTabContent } from "@/components/memshell/tabs/neoreg-tab"; import { Suo5TabContent } from "@/components/memshell/tabs/suo5-tab"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { FormControl, FormDescription, FormField, FormFieldItem, FormFieldLabel, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { Tabs } from "@/components/ui/tabs"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { type MainConfig, type ServerConfig, ShellToolType, } from "@/types/memshell"; import type { MemShellFormSchema } from "@/types/schema"; const shellToolIcons: Record = { [ShellToolType.Behinder]: , [ShellToolType.Godzilla]: , [ShellToolType.Command]: , [ShellToolType.AntSword]: , [ShellToolType.Suo5]: , [ShellToolType.Suo5v2]: , [ShellToolType.NeoreGeorg]: , [ShellToolType.Custom]: , }; const defaultServerVersionOptions = [ { name: "Unknown", value: "unknown", }, ]; export default function MainConfigCard({ mainConfig, form, servers, }: Readonly<{ mainConfig: MainConfig | undefined; form: UseFormReturn; servers?: ServerConfig; }>) { const [shellToolMap, setShellToolMap] = useState<{ [toolName: string]: string[]; }>(); const [shellTools, setShellTools] = useState([ ShellToolType.Godzilla, ShellToolType.Behinder, ShellToolType.AntSword, ShellToolType.Command, ShellToolType.Suo5, ShellToolType.NeoreGeorg, ShellToolType.Custom, ]); const [shellTypes, setShellTypes] = useState([]); const shellTool = form.watch("shellTool"); const { t } = useTranslation(["common", "memshell"]); const [serverVersionOptions, setServerVersionOptions] = useState( defaultServerVersionOptions, ); // 处理一下 shellTypes 由于 server 或 shellTool 变更时无法正常为 form.shellType 赋值的问题 useEffect(() => { if (shellTypes.length > 0) { form.setValue("shellType", shellTypes[0]); } }, [shellTypes, form]); const handleServerChange = useCallback( (value: string) => { if (mainConfig) { const newShellToolMap = mainConfig[value]; setShellToolMap(newShellToolMap); const newShellTools = Object.keys(newShellToolMap); setShellTools([ ...newShellTools.map((tool) => tool as ShellToolType), ShellToolType.Custom, ]); const currentShellTool = form.getValues("shellTool"); const firstTool = newShellTools[0]; let currentShellTypes = null; if (!newShellToolMap[currentShellTool]) { form.setValue("shellTool", firstTool); currentShellTypes = newShellToolMap[firstTool]; } else { currentShellTypes = newShellToolMap[currentShellTool]; } setShellTypes(currentShellTypes); // 特殊环境的 JDK 版本 if ( (value === "SpringWebFlux" || value === "XXLJOB") && Number.parseInt(form.getValues("targetJdkVersion") as string, 10) < 52 ) { form.setValue("targetJdkVersion", "52"); } else { form.setValue("targetJdkVersion", "50"); } // 特殊的服务需要指定版本 if (value === "TongWeb") { setServerVersionOptions([ ...defaultServerVersionOptions, { name: "6", value: "6" }, { name: "7", value: "7" }, { name: "8", value: "8" }, ]); } else if (value === "Jetty") { setServerVersionOptions([ ...defaultServerVersionOptions, { name: "6", value: "6" }, { name: "7+", value: "7+" }, { name: "12", value: "12" }, ]); } else { setServerVersionOptions(defaultServerVersionOptions); } form.resetField("serverVersion"); form.resetField("byPassJavaModule"); form.resetField("urlPattern"); } }, [form, mainConfig], ); // 处理一下默认值 server 不刷新 shellType 的问题 useEffect(() => { if (mainConfig) { const initialServer = form.getValues("server"); if (initialServer && mainConfig[initialServer]) { handleServerChange(initialServer); } } }, [mainConfig, form, handleServerChange]); const handleShellToolChange = useCallback( (value: string) => { const resetCommand = () => { form.resetField("commandParamName"); form.resetField("implementationClass"); form.resetField("encryptor"); }; const resetGodzilla = () => { form.resetField("godzillaKey"); form.resetField("godzillaPass"); form.resetField("headerName"); form.resetField("headerValue"); }; const resetBehinder = () => { form.resetField("behinderPass"); form.resetField("headerName"); form.resetField("headerValue"); }; const resetSuo5 = () => { form.resetField("headerName"); form.resetField("headerValue"); }; const resetAntSword = () => { form.resetField("antSwordPass"); form.resetField("headerName"); form.resetField("headerValue"); }; const resetNeoreGeorg = () => { form.setValue("headerName", "Referer"); form.resetField("headerValue"); }; const resetCustom = () => { form.resetField("shellClassBase64"); }; if (shellToolMap) { let currentShellTypes = null; if (value === ShellToolType.Custom) { currentShellTypes = servers?.[form.getValues("server")] as string[]; } else { currentShellTypes = shellToolMap[value]; } setShellTypes(currentShellTypes); form.resetField("urlPattern"); form.resetField("shellClassName"); form.resetField("injectorClassName"); if (value === ShellToolType.Godzilla) { resetGodzilla(); } else if (value === ShellToolType.Behinder) { resetBehinder(); } else if (value === ShellToolType.Command) { resetCommand(); } else if (value === ShellToolType.Suo5) { resetSuo5(); } else if (value === ShellToolType.AntSword) { resetAntSword(); } else if (value === ShellToolType.NeoreGeorg) { resetNeoreGeorg(); } else if (value === ShellToolType.Custom) { resetCustom(); } } form.setValue("shellTool", value); }, [form, servers, shellToolMap], ); return ( {t("common:mainConfig.title")}
( {t("common:server")} {t("memshell:tips.targetServerNotFound")}  {t("memshell:tips.targetServerRequest")} )} /> ( {t("common:serverVersion")} )} />
( {t("common:shellTool")} )} />
(
{t("common:debug")}

{t("common:debug.description")}

)} /> (

{t("common:probe.description")}

)} /> (

{t("common:byPassJavaModule.description")}

)} /> (

{t("common:lambdaSuffix.description")}

)} /> (

{t("common:shrink.description")}

)} /> (

{t("common:staticInitialize.description")}

)} />
); }