From 4c40fd38f3431a0fd6817bc53d639b3507f864c7 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 11 Jan 2019 10:22:02 +0100 Subject: [PATCH] Class registration verification now includes serializer class (but not it's configuration). --- .../serialization/ClassRegistration.java | 14 +++++++++++-- .../serialization/ClassSerializer.java | 2 -- .../serialization/ClassSerializer1.java | 1 - .../serialization/ClassSerializer2.java | 2 -- .../serialization/ClassSerializerRmi.java | 3 ++- .../network/serialization/Serialization.java | 20 +++++++++++++------ 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/dorkbox/network/serialization/ClassRegistration.java b/src/dorkbox/network/serialization/ClassRegistration.java index 62ff6d54..aae00eeb 100644 --- a/src/dorkbox/network/serialization/ClassRegistration.java +++ b/src/dorkbox/network/serialization/ClassRegistration.java @@ -17,6 +17,9 @@ package dorkbox.network.serialization; import org.slf4j.Logger; +import com.esotericsoftware.kryo.Registration; +import com.esotericsoftware.kryo.Serializer; + import dorkbox.network.connection.CryptoConnection; import dorkbox.network.connection.KryoExtra; import dorkbox.network.rmi.RemoteObjectSerializer; @@ -24,18 +27,25 @@ import dorkbox.network.rmi.RemoteObjectSerializer; class ClassRegistration { Class clazz; int id; + Serializer serializer; ClassRegistration(final Class clazz) { this.clazz = clazz; } void register(final KryoExtra kryo, final RemoteObjectSerializer remoteObjectSerializer) { + Registration registration; + if (clazz.isInterface()) { - id = kryo.register(clazz, remoteObjectSerializer).getId(); + registration = kryo.register(clazz, remoteObjectSerializer); + } else { - id = kryo.register(clazz).getId(); + registration = kryo.register(clazz); } + + id = registration.getId(); + serializer = registration.getSerializer(); } void log(final Logger logger) { diff --git a/src/dorkbox/network/serialization/ClassSerializer.java b/src/dorkbox/network/serialization/ClassSerializer.java index 1e828960..9a5e4258 100644 --- a/src/dorkbox/network/serialization/ClassSerializer.java +++ b/src/dorkbox/network/serialization/ClassSerializer.java @@ -24,8 +24,6 @@ import dorkbox.network.connection.KryoExtra; import dorkbox.network.rmi.RemoteObjectSerializer; class ClassSerializer extends ClassRegistration { - final Serializer serializer; - ClassSerializer(final Class clazz, final Serializer serializer) { super(clazz); this.serializer = serializer; diff --git a/src/dorkbox/network/serialization/ClassSerializer1.java b/src/dorkbox/network/serialization/ClassSerializer1.java index 36939eb0..9f27cb48 100644 --- a/src/dorkbox/network/serialization/ClassSerializer1.java +++ b/src/dorkbox/network/serialization/ClassSerializer1.java @@ -22,7 +22,6 @@ import dorkbox.network.connection.KryoExtra; import dorkbox.network.rmi.RemoteObjectSerializer; class ClassSerializer1 extends ClassRegistration { - ClassSerializer1(final Class clazz, final int id) { super(clazz); this.id = id; diff --git a/src/dorkbox/network/serialization/ClassSerializer2.java b/src/dorkbox/network/serialization/ClassSerializer2.java index a2577003..40cf3a2e 100644 --- a/src/dorkbox/network/serialization/ClassSerializer2.java +++ b/src/dorkbox/network/serialization/ClassSerializer2.java @@ -24,8 +24,6 @@ import dorkbox.network.connection.KryoExtra; import dorkbox.network.rmi.RemoteObjectSerializer; class ClassSerializer2 extends ClassRegistration { - final Serializer serializer; - ClassSerializer2(final Class clazz, final Serializer serializer, final int id) { super(clazz); this.serializer = serializer; diff --git a/src/dorkbox/network/serialization/ClassSerializerRmi.java b/src/dorkbox/network/serialization/ClassSerializerRmi.java index 8795af15..5932d1dd 100644 --- a/src/dorkbox/network/serialization/ClassSerializerRmi.java +++ b/src/dorkbox/network/serialization/ClassSerializerRmi.java @@ -30,7 +30,8 @@ class ClassSerializerRmi extends ClassRegistration { } void register(final KryoExtra kryo, final RemoteObjectSerializer remoteObjectSerializer) { - id = kryo.register(clazz, remoteObjectSerializer).getId(); + this.id = kryo.register(clazz, remoteObjectSerializer).getId(); + this.serializer = remoteObjectSerializer; } void log(final Logger logger) { diff --git a/src/dorkbox/network/serialization/Serialization.java b/src/dorkbox/network/serialization/Serialization.java index ad9e61cc..e7f5e058 100644 --- a/src/dorkbox/network/serialization/Serialization.java +++ b/src/dorkbox/network/serialization/Serialization.java @@ -480,7 +480,7 @@ class Serialization implements CryptoSerializationMa registration.log(logger); // now save all of the registration IDs for quick verification/access - registrationDetails[i] = new Object[] {registration.id, registration.clazz.getName()}; + registrationDetails[i] = new Object[] {registration.id, registration.clazz.getName(), registration.serializer.getClass().getName()}; @@ -505,7 +505,11 @@ class Serialization implements CryptoSerializationMa writer.setBuffer(buffer); kryo.setRegistrationRequired(false); - kryo.writeObject(writer, registrationDetails); + try { + kryo.writeCompressed(null, buffer, registrationDetails); + } catch (Exception e) { + logger.error("Unable to write compressed data for registration details"); + } savedRegistrationDetails = new byte[buffer.writerIndex()]; buffer.getBytes(0, savedRegistrationDetails); @@ -523,6 +527,7 @@ class Serialization implements CryptoSerializationMa /** * @return true if kryo registration is required for all classes sent over the wire */ + @SuppressWarnings("Duplicates") @Override public boolean verifyKryoRegistration(byte[] otherRegistrationData) { @@ -562,13 +567,15 @@ class Serialization implements CryptoSerializationMa Object[] classNew = classRegistrations[index]; int idNew = (Integer) classNew[0]; String nameNew = (String) classNew[1]; + String serializerNew = (String) classNew[2]; int idOrg = classOrg.id; String nameOrg = classOrg.clazz.getName(); + String serializerOrg = classOrg.serializer.getClass().getName(); - if (idNew != idOrg || !nameOrg.equals(nameNew)) { - logger.error("Server registration : {} -> {}", idOrg, nameOrg); - logger.error("Client registration : {} -> {}", idNew, nameNew); + if (idNew != idOrg || !nameOrg.equals(nameNew) || !serializerNew.equalsIgnoreCase(serializerOrg)) { + logger.error("Server registration : {} -> {} ({})", idOrg, nameOrg, serializerOrg); + logger.error("Client registration : {} -> {} ({})", idNew, nameNew, serializerNew); } } } @@ -579,8 +586,9 @@ class Serialization implements CryptoSerializationMa Object[] holderClass = classRegistrations[index]; int id = (Integer) holderClass[0]; String name = (String) holderClass[1]; + String serializer = (String) holderClass[2]; - logger.error("Missing server registration : {} -> {}", id, name); + logger.error("Missing server registration : {} -> {} ({})", id, name, serializer); } } } catch(Exception e) {