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;
import org.adde0109.ambassador.forge.packet.ModListPacket;
import org.adde0109.ambassador.forge.packet.ModListReplyPacket;
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.Checksum;
public class ForgeHandshake {
private ModListReplyPacket modListReplyPacket;
private final Checksum registryChecksum = new Adler32();
private final Map<String, Long> registries = new HashMap<>();
public ForgeHandshake() {
}
@ -24,10 +24,16 @@ public class ForgeHandshake {
}
public void addRegistry(RegistryPacket packet) {
Checksum registryChecksum = new Adler32();
registryChecksum.update(packet.getSnapshot());
registries.put(packet.getRegistryName(), registryChecksum.getValue());
}
public Checksum getRegistryChecksum() {
return registryChecksum;
public Map<String, Long> getRegistries() {
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.checkerframework.checker.units.qual.A;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.zip.Adler32;
@ -59,7 +61,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
}
};
public Checksum registryChecksum;
public ForgeHandshake handshake = new ForgeHandshake();
CountDownLatch remainingRegistries;
VelocityForgeBackendConnectionPhase() {
@ -88,7 +90,6 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
player.getConnection().write(message);
} else {
if (message instanceof ModListPacket modListPacket) {
registryChecksum = new Adler32();
remainingRegistries = new CountDownLatch(modListPacket.getRegistries().size());
CompletableFuture.runAsync(() -> {
try {
@ -97,19 +98,20 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas
throw new RuntimeException(e);
}
}).thenAcceptAsync((v) -> {
if (clientPhase.forgeHandshake.getRegistryChecksum().getValue() == registryChecksum.getValue()) {
if (clientPhase.forgeHandshake.isCompatible(handshake)) {
server.ensureConnected().write(clientPhase.forgeHandshake.getModListReplyPacket());
} else {
//Player needs to be kicked in order to continue.
server.disconnect();
server.disconnect();
}
}, server.ensureConnected().eventLoop());
} else if (message instanceof RegistryPacket registryPacket) {
server.getConnection().write(new ACKPacket(Context.createContext(message.getContext().getResponseID(), true)));
registryChecksum.update(registryPacket.getSnapshot());
handshake.addRegistry(registryPacket);
remainingRegistries.countDown();
} else if (message instanceof ConfigDataPacket) {
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

View File

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