Merge pull request #228 from simoleo89/fix/modtool-inputs

fix(modtool): bound staff supplied targets
This commit is contained in:
DuckieTM
2026-06-17 10:00:31 +02:00
committed by GitHub
12 changed files with 50 additions and 8 deletions
@@ -14,7 +14,7 @@ public class ModToolAlertEvent extends MessageHandler {
int userId = this.packet.readInt(); int userId = this.packet.readInt();
String message = ModToolInputGuard.normalize(this.packet.readString()); String message = ModToolInputGuard.normalize(this.packet.readString());
if (!ModToolInputGuard.isSafeMessage(message)) { if (!ModToolTicketGuard.isPositiveId(userId) || !ModToolInputGuard.isSafeMessage(message)) {
return; return;
} }
@@ -10,7 +10,13 @@ public class ModToolChangeRoomSettingsEvent extends MessageHandler {
@Override @Override
public void handle() throws Exception { public void handle() throws Exception {
if (this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) { if (this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) {
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(this.packet.readInt()); int roomId = this.packet.readInt();
if (!ModToolTicketGuard.isPositiveId(roomId)) {
return;
}
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId);
if (room != null) { if (room != null) {
final boolean lockDoor = this.packet.readInt() == 1; final boolean lockDoor = this.packet.readInt() == 1;
@@ -19,6 +19,10 @@ public class ModToolIssueDefaultSanctionEvent extends MessageHandler {
this.packet.readInt(); this.packet.readInt();
int category = this.packet.readInt(); int category = this.packet.readInt();
if (!ModToolTicketGuard.isPositiveId(issueId) || !ModToolTicketGuard.isPositiveId(category)) {
return;
}
ModToolIssue issue = Emulator.getGameEnvironment().getModToolManager().getTicket(issueId); ModToolIssue issue = Emulator.getGameEnvironment().getModToolManager().getTicket(issueId);
if (issue == null) { if (issue == null) {
@@ -21,7 +21,7 @@ public class ModToolKickEvent extends MessageHandler {
int userId = this.packet.readInt(); int userId = this.packet.readInt();
String message = ModToolInputGuard.normalize(this.packet.readString()); String message = ModToolInputGuard.normalize(this.packet.readString());
if (!ModToolInputGuard.isSafeMessage(message)) { if (!ModToolTicketGuard.isPositiveId(userId) || !ModToolInputGuard.isSafeMessage(message)) {
return; return;
} }
@@ -13,6 +13,10 @@ public class ModToolRequestRoomInfoEvent extends MessageHandler {
if (this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) { if (this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) {
int roomId = this.packet.readInt(); int roomId = this.packet.readInt();
if (!ModToolTicketGuard.isPositiveId(roomId)) {
return;
}
Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId); Room room = Emulator.getGameEnvironment().getRoomManager().getRoom(roomId);
if (room != null) { if (room != null) {
@@ -12,6 +12,10 @@ public class ModToolRequestRoomVisitsEvent extends MessageHandler {
if (this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) { if (this.client.getHabbo().hasPermission(Permission.ACC_SUPPORTTOOL)) {
int userId = this.packet.readInt(); int userId = this.packet.readInt();
if (!ModToolTicketGuard.isPositiveId(userId)) {
return;
}
HabboInfo habboInfo = Emulator.getGameEnvironment().getHabboManager().getHabboInfo(userId); HabboInfo habboInfo = Emulator.getGameEnvironment().getHabboManager().getHabboInfo(userId);
if (habboInfo != null) { if (habboInfo != null) {
@@ -24,7 +24,7 @@ public class ModToolSanctionAlertEvent extends MessageHandler {
String message = ModToolInputGuard.normalize(this.packet.readString()); String message = ModToolInputGuard.normalize(this.packet.readString());
int cfhTopic = this.packet.readInt(); int cfhTopic = this.packet.readInt();
if (!ModToolInputGuard.isSafeMessage(message)) { if (!ModToolTicketGuard.isPositiveId(userId) || !ModToolTicketGuard.isPositiveId(cfhTopic) || !ModToolInputGuard.isSafeMessage(message)) {
return; return;
} }
@@ -37,7 +37,7 @@ public class ModToolSanctionBanEvent extends MessageHandler {
int duration = 0; int duration = 0;
if (!ModToolInputGuard.isSafeMessage(message)) { if (!ModToolTicketGuard.isPositiveId(userId) || !ModToolTicketGuard.isPositiveId(cfhTopic) || !ModToolInputGuard.isSafeMessage(message)) {
return; return;
} }
@@ -26,7 +26,7 @@ public class ModToolSanctionMuteEvent extends MessageHandler {
String message = ModToolInputGuard.normalize(this.packet.readString()); String message = ModToolInputGuard.normalize(this.packet.readString());
int cfhTopic = this.packet.readInt(); int cfhTopic = this.packet.readInt();
if (!ModToolInputGuard.isSafeMessage(message)) { if (!ModToolTicketGuard.isPositiveId(userId) || !ModToolTicketGuard.isPositiveId(cfhTopic) || !ModToolInputGuard.isSafeMessage(message)) {
return; return;
} }
@@ -25,7 +25,7 @@ public class ModToolSanctionTradeLockEvent extends MessageHandler {
int duration = this.packet.readInt(); int duration = this.packet.readInt();
int cfhTopic = this.packet.readInt(); int cfhTopic = this.packet.readInt();
if (!ModToolInputGuard.isSafeMessage(message)) { if (!ModToolTicketGuard.isPositiveId(userId) || !ModToolTicketGuard.isPositiveId(cfhTopic) || !ModToolInputGuard.isSafeMessage(message)) {
return; return;
} }
@@ -19,7 +19,7 @@ public class ModToolWarnEvent extends MessageHandler {
int userId = this.packet.readInt(); int userId = this.packet.readInt();
String message = ModToolInputGuard.normalize(this.packet.readString()); String message = ModToolInputGuard.normalize(this.packet.readString());
if (!ModToolInputGuard.isSafeMessage(message)) { if (!ModToolTicketGuard.isPositiveId(userId) || !ModToolInputGuard.isSafeMessage(message)) {
return; return;
} }
@@ -109,4 +109,28 @@ class ModToolPermissionContractTest {
handler + " must reject empty or oversized staff-supplied text"); handler + " must reject empty or oversized staff-supplied text");
} }
} }
@Test
void staffSuppliedModToolTargetsArePositiveBeforeLookupOrMutation() throws Exception {
Path base = Path.of("src/main/java/com/eu/habbo/messages/incoming/modtool");
for (String handler : List.of(
"ModToolAlertEvent.java",
"ModToolWarnEvent.java",
"ModToolKickEvent.java",
"ModToolChangeRoomSettingsEvent.java",
"ModToolRequestRoomInfoEvent.java",
"ModToolRequestRoomVisitsEvent.java",
"ModToolIssueDefaultSanctionEvent.java",
"ModToolSanctionAlertEvent.java",
"ModToolSanctionBanEvent.java",
"ModToolSanctionMuteEvent.java",
"ModToolSanctionTradeLockEvent.java"
)) {
String source = Files.readString(base.resolve(handler));
assertTrue(source.contains("ModToolTicketGuard.isPositiveId"),
handler + " must reject zero or negative client-provided ids before manager/database lookups");
}
}
} }