From f52e6a1a2fb61b694eec05b15726f098d88472d2 Mon Sep 17 00:00:00 2001 From: games647 Date: Sat, 19 Jun 2021 11:53:29 +0200 Subject: [PATCH] Allow unregistered players in not enforced config to use tab --- .../protocollib/InventoryPacketAdapter.java | 27 ++++--------------- .../protocollib/ProtocolLibService.java | 21 +++++++++++++-- .../protocollib/TabCompletePacketAdapter.java | 11 ++++---- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/main/java/fr/xephi/authme/listener/protocollib/InventoryPacketAdapter.java b/src/main/java/fr/xephi/authme/listener/protocollib/InventoryPacketAdapter.java index 7709bb747..ec256d9b8 100644 --- a/src/main/java/fr/xephi/authme/listener/protocollib/InventoryPacketAdapter.java +++ b/src/main/java/fr/xephi/authme/listener/protocollib/InventoryPacketAdapter.java @@ -54,14 +54,14 @@ class InventoryPacketAdapter extends PacketAdapter { private final PlayerCache playerCache; private final DataSource dataSource; - private final boolean isRegistrationForced; + private final ProtocolLibService protocolLibService; InventoryPacketAdapter(AuthMe plugin, PlayerCache playerCache, DataSource dataSource, - boolean isRegistrationForced) { + ProtocolLibService protocolLibService) { super(plugin, PacketType.Play.Server.SET_SLOT, PacketType.Play.Server.WINDOW_ITEMS); this.playerCache = playerCache; this.dataSource = dataSource; - this.isRegistrationForced = isRegistrationForced; + this.protocolLibService = protocolLibService; } @Override @@ -70,7 +70,7 @@ class InventoryPacketAdapter extends PacketAdapter { PacketContainer packet = packetEvent.getPacket(); int windowId = packet.getIntegers().read(0); - if (windowId == PLAYER_INVENTORY && shouldHideInventory(player.getName())) { + if (windowId == PLAYER_INVENTORY && protocolLibService.shouldRestrictPlayer(player.getName())) { packetEvent.setCancelled(true); } } @@ -84,27 +84,10 @@ class InventoryPacketAdapter extends PacketAdapter { ProtocolLibrary.getProtocolManager().addPacketListener(this); bukkitService.getOnlinePlayers().stream() - .filter(player -> shouldHideInventory(player.getName())) + .filter(player -> protocolLibService.shouldRestrictPlayer(player.getName())) .forEach(this::sendBlankInventoryPacket); } - private boolean shouldHideInventory(String playerName) { - if (playerCache.isAuthenticated(playerName)) { - // fully logged in - no need to protect it - return false; - } - - if (dataSource.isCached()) { - // load from cache or only request once - return dataSource.isAuthAvailable(playerName); - } - - // data source is not cached - this means queries would run blocking - // If registration is enforced: **assume** player is registered to prevent any information leak - // If not, players could play even without a registration, so there is no need for protection - return isRegistrationForced; - } - public void unregister() { ProtocolLibrary.getProtocolManager().removePacketListener(this); } diff --git a/src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java b/src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java index 19c1b26aa..c1afc54c6 100644 --- a/src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java +++ b/src/main/java/fr/xephi/authme/listener/protocollib/ProtocolLibService.java @@ -68,7 +68,7 @@ public class ProtocolLibService implements SettingsDependent { if (protectInvBeforeLogin) { if (inventoryPacketAdapter == null) { // register the packet listener and start hiding it for all already online players (reload) - inventoryPacketAdapter = new InventoryPacketAdapter(plugin, playerCache, dataSource, isRegistrationForced); + inventoryPacketAdapter = new InventoryPacketAdapter(plugin, playerCache, dataSource, this); inventoryPacketAdapter.register(bukkitService); } } else if (inventoryPacketAdapter != null) { @@ -78,7 +78,7 @@ public class ProtocolLibService implements SettingsDependent { if (denyTabCompleteBeforeLogin) { if (tabCompletePacketAdapter == null) { - tabCompletePacketAdapter = new TabCompletePacketAdapter(plugin, playerCache); + tabCompletePacketAdapter = new TabCompletePacketAdapter(plugin, this); tabCompletePacketAdapter.register(); } } else if (tabCompletePacketAdapter != null) { @@ -116,6 +116,23 @@ public class ProtocolLibService implements SettingsDependent { } } + protected boolean shouldRestrictPlayer(String playerName) { + if (playerCache.isAuthenticated(playerName)) { + // fully logged in - no need to protect it + return false; + } + + if (dataSource.isCached()) { + // load from cache or only request once + return dataSource.isAuthAvailable(playerName); + } + + // data source is not cached - this means queries would run blocking + // If registration is enforced: **assume** player is registered to prevent any information leak + // If not, players could play even without a registration, so there is no need for protection + return isRegistrationForced; + } + @Override public void reload(Settings settings) { boolean oldProtectInventory = this.protectInvBeforeLogin; diff --git a/src/main/java/fr/xephi/authme/listener/protocollib/TabCompletePacketAdapter.java b/src/main/java/fr/xephi/authme/listener/protocollib/TabCompletePacketAdapter.java index 3f0bb3161..f36d06b9c 100644 --- a/src/main/java/fr/xephi/authme/listener/protocollib/TabCompletePacketAdapter.java +++ b/src/main/java/fr/xephi/authme/listener/protocollib/TabCompletePacketAdapter.java @@ -8,24 +8,25 @@ import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.reflect.FieldAccessException; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; -import fr.xephi.authme.data.auth.PlayerCache; import fr.xephi.authme.output.ConsoleLoggerFactory; class TabCompletePacketAdapter extends PacketAdapter { private final ConsoleLogger logger = ConsoleLoggerFactory.get(TabCompletePacketAdapter.class); - private final PlayerCache playerCache; - TabCompletePacketAdapter(AuthMe plugin, PlayerCache playerCache) { + private final ProtocolLibService protocolLibService; + + TabCompletePacketAdapter(AuthMe plugin, ProtocolLibService protocolLibService) { super(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.TAB_COMPLETE); - this.playerCache = playerCache; + this.protocolLibService = protocolLibService; } @Override public void onPacketReceiving(PacketEvent event) { if (event.getPacketType() == PacketType.Play.Client.TAB_COMPLETE) { try { - if (!playerCache.isAuthenticated(event.getPlayer().getName())) { + String playerName = event.getPlayer().getName(); + if (protocolLibService.shouldRestrictPlayer(playerName)) { event.setCancelled(true); } } catch (FieldAccessException e) {