now works properly for hotels that disable encryption

This commit is contained in:
sirjonasxx 2020-05-06 01:18:18 +02:00
parent 1b71b97501
commit 1e704ccf3c
4 changed files with 22 additions and 37 deletions

View File

@ -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);

View File

@ -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<TrafficListener>)trafficObservables[0]).removeListener(this);
HPacket packet = message.getPacket();
packet.readString();
isEncryptedStream = packet.readBoolean();
outgoingHandler.isEncryptedStream = true;
}
else if (message.getIndex() > 3) {
((Observable<TrafficListener>)trafficObservables[0]).removeListener(this);
@ -32,16 +33,6 @@ public class IncomingPacketHandler extends PacketHandler {
((Observable<TrafficListener>)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;

View File

@ -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

View File

@ -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<Byte> tempEncryptedBuffer = new ArrayList<>();
protected volatile boolean isEncryptedStream = false;
private volatile List<Byte> 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) {