mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 07:00:43 +08:00
feat: support random param and default config (#50)
This commit is contained in:
@@ -48,6 +48,7 @@ dependencies {
|
|||||||
implementation('org.springframework.boot:spring-boot-starter-web') {
|
implementation('org.springframework.boot:spring-boot-starter-web') {
|
||||||
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
|
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
|
||||||
}
|
}
|
||||||
|
implementation 'org.apache.commons:commons-lang3:3.+'
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-undertow'
|
implementation 'org.springframework.boot:spring-boot-starter-undertow'
|
||||||
compileOnly 'org.projectlombok:lombok'
|
compileOnly 'org.projectlombok:lombok'
|
||||||
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package com.reajason.javaweb.boot.dto;
|
|||||||
|
|
||||||
import com.reajason.javaweb.memshell.Packers;
|
import com.reajason.javaweb.memshell.Packers;
|
||||||
import com.reajason.javaweb.memshell.config.*;
|
import com.reajason.javaweb.memshell.config.*;
|
||||||
|
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
@@ -32,36 +34,36 @@ public class GenerateRequest {
|
|||||||
return switch (shellConfig.getShellTool()) {
|
return switch (shellConfig.getShellTool()) {
|
||||||
case Godzilla -> GodzillaConfig.builder()
|
case Godzilla -> GodzillaConfig.builder()
|
||||||
.shellClassName(shellToolConfig.getShellClassName())
|
.shellClassName(shellToolConfig.getShellClassName())
|
||||||
.pass(shellToolConfig.getGodzillaPass())
|
.pass(StringUtils.defaultIfBlank(shellToolConfig.getGodzillaPass(), CommonUtil.getRandomString(8)))
|
||||||
.key(shellToolConfig.getGodzillaKey())
|
.key(StringUtils.defaultIfBlank(shellToolConfig.getGodzillaKey(), CommonUtil.getRandomString(8)))
|
||||||
.headerName(shellToolConfig.getHeaderName())
|
.headerName(shellToolConfig.getHeaderName())
|
||||||
.headerValue(shellToolConfig.getHeaderValue())
|
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8)))
|
||||||
.build();
|
.build();
|
||||||
case Behinder -> BehinderConfig.builder()
|
case Behinder -> BehinderConfig.builder()
|
||||||
.shellClassName(shellToolConfig.getShellClassName())
|
.shellClassName(shellToolConfig.getShellClassName())
|
||||||
.pass(shellToolConfig.getBehinderPass())
|
.pass(StringUtils.defaultIfBlank(shellToolConfig.getBehinderPass(), CommonUtil.getRandomString(8)))
|
||||||
.headerName(shellToolConfig.getHeaderName())
|
.headerName(shellToolConfig.getHeaderName())
|
||||||
.headerValue(shellToolConfig.getHeaderValue())
|
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8)))
|
||||||
.build();
|
.build();
|
||||||
case Command -> CommandConfig.builder()
|
case Command -> CommandConfig.builder()
|
||||||
.shellClassName(shellToolConfig.getShellClassName())
|
.shellClassName(shellToolConfig.getShellClassName())
|
||||||
.paramName(shellToolConfig.getCommandParamName())
|
.paramName(StringUtils.defaultIfBlank(shellToolConfig.getCommandParamName(), CommonUtil.getRandomString(8)))
|
||||||
.build();
|
.build();
|
||||||
case Suo5 -> Suo5Config.builder()
|
case Suo5 -> Suo5Config.builder()
|
||||||
.shellClassName(shellToolConfig.getShellClassName())
|
.shellClassName(shellToolConfig.getShellClassName())
|
||||||
.headerName(shellToolConfig.getHeaderName())
|
.headerName(shellToolConfig.getHeaderName())
|
||||||
.headerValue(shellToolConfig.getHeaderValue())
|
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8)))
|
||||||
.build();
|
.build();
|
||||||
case AntSword -> AntSwordConfig.builder()
|
case AntSword -> AntSwordConfig.builder()
|
||||||
.shellClassName(shellToolConfig.getShellClassName())
|
.shellClassName(shellToolConfig.getShellClassName())
|
||||||
.pass(shellToolConfig.getAntSwordPass())
|
.pass(StringUtils.defaultIfBlank(shellToolConfig.getAntSwordPass(), CommonUtil.getRandomString(8)))
|
||||||
.headerName(shellToolConfig.getHeaderName())
|
.headerName(shellToolConfig.getHeaderName())
|
||||||
.headerValue(shellToolConfig.getHeaderValue())
|
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8)))
|
||||||
.build();
|
.build();
|
||||||
case NeoreGeorg -> NeoreGeorgConfig.builder()
|
case NeoreGeorg -> NeoreGeorgConfig.builder()
|
||||||
.shellClassName(shellToolConfig.getShellClassName())
|
.shellClassName(shellToolConfig.getShellClassName())
|
||||||
.headerName(shellToolConfig.getHeaderName())
|
.headerName(shellToolConfig.getHeaderName())
|
||||||
.headerValue(shellToolConfig.getHeaderValue())
|
.headerValue(StringUtils.defaultIfBlank(shellToolConfig.getHeaderValue(), CommonUtil.getRandomString(8)))
|
||||||
.build();
|
.build();
|
||||||
case Custom -> CustomConfig.builder()
|
case Custom -> CustomConfig.builder()
|
||||||
.shellClassBase64(shellToolConfig.getShellClassBase64())
|
.shellClassBase64(shellToolConfig.getShellClassBase64())
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import lombok.experimental.SuperBuilder;
|
|||||||
@ToString
|
@ToString
|
||||||
public class AntSwordConfig extends ShellToolConfig {
|
public class AntSwordConfig extends ShellToolConfig {
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String pass = "pass";
|
private String pass = CommonUtil.getRandomString(8);
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String headerName = "User-Agent";
|
private String headerName = "User-Agent";
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import lombok.experimental.SuperBuilder;
|
|||||||
@ToString
|
@ToString
|
||||||
public class BehinderConfig extends ShellToolConfig {
|
public class BehinderConfig extends ShellToolConfig {
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String pass = "pass";
|
private String pass = CommonUtil.getRandomString(8);
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String headerName = "User-Agent";
|
private String headerName = "User-Agent";
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.reajason.javaweb.memshell.config;
|
package com.reajason.javaweb.memshell.config;
|
||||||
|
|
||||||
|
import com.reajason.javaweb.memshell.utils.CommonUtil;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
@@ -14,5 +15,5 @@ import lombok.experimental.SuperBuilder;
|
|||||||
@ToString
|
@ToString
|
||||||
public class CommandConfig extends ShellToolConfig {
|
public class CommandConfig extends ShellToolConfig {
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String paramName = "cmd";
|
private String paramName = CommonUtil.getRandomString(8);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ import lombok.experimental.SuperBuilder;
|
|||||||
@ToString
|
@ToString
|
||||||
public class GodzillaConfig extends ShellToolConfig {
|
public class GodzillaConfig extends ShellToolConfig {
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String pass = "pass";
|
private String pass = CommonUtil.getRandomString(8);
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String key = "key";
|
private String key = CommonUtil.getRandomString(8);
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
private String headerName = "User-Agent";
|
private String headerName = "User-Agent";
|
||||||
@Builder.Default
|
@Builder.Default
|
||||||
|
|||||||
@@ -30,8 +30,9 @@ public class ApusicShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(SERVLET, ApusicServletInjector.class)
|
.addInjector(LISTENER, ApusicListenerInjector.class)
|
||||||
.addInjector(FILTER, ApusicFilterInjector.class)
|
.addInjector(FILTER, ApusicFilterInjector.class)
|
||||||
.addInjector(LISTENER, ApusicListenerInjector.class).build();
|
.addInjector(SERVLET, ApusicServletInjector.class)
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ public class BesShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(FILTER, BesFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, BesListenerInjector.class)
|
.addInjector(LISTENER, BesListenerInjector.class)
|
||||||
|
.addInjector(FILTER, BesFilterInjector.class)
|
||||||
.addInjector(VALVE, BesValveInjector.class)
|
.addInjector(VALVE, BesValveInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN, BesFilterChainAgentInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN, BesFilterChainAgentInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN_ASM, BesFilterChainAgentWithAsmInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN_ASM, BesFilterChainAgentWithAsmInjector.class)
|
||||||
|
|||||||
@@ -44,10 +44,10 @@ public class GlassFishShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(FILTER, GlassFishFilterInjector.class)
|
|
||||||
.addInjector(JAKARTA_FILTER, GlassFishFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, GlassFishListenerInjector.class)
|
.addInjector(LISTENER, GlassFishListenerInjector.class)
|
||||||
.addInjector(JAKARTA_LISTENER, GlassFishListenerInjector.class)
|
.addInjector(JAKARTA_LISTENER, GlassFishListenerInjector.class)
|
||||||
|
.addInjector(FILTER, GlassFishFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, GlassFishFilterInjector.class)
|
||||||
.addInjector(VALVE, GlassFishValveInjector.class)
|
.addInjector(VALVE, GlassFishValveInjector.class)
|
||||||
.addInjector(JAKARTA_VALVE, GlassFishValveInjector.class)
|
.addInjector(JAKARTA_VALVE, GlassFishValveInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
||||||
|
|||||||
@@ -24,10 +24,10 @@ public class InforSuiteShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(FILTER, InforSuiteFilterInjector.class)
|
|
||||||
.addInjector(JAKARTA_FILTER, InforSuiteFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, GlassFishListenerInjector.class)
|
.addInjector(LISTENER, GlassFishListenerInjector.class)
|
||||||
.addInjector(JAKARTA_LISTENER, GlassFishListenerInjector.class)
|
.addInjector(JAKARTA_LISTENER, GlassFishListenerInjector.class)
|
||||||
|
.addInjector(FILTER, InforSuiteFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, InforSuiteFilterInjector.class)
|
||||||
.addInjector(VALVE, GlassFishValveInjector.class)
|
.addInjector(VALVE, GlassFishValveInjector.class)
|
||||||
.addInjector(JAKARTA_VALVE, GlassFishValveInjector.class)
|
.addInjector(JAKARTA_VALVE, GlassFishValveInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ public class JbossShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(FILTER, JbossFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, JbossListenerInjector.class)
|
.addInjector(LISTENER, JbossListenerInjector.class)
|
||||||
|
.addInjector(FILTER, JbossFilterInjector.class)
|
||||||
.addInjector(VALVE, JbossValveInjector.class)
|
.addInjector(VALVE, JbossValveInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN_ASM, TomcatFilterChainAgentWithAsmInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN_ASM, TomcatFilterChainAgentWithAsmInjector.class)
|
||||||
|
|||||||
@@ -33,12 +33,12 @@ public class JettyShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(SERVLET, JettyServletInjector.class)
|
|
||||||
.addInjector(JAKARTA_SERVLET, JettyServletInjector.class)
|
|
||||||
.addInjector(FILTER, JettyFilterInjector.class)
|
|
||||||
.addInjector(JAKARTA_FILTER, JettyFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, JettyListenerInjector.class)
|
.addInjector(LISTENER, JettyListenerInjector.class)
|
||||||
.addInjector(JAKARTA_LISTENER, JettyListenerInjector.class)
|
.addInjector(JAKARTA_LISTENER, JettyListenerInjector.class)
|
||||||
|
.addInjector(FILTER, JettyFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, JettyFilterInjector.class)
|
||||||
|
.addInjector(SERVLET, JettyServletInjector.class)
|
||||||
|
.addInjector(JAKARTA_SERVLET, JettyServletInjector.class)
|
||||||
.addInjector(JETTY_AGENT_HANDLER, JettyHandlerAgentInjector.class)
|
.addInjector(JETTY_AGENT_HANDLER, JettyHandlerAgentInjector.class)
|
||||||
.addInjector(JETTY_AGENT_HANDLER_ASM, JettyHandlerAgentWithAsmInjector.class)
|
.addInjector(JETTY_AGENT_HANDLER_ASM, JettyHandlerAgentWithAsmInjector.class)
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ public class ResinShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(SERVLET, ResinServletInjector.class)
|
|
||||||
.addInjector(FILTER, ResinFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, ResinListenerInjector.class)
|
.addInjector(LISTENER, ResinListenerInjector.class)
|
||||||
|
.addInjector(FILTER, ResinFilterInjector.class)
|
||||||
|
.addInjector(SERVLET, ResinServletInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN, ResinFilterChainAgentInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN, ResinFilterChainAgentInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN_ASM, ResinFilterChainAgentWithAsmInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN_ASM, ResinFilterChainAgentWithAsmInjector.class)
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
+3
-4
@@ -23,12 +23,11 @@ public class ServerToolRegistry {
|
|||||||
Set<String> injectorSupportedShellTypes = shellInjectorMapping.getSupportedShellTypes();
|
Set<String> injectorSupportedShellTypes = shellInjectorMapping.getSupportedShellTypes();
|
||||||
ToolMapping.ToolMappingBuilder toolMappingBuilder = ToolMapping.builder();
|
ToolMapping.ToolMappingBuilder toolMappingBuilder = ToolMapping.builder();
|
||||||
|
|
||||||
for (Map.Entry<String, Class<?>> entry : rawToolMapping.entrySet()) {
|
for (String shellType : injectorSupportedShellTypes) {
|
||||||
String shellType = entry.getKey();
|
Class<?> shellClass = rawToolMapping.get(shellType);
|
||||||
if (!injectorSupportedShellTypes.contains(shellType)) {
|
if (shellClass == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Class<?> shellClass = entry.getValue();
|
|
||||||
|
|
||||||
if (ShellType.LISTENER.equals(shellType) || ShellType.JAKARTA_LISTENER.equals(shellType)) {
|
if (ShellType.LISTENER.equals(shellType) || ShellType.JAKARTA_LISTENER.equals(shellType)) {
|
||||||
shellClass = ListenerGenerator.generateListenerShellClass(shell.getListenerInterceptor(), shellClass);
|
shellClass = ListenerGenerator.generateListenerShellClass(shell.getListenerInterceptor(), shellClass);
|
||||||
|
|||||||
+1
-1
@@ -17,9 +17,9 @@ public class SpringWebFluxShell extends AbstractShell {
|
|||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(SPRING_WEBFLUX_WEB_FILTER, SpringWebFluxWebFilterInjector.class)
|
.addInjector(SPRING_WEBFLUX_WEB_FILTER, SpringWebFluxWebFilterInjector.class)
|
||||||
|
.addInjector(NETTY_HANDLER, SpringWebFluxNettyHandlerInjector.class)
|
||||||
.addInjector(SPRING_WEBFLUX_HANDLER_METHOD, SpringWebFluxHandlerMethodInjector.class)
|
.addInjector(SPRING_WEBFLUX_HANDLER_METHOD, SpringWebFluxHandlerMethodInjector.class)
|
||||||
.addInjector(SPRING_WEBFLUX_HANDLER_FUNCTION, SpringWebFluxHandlerFunctionInjector.class)
|
.addInjector(SPRING_WEBFLUX_HANDLER_FUNCTION, SpringWebFluxHandlerFunctionInjector.class)
|
||||||
.addInjector(NETTY_HANDLER, SpringWebFluxNettyHandlerInjector.class)
|
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,14 +33,14 @@ public class TomcatShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(SERVLET, TomcatServletInjector.class)
|
|
||||||
.addInjector(JAKARTA_SERVLET, TomcatServletInjector.class)
|
|
||||||
.addInjector(FILTER, TomcatFilterInjector.class)
|
|
||||||
.addInjector(JAKARTA_FILTER, TomcatFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, TomcatListenerInjector.class)
|
.addInjector(LISTENER, TomcatListenerInjector.class)
|
||||||
.addInjector(JAKARTA_LISTENER, TomcatListenerInjector.class)
|
.addInjector(JAKARTA_LISTENER, TomcatListenerInjector.class)
|
||||||
|
.addInjector(FILTER, TomcatFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, TomcatFilterInjector.class)
|
||||||
.addInjector(VALVE, TomcatValveInjector.class)
|
.addInjector(VALVE, TomcatValveInjector.class)
|
||||||
.addInjector(JAKARTA_VALVE, TomcatValveInjector.class)
|
.addInjector(JAKARTA_VALVE, TomcatValveInjector.class)
|
||||||
|
.addInjector(SERVLET, TomcatServletInjector.class)
|
||||||
|
.addInjector(JAKARTA_SERVLET, TomcatServletInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN, TomcatFilterChainAgentInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN_ASM, TomcatFilterChainAgentWithAsmInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN_ASM, TomcatFilterChainAgentWithAsmInjector.class)
|
||||||
.addInjector(CATALINA_AGENT_CONTEXT_VALVE, TomcatContextValveAgentInjector.class)
|
.addInjector(CATALINA_AGENT_CONTEXT_VALVE, TomcatContextValveAgentInjector.class)
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ public class TongWeb6Shell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(FILTER, TongWebFilterInjector.class)
|
|
||||||
.addInjector(JAKARTA_FILTER, TongWebFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, TongWebListenerInjector.class)
|
.addInjector(LISTENER, TongWebListenerInjector.class)
|
||||||
.addInjector(JAKARTA_LISTENER, TongWebListenerInjector.class)
|
.addInjector(JAKARTA_LISTENER, TongWebListenerInjector.class)
|
||||||
|
.addInjector(FILTER, TongWebFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, TongWebFilterInjector.class)
|
||||||
.addInjector(VALVE, TongWebValveInjector.class)
|
.addInjector(VALVE, TongWebValveInjector.class)
|
||||||
.addInjector(JAKARTA_VALVE, TongWebValveInjector.class)
|
.addInjector(JAKARTA_VALVE, TongWebValveInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN, TongWebFilterChainAgentInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN, TongWebFilterChainAgentInjector.class)
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ public class TongWeb7Shell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(FILTER, TongWebFilterInjector.class)
|
|
||||||
.addInjector(JAKARTA_FILTER, TongWebFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, TongWebListenerInjector.class)
|
.addInjector(LISTENER, TongWebListenerInjector.class)
|
||||||
.addInjector(JAKARTA_LISTENER, TongWebListenerInjector.class)
|
.addInjector(JAKARTA_LISTENER, TongWebListenerInjector.class)
|
||||||
|
.addInjector(FILTER, TongWebFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, TongWebFilterInjector.class)
|
||||||
.addInjector(VALVE, TongWebValveInjector.class)
|
.addInjector(VALVE, TongWebValveInjector.class)
|
||||||
.addInjector(JAKARTA_VALVE, TongWebValveInjector.class)
|
.addInjector(JAKARTA_VALVE, TongWebValveInjector.class)
|
||||||
.addInjector(AGENT_FILTER_CHAIN, TongWebFilterChainAgentInjector.class)
|
.addInjector(AGENT_FILTER_CHAIN, TongWebFilterChainAgentInjector.class)
|
||||||
|
|||||||
@@ -38,12 +38,12 @@ public class UndertowShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(SERVLET, UndertowServletInjector.class)
|
|
||||||
.addInjector(JAKARTA_SERVLET, UndertowServletInjector.class)
|
|
||||||
.addInjector(FILTER, UndertowFilterInjector.class)
|
|
||||||
.addInjector(JAKARTA_FILTER, UndertowFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, UndertowListenerInjector.class)
|
.addInjector(LISTENER, UndertowListenerInjector.class)
|
||||||
.addInjector(JAKARTA_LISTENER, UndertowListenerInjector.class)
|
.addInjector(JAKARTA_LISTENER, UndertowListenerInjector.class)
|
||||||
|
.addInjector(FILTER, UndertowFilterInjector.class)
|
||||||
|
.addInjector(JAKARTA_FILTER, UndertowFilterInjector.class)
|
||||||
|
.addInjector(SERVLET, UndertowServletInjector.class)
|
||||||
|
.addInjector(JAKARTA_SERVLET, UndertowServletInjector.class)
|
||||||
.addInjector(UNDERTOW_AGENT_SERVLET_HANDLER, UndertowServletInitialHandlerAgentInjector.class)
|
.addInjector(UNDERTOW_AGENT_SERVLET_HANDLER, UndertowServletInitialHandlerAgentInjector.class)
|
||||||
.addInjector(UNDERTOW_AGENT_SERVLET_HANDLER_ASM, UndertowServletInitialHandlerAgentWithAsmInjector.class)
|
.addInjector(UNDERTOW_AGENT_SERVLET_HANDLER_ASM, UndertowServletInitialHandlerAgentWithAsmInjector.class)
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ public class WebLogicShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(SERVLET, WebLogicServletInjector.class)
|
|
||||||
.addInjector(FILTER, WebLogicFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, WebLogicListenerInjector.class)
|
.addInjector(LISTENER, WebLogicListenerInjector.class)
|
||||||
|
.addInjector(FILTER, WebLogicFilterInjector.class)
|
||||||
|
.addInjector(SERVLET, WebLogicServletInjector.class)
|
||||||
.addInjector(WEBLOGIC_AGENT_SERVLET_CONTEXT, WebLogicServletContextAgentInjector.class)
|
.addInjector(WEBLOGIC_AGENT_SERVLET_CONTEXT, WebLogicServletContextAgentInjector.class)
|
||||||
.addInjector(WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM, WebLogicServletContextAgentWithAsmInjector.class)
|
.addInjector(WEBLOGIC_AGENT_SERVLET_CONTEXT_ASM, WebLogicServletContextAgentWithAsmInjector.class)
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ public class WebSphereShell extends AbstractShell {
|
|||||||
@Override
|
@Override
|
||||||
public InjectorMapping getShellInjectorMapping() {
|
public InjectorMapping getShellInjectorMapping() {
|
||||||
return InjectorMapping.builder()
|
return InjectorMapping.builder()
|
||||||
.addInjector(SERVLET, WebSphereServletInjector.class)
|
|
||||||
.addInjector(FILTER, WebSphereFilterInjector.class)
|
|
||||||
.addInjector(LISTENER, WebSphereListenerInjector.class)
|
.addInjector(LISTENER, WebSphereListenerInjector.class)
|
||||||
|
.addInjector(FILTER, WebSphereFilterInjector.class)
|
||||||
|
.addInjector(SERVLET, WebSphereServletInjector.class)
|
||||||
.addInjector(WAS_AGENT_FILTER_MANAGER, WebSphereFilterChainAgentInjector.class)
|
.addInjector(WAS_AGENT_FILTER_MANAGER, WebSphereFilterChainAgentInjector.class)
|
||||||
.addInjector(WAS_AGENT_FILTER_MANAGER_ASM, WebSphereFilterChainAgentWithAsmInjector.class)
|
.addInjector(WAS_AGENT_FILTER_MANAGER_ASM, WebSphereFilterChainAgentWithAsmInjector.class)
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
import { LanguageSwitcher } from "@/components/language-switcher";
|
import { LanguageSwitcher } from "@/components/language-switcher";
|
||||||
import { ModeToggle } from "@/components/mode-toggle.tsx";
|
import { ModeToggle } from "@/components/mode-toggle.tsx";
|
||||||
import { ThemeProvider } from "@/components/theme-provider.tsx";
|
import { ThemeProvider } from "@/components/theme-provider.tsx";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
import { Toaster } from "@/components/ui/sonner";
|
import { Toaster } from "@/components/ui/sonner";
|
||||||
import VersionBadge from "@/components/version-badge";
|
import VersionBadge from "@/components/version-badge";
|
||||||
import { GitHubIcon } from "@/icon";
|
import { GitHubIcon } from "@/icon";
|
||||||
import { Button } from "@/components/ui/button";
|
|
||||||
import { Outlet } from "react-router-dom";
|
import { Outlet } from "react-router-dom";
|
||||||
|
|
||||||
|
|
||||||
export default function RootLayout() {
|
export default function RootLayout() {
|
||||||
return (
|
return (
|
||||||
<ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
|
<ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import {
|
|||||||
WaypointsIcon,
|
WaypointsIcon,
|
||||||
ZapIcon,
|
ZapIcon,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import { JSX, useState } from "react";
|
import { JSX, useEffect, useState } from "react";
|
||||||
import { FormProvider, UseFormReturn } from "react-hook-form";
|
import { FormProvider, UseFormReturn } from "react-hook-form";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { AntSwordTabContent } from "./tools/antsword-tab";
|
import { AntSwordTabContent } from "./tools/antsword-tab";
|
||||||
@@ -65,20 +65,45 @@ export function MainConfigCard({
|
|||||||
const shellTool = form.watch("shellTool");
|
const shellTool = form.watch("shellTool");
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
// 处理一下默认值 server 不刷新 shellType 的问题
|
||||||
|
useEffect(() => {
|
||||||
|
if (mainConfig) {
|
||||||
|
const initialServer = form.getValues("server");
|
||||||
|
if (initialServer && mainConfig[initialServer]) {
|
||||||
|
handleServerChange(initialServer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [mainConfig, form]);
|
||||||
|
|
||||||
|
// 处理一下 shellTypes 由于 server 或 shellTool 变更时无法正常为 form.shellType 赋值的问题
|
||||||
|
useEffect(() => {
|
||||||
|
if (shellTypes.length > 0) {
|
||||||
|
form.setValue("shellType", shellTypes[0]);
|
||||||
|
}
|
||||||
|
}, [shellTypes, form]);
|
||||||
|
|
||||||
const handleServerChange = (value: string) => {
|
const handleServerChange = (value: string) => {
|
||||||
if (mainConfig) {
|
if (mainConfig) {
|
||||||
const newShellToolMap = mainConfig[value];
|
const newShellToolMap = mainConfig[value];
|
||||||
setShellToolMap(newShellToolMap);
|
setShellToolMap(newShellToolMap);
|
||||||
|
|
||||||
const newShellTools = Object.keys(newShellToolMap);
|
const newShellTools = Object.keys(newShellToolMap);
|
||||||
setShellTools([...newShellTools.map((tool) => tool as ShellToolType), ShellToolType.Custom]);
|
setShellTools([...newShellTools.map((tool) => tool as ShellToolType), ShellToolType.Custom]);
|
||||||
if (newShellTools.length > 0) {
|
|
||||||
const firstTool = newShellTools[0];
|
|
||||||
setShellTypes(newShellToolMap[firstTool]);
|
|
||||||
form.setValue("shellTool", firstTool);
|
|
||||||
} else {
|
|
||||||
setShellTypes([]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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 (
|
if (
|
||||||
(value === "SpringWebFlux" || value === "XXLJOB") &&
|
(value === "SpringWebFlux" || value === "XXLJOB") &&
|
||||||
Number.parseInt(form.getValues("targetJdkVersion") as string) < 52
|
Number.parseInt(form.getValues("targetJdkVersion") as string) < 52
|
||||||
@@ -88,8 +113,6 @@ export function MainConfigCard({
|
|||||||
form.resetField("targetJdkVersion");
|
form.resetField("targetJdkVersion");
|
||||||
}
|
}
|
||||||
form.resetField("bypassJavaModule");
|
form.resetField("bypassJavaModule");
|
||||||
form.resetField("shellTool");
|
|
||||||
form.resetField("shellType");
|
|
||||||
form.resetField("urlPattern");
|
form.resetField("urlPattern");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -133,14 +156,15 @@ export function MainConfigCard({
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (shellToolMap) {
|
if (shellToolMap) {
|
||||||
|
let currentShellTypes = null;
|
||||||
if (value === ShellToolType.Custom) {
|
if (value === ShellToolType.Custom) {
|
||||||
setShellTypes(servers?.[form.getValues("server")] as string[]);
|
currentShellTypes = servers?.[form.getValues("server")] as string[];
|
||||||
} else {
|
} else {
|
||||||
setShellTypes(shellToolMap[value]);
|
currentShellTypes = shellToolMap[value];
|
||||||
}
|
}
|
||||||
|
setShellTypes(currentShellTypes);
|
||||||
|
|
||||||
form.resetField("urlPattern");
|
form.resetField("urlPattern");
|
||||||
form.resetField("shellType");
|
|
||||||
form.resetField("shellClassName");
|
form.resetField("shellClassName");
|
||||||
form.resetField("injectorClassName");
|
form.resetField("injectorClassName");
|
||||||
if (value === ShellToolType.Godzilla) {
|
if (value === ShellToolType.Godzilla) {
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ type Option = {
|
|||||||
export function PackageConfigCard({
|
export function PackageConfigCard({
|
||||||
packerConfig,
|
packerConfig,
|
||||||
form,
|
form,
|
||||||
}: {
|
}: Readonly<{
|
||||||
packerConfig: PackerConfig | undefined;
|
packerConfig: PackerConfig | undefined;
|
||||||
form: UseFormReturn<FormSchema>;
|
form: UseFormReturn<FormSchema>;
|
||||||
}) {
|
}>) {
|
||||||
const [options, setOptions] = useState<Array<Option>>([]);
|
const [options, setOptions] = useState<Array<Option>>([]);
|
||||||
|
|
||||||
const shellType = form.watch("shellType");
|
const shellType = form.watch("shellType");
|
||||||
@@ -39,15 +39,17 @@ export function PackageConfigCard({
|
|||||||
}
|
}
|
||||||
return !name.startsWith("Agent") && !name.toLowerCase().startsWith("xxl");
|
return !name.startsWith("Agent") && !name.toLowerCase().startsWith("xxl");
|
||||||
});
|
});
|
||||||
setOptions(
|
|
||||||
filteredOptions.map((name) => {
|
const mappedOptions = filteredOptions.map((name) => {
|
||||||
return {
|
return {
|
||||||
name: t(`packageConfig.packer.${name}`),
|
name: t(`packageConfig.packer.${name}`),
|
||||||
value: name,
|
value: name,
|
||||||
};
|
};
|
||||||
}),
|
});
|
||||||
);
|
|
||||||
if (filteredOptions.length > 0) {
|
setOptions(mappedOptions);
|
||||||
|
const currentValue = form.getValues("packingMethod");
|
||||||
|
if (filteredOptions.length > 0 && (!currentValue || !filteredOptions.includes(currentValue))) {
|
||||||
form.setValue("packingMethod", filteredOptions[0]);
|
form.setValue("packingMethod", filteredOptions[0]);
|
||||||
}
|
}
|
||||||
}, [form, packerConfig, server, shellType, t]);
|
}, [form, packerConfig, server, shellType, t]);
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ export function AntSwordTabContent({
|
|||||||
name="antSwordPass"
|
name="antSwordPass"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.antSwordPass")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.antSwordPass")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("placeholders.input")} className="h-8" />
|
<Input {...field} placeholder={t("placeholders.input")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
@@ -49,7 +51,9 @@ export function AntSwordTabContent({
|
|||||||
name="headerValue"
|
name="headerValue"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.headerValue")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.headerValue")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ export function BehinderTabContent({
|
|||||||
name="behinderPass"
|
name="behinderPass"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.behinderPass")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.behinderPass")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("placeholders.input")} className="h-8" />
|
<Input {...field} placeholder={t("placeholders.input")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
@@ -49,7 +51,9 @@ export function BehinderTabContent({
|
|||||||
name="headerValue"
|
name="headerValue"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.headerValue")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.headerValue")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ export function CommandTabContent({
|
|||||||
name="commandParamName"
|
name="commandParamName"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.paramName")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.paramName")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<Input {...field} placeholder={t("shellToolConfig.paramName")} className="h-8" />
|
<Input {...field} placeholder={t("shellToolConfig.paramName")} className="h-8" />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
|
|||||||
@@ -29,7 +29,9 @@ export function GodzillaTabContent({
|
|||||||
name="godzillaPass"
|
name="godzillaPass"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.pass")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.pass")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("shellToolConfig.pass")} className="h-8" />
|
<Input {...field} placeholder={t("shellToolConfig.pass")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
@@ -39,7 +41,9 @@ export function GodzillaTabContent({
|
|||||||
name="godzillaKey"
|
name="godzillaKey"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.key")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.key")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("shellToolConfig.key")} className="h-8" />
|
<Input {...field} placeholder={t("shellToolConfig.key")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
@@ -59,7 +63,9 @@ export function GodzillaTabContent({
|
|||||||
name="headerValue"
|
name="headerValue"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.headerValue")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.headerValue")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ export function NeoRegTabContent({
|
|||||||
name="headerValue"
|
name="headerValue"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.headerValue")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.headerValue")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ export function Suo5TabContent({
|
|||||||
name="headerValue"
|
name="headerValue"
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem className="gap-1">
|
<FormItem className="gap-1">
|
||||||
<FormLabel className="h-6 flex items-center gap-1">{t("shellToolConfig.headerValue")}</FormLabel>
|
<FormLabel className="h-6 flex items-center gap-1">
|
||||||
|
{t("shellToolConfig.headerValue")} {t("optional")}
|
||||||
|
</FormLabel>
|
||||||
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
<Input {...field} placeholder={t("shellToolConfig.headerValue")} className="h-8" />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
|
|||||||
+3
-3
@@ -3,10 +3,10 @@ import "./index.css";
|
|||||||
import { TailwindIndicator } from "@/components/tailwind-indicator.tsx";
|
import { TailwindIndicator } from "@/components/tailwind-indicator.tsx";
|
||||||
import { env } from "@/config.ts";
|
import { env } from "@/config.ts";
|
||||||
import { I18nextProvider } from "react-i18next";
|
import { I18nextProvider } from "react-i18next";
|
||||||
import i18n from "./i18n/i18n";
|
|
||||||
import { RouterProvider } from "react-router-dom";
|
import { RouterProvider } from "react-router-dom";
|
||||||
import { router } from "./router";
|
import i18n from "./i18n/i18n";
|
||||||
import { QueryProvider } from "./providers/query-client-provider";
|
import { QueryProvider } from "./providers/query-client-provider";
|
||||||
|
import { router } from "./router";
|
||||||
|
|
||||||
const rootElement = document.getElementById("app") as HTMLElement;
|
const rootElement = document.getElementById("app") as HTMLElement;
|
||||||
|
|
||||||
@@ -18,6 +18,6 @@ if (!rootElement.innerHTML) {
|
|||||||
<RouterProvider router={router} />
|
<RouterProvider router={router} />
|
||||||
{env.MODE !== "production" && <TailwindIndicator />}
|
{env.MODE !== "production" && <TailwindIndicator />}
|
||||||
</I18nextProvider>
|
</I18nextProvider>
|
||||||
</QueryProvider>
|
</QueryProvider>,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-19
@@ -7,7 +7,6 @@ import { env } from "@/config.ts";
|
|||||||
import { FormSchema, formSchema } from "@/types/schema.ts";
|
import { FormSchema, formSchema } from "@/types/schema.ts";
|
||||||
import {
|
import {
|
||||||
APIErrorResponse,
|
APIErrorResponse,
|
||||||
ConfigResponseType,
|
|
||||||
GenerateResponse,
|
GenerateResponse,
|
||||||
GenerateResult,
|
GenerateResult,
|
||||||
MainConfig,
|
MainConfig,
|
||||||
@@ -17,14 +16,17 @@ import {
|
|||||||
} from "@/types/shell.ts";
|
} from "@/types/shell.ts";
|
||||||
import { customValidation, transformToPostData } from "@/utils/transformer.ts";
|
import { customValidation, transformToPostData } from "@/utils/transformer.ts";
|
||||||
import { zodResolver } from "@hookform/resolvers/zod";
|
import { zodResolver } from "@hookform/resolvers/zod";
|
||||||
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { LoaderCircle, WandSparklesIcon } from "lucide-react";
|
import { LoaderCircle, WandSparklesIcon } from "lucide-react";
|
||||||
import { useState, useTransition } from "react";
|
import { useState, useTransition } from "react";
|
||||||
import { useForm } from "react-hook-form";
|
import { useForm } from "react-hook-form";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useLoaderData } from "react-router-dom";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
import { useQuery } from "@tanstack/react-query";
|
|
||||||
|
|
||||||
export default function IndexPage() {
|
export default function IndexPage() {
|
||||||
|
const urlParams = useLoaderData() as Partial<FormSchema>;
|
||||||
|
|
||||||
const { data: serverConfig } = useQuery<ServerConfig>({
|
const { data: serverConfig } = useQuery<ServerConfig>({
|
||||||
queryKey: ["serverConfig"],
|
queryKey: ["serverConfig"],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
@@ -53,23 +55,25 @@ export default function IndexPage() {
|
|||||||
const form = useForm<FormSchema>({
|
const form = useForm<FormSchema>({
|
||||||
resolver: zodResolver(formSchema),
|
resolver: zodResolver(formSchema),
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
server: "Tomcat",
|
server: urlParams.server ?? "Tomcat",
|
||||||
targetJdkVersion: "50",
|
targetJdkVersion: urlParams.targetJdkVersion ?? "50",
|
||||||
debug: false,
|
debug: urlParams.debug ?? false,
|
||||||
bypassJavaModule: false,
|
bypassJavaModule: urlParams.bypassJavaModule ?? false,
|
||||||
shellClassName: "",
|
shellClassName: urlParams.shellClassName ?? "",
|
||||||
shellTool: "Godzilla",
|
shellTool: urlParams.shellTool ?? ShellToolType.Godzilla,
|
||||||
shellType: "Listener",
|
shellType: urlParams.shellType ?? "Listener",
|
||||||
urlPattern: "/*",
|
urlPattern: urlParams.urlPattern ?? "/*",
|
||||||
godzillaPass: "pass",
|
godzillaPass: urlParams.godzillaPass ?? "",
|
||||||
godzillaKey: "key",
|
godzillaKey: urlParams.godzillaKey ?? "",
|
||||||
commandParamName: "cmd",
|
commandParamName: urlParams.commandParamName ?? "",
|
||||||
behinderPass: "pass",
|
behinderPass: urlParams.behinderPass ?? "",
|
||||||
antSwordPass: "ant",
|
antSwordPass: urlParams.antSwordPass ?? "",
|
||||||
headerName: "User-Agent",
|
headerName: urlParams.headerName ?? "User-Agent",
|
||||||
headerValue: "test",
|
headerValue: urlParams.headerValue ?? "",
|
||||||
injectorClassName: "",
|
injectorClassName: urlParams.injectorClassName ?? "",
|
||||||
packingMethod: "Base64",
|
packingMethod: urlParams.packingMethod ?? "",
|
||||||
|
shrink: urlParams.shrink ?? false,
|
||||||
|
shellClassBase64: urlParams.shellClassBase64 ?? "",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -95,6 +99,7 @@ export default function IndexPage() {
|
|||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
const json: APIErrorResponse = await response.json();
|
const json: APIErrorResponse = await response.json();
|
||||||
toast.error(t("errors.generationFailed", { error: json.error }));
|
toast.error(t("errors.generationFailed", { error: json.error }));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = (await response.json()) as GenerateResponse;
|
const result = (await response.json()) as GenerateResponse;
|
||||||
|
|||||||
@@ -10,6 +10,6 @@ const queryClient = new QueryClient({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export function QueryProvider({ children }: { children: ReactNode }) {
|
export function QueryProvider({ children }: Readonly<{ children: ReactNode }>) {
|
||||||
return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
|
return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
|
||||||
}
|
}
|
||||||
+44
-3
@@ -1,7 +1,44 @@
|
|||||||
import { createBrowserRouter } from "react-router-dom";
|
|
||||||
import { env } from "@/config";
|
|
||||||
import RootLayout from "@/components/layouts/root-layout";
|
import RootLayout from "@/components/layouts/root-layout";
|
||||||
|
import { env } from "@/config";
|
||||||
import IndexPage from "@/pages";
|
import IndexPage from "@/pages";
|
||||||
|
import { FormSchema } from "@/types/schema";
|
||||||
|
import { createBrowserRouter } from "react-router-dom";
|
||||||
|
|
||||||
|
// Function to parse URL parameters into form default values
|
||||||
|
const parseUrlParams = (searchParams: URLSearchParams): Partial<FormSchema> => {
|
||||||
|
const result: Partial<FormSchema> = {};
|
||||||
|
|
||||||
|
// Helper function to parse boolean values
|
||||||
|
const parseBoolean = (value: string | null): boolean | undefined => {
|
||||||
|
if (value === null) return undefined;
|
||||||
|
return value.toLowerCase() === "true";
|
||||||
|
};
|
||||||
|
|
||||||
|
// Map URL parameters to form fields
|
||||||
|
if (searchParams.has("server")) result.server = searchParams.get("server") ?? undefined;
|
||||||
|
if (searchParams.has("targetJdkVersion")) result.targetJdkVersion = searchParams.get("targetJdkVersion") ?? undefined;
|
||||||
|
if (searchParams.has("debug")) result.debug = parseBoolean(searchParams.get("debug"));
|
||||||
|
if (searchParams.has("bypassJavaModule"))
|
||||||
|
result.bypassJavaModule = parseBoolean(searchParams.get("bypassJavaModule"));
|
||||||
|
if (searchParams.has("shellClassName")) result.shellClassName = searchParams.get("shellClassName") ?? undefined;
|
||||||
|
if (searchParams.has("shellTool")) result.shellTool = searchParams.get("shellTool") ?? undefined;
|
||||||
|
if (searchParams.has("shellType")) result.shellType = searchParams.get("shellType") ?? undefined;
|
||||||
|
if (searchParams.has("urlPattern")) result.urlPattern = searchParams.get("urlPattern") ?? undefined;
|
||||||
|
if (searchParams.has("godzillaPass")) result.godzillaPass = searchParams.get("godzillaPass") ?? undefined;
|
||||||
|
if (searchParams.has("godzillaKey")) result.godzillaKey = searchParams.get("godzillaKey") ?? undefined;
|
||||||
|
if (searchParams.has("behinderPass")) result.behinderPass = searchParams.get("behinderPass") ?? undefined;
|
||||||
|
if (searchParams.has("antSwordPass")) result.antSwordPass = searchParams.get("antSwordPass") ?? undefined;
|
||||||
|
if (searchParams.has("commandParamName")) result.commandParamName = searchParams.get("commandParamName") ?? undefined;
|
||||||
|
if (searchParams.has("headerName")) result.headerName = searchParams.get("headerName") ?? undefined;
|
||||||
|
if (searchParams.has("headerValue")) result.headerValue = searchParams.get("headerValue") ?? undefined;
|
||||||
|
if (searchParams.has("injectorClassName"))
|
||||||
|
result.injectorClassName = searchParams.get("injectorClassName") ?? undefined;
|
||||||
|
if (searchParams.has("packingMethod")) result.packingMethod = searchParams.get("packingMethod") ?? undefined;
|
||||||
|
if (searchParams.has("shrink")) result.shrink = parseBoolean(searchParams.get("shrink"));
|
||||||
|
if (searchParams.has("shellClassBase64")) result.shellClassBase64 = searchParams.get("shellClassBase64") ?? undefined;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
export const router = createBrowserRouter(
|
export const router = createBrowserRouter(
|
||||||
[
|
[
|
||||||
@@ -12,11 +49,15 @@ export const router = createBrowserRouter(
|
|||||||
{
|
{
|
||||||
index: true,
|
index: true,
|
||||||
element: <IndexPage />,
|
element: <IndexPage />,
|
||||||
|
loader: ({ request }) => {
|
||||||
|
const url = new URL(request.url);
|
||||||
|
return parseUrlParams(url.searchParams);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
basename: env.BASE_PATH,
|
basename: env.BASE_PATH,
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
@@ -56,3 +56,43 @@ export function transformToPostData(formValue: FormSchema) {
|
|||||||
packer: formValue.packingMethod,
|
packer: formValue.packingMethod,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a URL with the current form values as query parameters
|
||||||
|
* @param values The form values
|
||||||
|
* @returns A URL string with query parameters
|
||||||
|
*/
|
||||||
|
export function generateShareableUrl(values: FormSchema): string {
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
|
// Helper function to add parameters only if they have non-default values
|
||||||
|
const addParam = (key: string, value: any, defaultValue: any) => {
|
||||||
|
if (value !== defaultValue) {
|
||||||
|
params.append(key, String(value));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Add all form values to the URL parameters
|
||||||
|
addParam("server", values.server, "Tomcat");
|
||||||
|
addParam("targetJdkVersion", values.targetJdkVersion, "50");
|
||||||
|
addParam("debug", values.debug, false);
|
||||||
|
addParam("bypassJavaModule", values.bypassJavaModule, false);
|
||||||
|
addParam("shellClassName", values.shellClassName, "");
|
||||||
|
addParam("shellTool", values.shellTool, "Godzilla");
|
||||||
|
addParam("shellType", values.shellType, "Listener");
|
||||||
|
addParam("urlPattern", values.urlPattern, "/*");
|
||||||
|
addParam("godzillaPass", values.godzillaPass, "pass");
|
||||||
|
addParam("godzillaKey", values.godzillaKey, "key");
|
||||||
|
addParam("commandParamName", values.commandParamName, "cmd");
|
||||||
|
addParam("behinderPass", values.behinderPass, "pass");
|
||||||
|
addParam("antSwordPass", values.antSwordPass, "ant");
|
||||||
|
addParam("headerName", values.headerName, "User-Agent");
|
||||||
|
addParam("headerValue", values.headerValue, "test");
|
||||||
|
addParam("injectorClassName", values.injectorClassName, "");
|
||||||
|
addParam("packingMethod", values.packingMethod, "Base64");
|
||||||
|
addParam("shrink", values.shrink, false);
|
||||||
|
addParam("shellClassBase64", values.shellClassBase64, "");
|
||||||
|
|
||||||
|
// Return the current URL with the query parameters
|
||||||
|
return `${window.location.origin}${window.location.pathname}?${params.toString()}`;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user