diff --git a/classes/MinecraftInterface.class.php b/classes/MinecraftInterface.class.php index e7de67a14..ec46dbe6b 100644 --- a/classes/MinecraftInterface.class.php +++ b/classes/MinecraftInterface.class.php @@ -79,7 +79,8 @@ class MinecraftInterface{ }*/ $struct = $this->getStruct($pid); if($struct === false){ - $p = "[".microtime(true)."] [SERVER->CLIENT]: Error, bad packet id 0x".Utils::strToHex(chr($pid)).PHP_EOL; + console("[ERROR] Bad packet id 0x".Utils::strTohex(chr($pid)), true, true, 0); + $p = "[".microtime(true)."] [".((($origin === "client" and $this->client === true) or ($origin === "server" and $this->client === false)) ? "CLIENT->SERVER":"SERVER->CLIENT")." ".$ip.":".$port."]: Error, bad packet id 0x".Utils::strTohex(chr($pid))." [lenght ".strlen($raw)."]".PHP_EOL; $p .= Utils::hexdump($data[0]); $p .= PHP_EOL; logg($p, "packets", true, 2); diff --git a/classes/Session.class.php b/classes/Session.class.php index 77607bdf9..6fe4677ff 100644 --- a/classes/Session.class.php +++ b/classes/Session.class.php @@ -27,7 +27,7 @@ the Free Software Foundation, either version 3 of the License, or class Session{ - protected $server, $serverID; + protected $server, $serverID, $timeout, $eventID, $connected; var $clientID, $ip, $port; function __construct($server, $clientID, $ip, $port){ $this->server = $server; @@ -35,26 +35,46 @@ class Session{ $this->ip = $ip; $this->port = $port; $this->serverID =& $this->server->serverID; + $this->eventID = $this->server->event("onTick", array($this, "checkTimeout")); console("[DEBUG] New Session started with ".$ip.":".$port, true, true, 2); + $this->connected = true; + } + + public function checkTimeout($time){ + if($time > $this->timeout){ + $this->close(); + } + } + + public function close(){ + $this->server->deleteEvent("onTick", $this->eventID); + $this->connected = false; + console("[DEBUG] Session with ".$this->ip.":".$this->port." closed due to timeout", true, true, 2); } public function handle($pid, &$data){ - switch($pid){ - case 0x07: - $this->send(0x08, array( - MAGIC, - $this->serverID, - $this->port, - $data[3], - 0, - )); - break; - case 0x84: - $counter = $data[0]; - $this->send(0xc0, array( - "\x00\x01\x01\x00\x00\x00", - )); - break; + if($this->connected === true){ + $this->timeout = microtime(true) + 25; + switch($pid){ + case 0x07: + $this->send(0x08, array( + MAGIC, + $this->serverID, + $this->port, + $data[3], + 0, + )); + break; + case 0x84: + $counter = $data[0]; + /*$this->send(0xc0, array( + "\x00\x01\x01\x00\x00\x00", + ));*/ + break; + case 0x8c: + $counter = $data[0]; + break; + } } } diff --git a/classes/Utils.class.php b/classes/Utils.class.php index 73a96b8d3..3c944fad5 100644 --- a/classes/Utils.class.php +++ b/classes/Utils.class.php @@ -94,7 +94,7 @@ class Utils{ $c = (string) $c; for($i = 0; $i < 4; ++$i){ $value ^= md5($i . $c . microtime(true), true); - $value ^= substr(sha1($i . $c . microtime(true), true),$i,16); + $value ^= substr(sha1($i . $c . microtime(true), true), $i,16); } } return $value; diff --git a/pstruct/RakNet.php b/pstruct/RakNet.php index 5b463e91f..03eb83d58 100644 --- a/pstruct/RakNet.php +++ b/pstruct/RakNet.php @@ -81,19 +81,21 @@ $pstruct = array( ), 0x84 => array( + "ubyte", "ubyte", "special1", - /*10, - 8, - "double", - "byte", */ ), 0x8c => array( + "ubyte", "ubyte", "special1", ), + 0xa0 => array( + 6, + ), + 0xc0 => array( 6, ), diff --git a/pstruct/packetName.php b/pstruct/packetName.php index 50d0f8adf..98bdb60d9 100644 --- a/pstruct/packetName.php +++ b/pstruct/packetName.php @@ -36,5 +36,6 @@ $packetName = array( 0x1d => "ID_ADVERTISE_SYSTEM", //RakNet 0x84 => "ID_RESERVED_7", //Minecraft Implementation 0x8c => "Unknown", //Minecraft Implementation + 0xa0 => "Unknown", //Minecraft Implementation 0xc0 => "Unknown", //Minecraft Implementation ); \ No newline at end of file