diff --git a/src/main/java/net/elytrium/limboauth/LimboAuth.java b/src/main/java/net/elytrium/limboauth/LimboAuth.java index 04f2d21d..8dc0d8f0 100644 --- a/src/main/java/net/elytrium/limboauth/LimboAuth.java +++ b/src/main/java/net/elytrium/limboauth/LimboAuth.java @@ -48,6 +48,7 @@ import com.velocitypowered.api.proxy.messages.LegacyChannelIdentifier; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import com.velocitypowered.api.scheduler.ScheduledTask; +import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.util.ratelimit.Ratelimiter; import com.velocitypowered.proxy.util.ratelimit.Ratelimiters; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -153,7 +154,6 @@ public class LimboAuth { private final Map bruteforceCache = new ConcurrentHashMap<>(); private final Map postLoginTasks = new ConcurrentHashMap<>(); private final Set unsafePasswords = new HashSet<>(); - private final Set forcedPreviously = Collections.synchronizedSet(new HashSet<>()); private final Set pendingLogins = ConcurrentHashMap.newKeySet(); private final HttpClient client = HttpClient.newHttpClient(); @@ -558,7 +558,7 @@ public boolean needAuth(Player player) { public void authPlayer(Player player) { boolean isFloodgate = !Settings.IMP.MAIN.FLOODGATE_NEED_AUTH && this.floodgateApi.isFloodgatePlayer(player.getUniqueId()); - if (!isFloodgate && this.isForcedPreviously(player.getUsername()) && this.isPremium(player.getUsername())) { + if (!isFloodgate && this.isForceOfflineMode(player) && this.isPremium(player.getUsername())) { player.disconnect(this.reconnectKick); return; } @@ -923,16 +923,9 @@ public void clearBruteforceAttempts(InetAddress address) { this.bruteforceCache.remove(address); } - public void saveForceOfflineMode(String nickname) { - this.forcedPreviously.add(nickname); - } - - public void unsetForcedPreviously(String nickname) { - this.forcedPreviously.remove(nickname); - } - - public boolean isForcedPreviously(String nickname) { - return this.forcedPreviously.contains(nickname); + public boolean isForceOfflineMode(Player player) { + return player instanceof ConnectedPlayer connectedPlayer + && connectedPlayer.getConnection().getChannel().hasAttr(AuthListener.FORCE_OFFLINE_MODE); } public Set getPendingLogins() { diff --git a/src/main/java/net/elytrium/limboauth/listener/AuthListener.java b/src/main/java/net/elytrium/limboauth/listener/AuthListener.java index d31cdb89..ef646e02 100644 --- a/src/main/java/net/elytrium/limboauth/listener/AuthListener.java +++ b/src/main/java/net/elytrium/limboauth/listener/AuthListener.java @@ -30,6 +30,8 @@ import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.client.InitialInboundConnection; import com.velocitypowered.proxy.connection.client.LoginInboundConnection; +import io.netty.channel.Channel; +import io.netty.util.AttributeKey; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.sql.SQLException; @@ -54,6 +56,8 @@ public class AuthListener { private static final MethodHandle DELEGATE_FIELD; //private static final MethodHandle LOGIN_FIELD; + public static final AttributeKey FORCE_OFFLINE_MODE = AttributeKey.valueOf("limboauth-force-offline-mode"); + private final LimboAuth plugin; private final Dao playerDao; private final FloodgateApiHolder floodgateApi; @@ -106,13 +110,11 @@ public void onPreLoginEvent(PreLoginEvent event) { } else { try { MinecraftConnection connection = this.getConnection(event.getConnection()); - if (!connection.isClosed()) { - this.plugin.saveForceOfflineMode(username); - - // As Velocity doesnt have any events for our usecase, just inject into netty - connection.getChannel().closeFuture().addListener(future -> { - this.plugin.unsetForcedPreviously(username); - }); + if (connection != null) { + Channel channel = connection.getChannel(); + if (channel != null) { + connection.getChannel().attr(FORCE_OFFLINE_MODE).set(true); + } } } catch (Throwable throwable) { throw new IllegalStateException("failed to track client disconnection", throwable);