Skip to content

Commit 07586c9

Browse files
committed
Spigot: Fix resource pack bypass and possible memory leak
1 parent cd34d9f commit 07586c9

4 files changed

Lines changed: 39 additions & 36 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ dependencies {
1010

1111
allprojects {
1212
group = "com.convallyria.forcepack"
13-
version = "1.2.7"
13+
version = "1.2.8"
1414

1515
apply(plugin = "com.github.johnrengelman.shadow")
1616
apply(plugin = "java")

spigot/src/main/java/com/convallyria/forcepack/spigot/listener/ResourcePackListener.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,14 @@ public void onStatus(PlayerResourcePackStatusEvent event) {
3939
plugin.log(player.getName() + "'s exemptions: geyser, " + geyser + ". permission, " + canBypass + ".");
4040

4141
if (!canBypass && !geyser) {
42-
plugin.getWaiting().remove(player.getUniqueId());
43-
plugin.log(player.getName() + " sent status: " + event.getStatus());
44-
4542
final PlayerResourcePackStatusEvent.Status status = event.getStatus();
43+
plugin.log(player.getName() + " sent status: " + status);
44+
45+
// Only remove from waiting if they actually loaded the resource pack, rather than any status
46+
// Declined/failed is valid and should be allowed, server owner decides whether they get kicked
47+
if (status != PlayerResourcePackStatusEvent.Status.ACCEPTED) {
48+
plugin.getWaiting().remove(player.getUniqueId());
49+
}
4650

4751
for (String cmd : getConfig().getStringList("Server.Actions." + status.name() + ".Commands")) {
4852
ensureMainThread(() -> Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), cmd.replace("[player]", player.getName())));
@@ -89,7 +93,7 @@ private boolean tryValidateHacks(Player player, PlayerResourcePackStatusEvent.St
8993
ensureMainThread(() -> player.kickPlayer(Translations.DECLINED.get(player)));
9094
return true;
9195
}
92-
sentAccept.put(player.getUniqueId(), now);
96+
if (tryPrevent) sentAccept.put(player.getUniqueId(), now);
9397
} else if (status == PlayerResourcePackStatusEvent.Status.SUCCESSFULLY_LOADED) {
9498
if (tryPrevent && !sentAccept.containsKey(player.getUniqueId())) {
9599
plugin.log("Kicked player " + player.getName() + " because they are sending fake resource pack statuses (order not maintained).");

velocity/src/main/java/com/convallyria/forcepack/velocity/ForcePackVelocity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
@Plugin(
4444
id = "forcepack",
4545
name = "ForcePack",
46-
version = "1.2.7",
46+
version = "1.2.8",
4747
description = "Force players to use your server resource pack.",
4848
url = "https://www.convallyria.com",
4949
authors = {"SamB440"}

velocity/src/main/java/com/convallyria/forcepack/velocity/listener/ResourcePackListener.java

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -97,41 +97,40 @@ public void onPackStatus(PlayerResourcePackStatusEvent event) {
9797

9898
private boolean tryValidateHacks(Player player, PlayerResourcePackStatusEvent.Status status, VelocityConfig root, long now) {
9999
final boolean tryPrevent = plugin.getConfig().getBoolean("try-to-stop-fake-accept-hacks", true);
100-
if (tryPrevent) {
101-
if (status == PlayerResourcePackStatusEvent.Status.ACCEPTED) {
102-
if (sentAccept.containsKey(player.getUniqueId())) {
103-
plugin.log("Kicked player " + player.getUsername() + " because they are sending fake resource pack statuses (accepted sent twice).");
104-
final VelocityConfig actions = root.getConfig("actions").getConfig("DECLINED");
105-
final String text = actions.getString("message");
106-
if (text == null) return true;
107-
player.disconnect(plugin.getMiniMessage().deserialize(text));
108-
return true;
109-
}
110-
sentAccept.put(player.getUniqueId(), now);
111-
} else if (status == PlayerResourcePackStatusEvent.Status.SUCCESSFUL) {
112-
if (!sentAccept.containsKey(player.getUniqueId())) {
113-
plugin.log("Kicked player " + player.getUsername() + " because they are sending fake resource pack statuses (order not maintained).");
114-
final VelocityConfig actions = root.getConfig("actions").getConfig("FAILED_DOWNLOAD");
115-
final String text = actions.getString("message");
116-
if (text == null) return true;
117-
player.disconnect(plugin.getMiniMessage().deserialize(text));
118-
return true;
119-
}
120-
121-
long time = now - sentAccept.remove(player.getUniqueId());
122-
if (time <= 10) {
123-
plugin.log("Kicked player " + player.getUsername() + " because they are sending fake resource pack statuses (sent too fast).");
124-
final VelocityConfig actions = root.getConfig("actions").getConfig("FAILED_DOWNLOAD");
125-
final String text = actions.getString("message");
126-
if (text == null) return true;
127-
player.disconnect(plugin.getMiniMessage().deserialize(text));
128-
return true;
129-
}
100+
if (!tryPrevent) return false;
101+
102+
final VelocityConfig actionsRoot = root.getConfig("actions");
103+
if (status == PlayerResourcePackStatusEvent.Status.ACCEPTED) {
104+
if (sentAccept.containsKey(player.getUniqueId())) {
105+
plugin.log("Kicked player " + player.getUsername() + " because they are sending fake resource pack statuses (accepted sent twice).");
106+
final VelocityConfig actions = actionsRoot.getConfig("DECLINED");
107+
return disconnectAction(player, actions);
108+
}
109+
sentAccept.put(player.getUniqueId(), now);
110+
} else if (status == PlayerResourcePackStatusEvent.Status.SUCCESSFUL) {
111+
if (!sentAccept.containsKey(player.getUniqueId())) {
112+
plugin.log("Kicked player " + player.getUsername() + " because they are sending fake resource pack statuses (order not maintained).");
113+
final VelocityConfig actions = actionsRoot.getConfig("FAILED_DOWNLOAD");
114+
return disconnectAction(player, actions);
115+
}
116+
117+
long time = now - sentAccept.remove(player.getUniqueId());
118+
if (time <= 10) {
119+
plugin.log("Kicked player " + player.getUsername() + " because they are sending fake resource pack statuses (sent too fast).");
120+
final VelocityConfig actions = actionsRoot.getConfig("FAILED_DOWNLOAD");
121+
return disconnectAction(player, actions);
130122
}
131123
}
132124
return false;
133125
}
134126

127+
private boolean disconnectAction(Player player, VelocityConfig actions) {
128+
final String text = actions.getString("message");
129+
if (text == null) return true;
130+
player.disconnect(plugin.getMiniMessage().deserialize(text));
131+
return true;
132+
}
133+
135134
@Subscribe
136135
public void onQuit(DisconnectEvent event) {
137136
final Player player = event.getPlayer();

0 commit comments

Comments
 (0)