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 #231 from simoleo89/fix/navigator-inputs
fix(navigator): bound search inputs
This commit is contained in:
+2
-5
@@ -14,11 +14,8 @@ public class AddSavedSearchEvent extends MessageHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle() throws Exception {
|
public void handle() throws Exception {
|
||||||
String searchCode = this.packet.readString();
|
String searchCode = NavigatorInputGuard.normalizeSavedSearchValue(this.packet.readString());
|
||||||
String filter = this.packet.readString();
|
String filter = NavigatorInputGuard.normalizeSavedSearchValue(this.packet.readString());
|
||||||
|
|
||||||
if (searchCode.length() > 255) searchCode = searchCode.substring(0, 255);
|
|
||||||
if (filter.length() > 255) filter = filter.substring(0, 255);
|
|
||||||
|
|
||||||
if (this.client.getHabbo().getHabboInfo().getSavedSearches().size() >= MAX_SAVED_SEARCHES) {
|
if (this.client.getHabbo().getHabboInfo().getSavedSearches().size() >= MAX_SAVED_SEARCHES) {
|
||||||
this.client.sendResponse(new NewNavigatorSavedSearchesComposer(this.client.getHabbo().getHabboInfo().getSavedSearches()));
|
this.client.sendResponse(new NewNavigatorSavedSearchesComposer(this.client.getHabbo().getHabboInfo().getSavedSearches()));
|
||||||
|
|||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
package com.eu.habbo.messages.incoming.navigator;
|
||||||
|
|
||||||
|
final class NavigatorInputGuard {
|
||||||
|
static final int MAX_SEARCH_LENGTH = 64;
|
||||||
|
static final int MAX_SAVED_SEARCH_LENGTH = 255;
|
||||||
|
|
||||||
|
private NavigatorInputGuard() {
|
||||||
|
}
|
||||||
|
|
||||||
|
static String normalizeSearch(String value) {
|
||||||
|
return normalize(value, MAX_SEARCH_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static String normalizeSavedSearchValue(String value) {
|
||||||
|
return normalize(value, MAX_SAVED_SEARCH_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String normalize(String value, int maxLength) {
|
||||||
|
if (value == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
String normalized = value.trim();
|
||||||
|
return normalized.length() > maxLength ? normalized.substring(0, maxLength) : normalized;
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -7,7 +7,7 @@ import com.eu.habbo.messages.outgoing.navigator.PrivateRoomsComposer;
|
|||||||
public class SearchRoomsByTagEvent extends MessageHandler {
|
public class SearchRoomsByTagEvent extends MessageHandler {
|
||||||
@Override
|
@Override
|
||||||
public void handle() throws Exception {
|
public void handle() throws Exception {
|
||||||
String tag = this.packet.readString();
|
String tag = NavigatorInputGuard.normalizeSearch(this.packet.readString());
|
||||||
|
|
||||||
this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsWithTag(tag)));
|
this.client.sendResponse(new PrivateRoomsComposer(Emulator.getGameEnvironment().getRoomManager().getRoomsWithTag(tag)));
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-17
@@ -34,36 +34,43 @@ public class SearchRoomsEvent extends MessageHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handle() throws Exception {
|
public void handle() throws Exception {
|
||||||
String name = this.packet.readString();
|
String name = NavigatorInputGuard.normalizeSearch(this.packet.readString());
|
||||||
|
|
||||||
String prefix = "";
|
String prefix = "";
|
||||||
String query = name;
|
String query = name;
|
||||||
ArrayList<Room> rooms;
|
ArrayList<Room> rooms;
|
||||||
|
|
||||||
|
if (name.startsWith("owner:")) {
|
||||||
|
query = NavigatorInputGuard.normalizeSearch(name.substring("owner:".length()));
|
||||||
|
prefix = "owner:";
|
||||||
|
} else if (name.startsWith("tag:")) {
|
||||||
|
query = NavigatorInputGuard.normalizeSearch(name.substring("tag:".length()));
|
||||||
|
prefix = "tag:";
|
||||||
|
} else if (name.startsWith("group:")) {
|
||||||
|
query = NavigatorInputGuard.normalizeSearch(name.substring("group:".length()));
|
||||||
|
prefix = "group:";
|
||||||
|
}
|
||||||
|
|
||||||
|
String cacheKey = buildCacheKey(prefix, query);
|
||||||
|
|
||||||
ServerMessage message = null;
|
ServerMessage message = null;
|
||||||
Map<String, ServerMessage> rankCache = cachedResults.get(this.client.getHabbo().getHabboInfo().getRank());
|
Map<String, ServerMessage> rankCache = cachedResults.get(this.client.getHabbo().getHabboInfo().getRank());
|
||||||
if (rankCache != null) {
|
if (rankCache != null) {
|
||||||
message = rankCache.get((name + "\t" + query).toLowerCase());
|
message = rankCache.get(cacheKey);
|
||||||
} else {
|
} else {
|
||||||
rankCache = createLRUCache();
|
rankCache = createLRUCache();
|
||||||
cachedResults.put(this.client.getHabbo().getHabboInfo().getRank(), rankCache);
|
cachedResults.put(this.client.getHabbo().getHabboInfo().getRank(), rankCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message == null) {
|
if (message == null) {
|
||||||
if (name.startsWith("owner:")) {
|
if (prefix.equals("owner:")) {
|
||||||
query = name.split("owner:")[1];
|
rooms = (ArrayList<Room>) Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(query);
|
||||||
prefix = "owner:";
|
} else if (prefix.equals("tag:")) {
|
||||||
rooms = (ArrayList<Room>) Emulator.getGameEnvironment().getRoomManager().getRoomsForHabbo(name);
|
rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsWithTag(query);
|
||||||
} else if (name.startsWith("tag:")) {
|
} else if (prefix.equals("group:")) {
|
||||||
query = name.split("tag:")[1];
|
rooms = Emulator.getGameEnvironment().getRoomManager().getGroupRoomsWithName(query);
|
||||||
prefix = "tag:";
|
|
||||||
rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsWithTag(name);
|
|
||||||
} else if (name.startsWith("group:")) {
|
|
||||||
query = name.split("group:")[1];
|
|
||||||
prefix = "group:";
|
|
||||||
rooms = Emulator.getGameEnvironment().getRoomManager().getGroupRoomsWithName(name);
|
|
||||||
} else {
|
} else {
|
||||||
rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsWithName(name);
|
rooms = Emulator.getGameEnvironment().getRoomManager().getRoomsWithName(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
message = new PrivateRoomsComposer(rooms).compose();
|
message = new PrivateRoomsComposer(rooms).compose();
|
||||||
@@ -73,7 +80,7 @@ public class SearchRoomsEvent extends MessageHandler {
|
|||||||
map = createLRUCache();
|
map = createLRUCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
map.put((name + "\t" + query).toLowerCase(), message);
|
map.put(cacheKey, message);
|
||||||
cachedResults.put(this.client.getHabbo().getHabboInfo().getRank(), map);
|
cachedResults.put(this.client.getHabbo().getHabboInfo().getRank(), map);
|
||||||
|
|
||||||
NavigatorSearchResultEvent event = new NavigatorSearchResultEvent(this.client.getHabbo(), prefix, query, rooms);
|
NavigatorSearchResultEvent event = new NavigatorSearchResultEvent(this.client.getHabbo(), prefix, query, rooms);
|
||||||
@@ -84,4 +91,8 @@ public class SearchRoomsEvent extends MessageHandler {
|
|||||||
|
|
||||||
this.client.sendResponse(message);
|
this.client.sendResponse(message);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private static String buildCacheKey(String prefix, String query) {
|
||||||
|
return (prefix + "\t" + query).toLowerCase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
package com.eu.habbo.messages.incoming.navigator;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class NavigatorInputGuardTest {
|
||||||
|
@Test
|
||||||
|
void searchValuesAreTrimmedAndBounded() {
|
||||||
|
assertEquals("", NavigatorInputGuard.normalizeSearch(null));
|
||||||
|
assertEquals("rare", NavigatorInputGuard.normalizeSearch(" rare "));
|
||||||
|
assertEquals(NavigatorInputGuard.MAX_SEARCH_LENGTH, NavigatorInputGuard.normalizeSearch("a".repeat(100)).length());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void savedSearchValuesUseLargerBound() {
|
||||||
|
assertEquals("", NavigatorInputGuard.normalizeSavedSearchValue(null));
|
||||||
|
assertEquals("owner:duckie", NavigatorInputGuard.normalizeSavedSearchValue(" owner:duckie "));
|
||||||
|
assertEquals(NavigatorInputGuard.MAX_SAVED_SEARCH_LENGTH, NavigatorInputGuard.normalizeSavedSearchValue("a".repeat(400)).length());
|
||||||
|
}
|
||||||
|
}
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
package com.eu.habbo.messages.incoming.navigator;
|
||||||
|
|
||||||
|
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 NavigatorSearchInputContractTest {
|
||||||
|
@Test
|
||||||
|
void classicSearchNormalizesInputAndPassesUnprefixedQueriesToManagers() throws Exception {
|
||||||
|
String source = Files.readString(Path.of("src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsEvent.java"));
|
||||||
|
|
||||||
|
assertTrue(source.contains("NavigatorInputGuard.normalizeSearch(this.packet.readString())"),
|
||||||
|
"classic room search must normalize raw client text before cache or manager lookups");
|
||||||
|
assertTrue(source.contains("getRoomsForHabbo(query)"),
|
||||||
|
"owner search must pass only the unprefixed owner query");
|
||||||
|
assertTrue(source.contains("getRoomsWithTag(query)"),
|
||||||
|
"tag search must pass only the unprefixed tag query");
|
||||||
|
assertTrue(source.contains("getGroupRoomsWithName(query)"),
|
||||||
|
"group search must pass only the unprefixed group query");
|
||||||
|
assertTrue(source.contains("buildCacheKey(prefix, query)"),
|
||||||
|
"classic room search must cache using normalized prefix/query pairs");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void savedAndTagSearchesNormalizeText() throws Exception {
|
||||||
|
String saved = Files.readString(Path.of("src/main/java/com/eu/habbo/messages/incoming/navigator/AddSavedSearchEvent.java"));
|
||||||
|
String tag = Files.readString(Path.of("src/main/java/com/eu/habbo/messages/incoming/navigator/SearchRoomsByTagEvent.java"));
|
||||||
|
|
||||||
|
assertTrue(saved.contains("NavigatorInputGuard.normalizeSavedSearchValue"),
|
||||||
|
"saved searches must trim and bound search code/filter values");
|
||||||
|
assertTrue(tag.contains("NavigatorInputGuard.normalizeSearch"),
|
||||||
|
"tag search must trim and bound tag values");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user