From bf64d9cf56589f4dc98386425c290d03b14837fc Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Mon, 2 Dec 2019 11:35:17 +0000 Subject: [PATCH] ConnectionInitEvent diff --git a/api/src/main/java/io/github/waterfallmc/waterfall/event/ConnectionInitEvent.java b/api/src/main/java/io/github/waterfallmc/waterfall/event/ConnectionInitEvent.java new file mode 100644 index 00000000..6e79675f --- /dev/null +++ b/api/src/main/java/io/github/waterfallmc/waterfall/event/ConnectionInitEvent.java @@ -0,0 +1,56 @@ +package io.github.waterfallmc.waterfall.event; + +import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.config.ListenerInfo; +import net.md_5.bungee.api.event.AsyncEvent; +import net.md_5.bungee.api.event.ClientConnectEvent; +import net.md_5.bungee.api.plugin.Cancellable; + +import java.net.InetSocketAddress; +import java.net.SocketAddress; + +import lombok.ToString; + +/** + * Represents a brand new connection made to the proxy, allowing for plugins to + * efficiently close a connection, useful for connection throttlers, etc + */ +@ToString +public class ConnectionInitEvent extends AsyncEvent implements Cancellable { + + private final SocketAddress remoteAddress; + private final ListenerInfo listener; + private boolean isCancelled = false; + + public ConnectionInitEvent(SocketAddress remoteAddress, ListenerInfo listener, Callback done) { + super(done); + this.remoteAddress = remoteAddress; + this.listener = listener; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.isCancelled = cancel; + } + + /** + * @return the INetSocketAddress of the connection being opened + * @deprecated BungeeCord can accept connections via Unix domain sockets + */ + @Deprecated + public InetSocketAddress getRemoteAddress() { + return (InetSocketAddress) remoteAddress; + } + + /** + * @return the SocketAddress of the connection being opened + */ + public SocketAddress getRemoteSocketAddress() { + return remoteAddress; + } +} diff --git a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java index 6a0d3351..3b157d79 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java @@ -1,6 +1,7 @@ package net.md_5.bungee.netty; import com.google.common.base.Preconditions; +import io.github.waterfallmc.waterfall.event.ConnectionInitEvent; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelException; @@ -68,7 +69,6 @@ public class PipelineUtils ch.close(); return; } - ListenerInfo listener = ch.attr( LISTENER ).get(); if ( BungeeCord.getInstance().getPluginManager().callEvent( new ClientConnectEvent( remoteAddress, listener ) ).isCancelled() ) @@ -77,7 +77,21 @@ public class PipelineUtils return; } + ConnectionInitEvent connectionInitEvent = new ConnectionInitEvent(ch.remoteAddress(), listener, (result, throwable) -> { // Waterfall + + if (result.isCancelled()) { + ch.close(); + return; + } + + + try { BASE.initChannel( ch ); + } catch (Exception e) { + e.printStackTrace(); + ch.close(); + return; + } ch.pipeline().addBefore( FRAME_DECODER, LEGACY_DECODER, new LegacyDecoder() ); ch.pipeline().addAfter( FRAME_DECODER, PACKET_DECODER, new MinecraftDecoder( Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion() ) ); ch.pipeline().addAfter( FRAME_PREPENDER, PACKET_ENCODER, new MinecraftEncoder( Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion() ) ); @@ -88,6 +102,9 @@ public class PipelineUtils { ch.pipeline().addFirst( new HAProxyMessageDecoder() ); } + }); // Waterfall + + BungeeCord.getInstance().getPluginManager().callEvent(connectionInitEvent); } }; public static final Base BASE = new Base( false ); -- 2.44.0