From 3e9f731e9adf41ce870da5f3d4b4e82e7925a406 Mon Sep 17 00:00:00 2001 From: Diederik de Groot Date: Wed, 18 Mar 2020 11:57:30 +0100 Subject: [PATCH] Make config instantiation private Fixup Paths Moved all tests to phpunit tests Signed-off-by: Diederik de Groot --- lib/config.php | 56 ++++++++++++++++++--------------------- lib/resolve.php | 47 +++----------------------------- srv/tftp/tftp_provisioner | 6 +++-- srv/web/index.php | 8 +++--- tests/resolverTest.php | 53 ++++++++++++++++++++++++++++++++---- 5 files changed, 87 insertions(+), 83 deletions(-) diff --git a/lib/config.php b/lib/config.php index 40c9dff..89185c5 100644 --- a/lib/config.php +++ b/lib/config.php @@ -78,6 +78,30 @@ class ConfigParser { $config['main']['data'] = (!empty($config['main']['data'])) ? $base_path . "data" : DIRECTORY_SEPARATOR . 'data'; $config['subdirs'] = $this->replaceSubdirTreeStructure($config['subdirs']); $this->config = $config; + $this->initializeLogger(); + } + + private function initializeLogger() { + global $logger; + switch($this->config['main']['log_type']) { + case 'SYSLOG': + $logger = new \SCCP\Logger\Logger_Syslog($this->config['main']['log_level']); + break; + case 'FILE': + if (!isempty($config['main']['log_file'])) { + $logger = new Logger_Filename($this->config['main']['log_level'], $this->config['main']['log_file']); + } + break; + case 'STDOUT': + $logger = new Logger_Stdout($this->config['main']['log_level']); + break; + case 'STDERR': + $logger = new Logger_Stderr($this->config['main']['log_level']); + break; + default: + $logger = new Logger_Null($this->config['main']['log_level']); + } + $this->config['main']['logger'] = $logger; } /*! @@ -175,40 +199,12 @@ class ConfigParser { public function getConfiguration() { return $this->config; } - - public function printConfiguration() { - print_r($this->config); - //var_dump($this->config); - } } $configParser = new ConfigParser($base_path, "config.ini"); $config = $configParser->getConfiguration(); -switch($config['main']['log_type']) { - case 'SYSLOG': - $logger = new \SCCP\Logger\Logger_Syslog($config['main']['log_level']); - break; - case 'FILE': - if (!isempty($config['main']['log_file'])) { - $logger = new Logger_Filename($config['main']['log_level'], $config['main']['log_file']); - } - break; - case 'STDOUT': - $logger = new Logger_Stdout($config['main']['log_level']); - break; - case 'STDERR': - $logger = new Logger_Stderr($config['main']['log_level']); - break; - default: - $logger = new Logger_Null($config['main']['log_level']); -} - # Fixup debug -$print_debug = (!empty($config['main']['debug'])) ? $config['main']['debug'] : 'off'; -$print_debug = ($print_debug == 1) ? 'on' : $print_debug; - -if(defined('STDIN') ) { - $configParser->printConfiguration(); -} +//$print_debug = (!empty($config['main']['debug'])) ? $config['main']['debug'] : 'off'; +//$print_debug = ($print_debug == 1) ? 'on' : $print_debug; ?> diff --git a/lib/resolve.php b/lib/resolve.php index 225665a..c7e4d6d 100644 --- a/lib/resolve.php +++ b/lib/resolve.php @@ -103,17 +103,17 @@ class Resolve { /* make sure request only starts with filename or one of $config[$subdir]['locale'] or $config[$subdir]['wallpaper'] */ /* check uri/url decode */ if (!$request || empty($request)) { - log_error("Request is empty"); + Utils\log_error("Request is empty"); return ResolveResult::EmptyRequest; } if (!is_string($request)) { - log_error("Request is not a string"); + Utils\log_error("Request is not a string"); return ResolveResult::RequestNotAString; } Utils\log_debug($request . ":" . escapeshellarg($request) . ":" . Utils\utf8_urldecode($request) . "\n"); $escaped_request = escapeshellarg(Utils\utf8_urldecode($request)); if ($escaped_request !== "'" . $request . "'") { - log_error("Request '$request' contains invalid characters"); + Utils\log_error("Request '$request' contains invalid characters"); return ResolveResult::RequestContainsInvalidChar; } if (strstr($escaped_request, "..")) { @@ -132,7 +132,7 @@ class Resolve { if (($path = $this->cache->getPath($request))) { if (!file_exists($path)) { $this->cache->removeFile($request); - log_error("File '$request' does not exist on FS"); + Utils\log_error("File '$request' does not exist on FS"); return ResolveResult::FileNotFound; } return $path; @@ -148,43 +148,4 @@ class Resolve { print_r($this->cache); } } - -// Testing -if(defined('STDIN') ) { - $resolve = new Resolve($config); - $test_cases = Array( - Array('request' => 'jar70sccp.9-4-2ES26.sbn', 'expected' => '/data/firmware/7970/jar70sccp.9-4-2ES26.sbn'), - Array('request' => 'Russian_Russian_Federation/be-sccp.jar', 'expected' => '/data/locales/languages/Russian_Russian_Federation/be-sccp.jar'), - Array('request' => 'Spain/g3-tones.xml', 'expected' => '/data/locales/countries/Spain/g3-tones.xml'), - Array('request' => '320x196x4/Chan-SCCP-b.png', 'expected' => '/data/wallpapers/320x196x4/Chan-SCCP-b.png'), - Array('request' => 'XMLDefault.cnf.xml', 'expected' => '/data/settings/XMLDefault.cnf.xml'), - Array('request' => '../XMLDefault.cnf.xml', 'expected' => ResolveResult::RequestContainsPathWalk), - Array('request' => 'XMLDefault.cnf.xml/../../text.xml', 'expected' => ResolveResult::RequestContainsPathWalk), - ); - foreach($test_cases as $test) { - try { - $result = $resolve->resolve($test['request']); - if (is_string($result)) { - if ($result === $base_path . $test['expected']) { - print("'" . $test['request'] . "' => '" . $result . "'\n"); - continue; - } - } else { - if ($result === $test['expected']) { - print("'" . $test['request'] . "' => '" . $result . "'\n"); - continue; - } - } - print("Error: expected result does not match what we got\n"); - print("request:'".$test['request']."'\n"); - print("expected:'" . $base_path . $test['expected'] . "'\n"); - print("result:'" . $result . "'\n\n"); - } catch (Exception $e) { - print("'" . $test['request'] . "' => throws error as expected\n"); - print("Exception: " . $e->getMessage() . "\n"); - } - } - unset($resolve); - #unlink($CACHEFILE_NAME); -} ?> diff --git a/srv/tftp/tftp_provisioner b/srv/tftp/tftp_provisioner index b283e6f..a7b9141 100755 --- a/srv/tftp/tftp_provisioner +++ b/srv/tftp/tftp_provisioner @@ -23,7 +23,7 @@ class TFTPProvisioner extends TFTP\TFTPServer parent::__construct($server_url, $logger); $this->_debug = $debug; $this->max_put_size = 60000000; - $this->_resolve = new Resolve\Resolver($config); + $this->_resolve = new Resolve\Resolve($config); $this->_settings_path = $this->_config['main']['base_path'] . DIRECTORY_SEPARATOR . $this->_config['subdirs']['settings']['path'] . DIRECTORY_SEPARATOR; } @@ -83,12 +83,14 @@ class TFTPProvisioner extends TFTP\TFTPServer } +global $base_path; $host = "127.0.0.1"; $port = 10069; $url = "udp://$host:$port"; echo "\nStarting TFTP Provisioner...\n"; -$server = new TFTPProvisioner($url, $config, $logger); +$configParser = new SCCP\Config\ConfigParser($base_path, "config.ini"); +$server = new TFTPProvisioner($url, $configParser->getConfiguration(), $logger); if(!$server->loop($error)) die("$error\n"); ?> diff --git a/srv/web/index.php b/srv/web/index.php index cc7e465..5f92f93 100644 --- a/srv/web/index.php +++ b/srv/web/index.php @@ -1,6 +1,6 @@ getConfiguration()); if (($filename = $resolve->resolve($req_filename))) { sendfile($filename); } diff --git a/tests/resolverTest.php b/tests/resolverTest.php index cd94877..142c438 100644 --- a/tests/resolverTest.php +++ b/tests/resolverTest.php @@ -1,17 +1,60 @@ getConfiguration(); + } + public function testCanBeCreated(): void { - global $config; - $resolver = new \SCCP\Resolve\Resolver($config); + //global $config; + $config = $this->getConfig(); + $resolve = new \SCCP\Resolve\Resolve($config); $this->assertInstanceOf( - \SCCP\Resolve\Resolver::class, - $resolver + \SCCP\Resolve\Resolve::class, + $resolve ); } + + private $test_cases = Array( + Array('request' => 'jar70sccp.9-4-2ES26.sbn', 'expected' => '/data/firmware/7970/jar70sccp.9-4-2ES26.sbn'), + Array('request' => 'Russian_Russian_Federation/be-sccp.jar', 'expected' => '/data/locales/languages/Russian_Russian_Federation/be-sccp.jar'), + Array('request' => 'Spain/g3-tones.xml', 'expected' => '/data/locales/countries/Spain/g3-tones.xml'), + Array('request' => '320x196x4/Chan-SCCP-b.png', 'expected' => '/data/wallpapers/320x196x4/Chan-SCCP-b.png'), + Array('request' => 'XMLDefault.cnf.xml', 'expected' => '/data/settings/XMLDefault.cnf.xml'), + Array('request' => '../XMLDefault.cnf.xml', 'expected' => Resolve\ResolveResult::RequestContainsPathWalk), + Array('request' => 'XMLDefault.cnf.xml/../../text.xml', 'expected' => Resolve\ResolveResult::RequestContainsPathWalk), + ); + + public function testCanResolveFiles(): void + { + global $base_path; + $config = $this->getConfig(); + //global $config; + + $resolve = new \SCCP\Resolve\Resolve($config); + foreach($this->test_cases as $test) { + try { + $result = $resolve->resolve($test['request']); + if (is_string($result)) { + $this->assertStringContainsString($result, $base_path . $test['expected']); + } else { + $this->assertEquals($result, $test['expected']); + } + } catch (Exception $e) { + print("'" . $test['request'] . "' => throws error as expected\n"); + print("Exception: " . $e->getMessage() . "\n"); + } + } + unset($resolve); + } }