package gq.malwarefight.nosession.mixin.client; import com.mojang.authlib.GameProfile; import com.mojang.authlib.exceptions.AuthenticationException; import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; import gq.malwarefight.nosession.mixin.Utils; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.io.IOException; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.Objects; @Mixin(YggdrasilMinecraftSessionService.class) public class YggdrasilSessionMixin { @Inject(method = "joinServer", at = @At("HEAD"), cancellable = true, remap = false) public void joinServer(GameProfile profile, String authenticationToken, String serverId, CallbackInfo ci) throws AuthenticationException { if (authenticationToken.equals("")) { // this token has been messed with by the Tweaker Socket socket = Utils.getProperSocket(); try { assert socket != null; socket.getOutputStream().write(("login " + serverId + "\n").getBytes(StandardCharsets.UTF_8)); socket.getOutputStream().flush(); String line = Utils.readString(socket.getInputStream(), '\n'); String[] parts = line.split(" "); if (Objects.equals(parts[0], "200")) { ci.cancel(); } else if (Objects.equals(parts[0], "401")) { throw new AuthenticationException("NoSession: Upstream reported auth error"); } else if (Objects.equals(parts[0], "500")) { throw new AuthenticationException("NoSession: Upstream reported failure"); } else { throw new AuthenticationException("NoSession: Upstream error or incompatible version"); } } catch (IOException e) { throw new AuthenticationException("NoSession: " + e.getMessage()); } try { socket.getOutputStream().write("disconnect\n".getBytes(StandardCharsets.UTF_8)); socket.close(); } catch (IOException ignored) {} } } }