From 019471387acee432d447ee18479f9bfb93795165 Mon Sep 17 00:00:00 2001 From: 4drian3d Date: Thu, 28 Jul 2022 21:16:24 +0000 Subject: [PATCH] fix: Fix incorrect connect check logic fixes #44 --- .../proxy/AuthMeVelocityPlugin.java | 4 +- .../proxy/listener/ConnectListener.java | 91 +++++++++++++++++++ .../proxy/listener/ProxyListener.java | 69 +------------- 3 files changed, 96 insertions(+), 68 deletions(-) create mode 100644 proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ConnectListener.java diff --git a/proxy/src/main/java/com/glyart/authmevelocity/proxy/AuthMeVelocityPlugin.java b/proxy/src/main/java/com/glyart/authmevelocity/proxy/AuthMeVelocityPlugin.java index a4ddc1e..9ab15b2 100644 --- a/proxy/src/main/java/com/glyart/authmevelocity/proxy/AuthMeVelocityPlugin.java +++ b/proxy/src/main/java/com/glyart/authmevelocity/proxy/AuthMeVelocityPlugin.java @@ -2,6 +2,7 @@ package com.glyart.authmevelocity.proxy; import com.glyart.authmevelocity.proxy.commands.AuthmeCommand; import com.glyart.authmevelocity.proxy.config.AuthMeConfig; +import com.glyart.authmevelocity.proxy.listener.ConnectListener; import com.glyart.authmevelocity.proxy.listener.FastLoginListener; import com.glyart.authmevelocity.proxy.listener.PluginMessageListener; import com.glyart.authmevelocity.proxy.listener.ProxyListener; @@ -111,7 +112,8 @@ public class AuthMeVelocityPlugin { listeners.forEach(listener -> proxy.getEventManager().unregisterListener(this, listener)); listeners.clear(); - listeners.add(new ProxyListener(config, api, logger, proxy)); + listeners.add(new ProxyListener(config, api)); + listeners.add(new ConnectListener(config, api, proxy, logger)); listeners.add(new PluginMessageListener(proxy, logger, config, api)); if (proxy.getPluginManager().isLoaded("fastlogin")) { diff --git a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ConnectListener.java b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ConnectListener.java new file mode 100644 index 0000000..194df2d --- /dev/null +++ b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ConnectListener.java @@ -0,0 +1,91 @@ +package com.glyart.authmevelocity.proxy.listener; + +import java.util.Optional; + +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; + +import com.glyart.authmevelocity.proxy.AuthMeVelocityPlugin; +import com.glyart.authmevelocity.proxy.AuthmeVelocityAPI; +import com.glyart.authmevelocity.proxy.config.AuthMeConfig; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import com.velocitypowered.api.event.Continuation; +import com.velocitypowered.api.event.PostOrder; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; +import com.velocitypowered.api.event.player.ServerPostConnectEvent; +import com.velocitypowered.api.event.player.ServerPreConnectEvent; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.server.RegisteredServer; + +public class ConnectListener { + private final ProxyServer proxy; + private final Logger logger; + private final AuthMeConfig config; + private final AuthmeVelocityAPI api; + + public ConnectListener(AuthMeConfig config, AuthmeVelocityAPI api, ProxyServer proxy, Logger logger) { + this.config = config; + this.api = api; + this.logger = logger; + this.proxy = proxy; + } + + @Subscribe(order = PostOrder.LATE) + public void onInitialServer(PlayerChooseInitialServerEvent event, Continuation continuation){ + if(!config.getEnsureOptions().ensureAuthServer()) { + continuation.resume(); + return; + } + + Optional optionalSV = event.getInitialServer(); + if(optionalSV.isPresent() && api.isAuthServer(optionalSV.get())){ + continuation.resume(); + return; + } + + @Nullable RegisteredServer server = getAvailableServer(); + // Velocity takes over in case the initial server is not present + event.setInitialServer(server); + continuation.resume(); + if (server == null) { + logger.error("Cannot send the player {} to an auth server", event.getPlayer().getUsername()); + } + } + + @Subscribe + public void onServerPreConnect(ServerPreConnectEvent event, Continuation continuation) { + if (!event.getResult().isAllowed() && api.isLogged(event.getPlayer())) { + continuation.resume(); + return; + } + + event.getResult().getServer().ifPresent(server -> { + if(!api.isAuthServer(server)){ + event.setResult(ServerPreConnectEvent.ServerResult.denied()); + } + }); + } + + @Subscribe + public void onServerPostConnect(ServerPostConnectEvent event) { + final Player player = event.getPlayer(); + if (api.isLogged(player) && api.isInAuthServer(player)){ + ByteArrayDataOutput buf = ByteStreams.newDataOutput(); + buf.writeUTF("LOGIN"); + player.getCurrentServer().ifPresent(sv -> + sv.sendPluginMessage(AuthMeVelocityPlugin.AUTHMEVELOCITY_CHANNEL, buf.toByteArray())); + } + } + + // TODO: Implement #40 + private @Nullable RegisteredServer getAvailableServer() { + for(String sv : config.getAuthServers()){ + Optional opt = proxy.getServer(sv); + if (opt.isPresent()) return opt.get(); + } + return null; + } +} diff --git a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ProxyListener.java b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ProxyListener.java index bc3ddfb..4041ad5 100644 --- a/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ProxyListener.java +++ b/proxy/src/main/java/com/glyart/authmevelocity/proxy/listener/ProxyListener.java @@ -1,14 +1,9 @@ package com.glyart.authmevelocity.proxy.listener; -import java.util.Optional; - -import com.glyart.authmevelocity.proxy.AuthMeVelocityPlugin; import com.glyart.authmevelocity.proxy.AuthmeVelocityAPI; import com.glyart.authmevelocity.proxy.config.AuthMeConfig; import com.glyart.authmevelocity.proxy.config.ConfigUtils; import com.glyart.authmevelocity.proxy.utils.AuthmeUtils; -import com.google.common.io.ByteArrayDataOutput; -import com.google.common.io.ByteStreams; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.EventTask; import com.velocitypowered.api.event.PostOrder; @@ -16,29 +11,18 @@ import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.command.CommandExecuteEvent; import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.player.PlayerChatEvent; -import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; -import com.velocitypowered.api.event.player.ServerPostConnectEvent; -import com.velocitypowered.api.event.player.ServerPreConnectEvent; import com.velocitypowered.api.event.player.TabCompleteEvent; import com.velocitypowered.api.proxy.Player; -import com.velocitypowered.api.proxy.ProxyServer; -import com.velocitypowered.api.proxy.server.RegisteredServer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; public final class ProxyListener { private final AuthMeConfig config; private final AuthmeVelocityAPI api; - private final ProxyServer proxy; - private final Logger logger; - public ProxyListener(@NotNull AuthMeConfig config, AuthmeVelocityAPI api, Logger logger, ProxyServer proxy) { + public ProxyListener(@NotNull AuthMeConfig config, AuthmeVelocityAPI api) { this.config = config; this.api = api; - this.logger = logger; - this.proxy = proxy; } @Subscribe @@ -80,30 +64,6 @@ public final class ProxyListener { } } - @Subscribe - public void onServerPreConnect(ServerPreConnectEvent event, Continuation continuation) { - if ( - !event.getResult().isAllowed() && api.isLogged(event.getPlayer()) - || !event.getResult().getServer().map(api::isAuthServer).orElse(false) - ) { - continuation.resume(); - return; - } - event.setResult(ServerPreConnectEvent.ServerResult.denied()); - continuation.resume(); - } - - @Subscribe - public void onServerPostConnect(ServerPostConnectEvent event) { - final Player player = event.getPlayer(); - if (api.isLogged(player) && api.isInAuthServer(player)){ - ByteArrayDataOutput buf = ByteStreams.newDataOutput(); - buf.writeUTF("LOGIN"); - player.getCurrentServer().ifPresent(sv -> - sv.sendPluginMessage(AuthMeVelocityPlugin.AUTHMEVELOCITY_CHANNEL, buf.toByteArray())); - } - } - @Subscribe(order = PostOrder.FIRST) public void onTabComplete(TabCompleteEvent event){ if (api.isLogged(event.getPlayer())) { @@ -119,30 +79,5 @@ public final class ProxyListener { event.getSuggestions().clear(); } - - @Subscribe(order = PostOrder.LATE) - public void onInitialServer(PlayerChooseInitialServerEvent event, Continuation continuation){ - if(!config.getEnsureOptions().ensureAuthServer() - || event.getInitialServer().map(api::isAuthServer).orElse(false) - ) { - continuation.resume(); - return; - } - @Nullable RegisteredServer server = getAvailableServer(); - // Velocity takes over in case the initial server is not present - event.setInitialServer(server); - continuation.resume(); - if (server == null) { - logger.error("Cannot send the player {} to an auth server", event.getPlayer().getUsername()); - } - } - - // TODO: Implement #40 - private @Nullable RegisteredServer getAvailableServer() { - for(String sv : config.getAuthServers()){ - Optional opt = proxy.getServer(sv); - if (opt.isPresent()) return opt.get(); - } - return null; - } + }