From e09bc77d2253058b7fe4c4952ec254d8e5e855a2 Mon Sep 17 00:00:00 2001 From: pk910 Date: Tue, 26 Jul 2011 06:42:18 +0200 Subject: [PATCH] added P10_Server.class.php & recv_server --- Uplink/P10_Server.class.php | 113 ++++++++++++++++++++++++++++++++++++ Uplink/Uplink.class.php | 58 ++++++++++++++++-- main.php | 2 +- 3 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 Uplink/P10_Server.class.php diff --git a/Uplink/P10_Server.class.php b/Uplink/P10_Server.class.php new file mode 100644 index 0000000..a2144cb --- /dev/null +++ b/Uplink/P10_Server.class.php @@ -0,0 +1,113 @@ +name = $name; + $this->numeric = $numeric; + $this->parent_server = $parent_server; + $this->start_time = $start_time; + $this->link_time = $link_time; + $this->description = $description; + + self::$static_servers[$numeric] = $this; + } + + public function disconnectServer($linked_only = false) { + if(!$linked_only) { + if($this->parent_server) { + $this->parent_server->delServer($this); + } + $this->disconnectUsers(); + unset(self::$static_servers[$this->numeric]); + } + foreach($this->servers as $server) { + $server->disconnectServer(); + } + } + + public function disconnectUsers() { + //disconnect all Users connected to the actual Server + } + + public function getNumeric() { + return $this->numeric; + } + + public function addServer($server) { + $this->servers[$server->getNumeric()] = $server; + } + + public function delServer($server) { + if(array_key_exists($server->getNumeric(), $this->servers)) { + unset($this->servers[$server->getNumeric()]); + } else { + trigger_error("Tried to remove a Server, that does NOT exist.", E_USER_WARNING); + } + } +} + +?> \ No newline at end of file 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); + } } } diff --git a/main.php b/main.php index 954aa6b..123ccae 100644 --- a/main.php +++ b/main.php @@ -30,7 +30,7 @@ require_once("Uplink/Uplink.class.php"); //basicly here is nothing, yet :D $uplink = new Uplink(); $uplink->setUplinkHost("localhost", 4402); -$uplink->setUplinkServer(5, "php.local.TestNet", "very_weak_password"); +$uplink->setUplinkServer(5, "php.local.TestNet", "very_weak_password", "Test Server"); while(true) { $uplink->loop(); -- 2.20.1