From d9f53fea55379820809e913d2f9c61a2edf36c81 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Thu, 17 May 2012 10:25:03 +0000 Subject: [PATCH] Added filter for self-connect attempts --- .gitattributes | 1 + application/hub/config.php | 3 + .../class_PackageAnnouncementTagFilter.php | 10 +- .../class_PackageSelfConnectTagFilter.php | 138 ++++++++++++++++++ .../hub/main/package/class_NetworkPackage.php | 6 + .../class_XmlSelfConnectTemplateEngine.php | 23 ++- 6 files changed, 166 insertions(+), 15 deletions(-) create mode 100644 application/hub/main/filter/tags/class_PackageSelfConnectTagFilter.php diff --git a/.gitattributes b/.gitattributes index 552e40a8f..0572547f5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -277,6 +277,7 @@ application/hub/main/filter/shutdown/node/class_NodeShutdownNodeFilter.php svneo application/hub/main/filter/shutdown/node/class_NodeShutdownTaskHandlerFilter.php svneol=native#text/plain application/hub/main/filter/tags/.htaccess -text svneol=unset#text/plain application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php svneol=native#text/plain +application/hub/main/filter/tags/class_PackageSelfConnectTagFilter.php svneol=native#text/plain application/hub/main/filter/task/.htaccess -text svneol=unset#text/plain application/hub/main/filter/task/chat/.htaccess svneol=native#text/plain application/hub/main/filter/task/chat/class_ChatTaskHandlerInitializerFilter.php svneol=native#text/plain diff --git a/application/hub/config.php b/application/hub/config.php index 9387fcbdf..b20499020 100644 --- a/application/hub/config.php +++ b/application/hub/config.php @@ -201,6 +201,9 @@ $cfg->setConfigEntry('package_filter_chain_class', 'PackageFilterChain'); // CFG: PACKAGE-TAG-ANNOUNCEMENT-FILTER $cfg->setConfigEntry('package_tag_announcement_filter', 'PackageAnnouncementTagFilter'); +// CFG: PACKAGE-TAG-SELF-CONNECT-FILTER +$cfg->setConfigEntry('package_tag_self_connect_filter', 'PackageSelfConnectTagFilter'); + // CFG: NEWS-READER-CLASS $cfg->setConfigEntry('news_reader_class', 'ConsoleNewsReader'); diff --git a/application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php b/application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php index ee6521e79..0fb53f7f9 100644 --- a/application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php +++ b/application/hub/main/filter/tags/class_PackageAnnouncementTagFilter.php @@ -22,12 +22,6 @@ * along with this program. If not, see . */ class PackageAnnouncementTagFilter extends BaseFilter implements FilterablePackage { - /** - * Constants for message data array - */ - const MESSAGE_ARRAY_DATA = 'message_data'; - const MESSAGE_ARRAY_TYPE = 'message_type'; - /** * Array with all data XML nodes (which hold the actual data) and their values */ @@ -133,9 +127,9 @@ class PackageAnnouncementTagFilter extends BaseFilter implements FilterablePacka // Construct an array for pushing it on next stack $messageArray = array( // Message data itself - self::MESSAGE_ARRAY_DATA => $this->dataXmlNodes, + NetworkPackage::MESSAGE_ARRAY_DATA => $this->dataXmlNodes, // Message type (which is 'announcement') - self::MESSAGE_ARRAY_TYPE => 'announcement' + NetworkPackage::MESSAGE_ARRAY_TYPE => 'announcement' ); // Push the processed message back on stack diff --git a/application/hub/main/filter/tags/class_PackageSelfConnectTagFilter.php b/application/hub/main/filter/tags/class_PackageSelfConnectTagFilter.php new file mode 100644 index 000000000..c4bfb46e0 --- /dev/null +++ b/application/hub/main/filter/tags/class_PackageSelfConnectTagFilter.php @@ -0,0 +1,138 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Hub Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.ship-simu.org + * + * 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 . + */ +class PackageSelfConnectTagFilter extends BaseFilter implements FilterablePackage { + /** + * Array with all data XML nodes (which hold the actual data) and their values + */ + private $dataXmlNodes = array(); + + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + + // Init array + $this->dataXmlNodes = array( + XmlSelfConnectTemplateEngine::SELF_CONNECT_DATA_NODE_ID => '', + XmlSelfConnectTemplateEngine::SELF_CONNECT_DATA_SESSION_ID => '', + ); + } + + /** + * Creates an instance of this filter class + * + * @return $filterInstance An instance of this filter class + */ + public final static function createPackageSelfConnectTagFilter () { + // Get a new instance + $filterInstance = new PackageSelfConnectTagFilter(); + + // Return the instance + return $filterInstance; + } + + /** + * Executes the filter with given request and response objects + * + * @param $requestInstance An instance of a class with an Requestable interface + * @param $responseInstance An instance of a class with an Responseable interface + * @return void + * @throws UnsupportedOperationException If this method is called, please use processMessage() instead! + */ + public function execute (Requestable $requestInstance, Responseable $responseInstance) { + // Please don't call this method + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } + + /** + * Processes the given raw message content. The method renderXmlContent + * may throw (not the method itself) several exceptions: + * + * InvalidXmlNodeException - If an invalid XML node has been found (e.g. + * wrong/out-dated template used) + * XmlNodeMismatchException - Again might be caused by invalid XML node + * usage + * XmlParserException - If the XML message is damaged or not + * well-formed + * + * @param $messageContent Raw message content + * @param $packageInstance An instance of a Receivable class + * @return void + * @todo Exceptions from renderXmlContent() are currently unhandled + */ + public function processMessage ($messageContent, Receivable $packageInstance) { + // Get a template instance from the factory + $templateInstance = XmlTemplateEngineFactory::createXmlTemplateEngineInstance('node_self_connect_template_class'); + + // And render the XML content (aka message) + $templateInstance->renderXmlContent($messageContent); + + /* + * The template system now stores all required data as 'general' + * variables, so simply get them. If there is an invalid XML node + * inside the message, the above method call will cause exceptions. + */ + foreach ($this->dataXmlNodes as $key => $dummy) { + // Get the variable from template engine + $value = $templateInstance->readSelfConnectData($key); + + /* + * If value is NULL, a variable hasn't been found. This could mean + * that *this* node is running an out-dated software or the other + * peer is using an out-dated self_connect.xml template. + */ + if (is_null($value)) { + // Output a warning + $this->debugOutput('SELF-CONNECT-TAG: Found not fully supported variable ' . $key . ' - skipping.'); + + // Skip this part, don't write NULLs to the array + continue; + } // END - if + + // Debug message + $this->debugOutput('SELF-CONNECT-TAG: key=' . $key . ',value=' . $value); + + // Set it now + $this->dataXmlNodes[$key] = $value; + } // END - foreach + + // Construct an array for pushing it on next stack + $messageArray = array( + // Message data itself + NetworkPackage::MESSAGE_ARRAY_DATA => $this->dataXmlNodes, + // Message type (which is 'self_connect') + NetworkPackage::MESSAGE_ARRAY_TYPE => 'self_connect' + ); + + // Push the processed message back on stack + $packageInstance->getStackerInstance()->pushNamed(NetworkPackage::STACKER_NAME_PROCESSED_MESSAGE); + } +} + +// [EOF] +?> diff --git a/application/hub/main/package/class_NetworkPackage.php b/application/hub/main/package/class_NetworkPackage.php index fad98f9d2..b209bd0aa 100644 --- a/application/hub/main/package/class_NetworkPackage.php +++ b/application/hub/main/package/class_NetworkPackage.php @@ -108,6 +108,12 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R const PACKAGE_STATUS_FAILED = 'failed'; const PACKAGE_STATUS_DECODED = 'decoded'; + /** + * Constants for message data array + */ + const MESSAGE_ARRAY_DATA = 'message_data'; + const MESSAGE_ARRAY_TYPE = 'message_type'; + /** * Tags separator */ diff --git a/application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php b/application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php index 84341daad..20d69b3fb 100644 --- a/application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php +++ b/application/hub/main/template/connect/class_XmlSelfConnectTemplateEngine.php @@ -23,6 +23,12 @@ * along with this program. If not, see . */ class XmlSelfConnectTemplateEngine extends BaseTemplateEngine implements CompileableTemplate, Registerable { + /** + * Data nodes + */ + const SELF_CONNECT_DATA_NODE_ID = 'node-id'; + const SELF_CONNECT_DATA_SESSION_ID = 'session-id'; + /** * Main nodes in the XML tree */ @@ -33,11 +39,7 @@ class XmlSelfConnectTemplateEngine extends BaseTemplateEngine implements Compile /** * Sub nodes in the XML tree */ - private $subNodes = array( - 'self-connect-data', - 'node-id', - 'session-id' - ); + private $subNodes = array(); /** * Current main node @@ -57,6 +59,13 @@ class XmlSelfConnectTemplateEngine extends BaseTemplateEngine implements Compile protected function __construct () { // Call parent constructor parent::__construct(__CLASS__); + + // Init array + $this->subNodes = array( + 'self-connect-data', + self::SELF_CONNECT_DATA_NODE_ID, + self::SELF_CONNECT_DATA_SESSION_ID + ); } /** @@ -314,7 +323,7 @@ class XmlSelfConnectTemplateEngine extends BaseTemplateEngine implements Compile */ private function startNodeId () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('self_connect', 'node-id'); + $this->getStackerInstance()->pushNamed('self_connect', self::SELF_CONNECT_DATA_NODE_ID); } /** @@ -324,7 +333,7 @@ class XmlSelfConnectTemplateEngine extends BaseTemplateEngine implements Compile */ private function startSessionId () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('self_connect', 'session-id'); + $this->getStackerInstance()->pushNamed('self_connect', self::SELF_CONNECT_DATA_SESSION_ID); } /** -- 2.39.5