Code polish, by default does not encrypt data sent over a loopback

interface, only over remote interfaces.
This commit is contained in:
nathan 2016-03-18 16:13:53 +01:00
parent 7168eaadb7
commit aae89891c0

View File

@ -126,35 +126,30 @@ class KryoCryptoSerializationManager implements CryptoSerializationManager {
} }
private static class ClassSerializer {
static class ClassSerializer {
final Class<?> clazz; final Class<?> clazz;
final Serializer<?> serializer; final Serializer<?> serializer;
public
ClassSerializer(final Class<?> clazz, final Serializer<?> serializer) { ClassSerializer(final Class<?> clazz, final Serializer<?> serializer) {
this.clazz = clazz; this.clazz = clazz;
this.serializer = serializer; this.serializer = serializer;
} }
} }
static class ClassSerializer2 { private static class ClassSerializer2 {
final Class<?> clazz; final Class<?> clazz;
final Serializer<?> serializer; final Serializer<?> serializer;
final int id; final int id;
public
ClassSerializer2(final Class<?> clazz, final Serializer<?> serializer, final int id) { ClassSerializer2(final Class<?> clazz, final Serializer<?> serializer, final int id) {
this.clazz = clazz; this.clazz = clazz;
this.serializer = serializer; this.serializer = serializer;
this.id = id; this.id = id;
} }
} }
static class RemoteClass<Iface, Impl extends Iface> { private static class RemoteClass<Iface, Impl extends Iface> {
private final Class<Iface> ifaceClass; private final Class<Iface> ifaceClass;
private final Class<Impl> implClass; private final Class<Impl> implClass;
public
RemoteClass(final Class<Iface> ifaceClass, final Class<Impl> implClass) { RemoteClass(final Class<Iface> ifaceClass, final Class<Impl> implClass) {
this.ifaceClass = ifaceClass; this.ifaceClass = ifaceClass;
this.implClass = implClass; this.implClass = implClass;
@ -165,19 +160,21 @@ class KryoCryptoSerializationManager implements CryptoSerializationManager {
private final ObjectPool<KryoExtra> kryoPool; private final ObjectPool<KryoExtra> kryoPool;
// used by operations performed during kryo initialization, which are by default package access (since it's an anon-inner class // used by operations performed during kryo initialization, which are by default package access (since it's an anon-inner class
final List<Class<?>> classesToRegister = new ArrayList<Class<?>>(); private final List<Class<?>> classesToRegister = new ArrayList<Class<?>>();
final List<ClassSerializer> classSerializerToRegister = new ArrayList<ClassSerializer>(); private final List<ClassSerializer> classSerializerToRegister = new ArrayList<ClassSerializer>();
final List<ClassSerializer2> classSerializer2ToRegister = new ArrayList<ClassSerializer2>(); private final List<ClassSerializer2> classSerializer2ToRegister = new ArrayList<ClassSerializer2>();
final List<RemoteClass> remoteClassToRegister = new ArrayList<RemoteClass>(); private final List<RemoteClass> remoteClassToRegister = new ArrayList<RemoteClass>();
boolean shouldInitRMI = false; private boolean shouldInitRMI = false;
InvokeMethodSerializer methodSerializer = null; private InvokeMethodSerializer methodSerializer = null;
Serializer<Object> invocationSerializer = null; private Serializer<Object> invocationSerializer = null;
RemoteObjectSerializer remoteObjectSerializer; private RemoteObjectSerializer remoteObjectSerializer;
/** /**
* By default, the serialization manager will compress+encrypt data to connections with remote IPs, and only compress on the loopback IP
* <p>
* @param references * @param references
* If true, each appearance of an object in the graph after the first is stored as an integer ordinal. When set to true, * If true, each appearance of an object in the graph after the first is stored as an integer ordinal. When set to true,
* {@link MapReferenceResolver} is used. This enables references to the same object and cyclic graphs to be serialized, * {@link MapReferenceResolver} is used. This enables references to the same object and cyclic graphs to be serialized,
@ -201,6 +198,7 @@ class KryoCryptoSerializationManager implements CryptoSerializationManager {
*/ */
public public
KryoCryptoSerializationManager(final boolean references, final boolean registrationRequired, final SerializerFactory factory) { KryoCryptoSerializationManager(final boolean references, final boolean registrationRequired, final SerializerFactory factory) {
kryoPool = ObjectPool.NonBlockingSoftReference(new PoolableObject<KryoExtra>() { kryoPool = ObjectPool.NonBlockingSoftReference(new PoolableObject<KryoExtra>() {
@Override @Override
public public
@ -503,7 +501,13 @@ class KryoCryptoSerializationManager implements CryptoSerializationManager {
void writeWithCrypto(final ConnectionImpl connection, final ByteBuf buffer, final Object message) throws IOException { void writeWithCrypto(final ConnectionImpl connection, final ByteBuf buffer, final Object message) throws IOException {
final KryoExtra kryo = kryoPool.take(); final KryoExtra kryo = kryoPool.take();
try { try {
kryo.writeCrypto(connection, buffer, message); // we only need to encrypt when NOT on loopback, since encrypting on loopback is a waste of CPU
if (connection.isLoopback()) {
kryo.writeCompressed(connection, buffer, message);
}
else {
kryo.writeCrypto(connection, buffer, message);
}
} finally { } finally {
kryoPool.put(kryo); kryoPool.put(kryo);
} }
@ -523,7 +527,13 @@ class KryoCryptoSerializationManager implements CryptoSerializationManager {
Object readWithCrypto(final ConnectionImpl connection, final ByteBuf buffer, final int length) throws IOException { Object readWithCrypto(final ConnectionImpl connection, final ByteBuf buffer, final int length) throws IOException {
final KryoExtra kryo = kryoPool.take(); final KryoExtra kryo = kryoPool.take();
try { try {
return kryo.readCrypto(connection, buffer, length); // we only need to encrypt when NOT on loopback, since encrypting on loopback is a waste of CPU
if (connection.isLoopback()) {
return kryo.readCompressed(connection, buffer, length);
}
else {
return kryo.readCrypto(connection, buffer, length);
}
} finally { } finally {
kryoPool.put(kryo); kryoPool.put(kryo);
} }