mirror of
https://github.com/sirjonasxx/G-Earth.git
synced 2024-11-23 17:00:52 +01:00
Add HPacket type checks to prevent mistakes
This commit is contained in:
parent
3ec372b5d4
commit
9f28eec447
@ -2,7 +2,7 @@ package gearth.extensions;
|
|||||||
|
|
||||||
import gearth.misc.HostInfo;
|
import gearth.misc.HostInfo;
|
||||||
import gearth.protocol.HPacketFormat;
|
import gearth.protocol.HPacketFormat;
|
||||||
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtensionMessage;
|
import gearth.protocol.connection.packetsafety.PacketTypeChecker;
|
||||||
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtensionMessage.Incoming;
|
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtensionMessage.Incoming;
|
||||||
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtensionMessage.Outgoing;
|
import gearth.services.extension_handler.extensions.implementations.network.NetworkExtensionMessage.Outgoing;
|
||||||
import gearth.services.packet_info.PacketInfoManager;
|
import gearth.services.packet_info.PacketInfoManager;
|
||||||
@ -31,6 +31,11 @@ public abstract class Extension extends ExtensionBase {
|
|||||||
|
|
||||||
private OutputStream out = null;
|
private OutputStream out = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Which client G-Earth is connected to.
|
||||||
|
*/
|
||||||
|
private HClient clientType = null;
|
||||||
|
|
||||||
private String getArgument(String[] args, String... arg) {
|
private String getArgument(String[] args, String... arg) {
|
||||||
for (int i = 0; i < args.length - 1; i++) {
|
for (int i = 0; i < args.length - 1; i++) {
|
||||||
for (String str : arg) {
|
for (String str : arg) {
|
||||||
@ -132,7 +137,7 @@ public abstract class Extension extends ExtensionBase {
|
|||||||
int connectionPort = packet.readInteger();
|
int connectionPort = packet.readInteger();
|
||||||
String hotelVersion = packet.readString();
|
String hotelVersion = packet.readString();
|
||||||
String clientIdentifier = packet.readString();
|
String clientIdentifier = packet.readString();
|
||||||
HClient clientType = HClient.valueOf(packet.readString());
|
clientType = HClient.valueOf(packet.readString());
|
||||||
setPacketInfoManager(PacketInfoManager.readFromPacket(packet));
|
setPacketInfoManager(PacketInfoManager.readFromPacket(packet));
|
||||||
|
|
||||||
Constants.UNITY_PACKETS = clientType == HClient.UNITY;
|
Constants.UNITY_PACKETS = clientType == HClient.UNITY;
|
||||||
@ -231,6 +236,10 @@ public abstract class Extension extends ExtensionBase {
|
|||||||
return send(packet, HMessage.Direction.TOSERVER);
|
return send(packet, HMessage.Direction.TOSERVER);
|
||||||
}
|
}
|
||||||
private boolean send(HPacket packet, HMessage.Direction direction) {
|
private boolean send(HPacket packet, HMessage.Direction direction) {
|
||||||
|
if (clientType == null) return false;
|
||||||
|
|
||||||
|
PacketTypeChecker.ensureValid(clientType, direction, packet);
|
||||||
|
|
||||||
if (packet.isCorrupted()) return false;
|
if (packet.isCorrupted()) return false;
|
||||||
|
|
||||||
if (!packet.isPacketComplete()) packet.completePacket(packetInfoManager);
|
if (!packet.isPacketComplete()) packet.completePacket(packetInfoManager);
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package gearth.protocol.connection;
|
package gearth.protocol.connection;
|
||||||
|
|
||||||
|
import gearth.protocol.HMessage;
|
||||||
import gearth.protocol.HPacket;
|
import gearth.protocol.HPacket;
|
||||||
import gearth.protocol.connection.packetsafety.PacketSafetyManager;
|
import gearth.protocol.connection.packetsafety.PacketSafetyManager;
|
||||||
|
import gearth.protocol.connection.packetsafety.PacketTypeChecker;
|
||||||
import gearth.protocol.connection.packetsafety.SafePacketsContainer;
|
import gearth.protocol.connection.packetsafety.SafePacketsContainer;
|
||||||
import gearth.services.packet_info.PacketInfo;
|
import gearth.services.packet_info.PacketInfo;
|
||||||
import gearth.services.packet_info.PacketInfoManager;
|
import gearth.services.packet_info.PacketInfoManager;
|
||||||
@ -57,6 +59,7 @@ public class HProxy {
|
|||||||
|
|
||||||
public boolean sendToServer(HPacket packet) {
|
public boolean sendToServer(HPacket packet) {
|
||||||
if (outHandler != null) {
|
if (outHandler != null) {
|
||||||
|
PacketTypeChecker.ensureValid(hClient, HMessage.Direction.TOSERVER, packet);
|
||||||
return outHandler.sendToStream(packet.toBytes());
|
return outHandler.sendToStream(packet.toBytes());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -64,6 +67,7 @@ public class HProxy {
|
|||||||
|
|
||||||
public boolean sendToClient(HPacket packet) {
|
public boolean sendToClient(HPacket packet) {
|
||||||
if (inHandler != null) {
|
if (inHandler != null) {
|
||||||
|
PacketTypeChecker.ensureValid(hClient, HMessage.Direction.TOCLIENT, packet);
|
||||||
return inHandler.sendToStream(packet.toBytes());
|
return inHandler.sendToStream(packet.toBytes());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
package gearth.protocol.connection.packetsafety;
|
||||||
|
|
||||||
|
import gearth.protocol.HMessage;
|
||||||
|
import gearth.protocol.HPacket;
|
||||||
|
import gearth.protocol.HPacketFormat;
|
||||||
|
import gearth.protocol.connection.HClient;
|
||||||
|
import gearth.protocol.packethandler.shockwave.packets.ShockPacketIncoming;
|
||||||
|
import gearth.protocol.packethandler.shockwave.packets.ShockPacketOutgoing;
|
||||||
|
|
||||||
|
public class PacketTypeChecker {
|
||||||
|
/**
|
||||||
|
* Ensure that the packet is of the correct type for the client
|
||||||
|
*
|
||||||
|
* @param clientType The client we are sending to.
|
||||||
|
* @param direction The direction of the packet.
|
||||||
|
* @param packet The packet to check.
|
||||||
|
* @throws PacketTypeException If the packet is not of the correct type.
|
||||||
|
*/
|
||||||
|
public static void ensureValid(HClient clientType, HMessage.Direction direction, HPacket packet) {
|
||||||
|
if (clientType == HClient.SHOCKWAVE) {
|
||||||
|
if (direction == HMessage.Direction.TOSERVER && !(packet instanceof ShockPacketOutgoing)) {
|
||||||
|
throw new PacketTypeException(String.format("ShockPacketOutgoing expected for %s", clientType));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (direction == HMessage.Direction.TOCLIENT && !(packet instanceof ShockPacketIncoming)) {
|
||||||
|
throw new PacketTypeException(String.format("ShockPacketIncoming expected for %s", clientType));
|
||||||
|
}
|
||||||
|
} else if (packet.getFormat() != HPacketFormat.EVA_WIRE) {
|
||||||
|
throw new PacketTypeException(String.format("Invalid packet, expected HPacket for %s", clientType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package gearth.protocol.connection.packetsafety;
|
||||||
|
|
||||||
|
public class PacketTypeException extends RuntimeException {
|
||||||
|
public PacketTypeException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user