aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/moe/ymc/safelog
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/moe/ymc/safelog')
-rw-r--r--src/main/java/moe/ymc/safelog/Safelog.java46
-rw-r--r--src/main/java/moe/ymc/safelog/SanitizedInetSocketAddress.java23
-rw-r--r--src/main/java/moe/ymc/safelog/mixin/PlayerManagerMixin.java28
-rw-r--r--src/main/java/moe/ymc/safelog/mixin/ServerLoginNetworkHandlerMixin.java36
4 files changed, 133 insertions, 0 deletions
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<String> cir) {
+ if(profile != null) {
+ cir.setReturnValue(profile + " (" + Safelog.sanitize(this.connection.getAddress()) + ")");
+ } else {
+ cir.setReturnValue(Safelog.sanitize(this.connection.getAddress()));
+ }
+ }
+}