application/hub/exceptions.php -text
application/hub/exceptions/.htaccess -text
application/hub/exceptions/class_HubException.php -text
-application/hub/exceptions/client/.htaccess -text
-application/hub/exceptions/client/class_HubHelloException.php -text
-application/hub/exceptions/client/class_HubPeerAuthorizationException.php -text
-application/hub/exceptions/client/class_HubPeerTimeoutException.php -text
-application/hub/exceptions/commands/.htaccess -text
-application/hub/exceptions/commands/class_UnexpectedAwaitCommandException.php -text
-application/hub/exceptions/master/.htaccess -text
-application/hub/exceptions/master/class_HubMasterDisconnectedException.php -text
-application/hub/exceptions/socket/.htaccess -text
-application/hub/exceptions/socket/class_SocketException.php -text
-application/hub/exceptions/socket/connector/.htaccess -text
-application/hub/exceptions/socket/connector/class_SocketAcceptException.php -text
-application/hub/exceptions/socket/connector/class_SocketSelectorException.php -text
-application/hub/exceptions/socket/init/.htaccess -text
-application/hub/exceptions/socket/init/class_SocketBindException.php -text
-application/hub/exceptions/socket/init/class_SocketConnectException.php -text
-application/hub/exceptions/socket/init/class_SocketCreationException.php -text
-application/hub/exceptions/socket/init/class_SocketListeningException.php -text
-application/hub/exceptions/socket/init/class_SocketSetupException.php -text
-application/hub/exceptions/socket/peer/.htaccess -text
-application/hub/exceptions/socket/peer/class_BrokenPipeException.php -text
-application/hub/exceptions/socket/peer/class_IPSpoofingException.php -text
-application/hub/exceptions/socket/peer/class_PeerSocketException.php -text
application/hub/init.php -text
application/hub/interfaces/.htaccess -text
application/hub/loader.php -text
application/hub/main/.htaccess -text
-application/hub/main/class_HubCommandProcessor.php -text
-application/hub/main/class_HubConnector.php -text
-application/hub/main/class_HubCoreLoop.php -text
-application/hub/main/class_HubPeer.php -text
application/hub/middleware/.htaccess -text
application/hub/starter.php -text
/chat-server.php -text
/**
* Getter for an instance of this class
*
- * @return $thisInstance An instance of this class
+ * @return $thisInstance An instance of this class
*/
public final static function getInstance () {
// Is the instance there?
/**
* Setter for the version number
*
- * @param $appVersion The application's version number
+ * @param $appVersion The application's version number
* @return void
*/
public final function setAppVersion ($appVersion) {
// Cast and set it
- $appVersion = (string) $appVersion;
- $this->appVersion = $appVersion;
+ $this->appVersion = (string) $appVersion;
}
/**
/**
* Setter for human-readable name
*
- * @param $appName The application's human-readable name
+ * @param $appName The application's human-readable name
* @return void
*/
public final function setAppName ($appName) {
// Cast and set it
- $appName = (string) $appName;
- $this->appName = $appName;
+ $this->appName = (string) $appName;;
}
/**
/**
* Setter for short uni*-like name
*
- * @param $shortName The application's short uni*-like name
+ * @param $shortName The application's short uni*-like name
* @return void
*/
public final function setAppShortName ($shortName) {
// Cast and set it
- $shortName = (string) $shortName;
- $this->shortName = $shortName;
+ $this->shortName = (string) $shortName;
}
/**
* @return void
*/
public final function entryPoint () {
- // Get a core loop instance
- $hubInstance = HubCoreLoop::createHubCoreLoop();
-
- // Output some text
- $hubInstance->outputIntro();
-
- // Contact the master hub
- $hubInstance->contactMasterHub();
-
- // The main loop begins here
- $hubInstance->coreLoop();
-
- // Shutdown the hub
- $hubInstance->shutdownHub();
- }
-
- /**
- * Getter for master template name
- *
- * @return $masterTemplate Name of the master template
- */
- public final function getMasterTemplate () {
- return "hub_main";
+ trigger_error(__METHOD__.": Cleared!");
}
/**
die("MSG:".$message);
}
}
+
+ /**
+ * Builds the master template's name
+ *
+ * @return $masterTemplateName Name of the master template
+ */
+ public function buildMasterTemplateName () {
+ return "hub_main";
+ }
}
// [EOF]
// CFG: WEB-CONTENT-TYPE
$cfg->setConfigEntry("web_content_type", "");
-// CFG: HUB-INTRO-ENABLED
-$cfg->setConfigEntry("hub_intro_enabled", "Y");
-
-// CFG: HUB-MAX-AUTH-TRIES
-$cfg->setConfigEntry("hub_max_auth_tries", 3);
-
-// CFG: HUB-MSG-AUTH-TRIES
-$cfg->setConfigEntry("hub_msg_auth_tries", "AUTH_MAX_TRIES");
-
-// CFG: HUB-MSG-SPOOFING
-$cfg->setConfigEntry("hub_msg_spoofing", "SPOOFING");
-
-// CFG: HUB-MSG-AUTH-REPLY
-$cfg->setConfigEntry("hub_msg_auth_reply_timeout", "TIMEOUT_AUTH");
-
-// CFG: HUB-MSG-BYE
-$cfg->setConfigEntry("hub_msg_bye", "BYE");
-
-// CFG: HUB-MASTER-IP
-$cfg->setConfigEntry("hub_master_ip", "192.168.1.17");
-
-// CFG: HUB-MASTER-PORT
-$cfg->setConfigEntry("hub_master_port", 9060);
-
-// CFG: HUB-AUTH-REQUEST
-$cfg->setConfigEntry("hub_auth_request", "AUTH");
-
-// CFG: HUB-AUTH-REQUEST-TIMEOUT (5 seconds for whole auth procedure shall be fine)
-$cfg->setConfigEntry("hub_auth_request_timeout", 5);
-
-// CFG: HUB-PEER-HELLO
-$cfg->setConfigEntry("hub_peer_hello", "HELLO");
-
-// CFG: HUB-HELLO-REPLY
-$cfg->setConfigEntry("hub_hello_reply", "ELHO");
-
-// CFG: HUB-HELLO-TIMEOUT
-$cfg->setConfigEntry("hub_hello_timeout", 30);
-
-// CFG: HUB-HELLO-RETRIES
-$cfg->setConfigEntry("hub_hello_retires", 3);
-
-// CFG: HUB-PEER-PING
-$cfg->setConfigEntry("hub_peer_ping", "PING");
-
-// CFG: HUB-PING-REPLY
-$cfg->setConfigEntry("hub_ping_reply", "PONG");
-
-// CFG: HUB-PING-TIMEOUT
-$cfg->setConfigEntry("hub_ping_timeout", 10);
-
-// CFG: HUB-PING-MAXDROPS
-$cfg->setConfigEntry("hub_ping_maxdrops", 3);
-
-// CFG: HUB-PEER-MISS-PONG
-$cfg->setConfigEntry("hub_peer_miss_pong", "PONG_MISS");
-
// [EOF]
?>
+++ /dev/null
-Deny from all
+++ /dev/null
-<?php
-/**
- * An exception thrown when the "hello" command was not received
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class HubHelloException extends HubException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Peer <u>%s</u> has not replyed our %s request within %d retries.<br />\n",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['peer']->getValidatedIP(),
- $msgArray['this']->getConfigInstance()->readConfig("hub_peer_hello"),
- $msgArray['this']->getConfigInstance()->readConfig("hub_hello_retires")
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception thrown then hub peer is not authorized
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class HubPeerAuthorizationException extends HubException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Peer <u>%s</u> has reached the maximum of <u>%d</u> authorization tries. Disconnecting peer....<br />\n",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['peer']->getValidatedIP(),
- $msgArray['max']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception when a hub peer has timed out
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class HubPeerTimeoutException extends HubException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Peer <u>%s</u> is no longer responding. Trying to disconnect the peer...<br />\n",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['peer']->getValidatedIP()
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-Deny from all
+++ /dev/null
-<?php
-/**
- * An exception thrown when the received command is unexpected
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class UnexpectedAwaitCommandException extends HubException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Not awaiting command %s from peer %s<br />\n",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['await'],
- $msgArray['this']->getPeerInstance()->getValidatedIP()
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-Deny from all
+++ /dev/null
-<?php
-/**
- * An exception thrown when the master hub has disconnected
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class HubMasterDisconnectedException extends HubException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Raw message received: %s<br />\n",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['msg']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-Deny from all
+++ /dev/null
-<?php
-/**
- * A general socket exception. This shall not be thrown so it defaults to abstract.
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-abstract class SocketException extends HubException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public function __construct ($message, $code) {
- // For now just pipe all data through
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-Deny from all
+++ /dev/null
-<?php
-/**
- * An exception for listening to sockets
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class SocketAcceptException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] socket_accept() has failed. Reason: <u>%s</u> (Code: <u>%d</u>)",
- $msgArray['this']->__toString(),
- $this->getLine(),
- socket_strerror($msgArray['code']),
- $msgArray['code']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception for listening to sockets
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class SocketSelectorException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] socket_select() has failed. Reason: <u>%s</u> (Code: <u>%d</u>)",
- $msgArray['this']->__toString(),
- $this->getLine(),
- socket_strerror($msgArray['code']),
- $msgArray['code']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-Deny from all
+++ /dev/null
-<?php
-/**
- * An exception for socket setup problems
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class SocketBindException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Socket konnte nicht an %s:%d gebunden werden. Reason: <u>%s</u> (Code: <u>%d</u>)",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['host'],
- $msgArray['port'],
- socket_strerror($msgArray['code']),
- $msgArray['code']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception for listening to sockets
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class SocketConnectException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] socket_connect() has failed. Reason: <u>%s</u> (Code: <u>%d</u>)",
- $msgArray['this']->__toString(),
- $this->getLine(),
- socket_strerror($msgArray['code']),
- $msgArray['code']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception for socket creation problems
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class SocketCreationException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Socket konnte nicht erstellt werden. Reason: <u>%s</u> (Code: <u>%d</u>)",
- $msgArray['this']->__toString(),
- $this->getLine(),
- socket_strerror($msgArray['code']),
- $msgArray['code']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception for listening to sockets
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class SocketListeningException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] socket_listen() has failed. Reason: <u>%s</u> (Code: <u>%d</u>)",
- $msgArray['this']->__toString(),
- $this->getLine(),
- socket_strerror($msgArray['code']),
- $msgArray['code']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception for socket setup problems
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class SocketSetupException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Socket konnte nicht konfiguriert werden. Reason: <u>%s</u> (Code: <u>%d</u>)",
- $msgArray['this']->__toString(),
- $this->getLine(),
- socket_strerror($msgArray['code']),
- $msgArray['code']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-Deny from all
+++ /dev/null
-<?php
-/**
- * An exception for client sockets
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class BrokenPipeException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Connection lost to peer <u>%s</u>. Error message: <u>%s</u> (Code: %d)<br />\n",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['this']->getValidatedIP(),
- socket_strerror($msgArray['code']),
- $msgArray['code']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception for spoofed IP numbers (possible!)
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class IPSpoofingException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Peer-IP hat sich von <u>%s</u> auf <u>%s</u> geändert.<br />\n",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['old_ip'],
- $msgArray['new_ip']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * An exception for client sockets
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class PeerSocketException extends SocketException {
- /**
- * The constructor
- *
- * @param $message Message from the exception
- * @param $code Code number for the exception
- * @return void
- */
- public final function __construct (array $msgArray, $code) {
- // Construct the message
- $message = sprintf("[%s:%d] Peer-Socket ist ungültig. Datentyp: <u>%s</u><br />\n",
- $msgArray['this']->__toString(),
- $this->getLine(),
- $msgArray['type']
- );
-
- // Call parent constructor
- parent::__construct($message, $code);
- }
-}
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * A class for handling commands to and from hubs including the master hub
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class HubCommandProcessor extends BaseFrameworkSystem {
- /**
- * An instance of a HubPeer class
- */
- private $peerInstance = null;
-
- /**
- * A list of sent commands but not replied (yet)
- */
- private $sentCommandsAwaitingAnswer = array();
-
- /**
- * Queued commands from the master hub
- */
- private $masterCommands = array();
-
- // Exceptions
- const EXCEPTION_COMMAND_AWAIT_INVALID = 0xc00;
-
- /**
- * The private constructor
- *
- * @return void
- */
- protected function __construct () {
- // Call parent constructor
- parent::__construct(__CLASS__);
-
- // Tidy up a little
- $this->removeSystemArray();
- $this->removeNumberFormaters();
- }
-
- /**
- * Creates an instance of a HubCommandProcessor class by a HubPeer class
- *
- * @param $peerInstance An instance of a HubPeer class
- * @return $command An instance of this class
- */
- public final static function createHubCommandProcessor (HubPeer $peerInstance) {
- // Get a new instance of this class
- $command = new HubCommandProcessor();
-
- // Set the hub instance
- $command->setPeerInstance($peerInstance);
-
- // Return the instance
- return $command;
- }
-
- /**
- * Setter for HubPeer instances
- *
- * @param $peerInstance An instance of a HubPeer class
- * @return void
- */
- public final function setPeerInstance(HubPeer $peerInstance) {
- $this->peerInstance = $peerInstance;
- }
-
- /**
- * Getter for HubPeer instances
- *
- * @return $peerInstance An instance of a HubPeer class
- */
- public final function getPeerInstance() {
- return $this->peerInstance;
- }
-
- /**
- * Handles simple commands which require an answer command from the peer without any parameters
- *
- * @param $sendCommand The command we shall send to the peer
- * @param $expectCommand The command we except from the peer
- * @return void
- */
- public function simpleExecute ($sendCommand, $expectCommand) {
- // Remember the command
- $this->sentCommandsAwaitingAnswer[$expectCommand] = $sendCommand;
-
- // Debug message
- $this->getPeerInstance()->getHubInstance()->getOutputInstance()->output(sprintf("[%s] Sending command %s to peer %s",
- $this->__toString(),
- $sendCommand,
- $this->getPeerInstance()->getValidatedIP()
- ));
-
- // Execute the command
- $this->getPeerInstance()->sendMessage($sendCommand);
- }
-
- /**
- * Awaits a specified command from the peer and returns TRUE if received or FALSE if not.
- *
- * @param $exceptCommand The command we are expecting from the peer
- * @return $await Wether the awaited command has been received
- * @throws UnexpectedAwaitCommandException If the awaited command is not being awaited...
- */
- public function ifAwaitsCommand ($expectCommand) {
- $await = false;
-
- // Do we wait for this command?
- if (!isset($this->sentCommandsAwaitingAnswer[$expectCommand])) {
- // We are not waiting for this command
- throw new UnexpectedAwaitCommandException (
- array(
- 'this' => $this,
- 'await' => $expectCommand
- ), self::EXCEPTION_COMMAND_AWAIT_INVALID
- );
- } // END - if
-
- // Then process it... :-)
- $readCommand = $this->getPeerInstance()->readFromSocket();
-
- // Is the command not empty?
- if (!empty($readCommand)) {
- // Debug message
- $this->getPeerInstance()->getHubInstance()->getOutputInstance()->output(sprintf("[%s] Raw command %s received from peer %s",
- $this->__toString(),
- $readCommand,
- $this->getPeerInstance()->getValidatedIP()
- ));
- } // END - if
-
- if ($readCommand == $expectCommand) {
- // Debug message
- $this->getPeerInstance()->getHubInstance()->getOutputInstance()->output(sprintf("[%s] Awaited command %s received from peer %s",
- $this->__toString(),
- $expectCommand,
- $this->getPeerInstance()->getValidatedIP()
- ));
-
- // Expected command has been received!
- unset($this->sentCommandsAwaitingAnswer[$expectCommand]);
- $await = true;
-
- } // END - if
-
- // Return the result
- return $await;
- }
-
- /**
- * Awaits any command from the peer
- *
- * @return $command The sent command from the peer
- */
- public function awaitAnyCommand () {
- $command = false;
- $readCommand = $this->getPeerInstance()->readFromSocket();
- if (!empty($readCommand)) {
- // Remember this command
- // TODO Add some validation here!
- $this->masterCommands[] = $readCommand;
-
- // A command is in the queue
- $command = true;
- } // END - if
-
- // Return status
- return $command;
- }
-
-} // END - class
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * A class for making socket connections to other hubs including the master hub
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class HubConnector extends BaseFrameworkSystem {
- /**
- * The socket we shall use for communication
- */
- private $socketResource = null;
-
- /**
- * The peer instance (HubPeer class)
- */
- private $peerInstance = null;
-
- /**
- * The private constructor
- *
- * @return void
- */
- protected function __construct () {
- // Call parent constructor
- parent::__construct(__CLASS__);
-
- // Tidy up a little
- $this->removeSystemArray();
- $this->removeNumberFormaters();
- }
-
- /**
- * Creates an instance based on the (IP) address and port number of this
- * class. Next it tries to connect to the specified peer and communicates
- * to it over a socket
- *
- * @param $address The peer's IP address
- * @param $port The peer's port number
- * @param $hubInstance An instance of a HubCoreLoop class
- * @return $connector An instance of this class
- * @throws HubHelloException If HELLO retries reached maximum
- */
- public final static function createHubConnectorByAddressPort ($address, $port, HubCoreLoop $hubInstance) {
- // Get a new instance of this class
- $connector = new HubConnector();
-
- // Connect to the given address and IP number
- $connector->aquireConnectionToAddress($address, $port);
-
- // Message to console
- $hubInstance->getOutputInstance()->output(sprintf("[%s] Sending %s request to hub %s:%d...",
- __METHOD__,
- $connector->getConfigInstance()->readConfig("hub_peer_hello"),
- $address,
- $port
- ));
-
- // Get a HubPeer instance
- $peerInstance = HubPeer::createHubPeerBySocket($connector->getSocketResource(), $hubInstance);
-
- // Send a HELLO to the master hub
- $helloed = 0; $retries = 0;
- while (!$peerInstance->ifHelloReplied()) {
- // Within timeout?
- if ((time() - $helloed) >= $connector->getConfigInstance()->readConfig("hub_hello_timeout")) {
- // Send HELLOs out in periodic times
- $peerInstance->sendMessage($connector->getConfigInstance()->readConfig("hub_peer_hello"));
- $helloed = time(); $retries++;
- if ($retries == $connector->getConfigInstance()->readConfig("hub_hello_retires")) {
- // Maximum retries reached
- throw new HubHelloException(
- array(
- 'this' => $connector,
- 'peer' => $peerInstance
- ), HubCoreLoop::EXCEPTION_HELLO_TIMED_OUT
- );
- }
- } // END - if
- } // END - while
-
- // Set the peer instance
- $connector->setPeerInstance($peerInstance);
-
- // Return the instance
- return $connector;
- }
-
- /**
- * Aquires a socket link to a specified IP address and port number. It
- * throws subclasses of SocketException-s if the peer is down or not
- * responding. If the connection is up it writes it's resource into
- * the attribute $socketResource and waits for incoming data packages.
- *
- * @param $address The peer's IP address
- * @param $port The peer's port number
- * @return void
- * @throws SocketCreationException If creation of the socket wents wrong
- * @throws SocketConnectException If the connection was not established
- */
- public function aquireConnectionToAddress ($address, $port) {
- // Create a socket for binding to the address
- $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
-
- // Was it a success?
- if (!is_resource($socket)) {
- // This fails! :(
- throw new SocketCreationException(
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), HubCoreLoop::EXCEPTION_SOCKET_PROBLEM
- );
- } // END - fi
-
- // Now connect to the peer
- if (@socket_connect($socket, $address, $port) === false) {
- // Something wents wrong!
- throw new SocketConnectException (
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), HubCoreLoop::EXCEPTION_SOCKET_PROBLEM
- );
- } // END - if
-
- // Set non-blocking mode
- @socket_set_nonblock($socket);
-
- // Set the socket
- $this->socketResource = $socket;
- }
-
- /**
- * Getter for current socket
- *
- * @return $socketResource The current socket resource or null if not set
- */
- public final function getSocketResource() {
- return $this->socketResource;
- }
-
- /**
- * Setter for a HubPeer instance
- *
- * @param $peerInstance An instance of a HubPeer class
- * @return void
- */
- public final function setPeerInstance (HubPeer $peerInstance) {
- $this->peerInstance = $peerInstance;
- }
-
- /**
- * Handles any incoming master requests
- *
- * @return void
- */
- public function handleMasterRequests () {
- // Just ask the peer instance
- $command = $this->peerInstance->handleMasterRequests();
- }
-
-} // END - class
-?>
+++ /dev/null
-<?php
-/**
- * The hub's main loop. The hub will wait and listen for incoming requests in
- * this loop.
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class HubCoreLoop extends BaseFrameworkSystem {
- /**
- * Wether the hub is active and running
- */
- private $hubActivated = false;
-
- /**
- * Wether the hub is shutting down
- */
- private $hubShutsDown = false;
-
- /**
- * A list of all connected peers (sockets)
- */
- private $connectedPeers = null;
-
- /**
- * A console output handler
- */
- private $outputInstance = null;
-
- /**
- * Reading peers
- */
- private $readPeers = array();
-
- /**
- * Writing peers
- */
- private $writePeers = array();
-
- /**
- * The main socket (listening) for this hub
- */
- private $main_socket = null;
-
- /**
- * A list of authenticated peers
- */
- private $authPeers = null;
-
- /**
- * Last peer instance
- */
- private $lastPeerInstance = null;
-
- /**
- * Wether this hub is a master hub
- */
- private $hubIsMaster = false;
-
- /**
- * Maximum auth retries (cached)
- */
- private $authRetries = 0;
-
- /**
- * Auth request message
- */
- private $authRequest = "";
-
- /**
- * Cached timeout for auth requests
- */
- private $authRequestTimeout = 0;
-
- /**
- * An instance to the HubConnector class for master hub connection
- */
- private $masterConnector = null;
-
- // Exception codes
- const EXCEPTION_SOCKET_PROBLEM = 0xb00;
- const EXCEPTION_HUB_PEER_TIMEOUT = 0xb01;
- const EXCEPTION_HUB_PEER_FAILED_AUTH = 0xb02;
- const EXCEPTION_HELLO_TIMED_OUT = 0xb03;
-
- /**
- * The private constructor
- *
- * @return void
- */
- protected function __construct () {
- // Call parent constructor
- parent::__construct(__CLASS__);
-
- // Tidy up a little
- $this->removeSystemArray();
- $this->removeNumberFormaters();
-
- // Init the peer list
- $this->initPeerList();
- }
-
- /**
- * Factory for main loop
- *
- * @return $hubInstance An instance of this class
- */
- public final static function createHubCoreLoop () {
- // Get an instance
- $hubInstance = new HubCoreLoop();
-
- // Try to setup the socket
- $hubInstance->setupHub();
-
- // Get the configuration variable
- $outEngine = $hubInstance->getConfigInstance()->readConfig("tpl_engine");
-
- // Setup the console output handler
- $eval = sprintf("\$hubInstance->setOutputInstance(%s::create%s(\"%s\"));",
- $outEngine,
- $outEngine,
- $hubInstance->getConfigInstance()->readConfig("web_content_type")
- );
-
- // Debug message
- if ((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) $hubInstance->getDebugInstance()->output(sprintf("[%s:] Konstruierte PHP-Anweisung: %s",
- $hubInstance->__toString(),
- htmlentities($eval)
- ));
- @eval($eval);
-
- // Return the prepared instance
- return $hubInstance;
- }
-
- /**
- * Initializes the peer list
- *
- * @return void
- */
- private final function initPeerList () {
- $this->connectedPeers = new FrameworkArrayObject("FakedConnectedPeers");
- $this->authPeers = new FrameworkArrayObject("FakeAuthPeers");
- }
-
- /**
- * Get total number of connected peers
- *
- * @return $num The total number of connected peers
- */
- private final function getTotalConnectedPeers () {
- $read = array($this->connectedPeers->getIterator()->current());
- $write = array();
- $except = array();
-
- // Get socket number
- $num = socket_select(
- $read,
- $write,
- $except,
- 0
- );
-
- // Transfer readers and writers
- $this->readPeers = $read;
- $this->writePeers = $write;
-
- // Return the number
- return $num;
- }
-
- /**
- * Handle newly connected peers
- *
- * @return void
- */
- private final function handleNewPeers () {
- // Output message
- $this->getOutputInstance()->output(sprintf("[%s] Validating peer...", __METHOD__));
-
- // Is the main socket in the array?
- if (in_array($this->main_socket, $this->readPeers)) {
- // Accept the connection and add him to the list
- $peer_socket = socket_accept($this->main_socket);
-
- // Get a new peer instance
- $this->setCurrPeerInstance(HubPeer::createHubPeerBySocket($peer_socket, $this));
-
- // Register the new peer
- $this->getOutputInstance()->output(sprintf("[%s] Registering new peer with IP %s.",
- __METHOD__,
- $this->getCurrPeerInstance()->getValidatedIP()
- ));
- $this->connectedPeers->append($this->lastPeerInstance);
-
- // A new peer has connected
- $this->getOutputInstance()->output(sprintf("[%s] New peer with IP %s has been registered.",
- __METHOD__,
- $this->getCurrPeerInstance()->getValidatedIP()
- ));
-
- // Remove him from the list
- $key = array_search($this->main_socket, $this->readPeers);
- unset($this->readPeers[$key]);
- } // END - if
- }
-
- /**
- * Handles unauthenticated peers
- *
- * @return void
- * @throws HubPeerTimeoutException If the peer times out to answer a request
- * @throws HubPeerAuthorizationException If the peer fails to authorize himself (to many retries)
- */
- private final function handleUnauthPeers () {
- // Are there some peers?
- if ($this->connectedPeers->count() > 1) {
- // Iterate through all connected peers
- for ($idx = $this->connectedPeers->getIterator(); $idx->valid(); $idx->next()) {
- // Get current peer
- $this->lastPeerInstance = $idx->current();
-
- // Ignore own socket and invalid entries
- if (($this->getCurrPeerInstance() !== $this->main_socket) && (is_object($this->getCurrPeerInstance())) && ($this->getCurrPeerInstance() instanceof HubPeer)) {
- // Is this peer already authorized or is this the master hub?
- // If this is the master hub then there is no auth required
- if ((!$this->getCurrPeerInstance()->ifPeerIsAuthorized()) && (!$this->getCurrPeerInstance()->ifPeerIsLocalAdmin()) && (!$this->hubIsMaster)) {
- // This peer waits for authorization, so does he have some tries left?
- if ($this->getCurrPeerInstance()->getAuthRetries() <= $this->authRetries) {
- // This peer is still allowed to try his authorization
- if ($this->getCurrPeerInstance()->getLastSentMessage() == $this->authRequest) {
- // Already asked so maybe timed out?
- if ((time() - $this->getCurrPeerInstance()->getLastSentMessageStamp()) >= $this->authRequestTimeout) {
- // Timed out so disconnect the peer
- throw new HubPeerTimeoutException (
- array(
- 'this' => $this,
- 'peer' => $this->getCurrPeerInstance()
- ), self::EXCEPTION_HUB_PEER_TIMEOUT
- );
- } // END - if
- } elseif ($this->getCurrPeerInstance()->ifHelloReceived()) {
- // HELLO received so we need to sent the AUTH request
- $this->getCurrPeerInstance()->askAuthorizationKey();
- }
- } else {
- // This peer needs disconnecting!
- throw new HubPeerAuthorizationException (
- array(
- 'this' => $this,
- 'peer' => $this->getCurrPeerInstance(),
- 'max' => $this->authRetries
- ), self::EXCEPTION_HUB_PEER_FAILED_AUTH
- );
- } // END - else
- } elseif ((!$this->getCurrPeerInstance()->ifPeerIsAuthorized()) && ($this->getCurrPeerInstance()->ifPeerIsLocalAdmin())) {
- // This peer is a local admin so he is always authorized!
- $this->getCurrPeerInstance()->enableLocalAdmin();
-
- // Output debug message
- $this->getOutputInstance()->output(sprintf("[%s] A local admin has connected.",
- $this->__toString()
- ));
-
- // Say "hi" to the admin
- $this->getCurrPeerInstance()->sayHi2Admin();
- } elseif (($this->hubIsMaster) && ($this->getCurrPeerInstance()->ifHelloReceived()) && (!$this->getCurrPeerInstance()->ifELHOsent())) {
- // Is the master hub so authorize the peer here...
- $this->getCurrPeerInstance()->enableIsAuthorized();
- $this->authPeers->append($this->getCurrPeerInstance());
-
- // Reply the HELLO request
- $this->getCurrPeerInstance()->replyHelloMessage();
- }
- } // END - if
- } // END - for
- } // END - if
- }
-
- /**
- * Handles only authorized peers
- *
- * @return void
- */
- public function handleAuthPeers () {
- // Are there some peers?
- if (($this->connectedPeers->count() > 1) && ($this->authPeers->count() > 0)) {
- // Iterate through all connected peers
- for ($idx = $this->authPeers->getIterator(); $idx->valid(); $idx->next()) {
- // Get current peer
- $this->lastPeerInstance = $idx->current();
-
- // Do the ping and update our authPeer list (LATER!)
- $this->lastPeerInstance->handlePingPeer();
-
- // Avoids a notice...
- if (is_null($this->getCurrPeerInstance())) break;
- } // END - for
- } // END - for
- }
-
- /**
- * Setup the hub: Create a socket for listening on incoming requests,
- * try to bind to a port, etc.
- *
- * @return void
- * @throws SocketCreationException If a socket cannot be created
- * @throws SocketSetupException If a socket cannot be setuped
- * @throws SocketBindException If a socket cannot be bind to
- * an address and port
- * @throws SocketListeningException If listening to a socket fails
- */
- private final function setupHub () {
- // Create a new TCP socket
- $main_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
-
- // Was it a success?
- if (!is_resource($main_socket)) {
- // This fails! :(
- throw new SocketCreationException(
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), self::EXCEPTION_SOCKET_PROBLEM
- );
- }
-
- // Set socket options
- if (!socket_set_option($main_socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
- // Close the socket
- $this->closeSocket($main_socket);
-
- // Problems setting socket options
- throw new SocketSetupException (
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), self::EXCEPTION_SOCKET_PROBLEM
- );
- }
-
- // Set to non-blocking
- socket_set_nonblock($main_socket);
-
- // Bind the socket to an address
- if (!socket_bind($main_socket, $this->getConfigInstance()->readConfig("hub_listen_addr"), $this->getConfigInstance()->readConfig("hub_listen_port"))) {
- // Bind failed
- throw new SocketBindException (
- array(
- 'this' => $this,
- 'host' => $this->getConfigInstance()->readConfig("hub_listen_addr"),
- 'port' => $this->getConfigInstance()->readConfig("hub_listen_port"),
- 'code' => socket_last_error()
- ), self::EXCEPTION_SOCKET_PROBLEM
- );
- }
-
- // Listen to ... the socket ;-)
- if (!socket_listen($main_socket)) {
- // Opps, that didn't work. Next time better listen to your heart... Roxette
- throw new SocketListeningException(
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), self::EXCEPTION_SOCKET_PROBLEM
- );
- }
-
- // Ignore user abort and do not time out
- @set_time_limit(0);
- @ignore_user_abort(true);
-
- // Cache more configuration stuff
- $this->authRetries = $this->getConfigInstance()->readConfig("hub_max_auth_tries");
- $this->authRequest = $this->getConfigInstance()->readConfig("hub_auth_request");
- $this->authRequestTimeout = $this->getConfigInstance()->readConfig("hub_auth_request_timeout");
-
- // The hub is running now!
- $this->hubActivated = true;
-
- // Append the main hub
- $this->main_socket = $main_socket;
- $this->connectedPeers->append($main_socket);
- }
-
- /**
- * Removes the current peer from the list
- *
- * @return void
- */
- public final function removePeerFromConnectList () {
- // Iterate through all connected peers
- for ($idx = $this->connectedPeers->getIterator(); $idx->valid(); $idx->next()) {
- // Get current peer from list
- $peer = $idx->current();
-
- // Is it a peer instance?
- if (($peer !== $this->main_socket) && (is_object($peer)) && ($peer instanceof HubPeer)) {
- // Okay, we have a peer instance so is it the same?
- if ($this->getCurrPeerInstance()->equals($peer)) {
- // Remove him!
- $idx->offsetUnset($idx->key());
-
- // Remove the last instance as well
- $this->lastPeerInstance = null;
-
- // Remove the socket as well
- $this->removeSocket($peer);
-
- // Stop searching here
- break;
- }
- }
- }
- }
-
- /**
- * Getter for console output handler
- *
- * @return $outputInstance An instance of the output handler
- */
- public final function getOutputInstance () {
- return $this->outputInstance;
- }
-
- /**
- * Setter for console output handler
- *
- * @param $outputInstance An instance of the output handler
- */
- public final function setOutputInstance ($outputInstance) {
- $this->outputInstance = $outputInstance;
- }
-
- /**
- * Getter for current peer instance to HubPeer class
- *
- * @return $lastPeerInstance Last peer instance
- */
- public final function getCurrPeerInstance () {
- return $this->lastPeerInstance;
- }
-
- /**
- * Setter for current peer instance to HubPeer class
- *
- * @param $lastPeerInstance Last peer instance
- * @return void
- */
- public final function setCurrPeerInstance (HubPeer $lastPeerInstance) {
- $this->lastPeerInstance = $lastPeerInstance;
- }
-
- /**
- * Checks wether the hub is running and not in shutdown phase
- *
- * @return $isRunning If the hub is running and not in shutdown phase
- */
- public function ifHubIsRunning () {
- return ((($this->hubActivated) || (!$this->hubShutsDown)) && ($this->connectedPeers->count() > 0));
- }
-
- /**
- * Output the intro text
- *
- * @return void
- */
- public final function outputIntro () {
- if ($this->getConfigInstance()->readConfig("hub_intro_enabled") == "Y") {
- // Output intro text
- $this->getOutputInstance()->output(sprintf("%s v%s Copyright (c) 2007, 2008 by Roland Häder",
- ApplicationHelper::getInstance()->getAppName(),
- ApplicationHelper::getInstance()->getAppVersion()
- ));
- $this->getOutputInstance()->output("");
- $this->getOutputInstance()->output("This software is free software licensed under the GNU GPL. In telnet session enter "/license" to read the license.");
- $this->getOutputInstance()->output("This software uses the MXChange Framework, Copyright (c) 2007, 2008 by Roland Häder which is licensed under the GNU GPL.");
- $this->getOutputInstance()->output("Enter "/framework" in telnet session to read that license.");
- $this->getOutputInstance()->output("");
- $this->getOutputInstance()->output("All core systems are initialized. Input on *this* console will currently be ignored!");
- $this->getOutputInstance()->output("");
- $this->getOutputInstance()->output(sprintf("[%s] Listening on: %s:%d",
- $this->__toString(),
- $this->getConfigInstance()->readConfig("hub_listen_addr"),
- $this->getConfigInstance()->readConfig("hub_listen_port")
- ));
- $this->getOutputInstance()->output("----------------------------------------------------------------------------------------------------------------------------");
- }
- }
-
- /**
- * Do the main loop
- *
- * @return void
- * @throws SocketCreationException If the main socket is not a resource
- */
- public function coreLoop () {
- // Is the main socket vailid?
- if (!is_resource($this->main_socket)) {
- // Is not valid!
- throw new SocketCreationException(
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), self::EXCEPTION_SOCKET_PROBLEM
- );
- } // END - if
-
- // We are ready to serve requests
- $this->getOutputInstance()->output(sprintf("[%s] Ready to serve requests.",
- $this->__toString()
- ));
-
- // Wait until the hub is shutting down
- while ($this->ifHubIsRunning()) {
- // Get number of total connected peers
- $num = $this->getTotalConnectedPeers();
-
- try {
- // Handle the master hub connection
- if ($this->masterConnector instanceof HubConnector) {
- $this->masterConnector->handleMasterRequests();
- }
-
- // Check for unauthorized peers
- $this->handleUnauthPeers();
-
- // Handle authorized peers
- $this->handleAuthPeers();
- } catch (HubPeerAuthorizationException $e) {
- // Authorization has failed
- $this->disconnectPeerWithReason("hub_msg_auth_tries");
-
- // Get new total connected peers
- $num = $this->getTotalConnectedPeers();
- } catch (HubPeerTimeoutException $e) {
- // Disconnect and remove the peer
- $this->disconnectPeerWithReason("hub_msg_auth_reply_timeout");
-
- // Get new total connected peers
- $num = $this->getTotalConnectedPeers();
- } catch (HubMasterDisconnectedException $e) {
- // The master hub has disconnected us... :(
- $this->masterConnector = null;
- $this->getOutputInstance()->output(sprintf("[%s] The master has disconnected us. Reason given: %s",
- $this->__toString(),
- $e->getMessage()
- ));
-
- // Get new total connected peers
- $num = $this->getTotalConnectedPeers();
- } catch (BrokenPipeException $e) {
- // Broken pipes are bad for us... :(
- $this->removePeerFromConnectList();
- $this->getOutputInstance()->output(sprintf("[%s] A peer has closed the connection unexpected: %s",
- $this->__toString(),
- $e->getMessage()
- ));
-
- // Get new total connected peers
- $num = $this->getTotalConnectedPeers();
- } catch (FrameworkException $e) {
- // Catch all other exceptions and output them
- hub_exception_handler($e);
-
- // Get new total connected peers
- $num = $this->getTotalConnectedPeers();
- }
-
- // Are there some peers?
- if ($num < 1) {
- // Wait for more peers
- continue;
- } // END - if
-
- // A new peer has connected
- $this->getOutputInstance()->output(sprintf("[%s] A new peer is connecting.",
- $this->__toString()
- ));
-
- try {
- // Check for new peers
- $this->handleNewPeers();
- } catch (IPSpoofingException $e) {
- // Output message
- $this->getOutputInstance()->output(sprintf("[%s] The peer's IP number has changed!",
- $this->__toString()
- ));
-
- // Output debug message
- $this->getDebugInstance()->output(sprintf("[%s] Peer spoofes IP number: %s",
- $this->__toString(),
- $e->getMessage()
- ));
-
- // Disconnect the peer first
- $this->disconnectPeerWithReason("hub_msg_spoofing");
-
- // Get new total connected peers
- $num = $this->getTotalConnectedPeers();
- } catch (FrameworkException $e) {
- // Catch all exceptions and output them to avoid aborting the program unexpectly
- hub_exception_handler($e);
-
- // Get new total connected peers
- $num = $this->getTotalConnectedPeers();
- }
-
- } // END - while
- }
-
- /**
- * Tries to contact the master server or simply reports that we are the master server
- *
- * @return void
- */
- public function contactMasterHub () {
- // Checks wether we are the master hub
- if ($_SERVER['SERVER_ADDR'] == $this->getConfigInstance()->readConfig("hub_master_ip")) {
- // We are master!
- $this->hubIsMaster = true;
- $this->getOutputInstance()->output(sprintf("[%s] Our IP %s matches the master IP. Becoming master hub...",
- $this->__toString(),
- $_SERVER['SERVER_ADDR']
- ));
- } else {
- // A regular hub or ultra hub so let's contact the master
- $this->getOutputInstance()->output(sprintf("[%s] Contacting the master hub at %s:%d...",
- $this->__toString(),
- $this->getConfigInstance()->readConfig("hub_master_ip"),
- $this->getConfigInstance()->readConfig("hub_master_port")
- ));
-
- // Try to aquire a connection to the master...
- try {
- // Announce us to the master hub
- $this->announceToMasterHub();
- } catch (FrameworkException $e) {
- // Catch all exceptions and output them
- hub_exception_handler($e);
- }
- } // END - else
- }
-
- /**
- * Disconnects the current with a configurable reason
- *
- * @param $reasonEntry The entry with the disconnection reason aka. message to the peer
- * @return void
- */
- public function disconnectPeerWithReason ($reasonEntry) {
- // Default is that we cannot read the peer's IP number
- $ip = "0.0.0.0";
-
- // Try to disconnect here
- try {
- // First get the raw IP number
- $ip = $this->getCurrPeerInstance()->getValidatedIP();
-
- // Disconnect the peer...
- $this->getCurrPeerInstance()->disconnectWithReason($this->getConfigInstance()->readConfig($reasonEntry));
- } catch (FrameworkException $e) {
- // Catch all exceptions and output them
- hub_exception_handler($e);
- }
-
- // Remove him from the list anyway
- $this->removePeerFromConnectList();
-
- // Output the message
- $this->getOutputInstance()->output(sprintf("[%s] Peer %s has been disconnected.",
- $this->__toString(),
- $ip
- ));
- }
-
- /**
- * Announces this hub to the master hub. This is being done by connecting to it and asking for auth request
- *
- * @return void
- */
- public function announceToMasterHub () {
- try {
- // Create a new instance for communicating to the master hub
- $this->masterConnector = HubConnector::createHubConnectorByAddressPort(
- $this->getConfigInstance()->readConfig("hub_master_ip"),
- $this->getConfigInstance()->readConfig("hub_master_port"),
- $this
- );
-
- // Send all our accepted objects to the master hub
- $this->masterConnector->sendAllAcceptedObjects();
- } catch (SocketConnectException $e) {
- // The master hub is down!
- ApplicationEntryPoint::app_die($e->getMessage());
- }
- }
-
- /**
- * Removes a given peer instance (socket) from all lists
- *
- * @param $peerInstance An instance of a HubPeer class
- * @return void
- */
- private function removeSocket (HubPeer $peerInstance) {
- // Get socket from peer
- $socket = $peerInstance->getPeerSocket();
-
- // Search for readers
- $key = array_search($socket, $this->readPeers, true);
- if ($key !== false) {
- // Remove from reader list
- unset($this->readPeers[$key]);
- }
-
- // Search for writers
- $key = array_search($socket, $this->writePeers, true);
- if ($key !== false) {
- // Remove from writer list
- unset($this->writePeers[$key]);
- }
-
- // Remove from auth peers as well
- for ($idx = $this->authPeers->getIterator(); $idx->valid(); $idx->next()) {
- // Get current entry
- $current = $idx->current();
-
- // Is it the same?
- if ($current->equals($peerInstance)) {
- // Remove from auth (-awaiting) list
- $idx->offsetUnset($idx->key());
- break;
- }
- }
- }
-
-} // END - class
-
-// [EOF]
-?>
+++ /dev/null
-<?php
-/**
- * A hub peer class for communicating with the hub peer
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @version 0.0
- * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license GNU GPL 3.0 or any newer version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class HubPeer extends BaseFrameworkSystem {
- /**
- * This peer's socket resource
- */
- private $peerSocket = null;
-
- /**
- * Timestamp for connection
- */
- private $connectTime = 0;
-
- /**
- * Timestamp of last received message
- */
- private $lastReceivedMessageStamp = 0;
-
- /**
- * Last received message
- */
- private $lastReceivedMessage = "";
-
- /**
- * Timestamp of last sent message
- */
- private $lastSentMessageStamp = 0;
-
- /**
- * Last sent message
- */
- private $lastSentMessage = "";
-
- /**
- * Number of tries for authorization
- */
- private $authRetries = 0;
-
- /**
- * Wether the peer is authorized (DO NEVER SET THIS TO "true"!)
- */
- private $isAuthorized = false;
-
- /**
- * Wether this peer needs to be requested for the AUTH command
- */
- private $needAuthRequest = true;
-
- /**
- * The peer's IP number
- */
- private static $peerIP = "0.0.0.0";
-
- /**
- * Wether the peer has "hello-ed" to the other
- */
- private $helloSent = false;
-
- /**
- * Wether the peer has replied our HELLO
- */
- private $helloReplied = false;
-
- /**
- * Wether we have sent our ELHO
- */
- private $elhoSent = false;
-
- /**
- * An instance of HubCoreLoop
- */
- private $hubInstance = null;
-
- /**
- * When the last ping was
- */
- private $lastPinged = 0;
-
- /**
- * When the last pong was
- */
- private $lastPonged = 0;
-
- /**
- * Number of missing pongs from the other peer
- */
- private $missingPongs = 0;
-
- /**
- * An instance of a HubCommandProcessor class
- */
- private $commandInstance = null;
-
- /**
- * A queue for reading data in non-blocking mode
- */
- private $queues = "";
-
- /**
- * Line ends
- */
- const LINE_END = "\n";
-
- //----------------------------------------------------------
- // Exceptions
- //----------------------------------------------------------
- const EXCEPTION_PEER_SOCKET_INVALID = 0x200;
- const EXCEPTION_PEER_IP_CHANGED = 0x201;
- const EXCEPTION_PEER_SOCKET_BROKEN = 0x202;
- //----------------------------------------------------------
-
- /**
- * The private constructor
- */
- protected function __construct () {
- // Call parent constructor
- parent::__construct(__CLASS__);
-
- // Tidy up a little
- $this->removeSystemArray();
- $this->removeNumberFormaters();
-
- // Get a command processor
- $this->commandInstance = HubCommandProcessor::createHubCommandProcessor($this);
- }
-
- /**
- * Creates an instance of a HubPeer by a provided valid socket resource
- *
- * @param $peerSocket The socket resource for the peer
- * @param $hubInstance An instance of HubCoreLoop
- * @return $peerInstance An instance of HubPeer
- */
- public final static function createHubPeerBySocket ($peerSocket, HubCoreLoop $hubInstance) {
- // Get a new instance
- $peerInstance = new HubPeer();
-
- // Is the peer socket fine?
- if (!is_resource($peerSocket)) {
- // There is a problem with the socket
- throw new PeerSocketException (
- array(
- 'this' => $peerInstance,
- 'type' => gettype($peerSocket)
- ), self::EXCEPTION_PEER_SOCKET_INVALID
- );
- }
-
- // Set the socket
- $peerInstance->setPeerSocket($peerSocket);
-
- // Set connection timestamp
- $peerInstance->setConnectionTimestamp();
-
- // Set the hub instance
- $peerInstance->setHubInstance($hubInstance);
-
- // Return the instance
- return $peerInstance;
- }
-
- //----------------------------------------------------------
- // Public getter/setter
- //----------------------------------------------------------
-
- /**
- * Setter for peer socket
- *
- * @param $peerSocket The peer's socket
- * @return void
- */
- public final function setPeerSocket ($peerSocket) {
- if (is_resource($peerSocket)) {
- $this->peerSocket = $peerSocket;
- } else {
- $this->peerSocket = null;
- }
- }
-
- /**
- * Getter for peer socket
- *
- * @return $peerSocket The peer's socket
- */
- public final function getPeerSocket () {
- return $this->peerSocket;
- }
-
- /**
- * Setter for connection timestamp only once
- *
- * @return void
- */
- public final function setConnectionTimestamp () {
- if ($this->connectTime == 0) $this->connectTime = time();
- }
-
- /**
- * Getter for a raw IP number
- *
- * @return $ip The peer's IP number
- * @throws BrokenPipeException If a socket has lost its connection to the peer
- */
- public final function getRawIP () {
- if (is_resource($this->peerSocket)) {
- // Get IP from socket
- @socket_getpeername($this->peerSocket, $ip);
-
- // Connection problems?
- if (socket_last_error() > 0) {
- // Throw an exception
- throw new BrokenPipeException(
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), self::EXCEPTION_PEER_SOCKET_BROKEN
- );
- }
- } else {
- // Without a socket we cannot determine the right IP
- $ip = "0.0.0.0";
- }
-
- // And return it...
- return $ip;
- }
-
- /**
- * Getter for a validated peer IP
- *
- * @return $peerIP The peer's IP number
- */
- public final function getValidatedIP() {
- // Is the socket valid and IP not set?
- if ((is_resource($this->peerSocket)) && (socket_last_error() == 0) && (self::$peerIP == "0.0.0.0")) {
- // Get peer's IP number
- self::$peerIP = $this->getRawIP();
- } elseif ((is_resource($this->peerSocket)) && (socket_last_error() == 0)) {
- // Get current raw IP number for validation
- $ip = $this->getRawIP();
-
- // Check if the IP has changed
- if ($ip !== self::$peerIP) {
- // The IP number has changed!
- throw new IPSpoofingException(
- array(
- 'this' => $this,
- 'old_ip' => self::$peerIP,
- 'new_ip' => $ip
- ), self::EXCEPTION_PEER_IP_CHANGED
- );
- }
- }
-
- return self::$peerIP;
- }
-
- /**
- * Getter for number of authorization tries
- * @return $authRetries Authorization tries
- */
- public final function getAuthRetries () {
- return $this->authRetries;
- }
-
- //----------------------------------------------------------
- // Public methods
- //----------------------------------------------------------
-
- /**
- * Setter for HubCoreLoop instances
- *
- * @param $hubInstance An instance of a HubCoreLoop class
- * @return void
- */
- public final function setHubInstance(HubCoreLoop $hubInstance) {
- $this->hubInstance = $hubInstance;
- }
-
- /**
- * Getter for HubCoreLoop instances
- *
- * @return $hubInstance An instance of a HubCoreLoop class
- */
- public final function getHubInstance() {
- return $this->hubInstance;
- }
-
- /**
- * Getter for last sent message timestamp
- *
- * @return $lastSentMessageStamp Timestamp of last sent message
- */
- public final function getLastSentMessageStamp () {
- return $this->lastSentMessageStamp;
- }
-
- /**
- * Getter for last sent message
- *
- * @return $lastSentMessage Last sent message to this peer
- */
- public final function getLastSentMessage () {
- return $this->lastSentMessage;
- }
-
- /**
- * Determines wether the peer is authorized
- *
- * @return void
- */
- public final function ifPeerIsAuthorized () {
- return (($this->isAuthorized === true) && ($this->ifPeerNeedsAuthRequest() === false));
- }
-
- /**
- * Returns wether this peer needs to receive the AUTH command
- */
- public final function ifPeerNeedsAuthRequest () {
- return $this->needAuthRequest;
- }
-
- /**
- * Disconnects the peer with a special reason (status)
- *
- * @param $reason The special reason
- * @return void
- */
- public final function disconnectWithReason ($reason) {
- // Is the message set?
- if (!empty($reason)) {
- // Send the given message
- $this->sendMessage($reason);
- } else {
- // Send default "good bye"
- $this->sendMessage($this->getConfigInstance()->readConfig("hub_msg_bye"));
- }
-
- // Disconnect the client
- socket_shutdown($this->peerSocket, 2);
- socket_close($this->peerSocket);
- }
-
- /**
- * Sends a specified message to the peer's socket
- *
- * @param $message The special message
- * @return void
- * @throws BrokenPipeException If a pipe to a socket peer is lost
- */
- public final function sendMessage ($message) {
- if (empty($message)) {
- // Set default message
- $message = $this->getConfigInstance()->readConfig("hub_msg_bye");
- }
-
- // Debug message
- $this->getDebugInstance()->output(sprintf("[%s] Sending message \"%s\" to peer %s.<br />\n",
- __METHOD__,
- $message,
- $this->getValidatedIP()
- ));
-
- // Is the socket still valid?
- if (!is_resource($this->peerSocket)) {
- // The socket is no longer valid!
- throw new BrokenPipeException (
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), self::EXCEPTION_PEER_SOCKET_BROKEN
- );
- }
-
- // Send it to the peer
- if (socket_write($this->peerSocket, $message."\n") !== false) {
- // Set the timestamp and message
- $this->lastSentMessage = $message;
- $this->lastSentMessageStamp = time();
- } else {
- // Message could not be sent
- throw new BrokenPipeException (
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), self::EXCEPTION_PEER_SOCKET_BROKEN
- );
- }
- }
-
- /**
- * Asks the connected new peer for the authorization key
- *
- * @return void
- */
- public final function askAuthorizationKey () {
- if ($this->ifPeerNeedsAuthRequest()) {
- // This peer needs to receive the AUTH command so send it to him
- $this->sendMessage($this->getConfigInstance()->readConfig("hub_auth_request"));
-
- // Set it to done
- $this->needAuthRequest = false;
- }
- }
-
- /**
- * Determines wether the peer is a local admin (localhost connection)
- *
- * @return $isLocalAdmin Wether the peer is a local admin
- */
- public function ifPeerIsLocalAdmin () {
- // Get the remote IP and extract only the first three numbers
- $remoteArray = explode(".", self::$peerIP);
-
- // Is the peer a local admin?
- return (($remoteArray[0].".".$remoteArray[1].".".$remoteArray[2]) == "127.0.0");
- }
-
- /**
- * Enables the local admin and authorizes this peer
- *
- * @return void
- */
- public function enableLocalAdmin() {
- // Is this IP really local?
- if (($this->ifPeerIsLocalAdmin()) && (!$this->ifPeerIsAuthorized())) {
- // Then authorize him
- $this->isAuthorized = true;
- $this->needAuthRequest = false;
- } // END - if
- }
-
- /**
- * Says "hi" to the local admin
- *
- * @return void
- */
- public function sayHi2Admin () {
- // Send a message to him... ;-)
- $this->sendMessage("Local admin console is ready. Enter HELP for instructions.");
- }
-
- /**
- * Enables wether the peer is authorized
- *
- * @param $isAuthValid Wether the authorization wents fine
- * @return void
- */
- public function enableIsAuthorized ($isAuthValid = true) {
- $this->isAuthorized = true;
- }
-
- /**
- * Checks wether a HELLO has been sent and if not it will be send to the other peer
- *
- * @return $helloSent Wether a HELLO has been sent
- */
- public function ifHelloReceived () {
- // HELLO has been sent?
- if (!$this->helloSent) {
- // Read some data
- $read = $this->readFromSocket();
-
- // Is this a HELLO?
- if ($read == $this->getConfigInstance()->readConfig("hub_peer_hello")) {
- // All right! A HELLO has been received
- $this->helloSent = true;
- $this->getHubInstance()->getOutputInstance()->output(sprintf("[%s] Peer %s said HELLO to us.",
- __METHOD__,
- $this->getValidatedIP()
- ));
- } // END - if
- } // END - if
-
- // Return status
- return $this->helloSent;
- }
-
- /**
- * Wether this hub has replied our HELLO request
- *
- * @return $helloReplied Wether this hub has replied our HELLO request
- */
- public function ifHelloReplied () {
- if ((!$this->helloReplied) && ($this->lastSentMessage == $this->getConfigInstance()->readConfig("hub_peer_hello"))) {
- // Read some data
- $read = $this->readFromSocket();
-
- // Is this a HELLO?
- if ($read == $this->getConfigInstance()->readConfig("hub_hello_reply")) {
- // Is this the master IP?
- if ($this->getValidatedIP() == $this->getConfigInstance()->readConfig("hub_master_ip")) {
- // All right! A HELLO has been received
- $this->helloReplied = true;
- $this->getHubInstance()->getOutputInstance()->output(sprintf("[%s] The master hub at %s:%d replied our %s.",
- __METHOD__,
- $this->getValidatedIP(),
- $this->getConfigInstance()->readConfig("hub_master_port"),
- $this->getConfigInstance()->readConfig("hub_peer_hello")
- ));
- } else {
- // ELHOs from non-masters are not valid!
- $this->getHubInstance()->getOutputInstance()->output(sprintf("[%s] Peer %s replied our %s but is not the master hub!",
- __METHOD__,
- $this->getValidatedIP(),
- $this->getConfigInstance()->readConfig("hub_peer_hello")
- ));
- }
- } // END - if
- } // END - if
-
- // Return status
- return $this->helloReplied;
- }
-
- /**
- * Returns wether a ELHO (HELLO reply has been sent)
- *
- * @return $elhoSent Wether a ELHO has been sent to the peer
- */
- public final function ifELHOsent () {
- return $this->elhoSent;
- }
-
- /**
- * Replies a HELLO message with a ELHO message
- *
- * @return void
- */
- public function replyHelloMessage () {
- $this->sendMessage($this->getConfigInstance()->readConfig("hub_hello_reply"));
- $this->elhoSent = true;
- }
-
- /**
- * Handles pinging this peer
- *
- * @return void
- */
- public function handlePingPeer () {
- $lost = false;
-
- // Do we need to ping?
- if ((time() - $this->lastPinged) > $this->getConfigInstance()->readConfig("hub_ping_timeout")) {
- // Don't ping any masters! ;-)
- if ($this->getValidatedIP() != $this->getConfigInstance()->readConfig("hub_master_ip")) {
- // Debug message
- $this->getHubInstance()->getOutputInstance()->output(sprintf("[%s] Sending ping to peer %s...",
- $this->__toString(),
- $this->getValidatedIP()
- ));
-
- // Send out a PING and await a PONG
- $this->commandInstance->simpleExecute(
- $this->getConfigInstance()->readConfig("hub_peer_ping"),
- $this->getConfigInstance()->readConfig("hub_ping_reply")
- );
-
- // PONG received within last ping?
- if (($this->lastPonged < time()) && (($this->lastPonged - $this->lastPinged) < 0)) {
- // Not replied so far
- $this->missingPongs++;
-
- // Debug message
- $this->getHubInstance()->getOutputInstance()->output(sprintf("[%s] Ping not replied! Try: %d",
- $this->__toString(),
- $this->missingPongs
- ));
-
- // Limit reached?
- if ($this->missingPongs == $this->getConfigInstance()->readConfig("hub_ping_maxdrops")) {
- // This peer is lost
- $this->getHubInstance()->disconnectPeerWithReason("hub_peer_miss_pong");
- $lost = true;
- } // END - if
- } // END - if
-
- // Last time we pinged is now.
- $this->lastPinged = time();
-
- } // END - if
- } // END - if
-
- // Connection is lost?
- if ($lost === true) return false;
-
- // Awaiting PONG here
- if ($this->commandInstance->ifAwaitsCommand($this->getConfigInstance()->readConfig("hub_ping_reply"))) {
- // PONG received! :-) So reset all counters...
- $this->lastPonged = time();
- $this->missingPongs = 0;
-
- // Notify the loop about the ping-pong-time
- $this->getHubInstance()->updatePeerEntry($this, (time() - $this->lastPinged));
- } // END - if
- }
-
- /**
- * Handles any incoming commands from the master hub
- *
- * @return void
- */
- public function handleMasterRequests () {
- // Read the raw socket for data packages
- if ($this->commandInstance->awaitAnyCommand()) {
- // A command has been received from the master hub
- $command = $this->commandInstance->pull();
-
- // TODO Handle a command from the master here...
- } // END - if
- }
-
- /**
- * Reads raw data from the socket and trims leading/trailing spaces away.
- * Returns an empty string if no data has been received.
- *
- * @return $data Raw data from the underlaying socket
- * @throws BrokenPipeException If a socket has lost its connection to the peer
- */
- public function readFromSocket () {
- $data = "";
- $read = array($this->peerSocket);
- $write = null;
- $except = null;
- $num = socket_select($read, $write, $except, 0);
- if ($num > 0) {
- // Something has changed on a socket
- foreach ($read as $socket) {
- if (is_resource($socket)) {
- $data = trim(@socket_read($socket, 1024, PHP_NORMAL_READ));
- if (socket_last_error() > 0) {
- // Throw an exception
- throw new BrokenPipeException(
- array(
- 'this' => $this,
- 'code' => socket_last_error()
- ), self::EXCEPTION_PEER_SOCKET_BROKEN
- );
- }
- break;
- } // END - if
- } // END - foreach
- } // END - if
- return $data;
- }
-
-} // END - class
-
-// [EOF]
-?>