diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProvider.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProvider.java index 13eefc0..f6886d5 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProvider.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/ProxyProvider.java @@ -43,7 +43,7 @@ public abstract class ProxyProvider { Rc4Obtainer rc4Obtainer = new Rc4Obtainer(hConnection); OutgoingPacketHandler outgoingHandler = new OutgoingPacketHandler(server.getOutputStream(), hConnection.getTrafficObservables()); - IncomingPacketHandler incomingHandler = new IncomingPacketHandler(client.getOutputStream(), hConnection.getTrafficObservables()); + IncomingPacketHandler incomingHandler = new IncomingPacketHandler(client.getOutputStream(), hConnection.getTrafficObservables(), outgoingHandler); rc4Obtainer.setPacketHandlers(outgoingHandler, incomingHandler); Semaphore abort = new Semaphore(0); diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/IncomingPacketHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/IncomingPacketHandler.java index c8ef55f..6e7ee56 100644 --- a/G-Earth/src/main/java/gearth/protocol/packethandler/IncomingPacketHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/IncomingPacketHandler.java @@ -11,17 +11,18 @@ import java.util.List; public class IncomingPacketHandler extends PacketHandler { - public IncomingPacketHandler(OutputStream outputStream, Object[] trafficObservables) { + public IncomingPacketHandler(OutputStream outputStream, Object[] trafficObservables, OutgoingPacketHandler outgoingHandler) { super(outputStream, trafficObservables); TrafficListener listener = new TrafficListener() { @Override public void onCapture(HMessage message) { - if (isDataStream && message.getPacket().structureEquals("s,b")) { + if (isDataStream && message.getPacket().structureEquals("s,b") && message.getPacket().length() > 500) { ((Observable)trafficObservables[0]).removeListener(this); HPacket packet = message.getPacket(); packet.readString(); isEncryptedStream = packet.readBoolean(); + outgoingHandler.isEncryptedStream = true; } else if (message.getIndex() > 3) { ((Observable)trafficObservables[0]).removeListener(this); @@ -32,16 +33,6 @@ public class IncomingPacketHandler extends PacketHandler { ((Observable)trafficObservables[0]).addListener(listener); } - @Override - public void act(byte[] buffer) throws IOException { - if (isDataStream) { - continuedAct(buffer); - } - else { - out.write(buffer); - } - } - @Override public HMessage.Direction getMessageSide() { return HMessage.Direction.TOCLIENT; diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/OutgoingPacketHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/OutgoingPacketHandler.java index 38da87c..4002c4b 100644 --- a/G-Earth/src/main/java/gearth/protocol/packethandler/OutgoingPacketHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/OutgoingPacketHandler.java @@ -38,17 +38,7 @@ public class OutgoingPacketHandler extends PacketHandler { @Override public void act(byte[] buffer) throws IOException { dataStreamCheck(buffer); - - if (isDataStream) { - if (!isEncryptedStream && (new HPacket(buffer).length() < 2 || new HPacket(buffer).length() > 1000)) { - isEncryptedStream = true; - } - - continuedAct(buffer); - } - else { - out.write(buffer); - } + super.act(buffer); } @Override diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/PacketHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/PacketHandler.java index 7cab0ef..c72b25e 100644 --- a/G-Earth/src/main/java/gearth/protocol/packethandler/PacketHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/PacketHandler.java @@ -16,23 +16,23 @@ public abstract class PacketHandler { protected static final boolean DEBUG = false; - volatile PayloadBuffer payloadBuffer = new PayloadBuffer(); - volatile OutputStream out; - volatile Object[] trafficObservables; //get notified on packet send - volatile boolean isTempBlocked = false; + private volatile PayloadBuffer payloadBuffer = new PayloadBuffer(); + private volatile OutputStream out; + private volatile Object[] trafficObservables; //get notified on packet send + private volatile boolean isTempBlocked = false; volatile boolean isDataStream = false; - volatile int currentIndex = 0; + private volatile int currentIndex = 0; - protected final Object lock = new Object(); + private final Object lock = new Object(); - protected RC4 decryptcipher = null; - protected RC4 encryptcipher = null; + private RC4 decryptcipher = null; + private RC4 encryptcipher = null; - protected volatile List tempEncryptedBuffer = new ArrayList<>(); - protected volatile boolean isEncryptedStream = false; + private volatile List tempEncryptedBuffer = new ArrayList<>(); + volatile boolean isEncryptedStream = false; - public PacketHandler(OutputStream outputStream, Object[] trafficObservables) { + PacketHandler(OutputStream outputStream, Object[] trafficObservables) { this.trafficObservables = trafficObservables; out = outputStream; } @@ -46,8 +46,12 @@ public abstract class PacketHandler { return isEncryptedStream; } - public abstract void act(byte[] buffer) throws IOException; - protected void continuedAct(byte[] buffer) throws IOException { + public void act(byte[] buffer) throws IOException { + if (!isDataStream) { + out.write(buffer); + return; + } + bufferChangeObservable.fireEvent(); if (!isEncryptedStream) {