diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionDateRangeActive.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionDateRangeActive.java index 0b92d4e6..80c5f75f 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionDateRangeActive.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredConditionDateRangeActive.java @@ -53,8 +53,7 @@ public class WiredConditionDateRangeActive extends InteractionWiredCondition { @Override public boolean saveData(WiredSettings settings) { if(settings.getIntParams().length < 2) return false; - this.startDate = settings.getIntParams()[0]; - this.endDate = settings.getIntParams()[1]; + this.applyRange(settings.getIntParams()[0], settings.getIntParams()[1]); return true; } @@ -81,19 +80,26 @@ public class WiredConditionDateRangeActive extends InteractionWiredCondition { @Override public void loadWiredData(ResultSet set, Room room) throws SQLException { String wiredData = set.getString("wired_data"); + if (wiredData == null || wiredData.isEmpty()) { + this.applyRange(0, 0); + return; + } if (wiredData.startsWith("{")) { JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class); - this.startDate = data.startDate; - this.endDate = data.endDate; + if (data == null) { + this.applyRange(0, 0); + return; + } + this.applyRange(data.startDate, data.endDate); } else { String[] data = wiredData.split("\t"); if (data.length == 2) { try { - this.startDate = Integer.parseInt(data[0]); - this.endDate = Integer.parseInt(data[1]); + this.applyRange(Integer.parseInt(data[0]), Integer.parseInt(data[1])); } catch (Exception e) { + this.applyRange(0, 0); } } } @@ -105,6 +111,12 @@ public class WiredConditionDateRangeActive extends InteractionWiredCondition { this.endDate = 0; } + private void applyRange(int startDate, int endDate) { + int[] range = WiredDateRangeInputGuard.normalizeRange(startDate, endDate); + this.startDate = range[0]; + this.endDate = range[1]; + } + static class JsonData { int startDate; int endDate; diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredDateRangeInputGuard.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredDateRangeInputGuard.java new file mode 100644 index 00000000..3661bd57 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredDateRangeInputGuard.java @@ -0,0 +1,21 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +public final class WiredDateRangeInputGuard { + private WiredDateRangeInputGuard() { + } + + public static int[] normalizeRange(int startDate, int endDate) { + int start = normalizeTimestamp(startDate); + int end = normalizeTimestamp(endDate); + + if (start > end) { + return new int[]{0, 0}; + } + + return new int[]{start, end}; + } + + public static int normalizeTimestamp(int value) { + return Math.max(0, value); + } +} diff --git a/Emulator/src/test/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredDateRangeInputGuardTest.java b/Emulator/src/test/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredDateRangeInputGuardTest.java new file mode 100644 index 00000000..c31bb5d3 --- /dev/null +++ b/Emulator/src/test/java/com/eu/habbo/habbohotel/items/interactions/wired/conditions/WiredDateRangeInputGuardTest.java @@ -0,0 +1,26 @@ +package com.eu.habbo.habbohotel.items.interactions.wired.conditions; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class WiredDateRangeInputGuardTest { + + @Test + void timestampsAreNonNegative() { + assertEquals(0, WiredDateRangeInputGuard.normalizeTimestamp(-1)); + assertEquals(42, WiredDateRangeInputGuard.normalizeTimestamp(42)); + } + + @Test + void validRangesArePreserved() { + assertArrayEquals(new int[]{100, 200}, WiredDateRangeInputGuard.normalizeRange(100, 200)); + } + + @Test + void negativeAndInvertedRangesBecomeInactive() { + assertArrayEquals(new int[]{0, 0}, WiredDateRangeInputGuard.normalizeRange(-10, -1)); + assertArrayEquals(new int[]{0, 0}, WiredDateRangeInputGuard.normalizeRange(200, 100)); + } +}