From f39c64749dc1c0e8cc935e04edd66ecc62f1dde3 Mon Sep 17 00:00:00 2001 From: Roland Haeder Date: Sun, 7 Dec 2014 20:29:33 +0100 Subject: [PATCH] Added new CSV file abstraction class which is now a stub and needs expansion. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roland Häder --- inc/classes/interfaces/io/file/csv/.htaccess | 1 + .../io/file/csv/class_CsvInputStreamer.php | 28 ++++++ .../main/client/http/class_HttpClient.p | 21 ++++ .../main/client/http/class_HttpClient.ph | 96 +++++++++++++++++++ .../main/file_directories/text/csv/.htaccess | 1 + .../text/csv/class_CsvFile.php | 54 +++++++++++ inc/config.php | 3 + 7 files changed, 204 insertions(+) create mode 100644 inc/classes/interfaces/io/file/csv/.htaccess create mode 100644 inc/classes/interfaces/io/file/csv/class_CsvInputStreamer.php create mode 100644 inc/classes/main/client/http/class_HttpClient.p create mode 100644 inc/classes/main/client/http/class_HttpClient.ph create mode 100644 inc/classes/main/file_directories/text/csv/.htaccess create mode 100644 inc/classes/main/file_directories/text/csv/class_CsvFile.php diff --git a/inc/classes/interfaces/io/file/csv/.htaccess b/inc/classes/interfaces/io/file/csv/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/interfaces/io/file/csv/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/interfaces/io/file/csv/class_CsvInputStreamer.php b/inc/classes/interfaces/io/file/csv/class_CsvInputStreamer.php new file mode 100644 index 00000000..957f6775 --- /dev/null +++ b/inc/classes/interfaces/io/file/csv/class_CsvInputStreamer.php @@ -0,0 +1,28 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2014 Core Developer Team + * @license GNU GPL 3.0 or any newer version + * @link http://www.shipsimu.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 . + */ +interface CsvInputStreamer extends FileInputStreamer { +} + +// [EOF] +?> diff --git a/inc/classes/main/client/http/class_HttpClient.p b/inc/classes/main/client/http/class_HttpClient.p new file mode 100644 index 00000000..c8222de7 --- /dev/null +++ b/inc/classes/main/client/http/class_HttpClient.p @@ -0,0 +1,21 @@ + + // First get a socket + // @TODO Add some DNS caching here + + // Open connection + if ($helperInstance->isProxyUsed() === TRUE) { + // Resolve hostname into IP address + $ip = $helperInstance->resolveIpAddress($helperInstance->getConfigInstance()->getConfigEntry('proxy_host')); + + // Connect to host through proxy connection + $socketResource = fsockopen($ip, $helperInstance->getConfigInstance()->getConfigEntry('proxy_port'), $errorNo, $errorStr, 30); + } else { + // Connect to host directly + $socketResource = fsockopen('188.138.90.169', 80, $errorNo, $errorStr, 30); + } + + // Check if there was an error else + if ($errorNo > 0) { + // Then throw again + throw new InvalidSocketException(array($helperInstance, $socketResource, $errorNo, $errorStr), BaseListener::EXCEPTION_INVALID_SOCKET); + } // END - if diff --git a/inc/classes/main/client/http/class_HttpClient.ph b/inc/classes/main/client/http/class_HttpClient.ph new file mode 100644 index 00000000..c753d2d1 --- /dev/null +++ b/inc/classes/main/client/http/class_HttpClient.ph @@ -0,0 +1,96 @@ + + /** + * Determines own remote IP address (e.g. can be used to probe if we are + * reachable from outside by determining external IP and then connect to it. + * This is accomblished by connecting to the IP of www.shipsimu.org which + * should default to 188.138.90.169 and requesting /ip.php which does only + * return the content of $_SERVER['REMOTE_ADDR']. Of course, this method + * requires a working Internet connection. + * + * This method is taken from a user comment on php.net and heavily rewritten. + * Compare to following link: + * http://de.php.net/manual/en/function.socket-create.php#49368 + * + * @return $externalAddress The determined external IP address + * @todo Make IP, host name, port and script name configurable + */ + public static function determineExternalIp () { + // Get helper instance + $helperInstance = new ConsoleTools(); + + // First get a socket + // @TODO Add some DNS caching here + + // Open connection + if ($helperInstance->isProxyUsed() === TRUE) { + // Resolve hostname into IP address + $ip = $helperInstance->resolveIpAddress($helperInstance->getConfigInstance()->getConfigEntry('proxy_host')); + + // Connect to host through proxy connection + $socketResource = fsockopen($ip, $helperInstance->getConfigInstance()->getConfigEntry('proxy_port'), $errorNo, $errorStr, 30); + } else { + // Connect to host directly + $socketResource = fsockopen('188.138.90.169', 80, $errorNo, $errorStr, 30); + } + + // Check if there was an error else + if ($errorNo > 0) { + // Then throw again + throw new InvalidSocketException(array($helperInstance, $socketResource, $errorNo, $errorStr), BaseListener::EXCEPTION_INVALID_SOCKET); + } // END - if + + // Prepare the GET request + $request = 'GET ' . ($helperInstance->isProxyUsed() === TRUE ? 'http://shipsimu.org' : '') . '/ip.php HTTP/1.0' . self::HTTP_EOL; + $request .= 'Host: shipsimu.org' . self::HTTP_EOL; + $request .= 'User-Agent: ' . $this->getUserAgent() . self::HTTP_EOL; + $request .= 'Connection: close' . self::HTTP_EOL; + + // Do we use proxy? + if ($helperInstance->isProxyUsed() === TRUE) { + // CONNECT method? + if ($helperInstance->getConfigInstance()->getConfigEntry('proxy_connect_method') == 'Y') { + // Setup proxy tunnel + $response = $helperInstance->setupProxyTunnel('shipsimu.org', 80, $socketResource); + + // If the response is invalid, abort + if ((count($response) == 3) && (empty($response[0])) && (empty($response[1])) && (empty($response[2]))) { + // Invalid response! + $helperInstance->debugBackTrace('Proxy tunnel not working: response=' . print_r($response, TRUE)); + } // END - if + } else { + // Add header for proxy + $request .= 'Proxy-Connection: Keep-Alive' . self::HTTP_EOL; + } + } // END - if + + // Add last HTTP_EOL + $request .= self::HTTP_EOL; + + // Send it to the socket + fwrite($socketResource, $request); + + // Init IP (this will always be the last line) + $externalAddress = 'invalid'; + + // And read the reply + while (!feof($socketResource)) { + // Get line + $externalAddress = trim(fgets($socketResource, 128)); + + // Detect HTTP response + if ((substr($externalAddress, 0, 7) == 'HTTP/1.') && (substr($externalAddress, -6, 6) != '200 OK')) { + // Stop processing + break; + } // END - if + } // END - while + + // Close socket + fclose($socketResource); + + + // Debug message + /* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('CONSOLE-TOOLS[' . __METHOD__ . ':' . __LINE__ . ']: Resolved external address: ' . $externalAddress); + + // Return determined external IP + return $externalAddress; + } diff --git a/inc/classes/main/file_directories/text/csv/.htaccess b/inc/classes/main/file_directories/text/csv/.htaccess new file mode 100644 index 00000000..3a428827 --- /dev/null +++ b/inc/classes/main/file_directories/text/csv/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/file_directories/text/csv/class_CsvFile.php b/inc/classes/main/file_directories/text/csv/class_CsvFile.php new file mode 100644 index 00000000..ade71d4d --- /dev/null +++ b/inc/classes/main/file_directories/text/csv/class_CsvFile.php @@ -0,0 +1,54 @@ + + * @version 0.0.0 + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2014 Core 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 CsvFile extends BaseTextFile implements CsvInputStreamer { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an instance of this File class and prepares it for usage + * + * @param $fileName Name of the index file + * @return $fileInstance An instance of this File class + */ + public final static function createCsvFile ($fileName) { + // Get a new instance + $fileInstance = new CsvFile(); + + // Init this abstract file + $fileInstance->initFile($fileName); + + // Return the prepared instance + return $fileInstance; + } +} + +// [EOF] +?> diff --git a/inc/config.php b/inc/config.php index 93646dd0..b022da0a 100644 --- a/inc/config.php +++ b/inc/config.php @@ -368,6 +368,9 @@ $cfg->setConfigEntry('file_raw_output_class', 'FrameworkFileOutputPointer'); // CFG: FILE-INPUT-OUTPUT-CLASS $cfg->setConfigEntry('file_raw_input_output_class', 'FrameworkFileInputOutputPointer'); +// CFG: CSV-FILE-CLASS +$cfg->setConfigEntry('csv_file_class', 'CsvFile'); + // CFG: FILE-ITERATOR-CLASS $cfg->setConfigEntry('file_iterator_class', 'FileIterator'); -- 2.39.5