fix(wired): bound date range inputs

This commit is contained in:
simoleo89
2026-06-17 18:40:48 +02:00
parent 416d0bb088
commit 5dfa8df5f4
3 changed files with 65 additions and 6 deletions
@@ -53,8 +53,7 @@ public class WiredConditionDateRangeActive extends InteractionWiredCondition {
@Override @Override
public boolean saveData(WiredSettings settings) { public boolean saveData(WiredSettings settings) {
if(settings.getIntParams().length < 2) return false; if(settings.getIntParams().length < 2) return false;
this.startDate = settings.getIntParams()[0]; this.applyRange(settings.getIntParams()[0], settings.getIntParams()[1]);
this.endDate = settings.getIntParams()[1];
return true; return true;
} }
@@ -81,19 +80,26 @@ public class WiredConditionDateRangeActive extends InteractionWiredCondition {
@Override @Override
public void loadWiredData(ResultSet set, Room room) throws SQLException { public void loadWiredData(ResultSet set, Room room) throws SQLException {
String wiredData = set.getString("wired_data"); String wiredData = set.getString("wired_data");
if (wiredData == null || wiredData.isEmpty()) {
this.applyRange(0, 0);
return;
}
if (wiredData.startsWith("{")) { if (wiredData.startsWith("{")) {
JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class); JsonData data = WiredManager.getGson().fromJson(wiredData, JsonData.class);
this.startDate = data.startDate; if (data == null) {
this.endDate = data.endDate; this.applyRange(0, 0);
return;
}
this.applyRange(data.startDate, data.endDate);
} else { } else {
String[] data = wiredData.split("\t"); String[] data = wiredData.split("\t");
if (data.length == 2) { if (data.length == 2) {
try { try {
this.startDate = Integer.parseInt(data[0]); this.applyRange(Integer.parseInt(data[0]), Integer.parseInt(data[1]));
this.endDate = Integer.parseInt(data[1]);
} catch (Exception e) { } catch (Exception e) {
this.applyRange(0, 0);
} }
} }
} }
@@ -105,6 +111,12 @@ public class WiredConditionDateRangeActive extends InteractionWiredCondition {
this.endDate = 0; 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 { static class JsonData {
int startDate; int startDate;
int endDate; int endDate;
@@ -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);
}
}
@@ -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));
}
}