diff --git a/api/src/main/java/com/velocitypowered/api/proxy/InboundConnection.java b/api/src/main/java/com/velocitypowered/api/proxy/InboundConnection.java index 884cd4111a..042d8a2bef 100644 --- a/api/src/main/java/com/velocitypowered/api/proxy/InboundConnection.java +++ b/api/src/main/java/com/velocitypowered/api/proxy/InboundConnection.java @@ -41,6 +41,14 @@ public interface InboundConnection { */ Optional getRawVirtualHost(); + /** + * If the connection was made through a proxy using the HAProxy protocol, this will contain the + * real address of the proxy. Otherwise, this will be empty. + * + * @return the address of the HAProxy proxy, if applicable + */ + Optional getHaProxyAddress(); + /** * Determine whether or not the player remains online. * diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/MinecraftConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/MinecraftConnection.java index 3d7ed44886..31b0838b08 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/MinecraftConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/MinecraftConnection.java @@ -87,6 +87,7 @@ public class MinecraftConnection extends ChannelInboundHandlerAdapter { private final Channel channel; public boolean pendingConfigurationSwitch = false; private SocketAddress remoteAddress; + private @Nullable SocketAddress haProxyAddress; private StateRegistry state; private Map sessionHandlers; private @Nullable MinecraftSessionHandler activeSessionHandler; @@ -158,6 +159,10 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception } else if (msg instanceof HAProxyMessage proxyMessage) { this.remoteAddress = new InetSocketAddress(proxyMessage.sourceAddress(), proxyMessage.sourcePort()); + + final var proxyTransportAddress = (InetSocketAddress) ctx.channel().remoteAddress(); + this.haProxyAddress = new InetSocketAddress(proxyTransportAddress.getAddress().getHostAddress(), + proxyTransportAddress.getPort()); } else if (msg instanceof ByteBuf) { activeSessionHandler.handleUnknown((ByteBuf) msg); } @@ -327,6 +332,10 @@ public SocketAddress getRemoteAddress() { return remoteAddress; } + public @Nullable SocketAddress getHaProxyAddress() { + return haProxyAddress; + } + public StateRegistry getState() { return state; } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java index 6d32535f39..98745212fe 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java @@ -383,6 +383,11 @@ public Optional getRawVirtualHost() { return Optional.ofNullable(rawVirtualHost); } + @Override + public Optional getHaProxyAddress() { + return Optional.ofNullable((InetSocketAddress) connection.getHaProxyAddress()); + } + void setPermissionFunction(PermissionFunction permissionFunction) { this.permissionFunction = permissionFunction; } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/HandshakeSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/HandshakeSessionHandler.java index 80260d2b47..f4629b62da 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/HandshakeSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/HandshakeSessionHandler.java @@ -248,6 +248,11 @@ public Optional getRawVirtualHost() { return getVirtualHost().map(InetSocketAddress::getHostName); } + @Override + public Optional getHaProxyAddress() { + return Optional.ofNullable((InetSocketAddress) connection.getHaProxyAddress()); + } + @Override public boolean isActive() { return !connection.isClosed(); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialInboundConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialInboundConnection.java index 35368844f5..e28b3a41bb 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialInboundConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialInboundConnection.java @@ -69,6 +69,11 @@ public Optional getRawVirtualHost() { return Optional.of(handshake.getServerAddress()); } + @Override + public Optional getHaProxyAddress() { + return Optional.ofNullable((InetSocketAddress) connection.getHaProxyAddress()); + } + @Override public boolean isActive() { return connection.getChannel().isActive(); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/LoginInboundConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/LoginInboundConnection.java index 9922c5095e..897c04d425 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/LoginInboundConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/LoginInboundConnection.java @@ -77,6 +77,11 @@ public Optional getRawVirtualHost() { return delegate.getRawVirtualHost(); } + @Override + public Optional getHaProxyAddress() { + return delegate.getHaProxyAddress(); + } + @Override public boolean isActive() { return delegate.isActive();