From b94acdf719957e02fcd6cb358570ac5f68de9afc Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sat, 13 Jun 2026 15:19:53 +0200 Subject: [PATCH] fix(rcon): report missing offline credit targets GiveCredits treated offline UPDATE execution as success without checking whether any user row was changed. Nonexistent user ids could therefore return an offline success response while granting nothing. Use executeUpdate(), return HABBO_NOT_FOUND when no row is affected, and keep SQL errors from falling through to the offline success message. --- .../eu/habbo/messages/rcon/GiveCredits.java | 6 ++++- .../rcon/GiveCreditsContractTest.java | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 Emulator/src/test/java/com/eu/habbo/messages/rcon/GiveCreditsContractTest.java diff --git a/Emulator/src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java b/Emulator/src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java index a5b8fb07..d5f906ed 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java @@ -29,10 +29,14 @@ public class GiveCredits extends RCONMessage { try (Connection connection = Emulator.getDatabase().getDataSource().getConnection(); PreparedStatement statement = connection.prepareStatement("UPDATE users SET credits = credits + ? WHERE id = ? LIMIT 1")) { statement.setInt(1, object.credits); statement.setInt(2, object.user_id); - statement.execute(); + if (statement.executeUpdate() == 0) { + this.status = RCONMessage.HABBO_NOT_FOUND; + return; + } } catch (SQLException e) { this.status = RCONMessage.SYSTEM_ERROR; LOGGER.error("Caught SQL exception", e); + return; } this.message = "offline"; diff --git a/Emulator/src/test/java/com/eu/habbo/messages/rcon/GiveCreditsContractTest.java b/Emulator/src/test/java/com/eu/habbo/messages/rcon/GiveCreditsContractTest.java new file mode 100644 index 00000000..dda7da84 --- /dev/null +++ b/Emulator/src/test/java/com/eu/habbo/messages/rcon/GiveCreditsContractTest.java @@ -0,0 +1,24 @@ +package com.eu.habbo.messages.rcon; + +import org.junit.jupiter.api.Test; + +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class GiveCreditsContractTest { + private static String giveCreditsSource() throws Exception { + return Files.readString(Path.of("src/main/java/com/eu/habbo/messages/rcon/GiveCredits.java")); + } + + @Test + void offlineCreditGrantReportsMissingUsersWhenNoRowsChange() throws Exception { + String source = giveCreditsSource(); + + assertTrue(source.contains("executeUpdate()"), + "Offline RCON credit grants must inspect the affected row count"); + assertTrue(source.contains("HABBO_NOT_FOUND"), + "Offline RCON credit grants must report missing users when the UPDATE changes no rows"); + } +}