X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=Uplink%2FUplink.class.php;h=c9de4102de829d949f599e781311dc8db3ae50bf;hb=e09bc77d2253058b7fe4c4952ec254d8e5e855a2;hp=d9ac2211afdaf715f3ec34ab65bda4143a6f4292;hpb=642e5fa114096506072cbc9ef6f16e31eecd7abf;p=PHP-P10.git diff --git a/Uplink/Uplink.class.php b/Uplink/Uplink.class.php index d9ac221..c9de410 100644 --- a/Uplink/Uplink.class.php +++ b/Uplink/Uplink.class.php @@ -27,6 +27,9 @@ ************************************************************************ * accessable methods: * + * void initialize() + * has to be called after the settings have been set. + * * void loop() * loop function that should be calles as many times as possible. * It reads from the socket and BLOCKS the script execution for a @@ -38,7 +41,7 @@ * void setLoopTimeout(int $timeout) * sets the maximum time loop() is blocking the script execution. * - * void setUplinkServer(int $numeric, String $name, String $password) + * void setUplinkServer(int $numeric, String $name, String $password, String $description) * sets the own P10 Server information. * * void setValidateServer(String $name, String $password) @@ -51,8 +54,9 @@ require_once("P10Formatter.class.php"); class Uplink { private $client = new Client(); private $settings = array(); + private $server; - const FLAG_P10SESSION = 0x0001; //connection is in P10 mode (parser relevant) + const FLAG_P10SESSION = 0x0001; //connection is in P10 mode (server is connected) const FLAG_SECURITY_QUIT = 0x0002; //local connection abort because of security issues const FLAG_NOT_CONNECTABLE = 0x0004; //remote server is not connectable private $flags = 0; @@ -61,15 +65,35 @@ class Uplink { $this->setSettings("recv_timeout", 1000); } + public function initialize() { + if($this->server) { + trigger_error("Uplink already initialized.", E_USER_ERROR); + return; + } + $self_numeric = $this->getSetting("numeric"); + $self_name = $this->getSetting("name"); + $self_description = $this->getSetting("description"); + $this->server = new P10_Server($self_name, $self_numeric, null, time(), time(), $self_description); + } + public function loop() { + if($this->server == null) { + trigger_error("Uplink not initialized.", E_USER_ERROR); + return; + } if(!$this->client->connected()) { + if(($this->flags & self::FLAG_P10SESSION)) { + //Server got disconnected + $this->server->disconnectServer(true); + $this->flags &= ~self::FLAG_P10SESSION; + } $host = $this->getSetting("host"); $port = $this->getSetting("port"); if($host == null || $port == null) { - Throw new Exception("Uplink Settings missing."); + trigger_error("Uplink Settings missing.", E_USER_ERROR); return; } - if(($flags & self::FLAG_SECURITY_QUIT) || ($flags & self::FLAG_NOT_CONNECTABLE)) { + if(($this->flags & self::FLAG_SECURITY_QUIT) || ($this->flags & self::FLAG_NOT_CONNECTABLE)) { sleep(1); } $state = $this->client->connect($host, $port, $this->getSettings("bind"), $this->getSettings("ssl"), $this->getSettings("recv_timeout")); @@ -99,10 +123,11 @@ class Uplink { $this->setSetting("recv_timeout", $timeout); } - public function setUplinkServer($numeric, $name, $password) { + public function setUplinkServer($numeric, $name, $password, $description) { $this->setSetting("numeric", Numerics::intToNum($numeric, 2)); $this->setSetting("name", $name); $this->setSetting("password", $password); + $this->setSetting("description", $description); } public function setValidateServer($name, $password) { @@ -128,6 +153,7 @@ class Uplink { if(count($highExplode) > 1) $tokens[] = $highExplode[1]; $cmdPos = (($this->flags & self::FLAG_P10SESSION) ? 1 : 0); + if($tokens[0] == "ERROR") $cmdPos = 0; //override if($cmdPos == 1) $from = $tokens[0]; else $from = null; $arguments = array_slice($tokens, $cmdPos + 1); @@ -180,7 +206,27 @@ class Uplink { } private function recv_server($from, $args) { - + if($from == null) { + //our uplink Server + $their_name = $this->getSetting("their_name"); + if($their_name && $args[0] != $their_name) { + $this->flags |= self::FLAG_SECURITY_QUIT; + $this->send("ERROR", "Invalid Server name"); + $this->client->disconnect(); + return; + } + $new_server = new P10_Server($args[0], substr($args[5],0,2), $this->server, $args[2], $args[3], $args[7]); + $this->server->add_server($new_server); + } else { + //another server got a new slave server ^^ + $server = P10_Server::getServerByNum($from); + if($server == null) { + trigger_error("Parent Server (".$from.") does not exist or was not found on recv_server.", E_USER_ERROR); + return; + } + $new_server = new P10_Server($args[0], substr($args[5],0,2), $server, $args[2], $args[3], $args[7]); + $server->add_server($new_server); + } } }