fix(wired): guard extra selector payloads

This commit is contained in:
simoleo89
2026-06-17 20:38:40 +02:00
parent 416d0bb088
commit 305d1ca097
44 changed files with 109 additions and 43 deletions
@@ -80,7 +80,7 @@ public class WiredExtraAnimationTime extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
this.durationMs = normalizeDuration((data != null) ? data.durationMs : WiredMovementsComposer.DEFAULT_DURATION);
return;
}
@@ -84,7 +84,7 @@ public class WiredExtraContextVariable extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.variableName = WiredVariableNameValidator.normalizeLegacy(data.variableName);
@@ -86,7 +86,7 @@ public class WiredExtraExecutionLimit extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.maxExecutions = normalizeExecutions(data.maxExecutions);
@@ -78,7 +78,7 @@ public class WiredExtraFilterFurni extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
this.amount = normalizeAmount((data != null) ? data.amount : 0);
return;
}
@@ -78,7 +78,7 @@ public class WiredExtraFilterUser extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
this.amount = normalizeAmount((data != null) ? data.amount : 0);
return;
}
@@ -89,7 +89,7 @@ public class WiredExtraFurniVariable extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.variableName = WiredVariableNameValidator.normalizeLegacy(data.variableName);
@@ -77,7 +77,7 @@ public class WiredExtraMoveCarryUsers extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.carryMode = this.normalizeCarryMode(data.carryMode);
@@ -97,7 +97,7 @@ public class WiredExtraMovePhysics extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.keepAltitude = data.keepAltitude;
@@ -128,7 +128,7 @@ public class WiredExtraOrEval extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.evaluationMode = normalizeEvaluationMode(data.evaluationMode);
@@ -0,0 +1,20 @@
package com.eu.habbo.habbohotel.items.interactions.wired.extra;
import com.eu.habbo.habbohotel.wired.core.WiredManager;
final class WiredExtraPayloadGuard {
private WiredExtraPayloadGuard() {
}
static <T> T fromJson(String wiredData, Class<T> type) {
if (wiredData == null || !wiredData.startsWith("{")) {
return null;
}
try {
return WiredManager.getGson().fromJson(wiredData, type);
} catch (RuntimeException e) {
return null;
}
}
}
@@ -92,7 +92,7 @@ public class WiredExtraRandom extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
this.pickAmount = normalizePickAmount((data != null) ? data.pickAmount : DEFAULT_PICK_AMOUNT);
this.skipExecutions = normalizeSkipExecutions((data != null) ? data.skipExecutions : DEFAULT_SKIP_EXECUTIONS);
return;
@@ -91,7 +91,7 @@ public class WiredExtraRoomVariable extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.variableName = WiredVariableNameValidator.normalizeLegacy(data.variableName);
@@ -110,7 +110,7 @@ public class WiredExtraTextInputVariable extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.variableToken = normalizeVariableToken((data.variableToken != null)
@@ -131,7 +131,7 @@ public class WiredExtraTextOutputFurniName extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.placeholderName = normalizePlaceholderName(data.placeholderName);
@@ -88,7 +88,7 @@ public class WiredExtraTextOutputUsername extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.placeholderName = normalizePlaceholderName(data.placeholderName);
@@ -181,7 +181,7 @@ public class WiredExtraTextOutputVariable extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.targetType = normalizeTargetType(data.targetType);
@@ -90,7 +90,7 @@ public class WiredExtraUserVariable extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.variableName = WiredVariableNameValidator.normalizeLegacy(data.variableName);
@@ -148,7 +148,7 @@ public class WiredExtraVariableEcho extends InteractionWiredExtra {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -488,7 +488,7 @@ public class WiredExtraVariableEcho extends InteractionWiredExtra {
return new ConfigData();
}
ConfigData config = WiredManager.getGson().fromJson(value, ConfigData.class);
ConfigData config = WiredExtraPayloadGuard.fromJson(value, ConfigData.class);
return (config != null) ? config : new ConfigData();
}
@@ -215,7 +215,7 @@ public abstract class WiredExtraVariableFilterBase extends InteractionWiredExtra
String wiredData = set.getString("wired_data");
if (wiredData == null || wiredData.isEmpty() || !wiredData.startsWith("{")) return;
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) return;
this.sortBy = normalizeSortBy(data.sortBy);
@@ -188,7 +188,7 @@ public class WiredExtraVariableLevelUpSystem extends InteractionWiredExtra {
try {
if (value.trim().startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(value, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(value, JsonData.class);
return (data != null) ? data : new JsonData();
}
} catch (Exception ignored) {
@@ -120,7 +120,7 @@ public class WiredExtraVariableReference extends InteractionWiredExtra {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -230,7 +230,7 @@ public class WiredExtraVariableReference extends InteractionWiredExtra {
return new ConfigData();
}
ConfigData config = WiredManager.getGson().fromJson(value, ConfigData.class);
ConfigData config = WiredExtraPayloadGuard.fromJson(value, ConfigData.class);
return (config != null) ? config : new ConfigData();
}
@@ -84,7 +84,7 @@ public class WiredExtraVariableTextConnector extends InteractionWiredExtra {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredExtraPayloadGuard.fromJson(wiredData, JsonData.class);
if (data != null) {
this.setMappingsText(data.mappingsText);
@@ -338,7 +338,7 @@ public final class WiredVariableReferenceSupport {
return null;
}
UserDefinitionData data = WiredManager.getGson().fromJson(wiredData, UserDefinitionData.class);
UserDefinitionData data = WiredExtraPayloadGuard.fromJson(wiredData, UserDefinitionData.class);
if (data == null) {
return null;
}
@@ -352,7 +352,7 @@ public final class WiredVariableReferenceSupport {
return null;
}
RoomDefinitionData data = WiredManager.getGson().fromJson(wiredData, RoomDefinitionData.class);
RoomDefinitionData data = WiredExtraPayloadGuard.fromJson(wiredData, RoomDefinitionData.class);
if (data == null) {
return null;
}
@@ -120,7 +120,7 @@ public class WiredEffectFurniAltitude extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -115,7 +115,7 @@ public class WiredEffectFurniArea extends InteractionWiredEffect {
String wiredData = set.getString("wired_data");
if (wiredData != null && wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
this.rootX = data.rootX;
this.rootY = data.rootY;
this.areaWidth = data.width;
@@ -170,7 +170,7 @@ public class WiredEffectFurniByType extends InteractionWiredEffect {
public void loadWiredData(ResultSet set, Room room) throws SQLException {
String wiredData = set.getString("wired_data");
if (wiredData != null && wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
this.sourceType = normalizeSourceType(data.sourceType);
this.matchState = data.matchState;
this.filterExisting = data.filterExisting;
@@ -329,7 +329,7 @@ public class WiredEffectFurniNeighborhood extends InteractionWiredEffect {
public void loadWiredData(ResultSet set, Room room) throws SQLException {
String wiredData = set.getString("wired_data");
if (wiredData != null && wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
this.sourceType = data.sourceType;
this.filterExisting = data.filterExisting;
this.invert = data.invert;
@@ -156,7 +156,7 @@ public class WiredEffectFurniOnFurni extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -110,7 +110,7 @@ public class WiredEffectFurniPicks extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -96,7 +96,7 @@ public class WiredEffectFurniSignal extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -101,7 +101,7 @@ public class WiredEffectUsersArea extends InteractionWiredEffect {
String wiredData = set.getString("wired_data");
if (wiredData != null && wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
this.rootX = data.rootX;
this.rootY = data.rootY;
this.areaWidth = data.width;
@@ -120,7 +120,7 @@ public class WiredEffectUsersByAction extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -110,7 +110,7 @@ public class WiredEffectUsersByName extends InteractionWiredEffect {
}
if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -95,7 +95,7 @@ public class WiredEffectUsersByType extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -109,7 +109,7 @@ public class WiredEffectUsersGroup extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -92,7 +92,7 @@ public class WiredEffectUsersHandItem extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -333,7 +333,7 @@ public class WiredEffectUsersNeighborhood extends InteractionWiredEffect {
public void loadWiredData(ResultSet set, Room room) throws SQLException {
String wiredData = set.getString("wired_data");
if (wiredData != null && wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
this.sourceType = data.sourceType;
this.filterExisting = data.filterExisting;
this.invert = data.invert;
@@ -142,7 +142,7 @@ public class WiredEffectUsersOnFurni extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -90,7 +90,7 @@ public class WiredEffectUsersSignal extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -95,7 +95,7 @@ public class WiredEffectUsersTeam extends InteractionWiredEffect {
return;
}
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) {
return;
}
@@ -222,7 +222,7 @@ public abstract class WiredEffectVariableSelectorBase extends InteractionWiredEf
String wiredData = set.getString("wired_data");
if (wiredData == null || wiredData.isEmpty() || !wiredData.startsWith("{")) return;
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
JsonData data = WiredSelectorPayloadGuard.fromJson(wiredData, JsonData.class);
if (data == null) return;
this.selectByValue = data.selectByValue;
@@ -0,0 +1,20 @@
package com.eu.habbo.habbohotel.items.interactions.wired.selector;
import com.eu.habbo.habbohotel.wired.core.WiredManager;
final class WiredSelectorPayloadGuard {
private WiredSelectorPayloadGuard() {
}
static <T> T fromJson(String wiredData, Class<T> type) {
if (wiredData == null || !wiredData.startsWith("{")) {
return null;
}
try {
return WiredManager.getGson().fromJson(wiredData, type);
} catch (RuntimeException e) {
return null;
}
}
}
@@ -0,0 +1,13 @@
package com.eu.habbo.habbohotel.items.interactions.wired.extra;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNull;
class WiredExtraPayloadGuardTest {
@Test
void malformedJsonReturnsNull() {
assertNull(WiredExtraPayloadGuard.fromJson("{broken", WiredExtraAnimationTime.JsonData.class));
assertNull(WiredExtraPayloadGuard.fromJson(null, WiredExtraAnimationTime.JsonData.class));
}
}
@@ -0,0 +1,13 @@
package com.eu.habbo.habbohotel.items.interactions.wired.selector;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNull;
class WiredSelectorPayloadGuardTest {
@Test
void malformedJsonReturnsNull() {
assertNull(WiredSelectorPayloadGuard.fromJson("{broken", WiredEffectFurniArea.JsonData.class));
assertNull(WiredSelectorPayloadGuard.fromJson(null, WiredEffectFurniArea.JsonData.class));
}
}