fix: Fix incorrect connect check logic

fixes #44
This commit is contained in:
4drian3d 2022-07-28 21:16:24 +00:00
parent f90be2e75f
commit 019471387a
3 changed files with 96 additions and 68 deletions

View File

@ -2,6 +2,7 @@ package com.glyart.authmevelocity.proxy;
import com.glyart.authmevelocity.proxy.commands.AuthmeCommand; import com.glyart.authmevelocity.proxy.commands.AuthmeCommand;
import com.glyart.authmevelocity.proxy.config.AuthMeConfig; 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.FastLoginListener;
import com.glyart.authmevelocity.proxy.listener.PluginMessageListener; import com.glyart.authmevelocity.proxy.listener.PluginMessageListener;
import com.glyart.authmevelocity.proxy.listener.ProxyListener; import com.glyart.authmevelocity.proxy.listener.ProxyListener;
@ -111,7 +112,8 @@ public class AuthMeVelocityPlugin {
listeners.forEach(listener -> proxy.getEventManager().unregisterListener(this, listener)); listeners.forEach(listener -> proxy.getEventManager().unregisterListener(this, listener));
listeners.clear(); 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)); listeners.add(new PluginMessageListener(proxy, logger, config, api));
if (proxy.getPluginManager().isLoaded("fastlogin")) { if (proxy.getPluginManager().isLoaded("fastlogin")) {

View File

@ -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<RegisteredServer> 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<RegisteredServer> opt = proxy.getServer(sv);
if (opt.isPresent()) return opt.get();
}
return null;
}
}

View File

@ -1,14 +1,9 @@
package com.glyart.authmevelocity.proxy.listener; 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.AuthmeVelocityAPI;
import com.glyart.authmevelocity.proxy.config.AuthMeConfig; import com.glyart.authmevelocity.proxy.config.AuthMeConfig;
import com.glyart.authmevelocity.proxy.config.ConfigUtils; import com.glyart.authmevelocity.proxy.config.ConfigUtils;
import com.glyart.authmevelocity.proxy.utils.AuthmeUtils; 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.Continuation;
import com.velocitypowered.api.event.EventTask; import com.velocitypowered.api.event.EventTask;
import com.velocitypowered.api.event.PostOrder; 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.command.CommandExecuteEvent;
import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.connection.DisconnectEvent;
import com.velocitypowered.api.event.player.PlayerChatEvent; 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.event.player.TabCompleteEvent;
import com.velocitypowered.api.proxy.Player; 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.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
public final class ProxyListener { public final class ProxyListener {
private final AuthMeConfig config; private final AuthMeConfig config;
private final AuthmeVelocityAPI api; 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.config = config;
this.api = api; this.api = api;
this.logger = logger;
this.proxy = proxy;
} }
@Subscribe @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) @Subscribe(order = PostOrder.FIRST)
public void onTabComplete(TabCompleteEvent event){ public void onTabComplete(TabCompleteEvent event){
if (api.isLogged(event.getPlayer())) { if (api.isLogged(event.getPlayer())) {
@ -119,30 +79,5 @@ public final class ProxyListener {
event.getSuggestions().clear(); 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<RegisteredServer> opt = proxy.getServer(sv);
if (opt.isPresent()) return opt.get();
}
return null;
}
} }