diff --git a/src/main/java/net/raphimc/viaproxy/plugins/events/PreConnectEvent.java b/src/main/java/net/raphimc/viaproxy/plugins/events/PreConnectEvent.java index 397eb7a..08dad74 100644 --- a/src/main/java/net/raphimc/viaproxy/plugins/events/PreConnectEvent.java +++ b/src/main/java/net/raphimc/viaproxy/plugins/events/PreConnectEvent.java @@ -17,6 +17,7 @@ */ package net.raphimc.viaproxy.plugins.events; +import com.google.common.net.HostAndPort; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import io.netty.channel.Channel; import net.raphimc.viaproxy.plugins.events.types.EventCancellable; @@ -28,14 +29,16 @@ public class PreConnectEvent extends EventCancellable { private SocketAddress serverAddress; private ProtocolVersion serverVersion; private final ProtocolVersion clientVersion; + private final HostAndPort clientHandshakeAddress; private final Channel clientChannel; private String cancelMessage = "§cCould not connect to the backend server! (Server is blacklisted)"; - public PreConnectEvent(final SocketAddress serverAddress, final ProtocolVersion serverVersion, final ProtocolVersion clientVersion, final Channel clientChannel) { + public PreConnectEvent(final SocketAddress serverAddress, final ProtocolVersion serverVersion, final ProtocolVersion clientVersion, final HostAndPort clientHandshakeAddress, final Channel clientChannel) { this.serverAddress = serverAddress; this.serverVersion = serverVersion; this.clientVersion = clientVersion; + this.clientHandshakeAddress = clientHandshakeAddress; this.clientChannel = clientChannel; } @@ -59,6 +62,10 @@ public class PreConnectEvent extends EventCancellable { return this.clientVersion; } + public HostAndPort getClientHandshakeAddress() { + return this.clientHandshakeAddress; + } + public Channel getClientChannel() { return this.clientChannel; } diff --git a/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/Client2ProxyHandler.java b/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/Client2ProxyHandler.java index 5fa7de0..bebcc5d 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/Client2ProxyHandler.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/Client2ProxyHandler.java @@ -18,6 +18,7 @@ package net.raphimc.viaproxy.proxy.client2proxy; import com.google.common.collect.Lists; +import com.google.common.net.HostAndPort; import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.storage.CookieStorage; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -131,12 +132,11 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { if (ViaProxy.getConfig().getWildcardDomainHandling() == ViaProxyConfig.WildcardDomainHandling.PUBLIC) { try { - if (handshakeParts[0].toLowerCase().contains(".viaproxy.")) { - handshakeParts[0] = handshakeParts[0].substring(0, handshakeParts[0].toLowerCase().lastIndexOf(".viaproxy.")); - } else { + if (!handshakeParts[0].toLowerCase().contains(".viaproxy.")) { throw new IllegalArgumentException(); } - final ArrayHelper arrayHelper = ArrayHelper.instanceOf(handshakeParts[0].split(Pattern.quote("_"))); + final String addressData = handshakeParts[0].substring(0, handshakeParts[0].toLowerCase().lastIndexOf(".viaproxy.")); + final ArrayHelper arrayHelper = ArrayHelper.instanceOf(addressData.split(Pattern.quote("_"))); if (arrayHelper.getLength() < 3) { throw new IllegalArgumentException(); } @@ -145,20 +145,21 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { if (serverVersion == null) { this.proxyConnection.kickClient("§cWrong domain syntax!\n§cUnknown server version."); } - final String connectIP = arrayHelper.getAsString(0, arrayHelper.getLength() - 3, "_"); + final String connectAddress = arrayHelper.getAsString(0, arrayHelper.getLength() - 3, "_"); final int connectPort = arrayHelper.getInteger(arrayHelper.getLength() - 2); - serverAddress = AddressUtil.parse(connectIP + ":" + connectPort, serverVersion); + serverAddress = AddressUtil.parse(connectAddress + ":" + connectPort, serverVersion); } catch (IllegalArgumentException e) { this.proxyConnection.kickClient("§cWrong domain syntax! §6Please use:\n§7address_port_version.viaproxy.hostname"); } } else if (ViaProxy.getConfig().getWildcardDomainHandling() == ViaProxyConfig.WildcardDomainHandling.INTERNAL) { final ArrayHelper arrayHelper = ArrayHelper.instanceOf(handshakeParts[0].split("\7")); - final String versionString = arrayHelper.get(1); + handshakeParts[0] = arrayHelper.get(0); // Restore the original address + final String versionString = arrayHelper.get(2); serverVersion = ProtocolVersionUtil.fromNameLenient(versionString); if (serverVersion == null) throw CloseAndReturn.INSTANCE; - serverAddress = AddressUtil.parse(arrayHelper.get(0), serverVersion); - if (arrayHelper.isIndexValid(2)) { - classicMpPass = arrayHelper.getString(2); + serverAddress = AddressUtil.parse(arrayHelper.get(1), serverVersion); + if (arrayHelper.isIndexValid(3)) { + classicMpPass = arrayHelper.getString(3); } } @@ -173,7 +174,14 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { serverAddress = TransferDataHolder.removeTempRedirect(this.proxyConnection.getC2P()); } - final PreConnectEvent preConnectEvent = new PreConnectEvent(serverAddress, serverVersion, clientVersion, this.proxyConnection.getC2P()); + HostAndPort clientHandshakeAddress; + try { + clientHandshakeAddress = HostAndPort.fromParts(handshakeParts[0], packet.port); + } catch (Throwable e) { + clientHandshakeAddress = null; + } + + final PreConnectEvent preConnectEvent = new PreConnectEvent(serverAddress, serverVersion, clientVersion, clientHandshakeAddress, this.proxyConnection.getC2P()); if (ViaProxy.EVENT_MANAGER.call(preConnectEvent).isCancelled()) { this.proxyConnection.kickClient(preConnectEvent.getCancelMessage()); } @@ -185,9 +193,10 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { if (packet.intendedState.getConnectionState() == ConnectionState.LOGIN && serverVersion.equals(ProtocolTranslator.AUTO_DETECT_PROTOCOL)) { SocketAddress finalServerAddress = serverAddress; + HostAndPort finalClientHandshakeAddress = clientHandshakeAddress; CompletableFuture.runAsync(() -> { final ProtocolVersion detectedVersion = ProtocolVersionDetector.get(finalServerAddress, clientVersion); - this.connect(finalServerAddress, detectedVersion, clientVersion, packet.intendedState, userOptions, handshakeParts); + this.connect(finalServerAddress, detectedVersion, clientVersion, packet.intendedState, finalClientHandshakeAddress, userOptions, handshakeParts); }).exceptionally(t -> { if (t instanceof ConnectException || t instanceof UnresolvedAddressException) { this.proxyConnection.kickClient("§cCould not connect to the backend server!"); @@ -197,11 +206,11 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { return null; }); } else { - this.connect(serverAddress, serverVersion, clientVersion, packet.intendedState, userOptions, handshakeParts); + this.connect(serverAddress, serverVersion, clientVersion, packet.intendedState, clientHandshakeAddress, userOptions, handshakeParts); } } - private void connect(final SocketAddress serverAddress, final ProtocolVersion serverVersion, final ProtocolVersion clientVersion, final IntendedState intendedState, final UserOptions userOptions, final String[] handshakeParts) { + private void connect(final SocketAddress serverAddress, final ProtocolVersion serverVersion, final ProtocolVersion clientVersion, final IntendedState intendedState, final HostAndPort clientHandshakeAddress, final UserOptions userOptions, final String[] handshakeParts) { final Supplier handlerSupplier = () -> ViaProxy.EVENT_MANAGER.call(new Proxy2ServerHandlerCreationEvent(new Proxy2ServerHandler(), false)).getHandler(); final ProxyConnection proxyConnection; if (serverVersion.equals(BedrockProtocolVersion.bedrockLatest)) { @@ -212,8 +221,9 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { this.proxyConnection = ViaProxy.EVENT_MANAGER.call(new ProxySessionCreationEvent<>(proxyConnection, false)).getProxySession(); this.proxyConnection.getC2P().attr(ProxyConnection.PROXY_CONNECTION_ATTRIBUTE_KEY).set(this.proxyConnection); this.proxyConnection.setClientVersion(clientVersion); - this.proxyConnection.setC2pConnectionState(intendedState.getConnectionState()); + this.proxyConnection.setClientHandshakeAddress(clientHandshakeAddress); this.proxyConnection.setUserOptions(userOptions); + this.proxyConnection.setC2pConnectionState(intendedState.getConnectionState()); this.proxyConnection.getPacketHandlers().add(new StatusPacketHandler(this.proxyConnection)); this.proxyConnection.getPacketHandlers().add(new OpenAuthModPacketHandler(this.proxyConnection)); if (ViaProxy.getConfig().shouldSupportSimpleVoiceChat() && serverVersion.newerThan(ProtocolVersion.v1_14) && clientVersion.newerThan(ProtocolVersion.v1_14)) { @@ -236,7 +246,7 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { this.proxyConnection.getPacketHandlers().add(new ResourcePackPacketHandler(this.proxyConnection)); this.proxyConnection.getPacketHandlers().add(new UnexpectedPacketHandler(this.proxyConnection)); - Logger.u_info("connect", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "[" + clientVersion.getName() + " <-> " + serverVersion.getName() + "] Connecting to " + AddressUtil.toString(serverAddress)); + Logger.u_info("connect", this.proxyConnection, "[" + clientVersion.getName() + " <-> " + serverVersion.getName() + "] Connecting to " + AddressUtil.toString(serverAddress)); ViaProxy.EVENT_MANAGER.call(new ConnectEvent(this.proxyConnection)); this.proxyConnection.connectToServer(serverAddress, serverVersion).addListeners((ThrowingChannelFutureListener) f -> { @@ -258,6 +268,7 @@ public class Client2ProxyHandler extends SimpleChannelInboundHandler { handshakeParts[0] = address; final C2SHandshakePacket newHandshakePacket = new C2SHandshakePacket(clientVersion.getOriginalVersion(), String.join("\0", handshakeParts), port, intendedState); + this.proxyConnection.getChannel().writeAndFlush(newHandshakePacket).addListeners(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE, (ChannelFutureListener) f2 -> { if (f2.isSuccess()) { this.proxyConnection.setP2sConnectionState(intendedState.getConnectionState()); diff --git a/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/passthrough/PassthroughClient2ProxyHandler.java b/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/passthrough/PassthroughClient2ProxyHandler.java index 2b51bbd..9e0999e 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/passthrough/PassthroughClient2ProxyHandler.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/client2proxy/passthrough/PassthroughClient2ProxyHandler.java @@ -31,6 +31,7 @@ import net.raphimc.viaproxy.proxy.util.HAProxyUtil; import net.raphimc.viaproxy.proxy.util.ThrowingChannelFutureListener; import net.raphimc.viaproxy.util.AddressUtil; import net.raphimc.viaproxy.util.logging.Logger; +import org.apache.logging.log4j.Level; import java.net.SocketAddress; import java.util.function.Supplier; @@ -80,7 +81,7 @@ public class PassthroughClient2ProxyHandler extends SimpleChannelInboundHandler< final SocketAddress serverAddress = this.getServerAddress(); ChannelUtil.disableAutoRead(this.proxyConnection.getC2P()); - Logger.u_info("connect", this.proxyConnection.getC2P().remoteAddress(), null, "[Legacy <-> Legacy] Connecting to " + AddressUtil.toString(serverAddress)); + Logger.u_log(Level.INFO, "connect", this.proxyConnection.getC2P().remoteAddress(), null, "[Legacy <-> Legacy] Connecting to " + AddressUtil.toString(serverAddress)); this.proxyConnection.connect(serverAddress).addListeners((ThrowingChannelFutureListener) f -> { if (f.isSuccess()) { diff --git a/src/main/java/net/raphimc/viaproxy/proxy/external_interface/ExternalInterface.java b/src/main/java/net/raphimc/viaproxy/proxy/external_interface/ExternalInterface.java index 1e2325a..6e783ca 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/external_interface/ExternalInterface.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/external_interface/ExternalInterface.java @@ -57,7 +57,7 @@ import java.util.concurrent.TimeoutException; public class ExternalInterface { public static void fillPlayerData(final ProxyConnection proxyConnection) { - Logger.u_info("auth", proxyConnection.getC2P().remoteAddress(), proxyConnection.getGameProfile(), "Filling player data"); + Logger.u_info("auth", proxyConnection, "Filling player data"); try { if (proxyConnection.getUserOptions().account() != null) { final Account account = proxyConnection.getUserOptions().account(); @@ -107,7 +107,7 @@ public class ExternalInterface { } public static void joinServer(final String serverIdHash, final ProxyConnection proxyConnection) throws InterruptedException, ExecutionException { - Logger.u_info("auth", proxyConnection.getC2P().remoteAddress(), proxyConnection.getGameProfile(), "Trying to join online mode server"); + Logger.u_info("auth", proxyConnection, "Trying to join online mode server"); if (ViaProxy.getConfig().getAuthMethod() == ViaProxyConfig.AuthMethod.OPENAUTHMOD) { try { final ByteBuf response = proxyConnection.getPacketHandler(OpenAuthModPacketHandler.class).sendCustomPayload(OpenAuthModConstants.JOIN_CHANNEL, PacketTypes.writeString(Unpooled.buffer(), serverIdHash)).get(6, TimeUnit.SECONDS); @@ -128,7 +128,7 @@ public class ExternalInterface { } public static void signNonce(final byte[] nonce, final C2SLoginKeyPacket1_19 packet, final ProxyConnection proxyConnection) throws InterruptedException, ExecutionException, SignatureException { - Logger.u_info("auth", proxyConnection.getC2P().remoteAddress(), proxyConnection.getGameProfile(), "Requesting nonce signature"); + Logger.u_info("auth", proxyConnection, "Requesting nonce signature"); final UserConnection user = proxyConnection.getUserConnection(); if (ViaProxy.getConfig().getAuthMethod() == ViaProxyConfig.AuthMethod.OPENAUTHMOD) { diff --git a/src/main/java/net/raphimc/viaproxy/proxy/packethandler/ConfigurationPacketHandler.java b/src/main/java/net/raphimc/viaproxy/proxy/packethandler/ConfigurationPacketHandler.java index c4de3bd..ce7d7a2 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/packethandler/ConfigurationPacketHandler.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/packethandler/ConfigurationPacketHandler.java @@ -50,7 +50,7 @@ public class ConfigurationPacketHandler extends PacketHandler { this.proxyConnection.setC2pConnectionState(ConnectionState.CONFIGURATION); listeners.add(f -> { if (f.isSuccess()) { - Logger.u_info("session", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "Switching to CONFIGURATION state"); + Logger.u_info("session", this.proxyConnection, "Switching to CONFIGURATION state"); this.proxyConnection.setP2sConnectionState(ConnectionState.CONFIGURATION); ChannelUtil.restoreAutoRead(this.proxyConnection.getChannel()); } @@ -68,7 +68,7 @@ public class ConfigurationPacketHandler extends PacketHandler { this.proxyConnection.setC2pConnectionState(ConnectionState.PLAY); listeners.add(f -> { if (f.isSuccess()) { - Logger.u_info("session", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "Configuration finished! Switching to PLAY state"); + Logger.u_info("session", this.proxyConnection, "Configuration finished! Switching to PLAY state"); this.proxyConnection.setP2sConnectionState(ConnectionState.PLAY); ChannelUtil.restoreAutoRead(this.proxyConnection.getChannel()); } diff --git a/src/main/java/net/raphimc/viaproxy/proxy/packethandler/LoginPacketHandler.java b/src/main/java/net/raphimc/viaproxy/proxy/packethandler/LoginPacketHandler.java index a508fc2..c155c7e 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/packethandler/LoginPacketHandler.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/packethandler/LoginPacketHandler.java @@ -99,14 +99,14 @@ public class LoginPacketHandler extends PacketHandler { if (loginKeyPacket.encryptedNonce != null) { if (!Arrays.equals(this.verifyToken, CryptUtil.decryptData(KEY_PAIR.getPrivate(), loginKeyPacket.encryptedNonce))) { - Logger.u_err("auth", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "Invalid verify token"); + Logger.u_err("auth", this.proxyConnection, "Invalid verify token"); this.proxyConnection.kickClient("§cInvalid verify token!"); } } else { final C2SLoginKeyPacket1_19 keyPacket = (C2SLoginKeyPacket1_19) packet; final C2SLoginHelloPacket1_19 helloPacket = (C2SLoginHelloPacket1_19) this.proxyConnection.getLoginHelloPacket(); if (helloPacket.key == null || !CryptUtil.verifySignedNonce(helloPacket.key, this.verifyToken, keyPacket.salt, keyPacket.signature)) { - Logger.u_err("auth", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "Invalid verify token"); + Logger.u_err("auth", this.proxyConnection, "Invalid verify token"); this.proxyConnection.kickClient("§cInvalid verify token!"); } } @@ -119,12 +119,12 @@ public class LoginPacketHandler extends PacketHandler { final String serverHash = new BigInteger(CryptUtil.computeServerIdHash("", KEY_PAIR.getPublic(), secretKey)).toString(16); final GameProfile mojangProfile = AuthLibServices.SESSION_SERVICE.hasJoinedServer(this.proxyConnection.getGameProfile(), serverHash, null); if (mojangProfile == null) { - Logger.u_err("auth", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "Invalid session"); + Logger.u_err("auth", this.proxyConnection, "Invalid session"); this.proxyConnection.kickClient("§cInvalid session! Please restart minecraft (and the launcher) and try again."); } else { this.proxyConnection.setGameProfile(mojangProfile); } - Logger.u_info("auth", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "Authenticated as " + this.proxyConnection.getGameProfile().getId().toString()); + Logger.u_info("auth", this.proxyConnection, "Authenticated as " + this.proxyConnection.getGameProfile().getId().toString()); } catch (Throwable e) { throw new RuntimeException("Failed to make session request for user '" + userName + "'!", e); } @@ -142,7 +142,7 @@ public class LoginPacketHandler extends PacketHandler { @Override public boolean handleP2S(IPacket packet, List listeners) throws GeneralSecurityException, ExecutionException, InterruptedException { if (packet instanceof S2CLoginDisconnectPacket1_7 loginDisconnectPacket) { - Logger.u_info("server kick", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), ConsoleFormatter.convert(loginDisconnectPacket.reason.asLegacyFormatString())); + Logger.u_info("server kick", this.proxyConnection, ConsoleFormatter.convert(loginDisconnectPacket.reason.asLegacyFormatString())); } else if (packet instanceof S2CLoginKeyPacket1_7 loginKeyPacket) { final PublicKey publicKey = CryptUtil.decodeRsaPublicKey(loginKeyPacket.publicKey); final SecretKey secretKey = CryptUtil.generateSecretKey(); @@ -176,7 +176,7 @@ public class LoginPacketHandler extends PacketHandler { final ConnectionState nextState = this.proxyConnection.getClientVersion().newerThanOrEqualTo(ProtocolVersion.v1_20_2) ? ConnectionState.CONFIGURATION : ConnectionState.PLAY; this.proxyConnection.setGameProfile(new GameProfile(loginSuccessPacket.uuid, loginSuccessPacket.name)); - Logger.u_info("session", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "Connected successfully! Switching to " + nextState + " state"); + Logger.u_info("session", this.proxyConnection, "Connected successfully! Switching to " + nextState + " state"); ChannelUtil.disableAutoRead(this.proxyConnection.getChannel()); listeners.add(f -> { diff --git a/src/main/java/net/raphimc/viaproxy/proxy/packethandler/TransferPacketHandler.java b/src/main/java/net/raphimc/viaproxy/proxy/packethandler/TransferPacketHandler.java index 2cad785..1580281 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/packethandler/TransferPacketHandler.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/packethandler/TransferPacketHandler.java @@ -29,6 +29,7 @@ import net.raphimc.netminecraft.packet.impl.configuration.S2CConfigTransfer1_20_ import net.raphimc.viaproxy.ViaProxy; import net.raphimc.viaproxy.proxy.session.ProxyConnection; import net.raphimc.viaproxy.proxy.util.TransferDataHolder; +import net.raphimc.viaproxy.util.logging.Logger; import java.net.InetSocketAddress; import java.util.List; @@ -72,14 +73,18 @@ public class TransferPacketHandler extends PacketHandler { } private S2CConfigTransfer1_20_5 createTransferPacket() { - if (!(ViaProxy.getCurrentProxyServer().getChannel().localAddress() instanceof InetSocketAddress bindAddress)) { - throw new IllegalArgumentException("ViaProxy bind address must be an InetSocketAddress"); + if (this.proxyConnection.getClientHandshakeAddress() != null) { + return new S2CConfigTransfer1_20_5(this.proxyConnection.getClientHandshakeAddress().getHost(), this.proxyConnection.getClientHandshakeAddress().getPort()); + } else { + Logger.u_warn("transfer", this.proxyConnection, "Client handshake address is invalid, using ViaProxy bind address instead"); + if (!(ViaProxy.getCurrentProxyServer().getChannel().localAddress() instanceof InetSocketAddress bindAddress)) { + throw new IllegalArgumentException("ViaProxy bind address must be an InetSocketAddress"); + } + if (!(this.proxyConnection.getC2P().localAddress() instanceof InetSocketAddress clientAddress)) { + throw new IllegalArgumentException("Client address must be an InetSocketAddress"); + } + return new S2CConfigTransfer1_20_5(clientAddress.getHostString(), bindAddress.getPort()); } - if (!(this.proxyConnection.getC2P().localAddress() instanceof InetSocketAddress clientAddress)) { - throw new IllegalArgumentException("Client address must be an InetSocketAddress"); - } - - return new S2CConfigTransfer1_20_5(clientAddress.getHostString(), bindAddress.getPort()); } } diff --git a/src/main/java/net/raphimc/viaproxy/proxy/proxy2server/Proxy2ServerHandler.java b/src/main/java/net/raphimc/viaproxy/proxy/proxy2server/Proxy2ServerHandler.java index 652b6e7..381e5d7 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/proxy2server/Proxy2ServerHandler.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/proxy2server/Proxy2ServerHandler.java @@ -44,7 +44,7 @@ public class Proxy2ServerHandler extends SimpleChannelInboundHandler { public void channelInactive(ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); - Logger.u_info("disconnect", this.proxyConnection.getC2P().remoteAddress(), this.proxyConnection.getGameProfile(), "Connection closed"); + Logger.u_info("disconnect", this.proxyConnection, "Connection closed"); try { this.proxyConnection.getC2P().close(); } catch (Throwable ignored) { diff --git a/src/main/java/net/raphimc/viaproxy/proxy/session/DummyProxyConnection.java b/src/main/java/net/raphimc/viaproxy/proxy/session/DummyProxyConnection.java index 4c52890..7c725d6 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/session/DummyProxyConnection.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/session/DummyProxyConnection.java @@ -17,6 +17,7 @@ */ package net.raphimc.viaproxy.proxy.session; +import com.google.common.net.HostAndPort; import com.mojang.authlib.GameProfile; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -56,6 +57,16 @@ public class DummyProxyConnection extends ProxyConnection { throw new UnsupportedOperationException(); } + @Override + public HostAndPort getClientHandshakeAddress() { + throw new UnsupportedOperationException(); + } + + @Override + public void setClientHandshakeAddress(HostAndPort clientHandshakeAddress) { + throw new UnsupportedOperationException(); + } + @Override public GameProfile getGameProfile() { return null; diff --git a/src/main/java/net/raphimc/viaproxy/proxy/session/ProxyConnection.java b/src/main/java/net/raphimc/viaproxy/proxy/session/ProxyConnection.java index 06895d0..f012582 100644 --- a/src/main/java/net/raphimc/viaproxy/proxy/session/ProxyConnection.java +++ b/src/main/java/net/raphimc/viaproxy/proxy/session/ProxyConnection.java @@ -17,6 +17,7 @@ */ package net.raphimc.viaproxy.proxy.session; +import com.google.common.net.HostAndPort; import com.mojang.authlib.GameProfile; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -67,6 +68,7 @@ public class ProxyConnection extends NetClient { private ProtocolVersion serverVersion; private ProtocolVersion clientVersion; + private HostAndPort clientHandshakeAddress; private GameProfile gameProfile; private C2SLoginHelloPacket1_7 loginHelloPacket; private Key storedSecretKey; @@ -142,6 +144,14 @@ public class ProxyConnection extends NetClient { this.clientVersion = clientVersion; } + public HostAndPort getClientHandshakeAddress() { + return this.clientHandshakeAddress; + } + + public void setClientHandshakeAddress(final HostAndPort clientHandshakeAddress) { + this.clientHandshakeAddress = clientHandshakeAddress; + } + public GameProfile getGameProfile() { return this.gameProfile; } @@ -238,7 +248,7 @@ public class ProxyConnection extends NetClient { } public void kickClient(final String message) throws CloseAndReturn { - Logger.u_err("proxy kick", this.c2p.remoteAddress(), this.getGameProfile(), ConsoleFormatter.convert(message)); + Logger.u_err("proxy kick", this, ConsoleFormatter.convert(message)); final ChannelFuture future; if (this.c2pConnectionState == ConnectionState.STATUS) { diff --git a/src/main/java/net/raphimc/viaproxy/util/logging/Logger.java b/src/main/java/net/raphimc/viaproxy/util/logging/Logger.java index 6442aac..0e60e6f 100644 --- a/src/main/java/net/raphimc/viaproxy/util/logging/Logger.java +++ b/src/main/java/net/raphimc/viaproxy/util/logging/Logger.java @@ -18,7 +18,7 @@ package net.raphimc.viaproxy.util.logging; import com.mojang.authlib.GameProfile; -import com.viaversion.viaversion.api.connection.UserConnection; +import net.raphimc.viaproxy.proxy.session.ProxyConnection; import net.raphimc.viaproxy.util.AddressUtil; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -43,20 +43,22 @@ public class Logger { System.setOut(new LoggerPrintStream("STDOUT", SYSOUT)); } - public static void u_info(final String title, final SocketAddress address, final GameProfile gameProfile, final String msg) { - u_log(Level.INFO, title, address, gameProfile, msg); + public static void u_info(final String title, final ProxyConnection proxyConnection, final String msg) { + u_log(Level.INFO, title, proxyConnection, msg); } - public static void u_err(final String title, final SocketAddress address, final GameProfile gameProfile, final String msg) { - u_log(Level.ERROR, title, address, gameProfile, msg); + public static void u_warn(final String title, final ProxyConnection proxyConnection, final String msg) { + u_log(Level.WARN, title, proxyConnection, msg); } - public static void u_err(final String title, final UserConnection user, final String msg) { - GameProfile gameProfile = null; - if (user.getProtocolInfo().getUsername() != null) { - gameProfile = new GameProfile(user.getProtocolInfo().getUuid(), user.getProtocolInfo().getUsername()); - } - u_log(Level.ERROR, title, user.getChannel().remoteAddress(), gameProfile, msg); + public static void u_err(final String title, final ProxyConnection proxyConnection, final String msg) { + u_log(Level.INFO, title, proxyConnection, msg); + } + + public static void u_log(final Level level, final String title, final ProxyConnection proxyConnection, final String msg) { + final SocketAddress address = proxyConnection.getC2P().remoteAddress(); + final GameProfile gameProfile = proxyConnection.getGameProfile(); + u_log(level, title, address, gameProfile, msg); } public static void u_log(final Level level, final String title, final SocketAddress address, final GameProfile gameProfile, final String msg) { diff --git a/src/main/resources/assets/viaproxy/viaproxy.yml b/src/main/resources/assets/viaproxy/viaproxy.yml index 0a413d4..d00cae7 100644 --- a/src/main/resources/assets/viaproxy/viaproxy.yml +++ b/src/main/resources/assets/viaproxy/viaproxy.yml @@ -65,7 +65,7 @@ resource-pack-url: "" # Allows clients to specify a target server and version using wildcard domains. # none: No wildcard domain handling. # public: Public wildcard domain handling. Intended for usage by external clients. (Example: address_port_version.viaproxy.127.0.0.1.nip.io) -# internal: Internal wildcard domain handling. Intended for local usage by custom clients. (Example: address:port\7version\7classic-mppass) +# internal: Internal wildcard domain handling. Intended for local usage by custom clients. (Example: original-handshake-address\7address:port\7version\7classic-mppass) wildcard-domain-handling: "none" # # Enables handling and rewriting of Simple Voice Chat mod packets.