From fa3455054c084fea618f6f236ff867cb38a43a23 Mon Sep 17 00:00:00 2001 From: Trumeet Date: Sun, 17 Oct 2021 22:20:58 -0700 Subject: First Commit --- src/main/java/moe/ymc/safelog/Safelog.java | 46 ++++++++++++++++++++++ .../ymc/safelog/SanitizedInetSocketAddress.java | 23 +++++++++++ .../moe/ymc/safelog/mixin/PlayerManagerMixin.java | 28 +++++++++++++ .../mixin/ServerLoginNetworkHandlerMixin.java | 36 +++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 src/main/java/moe/ymc/safelog/Safelog.java create mode 100644 src/main/java/moe/ymc/safelog/SanitizedInetSocketAddress.java create mode 100644 src/main/java/moe/ymc/safelog/mixin/PlayerManagerMixin.java create mode 100644 src/main/java/moe/ymc/safelog/mixin/ServerLoginNetworkHandlerMixin.java (limited to 'src/main/java') diff --git a/src/main/java/moe/ymc/safelog/Safelog.java b/src/main/java/moe/ymc/safelog/Safelog.java new file mode 100644 index 0000000..6a61747 --- /dev/null +++ b/src/main/java/moe/ymc/safelog/Safelog.java @@ -0,0 +1,46 @@ +package moe.ymc.safelog; + +import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.api.FabricLoader; +import org.apache.commons.codec.digest.DigestUtils; +import org.jetbrains.annotations.NotNull; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.file.Path; +import java.util.Properties; + +public class Safelog implements ModInitializer { + private static String salt = ""; + + @Override + public void onInitialize() { + try { + final Path config = FabricLoader.getInstance().getConfigDir().resolve("safelog.properties"); + if(!config.toFile().exists()) return; + Properties properties = new Properties(); + final InputStream in = new FileInputStream(config.toFile()); + properties.load(in); + in.close(); + salt = properties.getProperty("salt", ""); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + @NotNull + public static String md5(@NotNull String raw) { + final boolean removeLeadingSlash = raw.startsWith("/"); + return (removeLeadingSlash ? "/" : "") + DigestUtils.md5Hex(salt + raw.substring(removeLeadingSlash ? 1 : 0)); + } + + @NotNull + public static String sanitize(@NotNull SocketAddress address) { + if(!(address instanceof final InetSocketAddress inetSocketAddress)) return address.toString(); + return md5(inetSocketAddress.getAddress().toString()) + ":" + inetSocketAddress.getPort(); + } +} diff --git a/src/main/java/moe/ymc/safelog/SanitizedInetSocketAddress.java b/src/main/java/moe/ymc/safelog/SanitizedInetSocketAddress.java new file mode 100644 index 0000000..c9861e3 --- /dev/null +++ b/src/main/java/moe/ymc/safelog/SanitizedInetSocketAddress.java @@ -0,0 +1,23 @@ +package moe.ymc.safelog; + +import java.net.InetAddress; +import java.net.InetSocketAddress; + +public class SanitizedInetSocketAddress extends InetSocketAddress { + public SanitizedInetSocketAddress(int port) { + super(port); + } + + public SanitizedInetSocketAddress(InetAddress addr, int port) { + super(addr, port); + } + + public SanitizedInetSocketAddress(String hostname, int port) { + super(hostname, port); + } + + @Override + public String toString() { + return Safelog.sanitize(this); + } +} diff --git a/src/main/java/moe/ymc/safelog/mixin/PlayerManagerMixin.java b/src/main/java/moe/ymc/safelog/mixin/PlayerManagerMixin.java new file mode 100644 index 0000000..43458ac --- /dev/null +++ b/src/main/java/moe/ymc/safelog/mixin/PlayerManagerMixin.java @@ -0,0 +1,28 @@ +package moe.ymc.safelog.mixin; + +import moe.ymc.safelog.SanitizedInetSocketAddress; +import net.minecraft.network.ClientConnection; +import net.minecraft.server.PlayerManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.net.InetSocketAddress; +import java.net.SocketAddress; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { + @Redirect( + method = "onPlayerConnect", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/network/ClientConnection;getAddress()Ljava/net/SocketAddress;") + ) + public SocketAddress modifyGetAddress(ClientConnection clientConnection) { + SocketAddress address = clientConnection.getAddress(); + if (!(address instanceof InetSocketAddress inetAddress)) { + return address; + } + return new SanitizedInetSocketAddress(inetAddress.getAddress(), inetAddress.getPort()); + } +} diff --git a/src/main/java/moe/ymc/safelog/mixin/ServerLoginNetworkHandlerMixin.java b/src/main/java/moe/ymc/safelog/mixin/ServerLoginNetworkHandlerMixin.java new file mode 100644 index 0000000..e6c2802 --- /dev/null +++ b/src/main/java/moe/ymc/safelog/mixin/ServerLoginNetworkHandlerMixin.java @@ -0,0 +1,36 @@ +package moe.ymc.safelog.mixin; + +import com.mojang.authlib.GameProfile; +import moe.ymc.safelog.Safelog; +import net.minecraft.network.ClientConnection; +import net.minecraft.server.network.ServerLoginNetworkHandler; +import org.spongepowered.asm.mixin.Final; +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.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.security.MessageDigest; + +@Mixin(value = ServerLoginNetworkHandler.class) +public class ServerLoginNetworkHandlerMixin { + @Shadow + GameProfile profile; + @Shadow + @Final + public ClientConnection connection; + + @Inject( + method = "getConnectionInfo", + at = @At("HEAD"), + cancellable = true + ) + public void getConnectionInfo(CallbackInfoReturnable cir) { + if(profile != null) { + cir.setReturnValue(profile + " (" + Safelog.sanitize(this.connection.getAddress()) + ")"); + } else { + cir.setReturnValue(Safelog.sanitize(this.connection.getAddress())); + } + } +} -- cgit v1.2.3