Verify per registry message

This commit is contained in:
Adrian Bergqvist 2023-11-28 17:44:13 +01:00
parent 55e0a66122
commit dd89f5e07c
No known key found for this signature in database
GPG Key ID: FAE7D8EDE225E686
3 changed files with 23 additions and 11 deletions

View File

@ -1,16 +1,16 @@
package org.adde0109.ambassador.forge; package org.adde0109.ambassador.forge;
import org.adde0109.ambassador.forge.packet.ModListPacket;
import org.adde0109.ambassador.forge.packet.ModListReplyPacket; import org.adde0109.ambassador.forge.packet.ModListReplyPacket;
import org.adde0109.ambassador.forge.packet.RegistryPacket; import org.adde0109.ambassador.forge.packet.RegistryPacket;
import java.util.List; import java.util.HashMap;
import java.util.Map;
import java.util.zip.Adler32; import java.util.zip.Adler32;
import java.util.zip.Checksum; import java.util.zip.Checksum;
public class ForgeHandshake { public class ForgeHandshake {
private ModListReplyPacket modListReplyPacket; private ModListReplyPacket modListReplyPacket;
private final Checksum registryChecksum = new Adler32(); private final Map<String, Long> registries = new HashMap<>();
public ForgeHandshake() { public ForgeHandshake() {
} }
@ -24,10 +24,16 @@ public class ForgeHandshake {
} }
public void addRegistry(RegistryPacket packet) { public void addRegistry(RegistryPacket packet) {
Checksum registryChecksum = new Adler32();
registryChecksum.update(packet.getSnapshot()); registryChecksum.update(packet.getSnapshot());
registries.put(packet.getRegistryName(), registryChecksum.getValue());
} }
public Checksum getRegistryChecksum() { public Map<String, Long> getRegistries() {
return registryChecksum; return registries;
}
public boolean isCompatible(ForgeHandshake handshake) {
return this.registries.equals(handshake.registries);
} }
} }

View File

@ -14,6 +14,8 @@ import org.adde0109.ambassador.forge.pipeline.CommandDecoderErrorCatcher;
import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperCodec; import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperCodec;
import org.checkerframework.checker.units.qual.A; import org.checkerframework.checker.units.qual.A;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.zip.Adler32; import java.util.zip.Adler32;
@ -59,7 +61,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
} }
}; };
public Checksum registryChecksum; public ForgeHandshake handshake = new ForgeHandshake();
CountDownLatch remainingRegistries; CountDownLatch remainingRegistries;
VelocityForgeBackendConnectionPhase() { VelocityForgeBackendConnectionPhase() {
@ -88,7 +90,6 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
player.getConnection().write(message); player.getConnection().write(message);
} else { } else {
if (message instanceof ModListPacket modListPacket) { if (message instanceof ModListPacket modListPacket) {
registryChecksum = new Adler32();
remainingRegistries = new CountDownLatch(modListPacket.getRegistries().size()); remainingRegistries = new CountDownLatch(modListPacket.getRegistries().size());
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
try { try {
@ -97,19 +98,20 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
throw new RuntimeException(e); throw new RuntimeException(e);
} }
}).thenAcceptAsync((v) -> { }).thenAcceptAsync((v) -> {
if (clientPhase.forgeHandshake.getRegistryChecksum().getValue() == registryChecksum.getValue()) { if (clientPhase.forgeHandshake.isCompatible(handshake)) {
server.ensureConnected().write(clientPhase.forgeHandshake.getModListReplyPacket()); server.ensureConnected().write(clientPhase.forgeHandshake.getModListReplyPacket());
} else { } else {
//Player needs to be kicked in order to continue. server.disconnect();
server.disconnect();
} }
}, server.ensureConnected().eventLoop()); }, server.ensureConnected().eventLoop());
} else if (message instanceof RegistryPacket registryPacket) { } else if (message instanceof RegistryPacket registryPacket) {
server.getConnection().write(new ACKPacket(Context.createContext(message.getContext().getResponseID(), true))); server.getConnection().write(new ACKPacket(Context.createContext(message.getContext().getResponseID(), true)));
registryChecksum.update(registryPacket.getSnapshot()); handshake.addRegistry(registryPacket);
remainingRegistries.countDown(); remainingRegistries.countDown();
} else if (message instanceof ConfigDataPacket) { } else if (message instanceof ConfigDataPacket) {
server.getConnection().write(new ACKPacket(Context.createContext(message.getContext().getResponseID(), true))); server.getConnection().write(new ACKPacket(Context.createContext(message.getContext().getResponseID(), true)));
} else if (message instanceof GenericForgeLoginWrapperPacket<?>) {
//Save for after completion and send as plugin message
} }
} }
//Forge server //Forge server

View File

@ -50,6 +50,10 @@ public class RegistryPacket implements IForgeLoginWrapperPacket<Context> {
return context; return context;
} }
public String getRegistryName() {
return registryName;
}
public byte[] getSnapshot() { public byte[] getSnapshot() {
return snapshot; return snapshot;
} }