aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gq/malwarefight/nosession/tweaks
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gq/malwarefight/nosession/tweaks')
-rw-r--r--src/main/java/gq/malwarefight/nosession/tweaks/CleanupTweaker.java82
-rw-r--r--src/main/java/gq/malwarefight/nosession/tweaks/InitialTweaker.java104
2 files changed, 186 insertions, 0 deletions
diff --git a/src/main/java/gq/malwarefight/nosession/tweaks/CleanupTweaker.java b/src/main/java/gq/malwarefight/nosession/tweaks/CleanupTweaker.java
new file mode 100644
index 0000000..6deeeb0
--- /dev/null
+++ b/src/main/java/gq/malwarefight/nosession/tweaks/CleanupTweaker.java
@@ -0,0 +1,82 @@
+package gq.malwarefight.nosession.tweaks;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import net.minecraft.launchwrapper.ITweaker;
+import net.minecraft.launchwrapper.Launch;
+import net.minecraft.launchwrapper.LaunchClassLoader;
+import net.minecraftforge.fml.common.asm.ASMTransformerWrapper;
+
+import java.io.File;
+import java.lang.reflect.*;
+import java.net.URL;
+import java.net.URLStreamHandler;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import gq.malwarefight.nosession.utils.Utils;
+
+public class CleanupTweaker implements ITweaker {
+ /**
+ * Cached to avoid expensive reflection operations
+ */
+ public Method makeWrapper;
+
+ public CleanupTweaker() throws NoSuchMethodException {
+ makeWrapper = ASMTransformerWrapper.class.getDeclaredMethod("makeWrapper", String.class);
+ makeWrapper.setAccessible(true);
+ }
+ @Override
+ @SuppressWarnings("unchecked")
+ public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile) {
+ // add the FMLTweaker
+ ArrayList<String> tweakerList = (ArrayList<String>) Launch.blackboard.get("TweakClasses");
+ tweakerList.add("net.minecraftforge.fml.common.launcher.FMLTweaker");
+ // reset ASMTransformerWrapper
+ Class<ASMTransformerWrapper> cls = ASMTransformerWrapper.class;
+ try {
+ Utils.setStaticValue(cls, "wrapperModMap", new HashMap<String, String>());
+ Utils.setStaticValue(cls, "wrapperParentMap", new HashMap<String, String>());
+ Utils.setStaticValue(cls, "wrapperCache", CacheBuilder.newBuilder().maximumSize(30L).weakValues().build(new CacheLoader<String, byte[]>() {
+ public byte[] load(String file) throws Exception {
+ return (byte[]) makeWrapper.invoke(null, file);
+ }
+ }));
+ Utils.setStaticValue(cls, "asmGenRoot", new URL("asmgen", null, -1, "/", getAsmGenHandler()));
+ Utils.setStaticValue(cls, "injected", false);
+ } catch (Exception e) {
+ System.err.println("NoSession: Fixing ASMTransformerWrapper failed. Things may break.");
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void injectIntoClassLoader(LaunchClassLoader classLoader) {}
+
+ @Override
+ public String getLaunchTarget() {
+ return "net.minecraft.client.main.Main";
+ }
+
+ @Override
+ public String[] getLaunchArguments() {
+ return new String[0];
+ }
+
+
+
+ @SuppressWarnings("unchecked")
+ private URLStreamHandler getAsmGenHandler() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
+ Class<ASMTransformerWrapper> cls = ASMTransformerWrapper.class;
+ for (Class<?> candidate: cls.getDeclaredClasses()) {
+ if (candidate.getSimpleName().equals("ASMGenHandler")) {
+ Method pgdc = Class.class.getDeclaredMethod("privateGetDeclaredConstructors", boolean.class);
+ pgdc.setAccessible(true);
+ Constructor<? extends URLStreamHandler> constructor = ((Constructor<? extends URLStreamHandler>[]) pgdc.invoke(candidate, false))[0];
+ constructor.setAccessible(true);
+ return constructor.newInstance();
+ }
+ }
+ throw new RuntimeException("NoSession: unable to get the ASMGenHandler");
+ }
+}
diff --git a/src/main/java/gq/malwarefight/nosession/tweaks/InitialTweaker.java b/src/main/java/gq/malwarefight/nosession/tweaks/InitialTweaker.java
new file mode 100644
index 0000000..74d05f5
--- /dev/null
+++ b/src/main/java/gq/malwarefight/nosession/tweaks/InitialTweaker.java
@@ -0,0 +1,104 @@
+package gq.malwarefight.nosession.tweaks;
+
+import gq.malwarefight.nosession.relaunch.Relaunch;
+import gq.malwarefight.nosession.utils.Utils;
+import net.minecraft.launchwrapper.ITweaker;
+import net.minecraft.launchwrapper.Launch;
+import net.minecraft.launchwrapper.LaunchClassLoader;
+import org.spongepowered.asm.launch.MixinBootstrap;
+import org.spongepowered.asm.mixin.MixinEnvironment;
+import org.spongepowered.asm.mixin.Mixins;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.Socket;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class InitialTweaker implements ITweaker {
+
+ public InitialTweaker() {
+ System.gc(); // try to garbage collect the earlier launch data
+ }
+
+ /**
+ * This handles the launch arguments passed towards minecraft
+ * @param args The launch arguments
+ * @param gameDir The game directory (ie: .minecraft)
+ * @param assetsDir The assets directory
+ * @param version The game version
+ */
+ @Override
+ public final void acceptOptions(List<String> args, File gameDir, File assetsDir, String version) {
+ ArrayList<String> argsCopy = new ArrayList<>(args);
+ for (int i = 0; i < argsCopy.size(); i++) {
+ if (argsCopy.get(i).equals("--accessToken")) {
+ if (argsCopy.get(i + 1).equals("<noSessionAccessToken>")) {
+ Runtime.getRuntime().addShutdownHook(
+ new Thread(() -> {
+ try {
+ Socket socket = Utils.getProperSocket();
+ socket.getOutputStream().write("fullquit\n".getBytes(StandardCharsets.UTF_8));
+ socket.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ })
+ );
+ return; // don't do anything, the change has already been made
+ }
+ try {
+ Utils.setToken(args.get(i + 1));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ argsCopy.set(i + 1, "<noSessionAccessToken>");
+ }
+ }
+ System.out.println("=======================");
+ System.out.println("NoSession: relaunching without the token");
+ System.out.println("=======================");
+ try {
+ Relaunch.relaunch(argsCopy, gameDir, assetsDir, version);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ /**
+ * Inject into the MC class loader
+ * @param classLoader The class loader
+ */
+ @Override
+ public final void injectIntoClassLoader(LaunchClassLoader classLoader) {
+ MixinBootstrap.init();
+ MixinEnvironment environment = MixinEnvironment.getDefaultEnvironment();
+ Mixins.addConfiguration("mixins.nosession.json");
+ // Check if the obfuscation context is null
+ if (environment.getObfuscationContext() == null) {
+ environment.setObfuscationContext("notch");
+ }
+ // This is a client side, client :)
+ environment.setSide(MixinEnvironment.Side.CLIENT);
+ }
+
+ @Override
+ public String getLaunchTarget() {
+ return MixinBootstrap.getPlatform().getLaunchTarget();
+ }
+
+ @Override
+ public String[] getLaunchArguments() {
+ return new String[0];
+ }
+
+}