Skip to content

Commit b80a51f

Browse files
committed
Moved Floodgate player check away from individual channels
1 parent 57fe178 commit b80a51f

12 files changed

Lines changed: 77 additions & 53 deletions

File tree

bungee/src/main/java/org/geysermc/floodgate/module/BungeePlatformModule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,9 @@ public ListenerRegistration<Listener> listenerRegistration() {
111111
@Singleton
112112
public PluginMessageUtils pluginMessageUtils(
113113
PluginMessageManager manager,
114+
FloodgateApi api,
114115
FloodgateLogger logger) {
115-
return new BungeePluginMessageUtils(manager, logger);
116+
return new BungeePluginMessageUtils(manager, api, logger);
116117
}
117118

118119
@Provides

bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeePluginMessageUtils.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,17 @@
3636
import net.md_5.bungee.api.plugin.Listener;
3737
import net.md_5.bungee.event.EventHandler;
3838
import net.md_5.bungee.event.EventPriority;
39+
import org.geysermc.floodgate.api.FloodgateApi;
3940
import org.geysermc.floodgate.api.logger.FloodgateLogger;
41+
import org.geysermc.floodgate.api.player.FloodgatePlayer;
4042
import org.geysermc.floodgate.platform.pluginmessage.PluginMessageUtils;
4143
import org.geysermc.floodgate.pluginmessage.PluginMessageChannel.Identity;
4244
import org.geysermc.floodgate.pluginmessage.PluginMessageChannel.Result;
4345

4446
@RequiredArgsConstructor
4547
public final class BungeePluginMessageUtils extends PluginMessageUtils implements Listener {
4648
private final PluginMessageManager pluginMessageManager;
49+
private final FloodgateApi api;
4750
private final FloodgateLogger logger;
4851

4952
@EventHandler(priority = EventPriority.LOW)
@@ -53,23 +56,26 @@ public void onPluginMessage(PluginMessageEvent event) {
5356
return;
5457
}
5558

56-
UUID sourceUuid = null;
57-
String sourceUsername = null;
59+
FloodgatePlayer fSource = null;
5860
Identity sourceIdentity = Identity.UNKNOWN;
5961

6062
Connection source = event.getSender();
6163
if (source instanceof ProxiedPlayer) {
6264
ProxiedPlayer player = (ProxiedPlayer) source;
63-
sourceUuid = player.getUniqueId();
64-
sourceUsername = player.getName();
65+
fSource = api.getPlayer(player.getUniqueId());
6566
sourceIdentity = Identity.PLAYER;
6667

68+
if (fSource == null) {
69+
logKick(source, "Only Floodgate players can send floodgate messages!");
70+
return;
71+
}
72+
6773
} else if (source instanceof ServerConnection) {
6874
sourceIdentity = Identity.SERVER;
6975
}
7076

7177
Result result = channel.handleProxyCall(
72-
event.getData(), sourceUuid, sourceUsername, sourceIdentity
78+
event.getData(), fSource, sourceIdentity
7379
);
7480

7581
event.setCancelled(!result.isAllowed());

core/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ dependencies {
1414
api("com.google.inject", "guice", Versions.guiceVersion)
1515
api("com.nukkitx.fastutil", "fastutil-short-object-maps", Versions.fastutilVersion)
1616
api("com.nukkitx.fastutil", "fastutil-int-object-maps", Versions.fastutilVersion)
17-
api("com.nukkitx.fastutil", "fastutil-object-object-maps", Versions.fastutilVersion)
1817
api("org.java-websocket", "Java-WebSocket", Versions.javaWebsocketVersion)
1918
api("org.incendo", "cloud-core", Versions.cloudCore)
2019
api("org.bstats", "bstats-base", Versions.bstatsVersion)

core/src/main/java/org/geysermc/floodgate/pluginmessage/PluginMessageChannel.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,22 @@
2525

2626
package org.geysermc.floodgate.pluginmessage;
2727

28-
import java.util.UUID;
2928
import lombok.AccessLevel;
3029
import lombok.Getter;
3130
import lombok.RequiredArgsConstructor;
31+
import org.geysermc.floodgate.api.player.FloodgatePlayer;
3232

3333
public interface PluginMessageChannel {
3434

3535
String getIdentifier();
3636

3737
Result handleProxyCall(
3838
byte[] data,
39-
UUID sourceUuid,
40-
String sourceUsername,
39+
FloodgatePlayer source,
4140
Identity sourceIdentity
4241
);
4342

44-
Result handleServerCall(byte[] data, UUID playerUuid, String playerUsername);
43+
Result handleServerCall(byte[] data, FloodgatePlayer source);
4544

4645
@Getter
4746
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)

core/src/main/java/org/geysermc/floodgate/pluginmessage/channel/FormChannel.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,17 @@
3030
import it.unimi.dsi.fastutil.shorts.Short2ObjectMap;
3131
import it.unimi.dsi.fastutil.shorts.Short2ObjectMaps;
3232
import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap;
33-
import java.util.ArrayList;
34-
import java.util.Collections;
35-
import java.util.HashSet;
3633
import java.util.Map;
3734
import java.util.Set;
3835
import java.util.UUID;
3936
import java.util.concurrent.ConcurrentHashMap;
37+
import java.util.concurrent.atomic.AtomicBoolean;
4038
import java.util.concurrent.atomic.AtomicInteger;
4139
import org.geysermc.cumulus.form.Form;
4240
import org.geysermc.cumulus.form.impl.FormDefinition;
4341
import org.geysermc.cumulus.form.impl.FormDefinitions;
4442
import org.geysermc.floodgate.api.logger.FloodgateLogger;
43+
import org.geysermc.floodgate.api.player.FloodgatePlayer;
4544
import org.geysermc.floodgate.config.FloodgateConfig;
4645
import org.geysermc.floodgate.platform.pluginmessage.PluginMessageUtils;
4746
import org.geysermc.floodgate.pluginmessage.PluginMessageChannel;
@@ -65,8 +64,7 @@ public String getIdentifier() {
6564
@Override
6665
public Result handleProxyCall(
6766
byte[] data,
68-
UUID sourceUuid,
69-
String sourceUsername,
67+
FloodgatePlayer source,
7068
Identity sourceIdentity
7169
) {
7270
if (sourceIdentity == Identity.SERVER) {
@@ -86,17 +84,19 @@ public Result handleProxyCall(
8684
return Result.forward();
8785
}
8886

89-
if (!callResponseConsumer(sourceUuid, data)) {
87+
if (!callResponseConsumer(source, data)) {
9088
logger.error("Couldn't find stored form with id {} for player {}",
91-
formId, sourceUsername);
89+
formId, source.getCorrectUsername());
9290
}
9391
}
9492
return Result.handled();
9593
}
9694

9795
@Override
98-
public Result handleServerCall(byte[] data, UUID playerUuid, String playerUsername) {
99-
callResponseConsumer(playerUuid, data);
96+
public Result handleServerCall(byte[] data, FloodgatePlayer source) {
97+
if (!callResponseConsumer(source, data)) {
98+
logger.error("Couldn't find stored form for player {}", source.getCorrectUsername());
99+
}
100100
return Result.handled();
101101
}
102102

@@ -125,7 +125,7 @@ public boolean sendForm(UUID player, Form form) {
125125
public byte[] createFormData(UUID uuid, Form form) {
126126
short formId = getNextFormId();
127127
if (config.isProxy()) {
128-
formId |= 0x8000;
128+
formId |= (short) 0x8000;
129129
}
130130
storedForms.put(formId, form);
131131
playerToFormMap.computeIfAbsent(uuid, k -> ConcurrentHashMap.newKeySet()).add(formId);
@@ -145,13 +145,18 @@ public byte[] createFormData(UUID uuid, Form form) {
145145
return data;
146146
}
147147

148-
protected boolean callResponseConsumer(UUID player, byte[] data) {
148+
protected boolean callResponseConsumer(FloodgatePlayer player, byte[] data) {
149149
short formId = getFormId(data);
150-
playerToFormMap.computeIfPresent(player, (k, list) -> {
151-
list.remove(Short.valueOf(formId)); // remove by value, not index
150+
AtomicBoolean found = new AtomicBoolean(false);
151+
playerToFormMap.computeIfPresent(player.getCorrectUniqueId(), (k, list) -> {
152+
found.set(list.remove(formId)); // remove by value, not index
152153
return list.isEmpty() ? null : list;
153154
});
154155

156+
if (!found.get()) {
157+
return false;
158+
}
159+
155160
Form storedForm = storedForms.remove(formId);
156161
if (storedForm != null) {
157162
String responseData = new String(data, 2, data.length - 2, Charsets.UTF_8);

core/src/main/java/org/geysermc/floodgate/pluginmessage/channel/PacketChannel.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.inject.Inject;
2929
import java.util.UUID;
3030
import org.geysermc.floodgate.api.UnsafeFloodgateApi;
31+
import org.geysermc.floodgate.api.player.FloodgatePlayer;
3132
import org.geysermc.floodgate.platform.pluginmessage.PluginMessageUtils;
3233
import org.geysermc.floodgate.pluginmessage.PluginMessageChannel;
3334

@@ -42,8 +43,7 @@ public String getIdentifier() {
4243
@Override
4344
public Result handleProxyCall(
4445
byte[] data,
45-
UUID sourceUuid,
46-
String sourceUsername,
46+
FloodgatePlayer source,
4747
Identity sourceIdentity
4848
) {
4949
if (sourceIdentity == Identity.SERVER) {
@@ -52,14 +52,14 @@ public Result handleProxyCall(
5252
}
5353

5454
if (sourceIdentity == Identity.PLAYER) {
55-
return handleServerCall(data, sourceUuid, sourceUsername);
55+
return handleServerCall(data, source);
5656
}
5757

5858
return Result.handled();
5959
}
6060

6161
@Override
62-
public Result handleServerCall(byte[] data, UUID playerUuid, String playerUsername) {
62+
public Result handleServerCall(byte[] data, FloodgatePlayer source) {
6363
return Result.kick("Cannot send packets from Geyser/Floodgate to Floodgate");
6464
}
6565

core/src/main/java/org/geysermc/floodgate/pluginmessage/channel/SkinChannel.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
import com.google.inject.Inject;
2929
import java.nio.charset.StandardCharsets;
30-
import java.util.UUID;
3130
import org.geysermc.floodgate.api.FloodgateApi;
3231
import org.geysermc.floodgate.api.player.FloodgatePlayer;
3332
import org.geysermc.floodgate.api.player.PropertyKey;
@@ -50,13 +49,12 @@ public String getIdentifier() {
5049
@Override
5150
public Result handleProxyCall(
5251
byte[] data,
53-
UUID sourceUuid,
54-
String sourceUsername,
52+
FloodgatePlayer source,
5553
Identity sourceIdentity
5654
) {
5755
// we can only get skins from Geyser (client)
5856
if (sourceIdentity == Identity.PLAYER) {
59-
Result result = handleServerCall(data, sourceUuid, sourceUsername);
57+
Result result = handleServerCall(data, source);
6058
// aka translate 'handled' into 'forward' when send-floodgate-data is enabled
6159
if (!result.isAllowed() && result.getReason() == null) {
6260
if (config.isProxy() && ((ProxyFloodgateConfig) config).isSendFloodgateData()) {
@@ -74,12 +72,7 @@ public Result handleProxyCall(
7472
}
7573

7674
@Override
77-
public Result handleServerCall(byte[] data, UUID playerUuid, String playerUsername) {
78-
FloodgatePlayer floodgatePlayer = api.getPlayer(playerUuid);
79-
if (floodgatePlayer == null) {
80-
return Result.kick("Player sent skins data for a non-Floodgate player");
81-
}
82-
75+
public Result handleServerCall(byte[] data, FloodgatePlayer floodgatePlayer) {
8376
String message = new String(data, StandardCharsets.UTF_8);
8477

8578
String[] split = message.split("\0");

core/src/main/java/org/geysermc/floodgate/pluginmessage/channel/TransferChannel.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.inject.Inject;
2929
import java.nio.charset.StandardCharsets;
3030
import java.util.UUID;
31+
import org.geysermc.floodgate.api.player.FloodgatePlayer;
3132
import org.geysermc.floodgate.platform.pluginmessage.PluginMessageUtils;
3233
import org.geysermc.floodgate.pluginmessage.PluginMessageChannel;
3334

@@ -42,8 +43,7 @@ public String getIdentifier() {
4243
@Override
4344
public Result handleProxyCall(
4445
byte[] data,
45-
UUID sourceUuid,
46-
String sourceUsername,
46+
FloodgatePlayer source,
4747
Identity sourceIdentity
4848
) {
4949
if (sourceIdentity == Identity.SERVER) {
@@ -52,14 +52,14 @@ public Result handleProxyCall(
5252
}
5353

5454
if (sourceIdentity == Identity.PLAYER) {
55-
handleServerCall(data, sourceUuid, sourceUsername);
55+
handleServerCall(data, source);
5656
}
5757

5858
return Result.handled();
5959
}
6060

6161
@Override
62-
public Result handleServerCall(byte[] data, UUID playerUuid, String playerUsername) {
62+
public Result handleServerCall(byte[] data, FloodgatePlayer source) {
6363
return Result.kick("I'm sorry, I'm unable to transfer a server :(");
6464
}
6565

spigot/src/main/java/org/geysermc/floodgate/module/SpigotPlatformModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ public PluginMessageUtils pluginMessageUtils() {
135135

136136
@Provides
137137
@Singleton
138-
public PluginMessageRegistration pluginMessageRegister() {
139-
return new SpigotPluginMessageRegistration(plugin);
138+
public PluginMessageRegistration pluginMessageRegister(FloodgateApi api) {
139+
return new SpigotPluginMessageRegistration(plugin, api);
140140
}
141141

142142
@Provides

spigot/src/main/java/org/geysermc/floodgate/pluginmessage/SpigotPluginMessageRegistration.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@
2828
import lombok.RequiredArgsConstructor;
2929
import org.bukkit.plugin.java.JavaPlugin;
3030
import org.bukkit.plugin.messaging.Messenger;
31+
import org.geysermc.floodgate.api.FloodgateApi;
32+
import org.geysermc.floodgate.api.player.FloodgatePlayer;
33+
import org.geysermc.floodgate.pluginmessage.PluginMessageChannel.Result;
3134

3235
@RequiredArgsConstructor
3336
public class SpigotPluginMessageRegistration implements PluginMessageRegistration {
3437
private final JavaPlugin plugin;
38+
private final FloodgateApi api;
3539

3640
@Override
3741
public void register(PluginMessageChannel channel) {
@@ -40,8 +44,18 @@ public void register(PluginMessageChannel channel) {
4044
messenger.registerIncomingPluginChannel(
4145
plugin,
4246
channel.getIdentifier(),
43-
(channel1, player, message) ->
44-
channel.handleServerCall(message, player.getUniqueId(), player.getName()));
47+
(channel1, player, message) -> {
48+
FloodgatePlayer fPlayer = api.getPlayer(player.getUniqueId());
49+
if (fPlayer == null) {
50+
player.kickPlayer("Only Floodgate players can send floodgate messages!");
51+
return;
52+
}
53+
54+
Result result = channel.handleServerCall(message, fPlayer);
55+
if (!result.isAllowed() && result.getReason() != null) {
56+
player.kickPlayer(result.getReason());
57+
}
58+
});
4559

4660
messenger.registerOutgoingPluginChannel(plugin, channel.getIdentifier());
4761
}

0 commit comments

Comments
 (0)