diff --git a/src/main/java/ru/fiw/proxyserver/mixin/YggdrasilInjection.java b/src/main/java/ru/fiw/proxyserver/mixin/YggdrasilInjection.java new file mode 100644 index 0000000..36667cb --- /dev/null +++ b/src/main/java/ru/fiw/proxyserver/mixin/YggdrasilInjection.java @@ -0,0 +1,46 @@ +package ru.fiw.proxyserver.mixin; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; + +import net.minecraft.client.MinecraftClient; +import ru.fiw.proxyserver.Config; +import ru.fiw.proxyserver.ProxyServer; +import ru.fiw.proxyserver.proxiedObjects.SocksProxy; + +@Mixin(MinecraftClient.class) +public class YggdrasilInjection { + @Final + @Mutable + @Shadow + private YggdrasilAuthenticationService authenticationService; + + @Inject(method = "", at = @At("RETURN")) + public void initInject(CallbackInfo info) { + String playerName = MinecraftClient.getInstance().getSession().getProfile().getName(); + if (!playerName.equals(Config.lastPlayerName)) { + Config.lastPlayerName = playerName; + if (Config.accounts.containsKey(playerName)) { + ProxyServer.proxy = Config.accounts.get(playerName); + } else { + if (Config.accounts.containsKey("")) { + ProxyServer.proxy = Config.accounts.get(""); + } + } + } + + java.net.Authenticator.setDefault(new java.net.Authenticator() { + protected java.net.PasswordAuthentication getPasswordAuthentication() { + return new java.net.PasswordAuthentication(ProxyServer.proxy.username, ProxyServer.proxy.password.toCharArray()); + } + }); + this.authenticationService = new YggdrasilAuthenticationService(new SocksProxy()); + } +} diff --git a/src/main/java/ru/fiw/proxyserver/proxiedObjects/SocksProxy.java b/src/main/java/ru/fiw/proxyserver/proxiedObjects/SocksProxy.java new file mode 100644 index 0000000..689fd39 --- /dev/null +++ b/src/main/java/ru/fiw/proxyserver/proxiedObjects/SocksProxy.java @@ -0,0 +1,24 @@ +package ru.fiw.proxyserver.proxiedObjects; + +import java.net.Proxy; +import java.net.SocketAddress; +import java.net.InetSocketAddress; + +public class SocksProxy extends Proxy { + public SocksProxy() { + super(Proxy.Type.HTTP, new InetSocketAddress(0)); + } + + @Override + public Type type() { + return ru.fiw.proxyserver.ProxyServer.proxyEnabled == true ? Proxy.Type.SOCKS : Proxy.Type.DIRECT; + } + + @Override + public SocketAddress address() { + return new InetSocketAddress( + ru.fiw.proxyserver.ProxyServer.proxy.getIp(), + ru.fiw.proxyserver.ProxyServer.proxy.getPort() + ); + } +} diff --git a/src/main/resources/proxyserver.mixins.json b/src/main/resources/proxyserver.mixins.json index 73c323d..1c2f5e9 100644 --- a/src/main/resources/proxyserver.mixins.json +++ b/src/main/resources/proxyserver.mixins.json @@ -8,7 +8,8 @@ "client": [ "ClientConnectionInit", "MultiplayerScreenOpen", - "ScreenAccessor" + "ScreenAccessor", + "YggdrasilInjection" ], "injectors": { "defaultRequire": 1