You've already forked Arcturus-Morningstar-Extended
mirror of
https://github.com/duckietm/Arcturus-Morningstar-Extended.git
synced 2026-06-19 15:06:19 +00:00
Merge pull request #262 from simoleo89/fix/room-settings-inputs
fix(room-settings): bound inputs
This commit is contained in:
+74
@@ -0,0 +1,74 @@
|
|||||||
|
package com.eu.habbo.messages.incoming.rooms;
|
||||||
|
|
||||||
|
import com.eu.habbo.habbohotel.rooms.RoomState;
|
||||||
|
|
||||||
|
final class RoomSettingsInputGuard {
|
||||||
|
static final int MAX_PASSWORD_LENGTH = 64;
|
||||||
|
static final int MAX_TAGS = 2;
|
||||||
|
static final int MIN_USERS_MAX = 1;
|
||||||
|
static final int MAX_USERS_MAX = 200;
|
||||||
|
static final int MIN_WALL_OR_FLOOR_SIZE = -2;
|
||||||
|
static final int MAX_WALL_OR_FLOOR_SIZE = 1;
|
||||||
|
static final int MIN_CHAT_DISTANCE = 1;
|
||||||
|
static final int MAX_CHAT_DISTANCE = 99;
|
||||||
|
|
||||||
|
private RoomSettingsInputGuard() {
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidRoomState(int value) {
|
||||||
|
return value >= 0 && value < RoomState.values().length;
|
||||||
|
}
|
||||||
|
|
||||||
|
static RoomState roomState(int value) {
|
||||||
|
RoomState[] states = RoomState.values();
|
||||||
|
return states[value];
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidUsersMax(int value) {
|
||||||
|
return isInRange(value, MIN_USERS_MAX, MAX_USERS_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidTagCount(int value) {
|
||||||
|
return isInRange(value, 0, MAX_TAGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidTradeMode(int value) {
|
||||||
|
return isInRange(value, 0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidModerationOption(int value) {
|
||||||
|
return isInRange(value, 0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidWallOrFloorSize(int value) {
|
||||||
|
return isInRange(value, MIN_WALL_OR_FLOOR_SIZE, MAX_WALL_OR_FLOOR_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidChatMode(int value) {
|
||||||
|
return isInRange(value, 0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidChatWeight(int value) {
|
||||||
|
return isInRange(value, 0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidChatSpeed(int value) {
|
||||||
|
return isInRange(value, 0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidChatDistance(int value) {
|
||||||
|
return isInRange(value, MIN_CHAT_DISTANCE, MAX_CHAT_DISTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isValidChatProtection(int value) {
|
||||||
|
return isInRange(value, 0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isSafePassword(String password) {
|
||||||
|
return password != null && password.length() <= MAX_PASSWORD_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isInRange(int value, int min, int max) {
|
||||||
|
return value >= min && value <= max;
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
-28
@@ -15,15 +15,6 @@ import java.util.Set;
|
|||||||
|
|
||||||
public class RoomSettingsSaveEvent extends MessageHandler {
|
public class RoomSettingsSaveEvent extends MessageHandler {
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(RoomSettingsSaveEvent.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(RoomSettingsSaveEvent.class);
|
||||||
private static final int MAX_ROOM_PASSWORD_LENGTH = 64;
|
|
||||||
private static final int MAX_TAGS = 2;
|
|
||||||
private static final int MIN_USERS_MAX = 1;
|
|
||||||
private static final int MAX_USERS_MAX = 200;
|
|
||||||
private static final int MIN_THICKNESS = -2;
|
|
||||||
private static final int MAX_THICKNESS = 1;
|
|
||||||
private static final int MAX_OPTION_LEVEL = 2;
|
|
||||||
private static final int MIN_CHAT_DISTANCE = 1;
|
|
||||||
private static final int MAX_CHAT_DISTANCE = 99;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle() throws Exception {
|
public void handle() throws Exception {
|
||||||
@@ -57,13 +48,13 @@ public class RoomSettingsSaveEvent extends MessageHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int stateId = this.packet.readInt();
|
int stateId = this.packet.readInt();
|
||||||
if (stateId < 0 || stateId >= RoomState.values().length) {
|
if (!RoomSettingsInputGuard.isValidRoomState(stateId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RoomState state = RoomState.values()[stateId];
|
RoomState state = RoomSettingsInputGuard.roomState(stateId);
|
||||||
|
|
||||||
String password = this.packet.readString();
|
String password = this.packet.readString();
|
||||||
if (password.length() > MAX_ROOM_PASSWORD_LENGTH) {
|
if (!RoomSettingsInputGuard.isSafePassword(password)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (state == RoomState.PASSWORD && password.isEmpty() && (room.getPassword() == null || room.getPassword().isEmpty())) {
|
if (state == RoomState.PASSWORD && password.isEmpty() && (room.getPassword() == null || room.getPassword().isEmpty())) {
|
||||||
@@ -72,7 +63,7 @@ public class RoomSettingsSaveEvent extends MessageHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int usersMax = this.packet.readInt();
|
int usersMax = this.packet.readInt();
|
||||||
if (usersMax < MIN_USERS_MAX || usersMax > MAX_USERS_MAX) {
|
if (!RoomSettingsInputGuard.isValidUsersMax(usersMax)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +71,7 @@ public class RoomSettingsSaveEvent extends MessageHandler {
|
|||||||
StringBuilder tags = new StringBuilder();
|
StringBuilder tags = new StringBuilder();
|
||||||
Set<String> uniqueTags = new HashSet<>();
|
Set<String> uniqueTags = new HashSet<>();
|
||||||
int count = this.packet.readInt();
|
int count = this.packet.readInt();
|
||||||
if (count < 0 || count > MAX_TAGS) {
|
if (!RoomSettingsInputGuard.isValidTagCount(count)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
@@ -152,17 +143,17 @@ public class RoomSettingsSaveEvent extends MessageHandler {
|
|||||||
int chatDistance = this.packet.readInt();
|
int chatDistance = this.packet.readInt();
|
||||||
int chatProtection = this.packet.readInt();
|
int chatProtection = this.packet.readInt();
|
||||||
|
|
||||||
if (!isInRange(tradeMode, 0, MAX_OPTION_LEVEL)
|
if (!RoomSettingsInputGuard.isValidTradeMode(tradeMode)
|
||||||
|| !isInRange(wallSize, MIN_THICKNESS, MAX_THICKNESS)
|
|| !RoomSettingsInputGuard.isValidWallOrFloorSize(wallSize)
|
||||||
|| !isInRange(floorSize, MIN_THICKNESS, MAX_THICKNESS)
|
|| !RoomSettingsInputGuard.isValidWallOrFloorSize(floorSize)
|
||||||
|| !isInRange(muteOption, 0, MAX_OPTION_LEVEL)
|
|| !RoomSettingsInputGuard.isValidModerationOption(muteOption)
|
||||||
|| !isInRange(kickOption, 0, MAX_OPTION_LEVEL)
|
|| !RoomSettingsInputGuard.isValidModerationOption(kickOption)
|
||||||
|| !isInRange(banOption, 0, MAX_OPTION_LEVEL)
|
|| !RoomSettingsInputGuard.isValidModerationOption(banOption)
|
||||||
|| !isInRange(chatMode, 0, MAX_OPTION_LEVEL)
|
|| !RoomSettingsInputGuard.isValidChatMode(chatMode)
|
||||||
|| !isInRange(chatWeight, 0, MAX_OPTION_LEVEL)
|
|| !RoomSettingsInputGuard.isValidChatWeight(chatWeight)
|
||||||
|| !isInRange(chatSpeed, 0, MAX_OPTION_LEVEL)
|
|| !RoomSettingsInputGuard.isValidChatSpeed(chatSpeed)
|
||||||
|| !isInRange(chatDistance, MIN_CHAT_DISTANCE, MAX_CHAT_DISTANCE)
|
|| !RoomSettingsInputGuard.isValidChatDistance(chatDistance)
|
||||||
|| !isInRange(chatProtection, 0, MAX_OPTION_LEVEL)) {
|
|| !RoomSettingsInputGuard.isValidChatProtection(chatProtection)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,7 +189,4 @@ public class RoomSettingsSaveEvent extends MessageHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isInRange(int value, int min, int max) {
|
|
||||||
return value >= min && value <= max;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+74
@@ -0,0 +1,74 @@
|
|||||||
|
package com.eu.habbo.messages.incoming.rooms;
|
||||||
|
|
||||||
|
import com.eu.habbo.habbohotel.rooms.RoomState;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class RoomSettingsInputGuardTest {
|
||||||
|
@Test
|
||||||
|
void validatesRoomStateBeforeIndexing() {
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidRoomState(-1));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidRoomState(RoomState.values().length));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidRoomState(RoomState.PASSWORD.getState()));
|
||||||
|
assertEquals(RoomState.PASSWORD, RoomSettingsInputGuard.roomState(RoomState.PASSWORD.getState()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesRoomCapacityAndCosmeticSizes() {
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidUsersMax(-50));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidUsersMax(500));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidUsersMax(200));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidWallOrFloorSize(-50));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidWallOrFloorSize(50));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidWallOrFloorSize(-2));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidWallOrFloorSize(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesRoomOptionEnums() {
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidTradeMode(-1));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidTradeMode(99));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidTradeMode(2));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidModerationOption(-1));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidModerationOption(99));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidModerationOption(2));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatMode(-1));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatMode(99));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidChatMode(2));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatWeight(-1));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatWeight(99));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidChatWeight(2));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatSpeed(-1));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatSpeed(99));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidChatSpeed(2));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatProtection(-1));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatProtection(99));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidChatProtection(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesChatDistanceSafely() {
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatDistance(0));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatDistance(Integer.MIN_VALUE));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidChatDistance(500));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidChatDistance(1));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidChatDistance(99));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void validatesTagCount() {
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidTagCount(-1));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isValidTagCount(3));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidTagCount(0));
|
||||||
|
assertTrue(RoomSettingsInputGuard.isValidTagCount(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void rejectsOversizedPasswords() {
|
||||||
|
assertTrue(RoomSettingsInputGuard.isSafePassword("short-secret"));
|
||||||
|
assertFalse(RoomSettingsInputGuard.isSafePassword("x".repeat(RoomSettingsInputGuard.MAX_PASSWORD_LENGTH + 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user