diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/ChunkCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/ChunkCache.java index 4fa74644409..4c2d8c36fe3 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/cache/ChunkCache.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/ChunkCache.java @@ -67,7 +67,7 @@ public void addToCache(Column chunk) { chunks.put(chunkPosition, geyserColumn); } - public GeyserColumn getChunk(int chunkX, int chunkZ) { + public GeyserColumn getChunk(int chunkX, int chunkZ) { long chunkPosition = MathUtils.chunkPositionToLong(chunkX, chunkZ); return chunks.getOrDefault(chunkPosition, null); } @@ -136,6 +136,19 @@ public void removeChunk(int chunkX, int chunkZ) { chunks.remove(chunkPosition); } + /** + * Manually clears all entries in the chunk cache. + * The server is responsible for clearing chunk entries if out of render distance (for example) or switching dimensions, + * but it is the client that must clear chunks in the event of proxy switches. + */ + public void clear() { + if (!cache) { + return; + } + + chunks.clear(); + } + public int getChunkMinY() { return minY >> 4; } diff --git a/connector/src/main/java/org/geysermc/connector/utils/DimensionUtils.java b/connector/src/main/java/org/geysermc/connector/utils/DimensionUtils.java index 942220ddb3a..b9d6ac40ef2 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/DimensionUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/DimensionUtils.java @@ -60,6 +60,7 @@ public static void switchDimension(GeyserSession session, String javaDimension) int bedrockDimension = javaToBedrock(javaDimension); Entity player = session.getPlayerEntity(); + session.getChunkCache().clear(); session.getEntityCache().removeAllEntities(); session.getItemFrameCache().clear(); session.getLecternCache().clear(); diff --git a/connector/src/main/java/org/geysermc/connector/utils/LoginEncryptionUtils.java b/connector/src/main/java/org/geysermc/connector/utils/LoginEncryptionUtils.java index b9da1a4394a..a189544b76d 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/LoginEncryptionUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/LoginEncryptionUtils.java @@ -57,6 +57,7 @@ import java.security.PublicKey; import java.security.interfaces.ECPublicKey; import java.security.spec.ECGenParameterSpec; +import java.util.Iterator; import java.util.UUID; public class LoginEncryptionUtils { @@ -70,8 +71,10 @@ private static boolean validateChainData(JsonNode data) throws Exception { } ECPublicKey lastKey = null; - boolean validChain = false; - for (JsonNode node : data) { + boolean mojangSigned = false; + Iterator iterator = data.iterator(); + while (iterator.hasNext()) { + JsonNode node = iterator.next(); JWSObject jwt = JWSObject.parse(node.asText()); // x509 cert is expected in every claim @@ -92,8 +95,12 @@ private static boolean validateChainData(JsonNode data) throws Exception { return false; } + if (mojangSigned) { + return !iterator.hasNext(); + } + if (lastKey.equals(EncryptionUtils.getMojangPublicKey())) { - validChain = true; + mojangSigned = true; } Object payload = JSONValue.parse(jwt.getPayload().toString()); @@ -104,7 +111,7 @@ private static boolean validateChainData(JsonNode data) throws Exception { lastKey = EncryptionUtils.generateKey((String) identityPublicKey); } - return validChain; + return mojangSigned; } public static void encryptPlayerConnection(GeyserSession session, LoginPacket loginPacket) {