From ad87422c609e5d26e46f70da618f076b8ae4c50c Mon Sep 17 00:00:00 2001 From: Diederik de Groot Date: Sat, 15 Feb 2020 23:20:46 +0100 Subject: [PATCH] Added /lib directory Moved /tftpboot/index.cfg -> /config.ini Moved /tftpboot/resolver.php -> /lib/resolver.php Added /lib/config.php - include /lib/config.php in resolver.php and index.php Changed $config array Signed-off-by: Diederik de Groot --- config.ini | 15 ++++++++ lib/config.php | 59 ++++++++++++++++++++++++++++++ {tftpboot => lib}/resolver.php | 57 ++++++++++++++--------------- tftpboot/index.cnf | 13 ------- tftpboot/index.php | 65 +++++++++------------------------- 5 files changed, 120 insertions(+), 89 deletions(-) create mode 100644 config.ini create mode 100644 lib/config.php rename {tftpboot => lib}/resolver.php (56%) delete mode 100644 tftpboot/index.cnf diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..a2a319b --- /dev/null +++ b/config.ini @@ -0,0 +1,15 @@ +[main] +debug = on ; The output in the browser window for more information +cache_filename = "/tmp/provision_sccp_resolver.cache" +default_language = English_United_States +;log = provision.log + +[subdirs] +tftproot = tftpboot +firmware = firmware +settings = settings +wallpapers = wallpapers +ringtones = ringtones +locales = locales +countries = countries +languages = languages diff --git a/lib/config.php b/lib/config.php new file mode 100644 index 0000000..16df23a --- /dev/null +++ b/lib/config.php @@ -0,0 +1,59 @@ + Array( + 'debug' => 1, + 'default_language' => 'English_United_States', + ), + 'subdirs' => Array( + 'tftproot' => 'tftpboot', + 'firmware' => 'firmware', + 'settings' => 'settings', + 'wallpapers' => 'wallpapers', + 'ringtones' => 'ringtones', + 'locales' => 'locales', + 'countries' => 'countries', + 'languages' => 'languages', + ) +); +$tree_base = Array( + 'settings' => array('path' => 'tftproot', "strip" => 1), + 'wallpapers' => array('path' => 'tftproot', "strip" => 0), + 'ringtones' => array('path' => 'tftproot', "strip" => 1), + 'locales' => array('path' => 'tftproot', "strip" => 1), + 'firmware' => array('path' => 'tftproot', "strip" => 1), + 'languages' => array('path' => 'locales', "strip" => 0), + 'countries' => array('path' => 'locales', "strip" => 0), + 'default_language' => array('path' => 'locales', "strip" => 1), +); + +# Merge config +$ini_array = parse_ini_file('../config.ini', TRUE, INI_SCANNER_TYPED); +if (!empty($ini_array)) { + $config = array_merge($base_config, $ini_array); +} + +# rewrite config['subdirs'] paths using tree_base data +# Not sure if this is a good way +foreach ($tree_base as $key => $value) { + if (!empty($config['subdirs'][$key])) { + if (substr($config['subdirs'][$key], 0, 1) !== "/") { + $path = $config['subdirs'][$value['path']].'/'.$config['subdirs'][$key]; + $config['subdirs'][$key] = $path; + } + } +} +foreach ($tree_base as $key => $value) { + if (!empty($config['subdirs'][$key])) { + $config['subdirs'][$key] = array('path' => $config['subdirs'][$key], 'strip' => $value['strip']); + } +} + +$config['main']['base_path'] = $base_path; +print_r($config['main']['base_path']); +$config['main']['tftproot'] = (!empty($config['main']['tftproot'])) ? $base_path . "tftpboot" : '/tftpboot'; + +# Fixup debug +$print_debug = (!empty($config['main']['debug'])) ? $config['main']['debug'] : 'off'; +$print_debug = ($print_debug == 1) ? 'on' : $print_debug; +?> diff --git a/tftpboot/resolver.php b/lib/resolver.php similarity index 56% rename from tftpboot/resolver.php rename to lib/resolver.php index 653cce0..414e625 100755 --- a/tftpboot/resolver.php +++ b/lib/resolver.php @@ -1,6 +1,6 @@ #!/usr/bin/php cache = unserialize(file_get_contents($GLOBALS["CACHEFILE_NAME"])); + private $config; + function __construct($config) { + $this->config = $config; + if(file_exists($this->config['main']['cache_filename'])) { + $this->cache = unserialize(file_get_contents($config['main']['cache_filename'])); } else { $this->buildCleanCache(); } @@ -25,58 +27,57 @@ class Resolver { function __destruct() { //print_r($this->cache); if ($this->isDirty) { - if (!file_put_contents($GLOBALS["CACHEFILE_NAME"], serialize($this->cache))) { - throw new Exception("Could not write to file ".$GLOBALS["CACHEFILE_NAME"]." at Resolver::destruct"); + if (!file_put_contents($this->config['main']['cache_filename'], serialize($this->cache))) { + throw new Exception("Could not write to file '".$this->config['cache_filename']."' at Resolver::destruct"); } } } function searchForFile($filename) { - foreach(["settings","wallpapers","ringtones","locales/countries","locales/languages"] as $subdir) { - $path = "$subdir/$filename"; + foreach($this->config['subdirs'] as $key => $value) { + if ($key === "firmware" || $key === "tftproot" ) { + continue; + } + $path = realpath($this->config['main']['base_path'] . "/" . $value['path'] . "/$filename"); if (file_exists($path)) { $this-> addFile($filename, $path); return $path; } } - throw new Exception("File '$request' does not exist"); + throw new Exception("File '$filename' does not exist"); } function buildCleanCache() { - // Intelligently walk tree - $currentdir=getcwd(); - //foreach(["firmware","ringtones","settings"] as $subdir) { - foreach(["firmware","ringtones"] as $subdir) { - $dir_iterator = new RecursiveDirectoryIterator("$currentdir/$subdir"); - $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST); - foreach ($iterator as $file) { - if ($file->isFile()) { - $this->addFile($file->getFileName(), $file->getPathname()); - } + foreach($this->config['subdirs'] as $key =>$value) { + if ($key === "tftproot") { + continue; } - } - foreach(["locales/languages", "locales/countries", "wallpapers"] as $subdir) { - $dir_iterator = new RecursiveDirectoryIterator("$currentdir/$subdir"); + $path = $this->config['main']['base_path'] . "/" . $value['path'] . "/"; + $dir_iterator = new RecursiveDirectoryIterator($path); $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $file) { if ($file->isFile()) { - $path = basename(dirname($file->getPathname())); - $this->addFile("$path/".$file->getFileName(), $file->getPathname()); + if ($value['strip'] === 1) { + $this->addFile($file->getFileName(), $file->getPathname()); + } else { + $subdir = basename(dirname($file->getPathname())); + $this->addFile('$subpath/'.$file->getFileName(), $file->getPathname()); + } } } } $this->isDirty = TRUE; } function addFile($hash, $path) { - //echo "Rdding $hash\n"; + //echo 'Adding $hash\n'; $this->cache[$hash] = $path; $this->isDirty =TRUE; } function removeFile($hash) { - //echo "Removing $hash\n"; + //echo 'Removing $hash\n'; unset($this->cache[$hash]); $this->isDirty = TRUE; } function resolve($request) /* canthrow */ { - $path = ""; + $path = ''; if (array_key_exists($request, $this->cache)) { if ($path = $this->cache[$request]) { if (!file_exists($path)) { @@ -93,7 +94,7 @@ class Resolver { } } -$resolver = new Resolver(); +$resolver = new Resolver($config); try { print($resolver->resolve("jar70sccp.9-4-2ES26.sbn")."\n"); print($resolver->resolve("Russian_Russian_Federation/be-sccp.jar")."\n"); diff --git a/tftpboot/index.cnf b/tftpboot/index.cnf deleted file mode 100644 index 9ec78d3..0000000 --- a/tftpboot/index.cnf +++ /dev/null @@ -1,13 +0,0 @@ -[main] -debug = on ; The output in the browser window for more information -tftproot = /tftpboot -;default_language = English_United_States - -firmware = firmware -settings = settings -wallpapers = wallpapers -ringtones = ringtones -locales = locales -countries = countries -languages = languages -;log = /tftpboot/provision.log diff --git a/tftpboot/index.php b/tftpboot/index.php index 495d0ce..c343867 100644 --- a/tftpboot/index.php +++ b/tftpboot/index.php @@ -2,38 +2,7 @@ // // Written by Alex / github.com/PhantomVI // - -$base_path = realpath($_SERVER['DOCUMENT_ROOT']); -$base_config = Array( - 'debug' => 1, - 'tftproot' => $base_path, - 'default_language' => 'English_United_States', - 'firmware' => 'firmware', 'settings' => 'settings', 'wallpapers' => 'wallpapers', 'ringtones' => 'ringtones', - 'locales' => 'locales', 'countries' => 'countries', 'languages' => 'languages' -); -$base_tree = Array('settings' => 'tftproot', 'wallpapers' => 'tftproot', 'ringtones'=>'tftproot', - 'locales' => 'tftproot', 'firmware' => 'tftproot', 'languages' => 'locales', - 'countries' => 'locales', 'default_language' => 'locales'); - -# Merge config -$ini_array = parse_ini_file('index.cnf'); -if (!empty($ini_array)) { - $config = array_merge($base_config, $ini_array); -} - -foreach ($base_tree as $key => $value) { - if (!empty($config[$key])) { - if (substr($config[$key],0,1) != "/") { - $config[$key] = $config[$value].'/'.$config[$key]; - } - } -} - -#$config['tftproot'] = (!empty($config['tftproot'])) ? $config['tftproot'] : '/tftpboot'; - -# Fixup debug -$print_debug = (!empty($config['debug'])) ? $config['debug'] : 'off'; -$print_debug = ($print_debug == 1) ? 'on' : $print_debug; +include_once("../lib/config.php"); # Parse request $request = $_REQUEST; @@ -78,16 +47,16 @@ if (!empty($req_file)) { } - if (file_exists($config['tftproot'].'/'.$req_file_name)) // prevent "/../...//" browsing - (eliminate back door) + if (file_exists($config['main']['tftproot'].'/'.$req_file_name)) // prevent "/../...//" browsing - (eliminate back door) { - $req_file_full_path = $config['tftproot'].'/'.$req_file_name; + $req_file_full_path = $config['main']['tftproot'].'/'.$req_file_name; } else { $tmp_file = explode('.', $req_file_name); if (strpos_array($req_file_name, $fw_suffix,'any') !== FALSE) { // Firmware file was requested - $firmware_list = find_all_files($config['firmware']); + $firmware_list = find_all_files($config['subdirs']['firmware']); $pos2 = strpos_array($firmware_list, $req_file_name, 'any'); // case unsensitive if ($pos2 !== FALSE) { // Request Firmware $req_file_full_path = $firmware_list[$pos2]; @@ -100,55 +69,55 @@ if (!empty($req_file)) { //if (strpos_array($req_file_name, $settings_suffix, 'any') !== FALSE) { // Request Settings if (strpos(strtolower($req_file_name), '.cnf.xml') !== FALSE) { // Request Settings - $tmp_file = $config['settings'].'/'.$req_file_name; + $tmp_file = $config['subdirs']['settings'].'/'.$req_file_name; } else if (strpos(strtolower($req_file), 'desktops/') !== FALSE) { // Request Wallpapers - $tmp_file = $config['wallpapers'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_file_name; + $tmp_file = $config['subdirs']['wallpapers'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_file_name; } else if (strpos_array($ringtones_list, $req_file_name, 'any') !== FALSE) { // Request RingTones - $tmp_file = $config['ringtones'].'/'.$req_file_name; + $tmp_file = $config['subdirs']['ringtones'].'/'.$req_file_name; if (!file_exists($tmp_file)) { - $tmp_file = $config['ringtones'].'/ringlist.xml'; + $tmp_file = $config['subdirs']['ringtones'].'/ringlist.xml'; } } else if(strpos_array($req_file_name, $ringtones_suffix,'any') !== FALSE) { // Firmware file was requested - $tmp_file = $config['ringtones'].'/'.$req_file_name; + $tmp_file = $config['subdirs']['ringtones'].'/'.$req_file_name; } else if (strpos_array($req_file, $locale_list, 'any') !== FALSE) { // Request Languages if (!empty($req_data_ar[$req_data_len-1])) { - $tmp_file = $config['languages'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_file_name; + $tmp_file = $config['subdirs']['languages'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_file_name; } else { - $tmp_file = $config['default_language'].'/'. $req_file_name; + $tmp_file = $config['main']['default_language'].'/'. $req_file_name; } } /* else if (strpos(strtolower($req_file), '-tones.xml') !== FALSE) { // Request Countries - $tmp_file = $config['countries'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_data_ar[$req_data_len]; + $tmp_file = $config['subdirs']['countries'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_data_ar[$req_data_len]; } else if (strpos(strtolower($req_file), '-dictionary.') !== FALSE) { // Request Countries - $tmp_file = $config['languages'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_data_ar[$req_data_len]; + $tmp_file = $config['subdirs']['languages'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_data_ar[$req_data_len]; } else if (strpos_array($req_file, $locale_list, 'any') !== FALSE) { // Request Languages - $tmp_file = $config['languages'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_data_ar[$req_data_len]; + $tmp_file = $config['subdirs']['languages'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_data_ar[$req_data_len]; } else if (strpos(strtolower($req_file), '-dictionary.jar') !== FALSE) { // Request Countries - $tmp_file = $config['languages'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_data_ar[$req_data_len]; + $tmp_file = $config['subdirs']['languages'].'/'. $req_data_ar[$req_data_len-1].'/'. $req_data_ar[$req_data_len]; } */ if ($print_debug == 'on'){ print_r('
File : '. $orig_req_file_name. ' not found.
');} if (empty($tmp_file)) { - if (!empty($config['log'])) { to_log(array('GET ('.$req_file.'):'.$orig_req_file_name, 'no match found'),'E',$config['log']); } + if (!empty($config['main']['log'])) { to_log(array('GET ('.$req_file.'):'.$orig_req_file_name, 'no match found'),'E',$config['log']); } header("HTTP/1.0 404 Not Found"); die('ERROR: no match found.'); } $req_file_full_path = $tmp_file; } } - if (!empty($config['log'])) { to_log(array('GET ('.$req_file.') :'.$orig_req_file_name, 'Remap :'.$req_file_full_path),'i',$config['log']); } + if (!empty($config['main']['log'])) { to_log(array('GET ('.$req_file.') :'.$orig_req_file_name, 'Remap :'.$req_file_full_path),'i',$config['main']['log']); } if (!empty($req_file_full_path)) { if ($signed) {