diff --git a/src/main/extensions/Extension.java b/src/main/extensions/Extension.java index 628086b..8463c1e 100644 --- a/src/main/extensions/Extension.java +++ b/src/main/extensions/Extension.java @@ -5,6 +5,7 @@ import main.protocol.HPacket; import main.protocol.packethandler.PayloadBuffer; import main.ui.extensions.Extensions; +import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -50,90 +51,106 @@ public abstract class Extension { } } - + Socket gEarthExtensionServer = null; try { - Socket GEarthExtensionServer = new Socket("localhost", port); + gEarthExtensionServer = new Socket("localhost", port); - InputStream in = GEarthExtensionServer.getInputStream(); - out = GEarthExtensionServer.getOutputStream(); + InputStream in = gEarthExtensionServer.getInputStream(); + DataInputStream dIn = new DataInputStream(in); + out = gEarthExtensionServer.getOutputStream(); - PayloadBuffer buffer = new PayloadBuffer(); - while (!GEarthExtensionServer.isClosed()) { - if (in.available() > 0) { - byte[] data = new byte[in.available()]; - in.read(data); - buffer.push(data); + while (!gEarthExtensionServer.isClosed()) { - HPacket[] packets = buffer.receive(); - for (HPacket packet : packets) { - if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.INFOREQUEST) { - HPacket response = new HPacket(Extensions.INCOMING_MESSAGES_IDS.EXTENSIONINFO); - response.appendString(getTitle()) - .appendString(getAuthor()) - .appendString(getVersion()) - .appendString(getDescription()); - writeToStream(response.toBytes()); - } - else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.CONNECTIONSTART) { - onStartConnection(); - } - else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.CONNECTIONEND) { - onEndConnection(); - } - else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.FLAGSCHECK) { - // body = an array of G-Earths main flags - if (flagRequestCallback != null) { - int arraysize = packet.readInteger(); - String[] gEarthArgs = new String[arraysize]; - for (int i = 0; i < gEarthArgs.length; i++) { - gEarthArgs[i] = packet.readString(); - } - flagRequestCallback.act(gEarthArgs); - } - flagRequestCallback = null; - } - else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.INIT) { - init(); - } - else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.FREEFLOW) { - // nothing to be done yet - } - else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.ONDOUBLECLICK) { - onDoubleClick(); - } - else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.PACKETINTERCEPT) { - HMessage habboMessage = new HMessage(packet.readString()); - HPacket habboPacket = habboMessage.getPacket(); + int length = dIn.readInt(); + byte[] headerandbody = new byte[length + 4]; + int amountRead = dIn.read(headerandbody, 4, length); - Map> listeners = - habboMessage.getDestination() == HMessage.Side.TOCLIENT ? - incomingMessageListeners : - outgoingMessageListeners; + if (amountRead != length) break; - if (listeners.containsKey(-1)) { // registered on all packets - for (int i = listeners.get(-1).size() - 1; i >= 0; i--) { - listeners.get(-1).get(i).act(habboMessage); - } - } - if (listeners.containsKey(habboPacket.headerId())) { - for (int i = listeners.get(habboPacket.headerId()).size() - 1; i >= 0; i--) { - listeners.get(habboPacket.headerId()).get(i).act(habboMessage); - } - } + HPacket packet = new HPacket(headerandbody); + packet.fixLength(); - HPacket response = new HPacket(Extensions.INCOMING_MESSAGES_IDS.MANIPULATEDPACKET); - response.appendString(habboMessage.stringify()); - writeToStream(response.toBytes()); + if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.INFOREQUEST) { + HPacket response = new HPacket(Extensions.INCOMING_MESSAGES_IDS.EXTENSIONINFO); + response.appendString(getTitle()) + .appendString(getAuthor()) + .appendString(getVersion()) + .appendString(getDescription()); + writeToStream(response.toBytes()); + } + else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.CONNECTIONSTART) { + onStartConnection(); + } + else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.CONNECTIONEND) { + onEndConnection(); + } + else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.FLAGSCHECK) { + // body = an array of G-Earths main flags + if (flagRequestCallback != null) { + int arraysize = packet.readInteger(); + String[] gEarthArgs = new String[arraysize]; + for (int i = 0; i < gEarthArgs.length; i++) { + gEarthArgs[i] = packet.readString(); + } + flagRequestCallback.act(gEarthArgs); + } + flagRequestCallback = null; + } + else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.INIT) { + init(); + } + else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.FREEFLOW) { + // nothing to be done yet + } + else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.ONDOUBLECLICK) { + onDoubleClick(); + } + else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.PACKETINTERCEPT) { + String stringifiedMessage = packet.readString(); + HMessage habboMessage = new HMessage(stringifiedMessage); + HPacket habboPacket = habboMessage.getPacket(); +// +// System.out.println("----------"); +// System.out.println(stringifiedMessage); +// System.out.println(habboPacket); + + Map> listeners = + habboMessage.getDestination() == HMessage.Side.TOCLIENT ? + incomingMessageListeners : + outgoingMessageListeners; + + if (listeners.containsKey(-1)) { // registered on all packets + for (int i = listeners.get(-1).size() - 1; i >= 0; i--) { + listeners.get(-1).get(i).act(habboMessage); } } + if (listeners.containsKey(habboPacket.headerId())) { + for (int i = listeners.get(habboPacket.headerId()).size() - 1; i >= 0; i--) { + listeners.get(habboPacket.headerId()).get(i).act(habboMessage); + } + } + + HPacket response = new HPacket(Extensions.INCOMING_MESSAGES_IDS.MANIPULATEDPACKET); + response.appendString(habboMessage.stringify()); + + writeToStream(response.toBytes()); } - Thread.sleep(1); } - } catch (IOException | InterruptedException e) { - e.printStackTrace(); + } catch (IOException e) { +// e.printStackTrace(); + System.out.println("ERROR"); + } + finally { + if (gEarthExtensionServer != null && !gEarthExtensionServer.isClosed()) { + try { + gEarthExtensionServer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } diff --git a/src/main/extensions/SimpleTestExtension.java b/src/main/extensions/SimpleTestExtension.java new file mode 100644 index 0000000..75bc7bf --- /dev/null +++ b/src/main/extensions/SimpleTestExtension.java @@ -0,0 +1,55 @@ +package main.extensions; + +/** + * Created by Jonas on 24/06/18. + */ +public class SimpleTestExtension extends Extension { + + public static void main(String[] args) { + new SimpleTestExtension(args); + } + + private SimpleTestExtension(String[] args) { + super(args); + } + + @Override + protected void init() { + System.out.println("init"); + } + + @Override + protected void onDoubleClick() { + System.out.println("doubleclick"); + } + + @Override + protected void onStartConnection() { + System.out.println("connection started"); + } + + @Override + protected void onEndConnection() { + System.out.println("connection ended"); + } + + @Override + protected String getTitle() { + return "Simple Test!"; + } + + @Override + protected String getDescription() { + return "But just for testing purpose"; + } + + @Override + protected String getVersion() { + return "0.1"; + } + + @Override + protected String getAuthor() { + return "sirjonasxx"; + } +} diff --git a/src/main/protocol/HPacket.java b/src/main/protocol/HPacket.java index 2675b0c..9dc7d6b 100644 --- a/src/main/protocol/HPacket.java +++ b/src/main/protocol/HPacket.java @@ -484,7 +484,7 @@ public class HPacket implements StringifyAble { return isEdited; } - private void fixLength() { + public void fixLength() { boolean remember = isEdited; replaceInt(0, packetInBytes.length - 4); isEdited = remember; diff --git a/src/main/protocol/packethandler/IncomingHandler.java b/src/main/protocol/packethandler/IncomingHandler.java index cf2f064..eb04ca2 100644 --- a/src/main/protocol/packethandler/IncomingHandler.java +++ b/src/main/protocol/packethandler/IncomingHandler.java @@ -38,6 +38,7 @@ public class IncomingHandler extends Handler { if (!hMessage.isBlocked()) { out.write(hMessage.getPacket().toBytes()); + out.flush(); } currentIndex++; } diff --git a/src/main/protocol/packethandler/OutgoingHandler.java b/src/main/protocol/packethandler/OutgoingHandler.java index a5f654b..ef6578d 100644 --- a/src/main/protocol/packethandler/OutgoingHandler.java +++ b/src/main/protocol/packethandler/OutgoingHandler.java @@ -104,6 +104,7 @@ public class OutgoingHandler extends Handler { currentIndex < encryptOffset ? hMessage.getPacket().toBytes() : servercipher.rc4(hMessage.getPacket().toBytes()) ); + out.flush(); } currentIndex ++; } diff --git a/src/main/ui/extensions/GEarthExtension.java b/src/main/ui/extensions/GEarthExtension.java index 21518fc..252ad0a 100644 --- a/src/main/ui/extensions/GEarthExtension.java +++ b/src/main/ui/extensions/GEarthExtension.java @@ -4,6 +4,7 @@ import main.protocol.HMessage; import main.protocol.HPacket; import main.protocol.packethandler.PayloadBuffer; +import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; @@ -30,39 +31,34 @@ public class GEarthExtension { connection.getOutputStream().write((new HPacket(Extensions.OUTGOING_MESSAGES_IDS.INFOREQUEST)).toBytes()); connection.getOutputStream().flush(); - PayloadBuffer payloadBuffer = new PayloadBuffer(); InputStream inputStream = connection.getInputStream(); + DataInputStream dIn = new DataInputStream(inputStream); - outerloop: while (!connection.isClosed()) { - if (inputStream.available() > 0) { - byte[] incoming = new byte[inputStream.available()]; - inputStream.read(incoming); - payloadBuffer.push(incoming); + + int length = dIn.readInt(); + byte[] headerandbody = new byte[length + 4]; + int amountRead = dIn.read(headerandbody, 4, length); + + if (amountRead != length) break; + HPacket packet = new HPacket(headerandbody); + packet.fixLength(); + + if (packet.headerId() == Extensions.INCOMING_MESSAGES_IDS.EXTENSIONINFO) { + GEarthExtension gEarthExtension = new GEarthExtension( + packet.readString(), + packet.readString(), + packet.readString(), + packet.readString(), + connection, + onDisconnectedCallback + ); + callback.act(gEarthExtension); + break; } - - HPacket[] hPackets = payloadBuffer.receive(); - for (HPacket packet : hPackets) { // it should be only one packet - if (packet.headerId() == Extensions.INCOMING_MESSAGES_IDS.EXTENSIONINFO) { - - GEarthExtension gEarthExtension = new GEarthExtension( - packet.readString(), - packet.readString(), - packet.readString(), - packet.readString(), - connection, - onDisconnectedCallback - ); - callback.act(gEarthExtension); - - break outerloop; - } - } - - Thread.sleep(1); } - } catch (IOException | InterruptedException ignored) {} + } catch (IOException ignored) {} }).start(); } @@ -77,29 +73,35 @@ public class GEarthExtension { GEarthExtension selff = this; new Thread(() -> { try { - PayloadBuffer payloadBuffer = new PayloadBuffer(); InputStream inputStream = connection.getInputStream(); + DataInputStream dIn = new DataInputStream(inputStream); while (!connection.isClosed()) { - if (inputStream.available() > 0) { - byte[] incoming = new byte[inputStream.available()]; - inputStream.read(incoming); - payloadBuffer.push(incoming); + int length = dIn.readInt(); + byte[] headerandbody = new byte[length + 4]; + int amountRead = dIn.read(headerandbody, 4, length); + + if (amountRead != length) break; + HPacket packet = new HPacket(headerandbody); + packet.fixLength(); + + for (int i = receiveMessageListeners.size() - 1; i >= 0; i--) { + receiveMessageListeners.get(i).act(packet); } - HPacket[] hPackets = payloadBuffer.receive(); - for (HPacket packet : hPackets) { - for (int i = receiveMessageListeners.size() - 1; i >= 0; i--) { - receiveMessageListeners.get(i).act(packet); - } - } - - Thread.sleep(1); } onDisconnectedCallback.act(selff); - } catch (IOException | InterruptedException e) { + } catch (IOException e) { e.printStackTrace(); + } finally { + if (!connection.isClosed()) { + try { + connection.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } }).start();