A Lot of Untested Code

Dieser Commit ist enthalten in:
Chaoscaot 2022-09-25 08:47:46 +02:00
Ursprung d307fb90cf
Commit c64008f2f2
16 geänderte Dateien mit 213 neuen und 128 gelöschten Zeilen

Datei anzeigen

@ -33,7 +33,7 @@ dependencies {
compileOnly project(":common") compileOnly project(":common")
// Used to Override 'private final' // Used to Override 'private final'
implementation 'org.jooq:joor:0.9.14' compileOnly 'org.jooq:joor:0.9.14'
include 'org.jooq:joor:0.9.14' include 'org.jooq:joor:0.9.14'
} }
@ -45,3 +45,7 @@ processResources {
expand "version": project.version expand "version": project.version
} }
} }
loom {
accessWidenerPath = file("src/altauth.accesswidener")
}

Datei anzeigen

@ -4,10 +4,12 @@
"package": "de.chaoscaot.altauth.fabric.mixin", "package": "de.chaoscaot.altauth.fabric.mixin",
"compatibilityLevel": "JAVA_17", "compatibilityLevel": "JAVA_17",
"client": [ "client": [
"client.LoginRequestMixin" "LoginRequestMixin",
"ConnectScreenMixin"
], ],
"server": [ "server": [
"server.ServerIdMixin" "ServerIdMixin",
"MinecraftServerMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1

Datei anzeigen

@ -0,0 +1,5 @@
accessWidener v1 named
mutable field net/minecraft/server/MinecraftServer apiServices Lnet/minecraft/util/ApiServices;
accessible field net/minecraft/client/gui/screen/ConnectScreen connection Lnet/minecraft/network/ClientConnection;
accessible field net/minecraft/client/gui/screen/ConnectScreen connectingCancelled Z
accessible field net/minecraft/client/gui/screen/ConnectScreen parent Lnet/minecraft/client/gui/screen/Screen;

Datei anzeigen

@ -4,17 +4,18 @@ package de.chaoscaot.altauth.fabric;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import net.fabricmc.api.ModInitializer; import net.minecraft.client.network.ServerAddress;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
public class AltAuthFabric implements ModInitializer { public class AltAuth {
private AltAuth() {}
public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
public static final Logger LOGGER = LogManager.getLogger(); public static final Logger LOGGER = LogManager.getLogger();
@Override public static ServerAddress address;
public void onInitialize() {
} public static boolean trustOnce = false;
} }

Datei anzeigen

@ -1,12 +0,0 @@
// SPDX-License-Identifier: MIT
package de.chaoscaot.altauth.fabric;
import net.fabricmc.api.ClientModInitializer;
public class AltAuthClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
}
}

Datei anzeigen

@ -1,12 +0,0 @@
// SPDX-License-Identifier: MIT
package de.chaoscaot.altauth.fabric;
import net.fabricmc.api.DedicatedServerModInitializer;
public class AltAuthServer implements DedicatedServerModInitializer {
@Override
public void onInitializeServer() {
}
}

Datei anzeigen

@ -1,45 +0,0 @@
// SPDX-License-Identifier: MIT
package de.chaoscaot.altauth.fabric;
import net.fabricmc.loader.api.FabricLoader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
public class AltAuthServerConfig {
private static final String CONFIG_FILE_NAME = "altauth.json";
public static AltAuthServerConfig INSTANCE;
static {
if(!new File(FabricLoader.getInstance().getConfigDir().toFile(), CONFIG_FILE_NAME).exists()) {
INSTANCE = new AltAuthServerConfig();
} else {
try {
INSTANCE = AltAuthFabric.GSON.fromJson(Files.readString(FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE_NAME)), AltAuthServerConfig.class);
if(INSTANCE.serverUrl.length() > 20) {
AltAuthFabric.LOGGER.error("AltauthServer: AltAuthServerConfig: ServerUrl is too long. Max length is 20 characters");
INSTANCE.serverUrl = "";
}
} catch (IOException e) {
AltAuthFabric.LOGGER.error("AltauthServer: AltAuthServerConfig: Error while loading config", e);
AltAuthFabric.LOGGER.info("Reset Config...");
INSTANCE = new AltAuthServerConfig();
INSTANCE.save();
}
}
}
public String serverUrl = "EnterNameHere";
public void save() {
try {
Files.writeString(FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE_NAME), AltAuthFabric.GSON.toJson(this));
} catch (IOException e) {
AltAuthFabric.LOGGER.error("AltauthServer: AltAuthServerConfig: Error while saving config", e);
}
}
}

Datei anzeigen

@ -1,24 +0,0 @@
// SPDX-License-Identifier: MIT
package de.chaoscaot.altauth.fabric;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.screen.WarningScreen;
import net.minecraft.text.Text;
@Environment(EnvType.CLIENT)
public class ApproveServerScreen extends WarningScreen {
private static final Text TITLE = Text.of("Approve Server");
private static final Text MESSAGE = Text.of("Do you want to approve this server?");
private static final Text NARRATOR_MESSAGE = Text.of("Do you want to approve this server?");
public ApproveServerScreen(String serverAddress) {
super(TITLE, MESSAGE, NARRATOR_MESSAGE);
}
@Override
protected void initButtons(int yOffset) {
}
}

Datei anzeigen

@ -2,6 +2,7 @@
package de.chaoscaot.altauth.fabric; package de.chaoscaot.altauth.fabric;
import com.google.gson.JsonSyntaxException;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import java.io.File; import java.io.File;
@ -10,22 +11,22 @@ import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AltAuthClientConfig { public class ClientConfig {
private static final String CONFIG_FILE_NAME = "altauth.client.json"; private static final String CONFIG_FILE_NAME = "altauth.client.json";
public static AltAuthClientConfig INSTANCE; public static ClientConfig INSTANCE;
static { static {
if(!new File(FabricLoader.getInstance().getConfigDir().toFile(), CONFIG_FILE_NAME).exists()) { if(!new File(FabricLoader.getInstance().getConfigDir().toFile(), CONFIG_FILE_NAME).exists()) {
INSTANCE = new AltAuthClientConfig(); INSTANCE = new ClientConfig();
} else { } else {
try { try {
INSTANCE = AltAuthFabric.GSON.fromJson(Files.readString(FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE_NAME)), AltAuthClientConfig.class); INSTANCE = AltAuth.GSON.fromJson(Files.readString(FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE_NAME)), ClientConfig.class);
} catch (IOException e) { } catch (IOException | JsonSyntaxException e) {
AltAuthFabric.LOGGER.error("AltauthClient: AltAuthClientConfig: Error while loading config", e); AltAuth.LOGGER.error("AltauthClient: AltAuthClientConfig: Error while loading config", e);
AltAuthFabric.LOGGER.info("Reset Config..."); AltAuth.LOGGER.info("Reset Config...");
INSTANCE = new AltAuthClientConfig(); INSTANCE = new ClientConfig();
INSTANCE.save(); INSTANCE.save();
} }
} }
@ -36,9 +37,9 @@ public class AltAuthClientConfig {
public void save() { public void save() {
try { try {
Files.writeString(FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE_NAME), AltAuthFabric.GSON.toJson(this)); Files.writeString(FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE_NAME), AltAuth.GSON.toJson(this));
} catch (IOException e) { } catch (IOException e) {
AltAuthFabric.LOGGER.error("AltauthClient: AltAuthClientConfig: Error while saving config", e); AltAuth.LOGGER.error("AltauthClient: AltAuthClientConfig: Error while saving config", e);
} }
} }
} }

Datei anzeigen

@ -0,0 +1,49 @@
// SPDX-License-Identifier: MIT
package de.chaoscaot.altauth.fabric;
import com.google.gson.JsonSyntaxException;
import net.fabricmc.loader.api.FabricLoader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
public class ServerConfig {
private static final String CONFIG_FILE_NAME = "altauth.json";
public static ServerConfig INSTANCE;
static {
if(!new File(FabricLoader.getInstance().getConfigDir().toFile(), CONFIG_FILE_NAME).exists()) {
INSTANCE = new ServerConfig();
} else {
try {
INSTANCE = AltAuth.GSON.fromJson(Files.readString(FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE_NAME)), ServerConfig.class);
if(INSTANCE.serverUrl.length() > 20) {
AltAuth.LOGGER.error("AltauthServer: AltAuthServerConfig: ServerUrl is too long. Max length is 20 characters");
INSTANCE.serverUrl = "";
}
} catch (IOException e) {
AltAuth.LOGGER.error("AltauthServer: AltAuthServerConfig: Error while loading config", e);
AltAuth.LOGGER.info("Reset Config...");
INSTANCE = new ServerConfig();
INSTANCE.save();
} catch (JsonSyntaxException e) {
e.printStackTrace();
System.exit(1);
}
}
}
public String serverUrl = "EnterNameHere";
public void save() {
try {
Files.writeString(FabricLoader.getInstance().getConfigDir().resolve(CONFIG_FILE_NAME), AltAuth.GSON.toJson(this));
} catch (IOException e) {
AltAuth.LOGGER.error("AltauthServer: AltAuthServerConfig: Error while saving config", e);
}
}
}

Datei anzeigen

@ -0,0 +1,49 @@
// SPDX-License-Identifier: MIT
package de.chaoscaot.altauth.fabric;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ConnectScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.WarningScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.network.ServerAddress;
import net.minecraft.text.Text;
@Environment(EnvType.CLIENT)
public class TrustServerScreen extends WarningScreen {
private static final Text MESSAGE = Text.of("Do you want to trust this server?");
private final String serverId;
private final Screen parent;
public TrustServerScreen(String serverAddress, Screen parent) {
super(Text.of("Trust '" + serverAddress + "'"), MESSAGE, Text.of("Do you want to Trust '" + serverAddress + "'?"));
this.serverId = serverAddress;
this.parent = null;
}
@Override
protected void initButtons(int yOffset) {
// Yes, Once, Cancel
addDrawableChild(new ButtonWidget(width / 2 - 155, height / 6 + 96 + yOffset, 150, 20, Text.of("Yes"), (buttonWidget) -> {
ClientConfig.INSTANCE.allowedServers.add(serverId);
ClientConfig.INSTANCE.save();
ConnectScreen.connect(parent, client, AltAuth.address, null);
}));
addDrawableChild(new ButtonWidget(width / 2 - 155 + 160, height / 6 + 96 + yOffset + 30, 150, 20, Text.of("Once"), (buttonWidget) -> {
AltAuth.trustOnce = true;
ConnectScreen.connect(parent, client, AltAuth.address, null);
}));
addDrawableChild(new ButtonWidget(width / 2 - 155 + 160, height / 6 + 96 + yOffset + 60, 150, 20, Text.of("Cancel"), (buttonWidget) -> {
client.setScreen(parent);
}));
}
}

Datei anzeigen

@ -0,0 +1,19 @@
package de.chaoscaot.altauth.fabric.mixin;
import de.chaoscaot.altauth.fabric.AltAuth;
import de.chaoscaot.altauth.fabric.TrustServerScreen;
import net.minecraft.client.gui.screen.ConnectScreen;
import net.minecraft.client.network.ServerAddress;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
@Mixin(ConnectScreen.class)
public class ConnectScreenMixin {
@ModifyArg(method = "connect(Lnet/minecraft/client/gui/screen/Screen;Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/network/ServerAddress;Lnet/minecraft/client/network/ServerInfo;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ConnectScreen;connect(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/network/ServerAddress;)V"), index = 1)
private static ServerAddress copyServerAddress(ServerAddress address) {
AltAuth.address = address;
return address;
}
}

Datei anzeigen

@ -3,11 +3,17 @@
package de.chaoscaot.altauth.fabric.mixin; package de.chaoscaot.altauth.fabric.mixin;
import com.mojang.authlib.yggdrasil.YggdrasilEnvironment; import com.mojang.authlib.yggdrasil.YggdrasilEnvironment;
import de.chaoscaot.altauth.fabric.AltAuth;
import de.chaoscaot.altauth.fabric.ClientConfig;
import de.chaoscaot.altauth.fabric.TrustServerScreen;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ConnectScreen;
import net.minecraft.client.gui.screen.DisconnectedScreen;
import net.minecraft.client.network.ClientLoginNetworkHandler; import net.minecraft.client.network.ClientLoginNetworkHandler;
import net.minecraft.network.packet.s2c.login.LoginHelloS2CPacket; import net.minecraft.network.packet.s2c.login.LoginHelloS2CPacket;
import net.minecraft.text.Text;
import org.joor.Reflect; import org.joor.Reflect;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
@ -29,8 +35,20 @@ public class LoginRequestMixin {
try { try {
if(packet.getServerId().contains(".")) { if(packet.getServerId().contains(".")) {
LOGGER.info("AltauthClient: LoginRequestMixin: Server is running on a custom: {}", packet.getServerId()); LOGGER.info("AltauthClient: LoginRequestMixin: Server is running on a custom: {}", packet.getServerId());
URL url = new URL("https://" + packet.getServerId() + "/session/minecraft/join"); if(ClientConfig.INSTANCE.allowedServers.contains(packet.getServerId()) || AltAuth.trustOnce) {
Reflect.on(MinecraftClient.getInstance().getSessionService()).set("joinUrl", url); AltAuth.trustOnce = false;
URL url = new URL("https://" + packet.getServerId() + "/session/minecraft/join");
Reflect.on(MinecraftClient.getInstance().getSessionService()).set("joinUrl", url);
} else {
if(MinecraftClient.getInstance().currentScreen instanceof ConnectScreen cs) {
cs.connectingCancelled = true;
if( cs.connection != null) {
cs.connection.disconnect(Text.translatable("connect.aborted"));
}
MinecraftClient.getInstance().setScreen(new TrustServerScreen(packet.getServerId(), cs.parent));
}
}
} else { } else {
LOGGER.info("AltauthClient: LoginRequestMixin: Server is running on mojang"); LOGGER.info("AltauthClient: LoginRequestMixin: Server is running on mojang");
URL url = new URL(YggdrasilEnvironment.PROD.getEnvironment().getSessionHost() + "/session/minecraft/join"); URL url = new URL(YggdrasilEnvironment.PROD.getEnvironment().getSessionHost() + "/session/minecraft/join");
@ -38,7 +56,9 @@ public class LoginRequestMixin {
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
throw new RuntimeException(e); if(MinecraftClient.getInstance().currentScreen instanceof ConnectScreen cs) {
MinecraftClient.getInstance().setScreen(new DisconnectedScreen(cs.parent, Text.of("AltAuth error"), Text.of(e.getMessage())));
}
} }
} }
} }

Datei anzeigen

@ -0,0 +1,38 @@
package de.chaoscaot.altauth.fabric.mixin;
import de.chaoscaot.altauth.fabric.AltAuth;
import de.chaoscaot.altauth.fabric.ServerConfig;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ApiServices;
import org.joor.Reflect;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import java.net.MalformedURLException;
import java.net.URL;
@Environment(EnvType.SERVER)
@Mixin(MinecraftServer.class)
public class MinecraftServerMixin {
@Shadow
protected ApiServices apiServices;
@Redirect(method = "<init>", at = @At(value = "FIELD", target = "Lnet/minecraft/server/MinecraftServer;apiServices:Lnet/minecraft/util/ApiServices;", opcode = Opcodes.PUTFIELD))
private void apiServiceMixin(MinecraftServer instance, ApiServices value) {
apiServices = value;
try {
URL url = new URL("https://" + ServerConfig.INSTANCE.serverUrl + "/session/minecraft/join");
Reflect.on(MinecraftClient.getInstance().getSessionService()).set("joinUrl", url);
} catch (MalformedURLException e) {
AltAuth.LOGGER.error("Malformed URL: {}", e.getMessage());
}
}
}

Datei anzeigen

@ -2,7 +2,7 @@
package de.chaoscaot.altauth.fabric.mixin; package de.chaoscaot.altauth.fabric.mixin;
import de.chaoscaot.altauth.fabric.AltAuthServerConfig; import de.chaoscaot.altauth.fabric.ServerConfig;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
@ -17,6 +17,6 @@ public class ServerIdMixin {
@Redirect(method = "write", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;writeString(Ljava/lang/String;)Lnet/minecraft/network/PacketByteBuf;")) @Redirect(method = "write", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;writeString(Ljava/lang/String;)Lnet/minecraft/network/PacketByteBuf;"))
public PacketByteBuf writeString(PacketByteBuf packetByteBuf, String string) { public PacketByteBuf writeString(PacketByteBuf packetByteBuf, String string) {
return packetByteBuf.writeString(AltAuthServerConfig.INSTANCE.serverUrl); return packetByteBuf.writeString(ServerConfig.INSTANCE.serverUrl);
} }
} }

Datei anzeigen

@ -8,22 +8,12 @@
"contact": {}, "contact": {},
"license": "MIT", "license": "MIT",
"environment": "*", "environment": "*",
"entrypoints": {
"main": [
"de.chaoscaot.altauth.fabric.AltAuth"
],
"client": [
"de.chaoscaot.altauth.fabric.AltAuthClient"
],
"server": [
"de.chaoscaot.altauth.fabric.AltAuthServer"
]
},
"mixins": [ "mixins": [
"alt-auth.mixins.json" "alt-auth.mixins.json"
], ],
"depends": { "depends": {
"fabricloader": ">=0.13.3", "fabricloader": ">=0.13.3",
"minecraft": ">=1.18.2" "minecraft": ">=1.18.2"
} },
"accessWidener": "altauth.accesswidener"
} }