public static function getTranslationsFromSource($the_lang, $y_area, $y_subarea) { //-- if (substr((string) $y_area, 0, 1) == '@') { if ((string) $the_lang == 'en') { $fdb_dir = 'lib/app/translations/'; } else { // default is: modules/app/translations/ $fdb_dir = (string) SMART_FRAMEWORK_LANGUAGES_CACHE_DIR; } //end if else $fdb_template = strtolower($y_area . '/' . $y_subarea . '-' . $the_lang); } else { // $y_area can be: apps, mod-something, ... $fdb_dir = (string) Smart::safe_pathname('modules/' . $y_area . '/translations/'); $fdb_template = strtolower($y_subarea . '-' . $the_lang); } //end if else //-- $fdb_file = (string) $fdb_dir . $fdb_template . '.yaml'; SmartFileSysUtils::raise_error_if_unsafe_path($fdb_file); //-- if (!is_dir($fdb_dir)) { Smart::raise_error('Invalid Language Dir: ' . $fdb_dir . ' :: for: ' . $y_area . '@' . $y_subarea, 'Invalid Language Dir for: ' . $y_area . '@' . $y_subarea); return array(); } //end if //-- if (!is_file($fdb_file)) { //-- Smart::raise_error('Invalid Language File: ' . $fdb_file, 'Invalid Language File: ' . $fdb_template); return array(); //-- } //end if //-- $fcontent = SmartFileSystem::staticread($fdb_file); $arr = (new SmartYamlConverter())->parse((string) $fcontent); //-- if (!is_array($arr)) { Smart::raise_error('Parse Error / TRANSLATIONS :: Language File: ' . $fdb_file, 'Parse Error / TRANSLATIONS :: Language File: ' . $fdb_template); return array(); } //end if //-- if (!is_array($arr['TRANSLATIONS'])) { Smart::raise_error('Parse Error / TRANSLATIONS :: Language File: ' . $fdb_file, 'Parse Error / TRANSLATIONS :: Language File: ' . $fdb_template); return array(); } //end if if (Smart::array_size($arr['TRANSLATIONS'][(string) $y_subarea]) <= 0) { Smart::log_warning('Parse Error / TRANSLATIONS.' . $y_subarea . ' :: Language File: ' . $fdb_template); return array(); } //end if //-- return (array) $arr['TRANSLATIONS'][(string) $y_subarea]; //-- }
private function folder_iterator($recurring, $dir_name, $include_dot_files, $search_pattern = '', $search_prevent_file = '', $search_prevent_override = '') { //-- $recurring = (bool) $recurring; $dir_name = (string) $dir_name; $include_dot_files = (bool) $include_dot_files; $search_pattern = (string) $search_pattern; $search_prevent_file = (string) $search_prevent_file; $search_prevent_override = (string) $search_prevent_override; //-- if ((string) $dir_name == '') { Smart::log_warning('LibFileSys // ReadsFolderRecurring // Dir Name is Empty !'); return; // this function does not return anything, but just stop here in this case } //end if //-- fix invalid path (must end with /) $dir_name = SmartFileSysUtils::add_dir_last_slash($dir_name); //-- protection SmartFileSysUtils::raise_error_if_unsafe_path($dir_name); //-- @clearstatcache(); //-- $this->pattern_search_str = $search_pattern; $this->search_prevent_file = $search_prevent_file; $this->search_prevent_override = $search_prevent_override; //-- if (SmartFileSystem::file_or_link_exists($dir_name) and !is_file($dir_name)) { // can be dir or link //list //-- if ($handle = opendir($dir_name)) { //--------------------------------------- while (false !== ($file = readdir($handle))) { //-- if ((string) $file != '.' and (string) $file != '..') { //-- if ($include_dot_files or !$include_dot_files and substr($file, 0, 1) != '.') { //-- SmartFileSysUtils::raise_error_if_unsafe_path($dir_name . $file); //-- params to see if counted or added to pattern matches $tmp_allow_addition = 1; $tmp_add_pattern = 0; //-- this is for #private folders, will prevent searching in folders containing for example this file: .private-folder but can be overriden by the $search_prevent_override option exluding a particular path like folder/private/user1 if (strlen($search_prevent_file) > 0 and is_file($dir_name . $search_prevent_file)) { if (strlen($search_prevent_override) <= 0 or strlen($search_prevent_override) > 0 and !is_file($dir_name . $search_prevent_override)) { $tmp_allow_addition = 0; } //end if } //end if //-- this is a search pattern (search pattern does not apply to folders !!) ; if no empty will populate the pattern matches array with all files and folders matching ; to include all, use * or a particular search for the rest like myfile1 if ((string) $search_pattern == '' or is_dir($dir_name . $file)) { if ($tmp_allow_addition) { if ($this->list_files_and_dirs) { $tmp_add_pattern = 1; } //end if } //end if } else { if ($this->limit_search_files <= 0 or Smart::array_size($this->pattern_file_matches) < $this->limit_search_files) { if ((string) $search_pattern == '*' or (string) $search_pattern == '[image]' and (substr($file, -4, 4) == '.png' or substr($file, -4, 4) == '.gif' or substr($file, -4, 4) == '.jpg' or substr($file, -5, 5) == '.jpeg') or (string) $search_pattern != '*' and (string) $search_pattern != '[image]' and stripos($file, $search_pattern) !== false) { if ($tmp_allow_addition) { if ($this->list_files_and_dirs) { $tmp_add_pattern = 1; } //end if } //end if } else { $tmp_allow_addition = 0; } //end if else } //end if } //end if //-- if ($this->limit_search_files > 0) { // the dir should not be taken in count here if ($this->num_files + $this->num_links >= $this->limit_search_files) { break; } //end if } //end if //-- if (!is_link($dir_name . $file)) { //-- if (is_dir($dir_name . $file)) { //-- dir if ($tmp_allow_addition) { //-- $tmp_fsize = Smart::format_number_int(@filesize($dir_name . $file), '+'); //-- $this->num_dirs++; $this->num_size += $tmp_fsize; $this->num_dirs_size += $tmp_fsize; //-- $tmp_fsize = 0; //-- if ($tmp_add_pattern) { if ($recurring) { // if recurring, add the full path $this->pattern_dir_matches[$dir_name . $file] = @filemtime($dir_name . $file); } else { // if not recurring, add just base path, without dirname prefix $this->pattern_dir_matches[$file] = @filemtime($dir_name . $file); } //end if else } //end if //-- } //end if //-- if ($recurring) { //-- we go search inside even if this folder name may not match the search pattern, it is a folder, except if dissalow addition from above $this->folder_iterator($recurring, SmartFileSysUtils::add_dir_last_slash($dir_name . $file), $include_dot_files, $search_pattern, $search_prevent_file, $search_prevent_override); //-- } //end if //-- } else { //-- file if ($tmp_allow_addition) { //-- $tmp_fsize = Smart::format_number_int(@filesize($dir_name . $file), '+'); //-- $this->num_files++; $this->num_size += $tmp_fsize; $this->num_files_size += $tmp_fsize; //-- $tmp_fsize = 0; //-- if ($tmp_add_pattern) { if ($recurring) { // if recurring, add the full path $this->pattern_file_matches[$dir_name . $file] = @filemtime($dir_name . $file); } else { // if not recurring, add just base path, without dirname prefix $this->pattern_file_matches[$file] = @filemtime($dir_name . $file); } //end if else } //end if //-- } //end if //-- } //end else //-- } else { //-- link if ($tmp_allow_addition) { //-- $link_result = SmartFileSystem::link_get_origin($dir_name . $file); //-- if (empty($link_result) or (string) $link_result == '' or !SmartFileSystem::file_or_link_exists($link_result)) { //-- // case of readlink error ..., not includding broken links, they are useless //-- } else { //-- $tmp_size_arr = array(); $tmp_fsize = 0; //$tmp_size_arr = (array) @lstat($dir_name.$file); //$tmp_fsize = Smart::format_number_int($tmp_size_arr[7],'+'); // $tmp_size_arr[7] -> size, but may break compare if on a different file system or in distributed storage on various OS //-- $this->num_links++; //-- if (file_exists($dir_name . $file)) { // here file_exists must be tested because if broken link not stat on it (filemtime) to avoid log un-necessary errors //-- bugfix: not if broken link $this->num_size += $tmp_fsize; if ($tmp_add_pattern) { if (is_dir($dir_name . $file)) { $this->num_dirs++; $this->num_dirs_size += $tmp_fsize; if ($recurring) { // if recurring, add the full path $this->pattern_dir_matches[$dir_name . $file] = @filemtime($dir_name . $file); } else { // if not recurring, add just base path, without dirname prefix $this->pattern_dir_matches[$file] = @filemtime($dir_name . $file); } //end if else } else { $this->num_files++; $this->num_files_size += $tmp_fsize; if ($recurring) { // if recurring, add the full path $this->pattern_file_matches[$dir_name . $file] = @filemtime($dir_name . $file); } else { // if not recurring, add just base path, without dirname prefix $this->pattern_file_matches[$file] = @filemtime($dir_name . $file); } //end if else } //end if else } //end if //-- } //end if //-- $tmp_fsize = 0; $tmp_size_arr = array(); //-- } //end if else //-- } //end if //-- } //end if else //-- } //end if //-- } //end if(. ..) //-- } //end while //--------------------------------------- @closedir($handle); //--------------------------------------- } else { //--------------------------------------- $this->errors_arr[] = $dir_name; //--------------------------------------- } //end else //-- } else { //--------------------------------------- // nothing ... //--------------------------------------- } //end if else //-- }
public static function open($file_name, $timeout_busy_sec = 60) { //-- global $configs; //-- check if available self::check_is_available(); //-- path protection SmartFileSysUtils::raise_error_if_unsafe_path($file_name); //-- if (strlen($file_name) <= 1) { self::error((string) $file_name, 'OPEN', 'ERROR: DB name is empty !', '', ''); return; } //end if //-- $dir_of_db = Smart::dir_name($file_name); //-- if (!is_dir($dir_of_db)) { self::error((string) $file_name, 'OPEN', 'ERROR: DB folder does not exists !', '', ''); return; } //end if //-- if (!is_writable($dir_of_db)) { self::error((string) $file_name, 'OPEN', 'ERROR: DB folder is not writable !', '', ''); return; } //end if //-- open DB connection try { //-- $db = @new SQLite3($file_name, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE); //-- $db->busyTimeout((int) $timeout_busy_sec * 1000); // $timeout_busy_sec is in seconds ; we set a busy timeout in miliseconds //-- if ((string) SMART_FRAMEWORK_DEBUG_MODE == 'yes') { //-- $arr_version = @$db->version(); //-- if (!is_array($arr_version)) { $arr_version = array(); } //end if //-- SmartFrameworkRegistry::setDebugMsg('db', 'sqlite|log', ['type' => 'metainfo', 'data' => 'SQLite Library Version: ' . $arr_version['versionString'] . ' / ' . $arr_version['versionNumber']]); //-- if ((double) $configs['sqlite']['slowtime'] > 0) { self::$slow_time = (double) $configs['sqlite']['slowtime']; } //end if if (self::$slow_time < 1.0E-7) { self::$slow_time = 1.0E-7; } elseif (self::$slow_time > 0.9999999000000001) { self::$slow_time = 0.9999999000000001; } //end if //-- SmartFrameworkRegistry::setDebugMsg('db', 'sqlite|slow-time', number_format(self::$slow_time, 7, '.', ''), '='); SmartFrameworkRegistry::setDebugMsg('db', 'sqlite|log', ['type' => 'metainfo', 'data' => 'Fast Query Reference Time < ' . self::$slow_time . ' seconds']); //-- } //end if //-- } catch (Exception $e) { //-- self::error((string) $file_name, 'OPEN', $e->getMessage(), 'Catch Exception ...', ''); return; //-- } //end try catch //-- if (is_file($file_name)) { @chmod($file_name, SMART_FRAMEWORK_CHMOD_FILES); } //end if //-- self::check_connection($db); //-- SmartFrameworkRegistry::$Connections['sqlite'][(string) self::get_connection_id($db)] = (string) $file_name; //-- if (@$db->lastErrorCode() !== 0) { $sqlite_error = 'SQLite3-ERR:: ' . @$db->lastErrorMsg(); self::error((string) $file_name, 'OPEN', 'Failed to Open DB File', $file_name . "\n" . 'ERR: ' . $sqlite_error, $file_name); return; } //end if //-- if ((string) SMART_FRAMEWORK_DEBUG_MODE == 'yes') { SmartFrameworkRegistry::setDebugMsg('db', 'sqlite|log', ['type' => 'open-close', 'data' => 'Open SQLite Database: ' . $file_name]); } //end if //-- create the first time table to record the sqlite version if (!self::check_if_table_exists($db, '_smartframework_metadata')) { self::create_table($db, '_smartframework_metadata', 'id VARCHAR(255) PRIMARY KEY UNIQUE, description TEXT'); self::write_data($db, 'INSERT INTO _smartframework_metadata (id, description) VALUES (\'sqlite-version\', \'' . self::escape_str($db, '3') . '\')'); self::write_data($db, 'INSERT INTO _smartframework_metadata (id, description) VALUES (\'smartframework-version\', \'' . self::escape_str($db, (string) SMART_FRAMEWORK_VERSION) . '\')'); self::write_data($db, 'INSERT INTO _smartframework_metadata (id, description) VALUES (\'creation-date-and-time\', \'' . self::escape_str($db, (string) date('Y-m-d H:i:s O')) . '\')'); self::write_data($db, 'INSERT INTO _smartframework_metadata (id, description) VALUES (\'database-name\', \'' . self::escape_str($db, (string) $file_name) . '\')'); self::write_data($db, 'INSERT INTO _smartframework_metadata (id, description) VALUES (\'domain-realm-id\', \'' . self::escape_str($db, (string) SMART_SOFTWARE_NAMESPACE) . '\')'); } //end if //-- return $db; //-- }
public static function apply_watermark($imagePath, $watermarkPath, $quality, $gravity) { //-- check for required extension self::check_gd_truecolor(); //-- //-- SmartFileSysUtils::raise_error_if_unsafe_path($imagePath); SmartFileSysUtils::raise_error_if_unsafe_path($watermarkPath); //-- //-- $imagePath = (string) $imagePath; $watermarkPath = (string) $watermarkPath; //-- //-- if (is_file($imagePath) and is_file($watermarkPath)) { //-- $arr_imgsize = (array) @getimagesize($watermarkPath); $wtmW = (int) $arr_imgsize[0]; $wtmH = (int) $arr_imgsize[1]; $t_wtm = (int) $arr_imgsize[2]; // OK unset($arr_imgsize); //-- if ($t_wtm <= 0) { Smart::log_notice('Media Gallery // SmartGdImageProcess // Watermark :: Unknown Type [W]: ' . $watermarkPath); return 1; // not ok (unknown type) } //end if $t_wtm = (string) @image_type_to_mime_type((int) $t_wtm); // OK //-- switch ((string) $t_wtm) { case 'image/png': case 'image/x-png': $watermark = @imagecreatefrompng($watermarkPath); break; case 'image/gif': $watermark = @imagecreatefromgif($watermarkPath); break; case 'image/pjpeg': case 'image/jpeg': case 'image/jpg': $watermark = @imagecreatefromjpeg($watermarkPath); break; default: Smart::log_notice('Media Gallery // SmartGdImageProcess // Watermark :: Unsupported Type [W] (not PNG/GIF/JPEG ; Type=' . $t_wtm . '): ' . $watermarkPath); return 1; // not ok (invalid type) } //end switch //-- if (!is_resource($watermark)) { // if the immage is corrupt or invalid ... Smart::log_warning('Media Gallery // SmartGdImageProcess // Watermark :: Source Watermark Image Failure: ' . $watermarkPath); return 2; // not ok (there was an error reading the image / have no privileges / or may be an invalid image type) } //end if //-- //-- $arr_imgsize = (array) @getimagesize($imagePath); $imgW = (int) $arr_imgsize[0]; $imgH = (int) $arr_imgsize[1]; $t_img = (int) $arr_imgsize[2]; // OK unset($arr_imgsize); //-- if ($t_img <= 0) { Smart::log_notice('Media Gallery // SmartGdImageProcess // Watermark :: Unknown Type [I]: ' . $imagePath); return 3; // not ok (unknown type) } //end if $t_img = (string) @image_type_to_mime_type((int) $t_img); // OK //-- switch ((string) $t_img) { case 'image/png': case 'image/x-png': $the_type = 'png'; $source = @imagecreatefrompng($imagePath); break; case 'image/gif': $the_type = 'gif'; $source = @imagecreatefromgif($imagePath); break; case 'image/pjpeg': case 'image/jpeg': case 'image/jpg': $the_type = 'jpg'; $source = @imagecreatefromjpeg($imagePath); break; default: Smart::log_notice('Media Gallery // SmartGdImageProcess // Watermark :: Unsupported Type [I] (not PNG/GIF/JPEG ; Type=' . $t_img . '): ' . $imagePath); return 3; // not ok (invalid type) } //end switch //-- if (!is_resource($source)) { // if the immage is corrupt or invalid ... Smart::log_warning('Media Gallery // SmartGdImageProcess // Watermark :: Source Image Failure: ' . $watermarkPath); return 4; // not ok (there was an error reading the image / have no privileges / or may be an invalid image type) } //end if //-- //-- apply watermark switch ((string) $gravity) { // {{{SYNC-GRAVITY}}} case 'northwest': $gravityX = 0; $gravityY = 0; break; case 'northeast': $gravityX = ceil($imgW - $wtmW); $gravityY = 0; break; case 'southwest': $gravityX = 0; $gravityY = ceil($imgH - $wtmH); break; case 'southeast': $gravityX = ceil($imgW - $wtmW); $gravityY = ceil($imgH - $wtmH); break; case 'center': default: $gravityX = ceil($imgW / 2 - $wtmW / 2); $gravityY = ceil($imgH / 2 - $wtmH / 2); } //end switch //-- @imagecopy($source, $watermark, $gravityX, $gravityY, 0, 0, $wtmW, $wtmH); //-- //-- saving new image switch ((string) $the_type) { case 'png': @imagepng($source, $imagePath); break; case 'gif': @imagegif($source, $imagePath); break; case 'jpg': @imagejpeg($source, $imagePath, $quality); // preserve 100% quality for jpeg break; default: // this should not happen, it is catched above } //end switch //-- //-- @imagedestroy($source); @imagedestroy($watermark); //-- //-- return 0; // OK //-- } //end if else //-- //-- return -1; // not ok, files do not exists / not files / invalid paths provided //-- }
public static function test_fs() { //-- if (SMART_FRAMEWORK_TESTUNIT_ALLOW_FS_TESTS !== true) { return SmartComponents::operation_notice('Test Unit File System Tests are DISABLED ...'); } //end if //-- //-- $time = microtime(true); //-- //-- $err = ''; $tests = array(); //-- //-- if ((string) DIRECTORY_SEPARATOR != '\\') { // broken links do not work on Windows ! $tests[] = '##### FileSystem OPERATIONS / TESTS - ALL: #####'; } else { $tests[] = '##### FileSystem OPERATIONS / TESTS *** PARTIAL SUPPORT ONLY (BY PLATFORM) ***: #####'; } //end if else //-- //-- $test_string = '#START#' . "\n" . 'グッド' . "\n" . 'SmartFramework/Test/FileSystem' . "\n" . time() . "\n" . SMART_FRAMEWORK_HTACCESS_NOINDEXING . SMART_FRAMEWORK_HTACCESS_FORBIDDEN . SMART_FRAMEWORK_HTACCESS_NOEXECUTION . "\n" . '#END#'; $test_str_cksum = SmartHashCrypto::sha512($test_string); $long_prefixed = SmartFileSysUtils::prefixed_sha1_path(sha1(time())); $short_prefixed = SmartFileSysUtils::prefixed_uuid10_dir(Smart::uuid_10_seq()); //-- $the_base_folder = 'tmp/tests/'; $the_sufx_folder = 'Folder1'; $the_base_file = 'NORMAL-Write_123_@#.txt'; //-- $the_folder = $the_base_folder . $the_sufx_folder . '/'; $the_copy_folder = $the_base_folder . 'folder2'; $the_move_folder = $the_base_folder . 'FOLDER3'; $the_extra_folder = $the_folder . 'extra/'; $the_file = $the_folder . $the_base_file; //-- $get_folder = SmartFileSysUtils::add_dir_last_slash(SmartFileSysUtils::get_dir_from_path($the_folder)); $get_file = SmartFileSysUtils::get_file_name_from_path($the_file); $get_xfile = SmartFileSysUtils::get_noext_file_name_from_path($the_file); $get_ext = SmartFileSysUtils::get_file_extension_from_path($the_file); //-- $the_copy_file = $the_file . '.copy.txt'; $the_move_file = $the_extra_folder . $the_base_file . '.copy.moved.txt'; $the_broken_link = $the_extra_folder . 'a-broken-link'; $the_broken_dir_link = $the_extra_folder . 'a-broken-dir-link'; $the_good_link = $the_extra_folder . 'a-good-link'; $the_good_dir_link = $the_extra_folder . 'a-good-dir-link'; //-- //-- $tests[] = 'INITIAL-FOLDER: ' . $get_folder; $tests[] = 'NEW-FOLDER: ' . $the_folder; $tests[] = 'NEW-FILE: ' . $the_file; //-- //-- if ((string) $err == '') { $the_test = 'CHECK TEST SAFE PATH NAME: DIR / FILE ...'; $tests[] = $the_test; if ((string) Smart::safe_pathname((string) $get_folder) !== (string) $get_folder or (string) Smart::safe_pathname((string) $the_copy_file) !== (string) $the_copy_file) { $err = 'ERROR: SAFE PATH NAME TEST ... FAILED !!!'; } //end if } //end if //-- if ((string) $err == '') { $the_test = 'CHECK TEST ABSOLUTE / BACKWARD PATHS ...'; $tests[] = $the_test; if (!SmartFileSysUtils::check_file_or_dir_name('/this/is/absolute', 'no') or SmartFileSysUtils::check_file_or_dir_name('/this/is/absolute') or SmartFileSysUtils::check_file_or_dir_name('/this/is/../backward/path')) { $err = 'ERROR: CHECK TEST ABSOLUTE / BACKWARD PATHS ... FAILED !!!'; } //end if } //end if //-- if ((string) $err == '') { $the_test = 'CHECK EXTRACT FOLDER FROM PATH ...'; $tests[] = $the_test; if ((string) $get_folder != SmartFileSysUtils::add_dir_last_slash(Smart::dir_name($the_folder))) { $err = 'ERROR: Path Extraction FAILED: Dir=' . $get_folder . ' ; DirName=' . SmartFileSysUtils::add_dir_last_slash(Smart::dir_name($the_folder)); } //end if } //end if if ((string) $err == '') { $the_test = 'CHECK EXTRACT FILE AND EXTENSION FROM PATH (1) ...'; $tests[] = $the_test; if ((string) $get_folder . SmartFileSysUtils::add_dir_last_slash($the_sufx_folder) . $get_file != $the_file) { $err = 'ERROR :: Path Extraction FAILED: Re-Composed-File=' . $get_folder . SmartFileSysUtils::add_dir_last_slash($the_sufx_folder) . $get_file . ' ; File=' . $the_file; } //end if } //end if if ((string) $err == '') { $the_test = 'CHECK EXTRACT FILE AND EXTENSION FROM PATH (2) ...'; $tests[] = $the_test; if ((string) $get_file != $get_xfile . '.' . $get_ext) { $err = 'ERROR :: Path Extraction FAILED: File=' . $get_file . ' ; XFile=' . $get_xfile . ' ; Ext=' . $get_ext; } //end if } //end if //-- SmartFileSysUtils::raise_error_if_unsafe_path($the_folder); if ((string) $err == '') { $the_test = 'CHECK PATH NAME DIR: check_file_or_dir_name() : ' . $the_folder; $tests[] = $the_test; $result = 0; $result = SmartFileSysUtils::check_file_or_dir_name($the_folder); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if SmartFileSysUtils::raise_error_if_unsafe_path($the_file); if ((string) $err == '') { $the_test = 'CHECK PATH NAME FILE: check_file_or_dir_name() : ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSysUtils::check_file_or_dir_name($the_file); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- //-- if ((string) $err == '') { $parent_folder = SmartFileSysUtils::add_dir_last_slash(''); $the_test = 'Check Add Dir Last (trailing) Slash: Empty Folder Name'; $tests[] = $the_test; if ((string) $parent_folder != './') { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $parent_folder = SmartFileSysUtils::add_dir_last_slash('.'); $the_test = 'Check Add Dir Last (trailing) Slash: Dot Folder Name: ' . $parent_folder; $tests[] = $the_test; if ((string) $parent_folder != './') { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $parent_folder = SmartFileSysUtils::add_dir_last_slash('./'); $the_test = 'Check Add Dir Last (trailing) Slash: DotSlash Folder Name: ' . $parent_folder; $tests[] = $the_test; if ((string) $parent_folder != './') { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $parent_folder = SmartFileSysUtils::add_dir_last_slash(Smart::dir_name($the_base_folder)); $the_test = 'Check Parent Dir Name with Add Dir Last (trailing) Slash: ' . $parent_folder . ' # from: ' . $the_base_folder; $tests[] = $the_test; if ((string) $parent_folder != 'tmp/') { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- //-- if ((string) $err == '') { if (is_dir($get_folder)) { $the_test = 'DIR DELETE - INIT CLEANUP: dir_delete() + recursive: ' . $get_folder; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_delete($the_base_folder, true); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } else { $tests[] = 'DIR DELETE - INIT CLEANUP: Test Not Run (folder does not exists): ' . $get_folder; } //end if else } //end if //-- if ((string) $err == '') { $the_test = 'DIR CREATE RECURSIVE: dir_recursive_create() : ' . $the_folder . $long_prefixed . $short_prefixed; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_recursive_create($the_folder . $long_prefixed . $short_prefixed); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'DIR CREATE NON-RECURSIVE: dir_create() : extra/ in : ' . $the_extra_folder; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_recursive_create($the_extra_folder); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- if ((string) DIRECTORY_SEPARATOR != '\\') { // broken links do not work on Windows ! if ((string) $err == '') { $the_test = 'CREATE BROKEN FILE LINK FOR DELETION (1): link_create() : as : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::link_create('tmp/cache', $the_broken_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'DELETE BROKEN FILE LINK (1): delete() : as : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::delete($the_broken_link); if ($result !== 1 || is_link($the_broken_link)) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'CREATE BROKEN FILE LINK FOR DELETION (2): link_create() : as : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::link_create('tmp/index.html', $the_broken_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'DELETE BROKEN FILE LINK (2): dir_delete() : as : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_delete($the_broken_link); if ($result !== 1 || is_link($the_broken_link)) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'CREATE BROKEN FILE LINK: link_create() : as : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::link_create('tmp/index.html', $the_broken_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'CREATE BROKEN DIR LINK: link_create() : as : ' . $the_broken_dir_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::link_create('tmp/', $the_broken_dir_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'CREATE A FILE LINK: link_create() : as : ' . $the_good_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::link_create(Smart::real_path('tmp/index.html'), $the_good_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'CREATE A DIR LINK: link_create() : as : ' . $the_good_dir_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::link_create(Smart::real_path('tmp/'), $the_good_dir_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if } //end if //-- if ((string) $err == '') { $the_test = 'FILE WRITE with empty content: write() : ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::write($the_file, ''); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE WRITE: write() / before append : ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::write($the_file, $test_string); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE WRITE: write() +append : ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::write($the_file, $test_string, 'a'); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE READ / Append: read() Full Size: ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::read($the_file); if ((string) SmartHashCrypto::sha512($result) != (string) SmartHashCrypto::sha512($test_string . $test_string)) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE WRITE: re-write() : ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::write($the_file, $test_string); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- if ((string) DIRECTORY_SEPARATOR != '\\') { // broken links do not work on Windows ! if ((string) $err == '') { $the_test = 'FILE WRITE TO A BROKEN LINK: write() : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::write($the_broken_link, $test_string); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'DELETE THE BROKEN LINK AFTER write() and RE-CREATE IT : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::delete($the_broken_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'RE-CREATE BROKEN FILE LINK [AFTER WRITE]: link_create() : as : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::link_create('tmp/index.html', $the_broken_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE WRITE: write_if_not_exists() with Content Compare to a broken link : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::write_if_not_exists($the_broken_link, $test_string, 'yes'); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'DELETE THE BROKEN LINK AFTER write_if_not_exists() and RE-CREATE IT : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::delete($the_broken_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'RE-CREATE BROKEN FILE LINK [AFTER WRITE-IF-NOT-EXISTS]: link_create() : as : ' . $the_broken_link; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::link_create('tmp/index.html', $the_broken_link); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if } //end if //-- if ((string) $err == '') { $the_test = 'FILE WRITE: write_if_not_exists() without Content Compare : ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::write_if_not_exists($the_file, $test_string, 'no'); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- if ((string) $err == '') { $the_test = 'FILE READ: read() Full Size: ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::read($the_file); if ((string) SmartHashCrypto::sha512($result) != (string) $test_str_cksum) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE READ: read() Partial Size, First 10 bytes: ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::read($the_file, 10); if ((string) sha1($result) != (string) sha1(substr($test_string, 0, 10))) { // here we read bytes so substr() not SmartUnicode::sub_str() should be used $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- if ((string) $err == '') { $the_test = 'FILE STATIC-READ: staticread() Full Size: ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::staticread($the_file); if ((string) SmartHashCrypto::sha512($result) != (string) $test_str_cksum) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE STATIC-READ: staticread() Partial Size, First 10 bytes: ' . $the_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::staticread($the_file, 10); if ((string) sha1($result) != (string) sha1(substr($test_string, 0, 10))) { // here we read bytes so substr() not SmartUnicode::sub_str() should be used $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- if ((string) $err == '') { $the_test = 'FILE COPY: copy() : ' . $the_file . ' to: ' . $the_copy_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::copy($the_file, $the_copy_file); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE COPY with OVERWRITE: copy() : ' . $the_file . ' to: ' . $the_copy_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::copy($the_file, $the_copy_file, true); // overwrite destination file(s) if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'FILE RE-COPY (test should re-write the destination): copy() : ' . $the_file . ' to: ' . $the_move_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::copy($the_file, $the_move_file); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } else { $the_test = 'FILE DELETE: delete() : ' . $the_move_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::delete($the_move_file); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if } //end if if ((string) $err == '') { $the_test = 'FILE RENAME/MOVE: rename() : ' . $the_copy_file . ' to: ' . $the_move_file; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::rename($the_copy_file, $the_move_file); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- if ((string) $err == '') { if (is_dir('__development/')) { //-- $the_test = 'RECURSIVE COPY (CLONE) DIR [DEVELOPMENT]: dir_copy() : ' . '__development/' . ' to: ' . $the_folder . '__development'; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_copy('__development/', $the_folder . '__development'); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if //-- if ((string) $err == '') { $the_test = 'DIR COMPARE THE [DEVELOPMENT] SOURCE WITH [DEVELOPMENT] DESTINATION AFTER DIR COPY AND DIR MOVE:' . "\n" . 'compare_folders() : ' . '__development/' . ' with: ' . $the_folder . '__development/'; $tests[] = $the_test; $arr_diff = array(); $arr_diff = SmartFileSystem::compare_folders('__development', $the_folder . '__development', true, true); if (Smart::array_size($arr_diff) > 0) { $err = 'ERROR :: ' . $the_test . ' #DIFFERENCES=' . print_r($arr_diff, 1); } //end if } //end if //-- } else { $tests[] = 'RECURSIVE COPY (CLONE) DIR [DEVELOPMENT]: Test Not Run (Development environment not detected) ...'; } //end if else } //end if //-- if ((string) $err == '') { $the_test = 'RECURSIVE COPY (CLONE) DIR: dir_copy() : ' . $the_folder . ' to: ' . $the_copy_folder; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_copy($the_folder, $the_copy_folder); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- if ((string) $err == '') { $the_test = 'MOVE/RENAME DIR: dir_rename() : ' . $the_copy_folder . ' to: ' . $the_move_folder; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_rename($the_copy_folder, $the_move_folder); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- if ((string) $err == '') { $the_test = 'DIR COMPARE THE SOURCE WITH DESTINATION AFTER DIR COPY AND DIR MOVE: ' . $the_folder . ' with: ' . $the_move_folder; $tests[] = $the_test; $arr_diff = array(); $arr_diff = SmartFileSystem::compare_folders($the_folder, $the_move_folder, true, true); if (Smart::array_size($arr_diff) > 0) { $err = 'ERROR :: ' . $the_test . ' #DIFFERENCES=' . print_r($arr_diff, 1); } //end if } //end if //-- if ((string) $err == '') { $the_test = 'DIR DELETE - SIMPLE: dir_delete() non-recursive: ' . $the_extra_folder; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_delete($the_extra_folder, false); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if if ((string) $err == '') { $the_test = 'DIR DELETE - LAST CLEANUP: dir_delete() + recursive: ' . $get_folder; $tests[] = $the_test; $result = 0; $result = SmartFileSystem::dir_delete($the_base_folder, true); if ($result !== 1) { $err = 'ERROR :: ' . $the_test . ' #RESULT=' . $result; } //end if } //end if //-- //-- $time = 'TOTAL TIME was: ' . (microtime(true) - $time); //-- //-- $end_tests = '##### END TESTS ... ' . $time . ' sec. #####'; //-- //-- if ((string) $err == '') { $img_sign = 'lib/core/img/sign_info.png'; $img_check = 'lib/core/img/q_completed.png'; $text_main = Smart::escape_js('<span style="color:#83B953;">Good ... Perfect :: グッド ... パーフェクト</span>'); $text_info = Smart::escape_js('<h2><span style="color:#83B953;">All</span> the SmartFramework FS Operations <span style="color:#83B953;">Tests PASSED on PHP</span><hr></h2><span style="font-size:14px;">' . Smart::nl_2_br(Smart::escape_html(implode("\n" . '* ', $tests) . "\n" . $end_tests)) . '</span>'); } else { $img_sign = 'lib/core/img/sign_error.png'; $img_check = 'lib/core/img/q_warning.png'; $text_main = Smart::escape_js('<span style="color:#FF5500;">An ERROR occured ... :: エラーが発生しました ...</span>'); $text_info = Smart::escape_js('<h2><span style="color:#FF5500;">A test FAILED</span> when testing FS Operations.<span style="color:#FF5500;"><hr>FAILED Test Details</span>:</h2><br><h3>' . Smart::escape_html($tests[Smart::array_size($tests) - 1]) . '</h3><br><span style="font-size:14px;"><pre>' . Smart::escape_html($err) . '</pre></span>'); } //end if else //-- //-- $html = <<<HTML <h1>SmartFramework LibFileSystem Tests: DONE ... [ Time: {$time} sec. ]</h1> <script type="text/javascript"> \tSmartJS_BrowserUtils.alert_Dialog( \t\t'<img src="{$img_sign}" align="right"><h1>{$text_main}</h1><hr><span style="color:#333333;"><img src="{$img_check}" align="right">{$text_info}<br>', \t\t'', \t\t'FileSystem Operations Test Suite for SmartFramework: PHP', \t\t'920', \t\t'480' \t); </script> HTML; //-- //-- return $html; //-- }
public static final function DownloadsHandler($encrypted_download_pack, $controller_key) { //-- $encrypted_download_pack = (string) $encrypted_download_pack; $controller_key = (string) $controller_key; //-- $client_signature = SmartUtils::get_visitor_signature(); //-- if ((string) SMART_APP_VISITOR_COOKIE == '') { Smart::log_info('File Download', 'Failed: 400 / Invalid Visitor Cookie' . ' on Client: ' . $client_signature); self::Raise400Error('ERROR: Invalid Visitor UUID. Cookies must be enabled to enable this feature !'); return ''; } //end if //-- $downloaded_file = ''; // init //-- $decoded_download_packet = (string) trim((string) SmartUtils::crypto_decrypt((string) $encrypted_download_pack, 'SmartFramework//DownloadLink' . SMART_FRAMEWORK_SECURITY_KEY)); //-- if ((string) $decoded_download_packet != '') { // if data is corrupted, decrypt checksum does not match, will return an empty string //-- if (SMART_FRAMEWORK_ADMIN_AREA === true) { // {{{SYNC-DWN-CTRL-PREFIX}}} $controller_key = (string) 'AdminArea/' . $controller_key; } else { $controller_key = (string) 'IndexArea/' . $controller_key; } //end if //-- {{{SYNC-DOWNLOAD-ENCRYPT-ARR}}} $arr_metadata = explode("\n", (string) $decoded_download_packet, 6); // only need first 5 parts //print_r($arr_metadata); // #PACKET-STRUCTURE# [we will have an array like below, according with the: SmartUtils::create_download_link()] // [TimedAccess]\n // [FilePath]\n // [AccessKey]\n // [UniqueKey]\n // [SFR.UA]\n // #END# //-- $crrtime = (string) trim((string) $arr_metadata[0]); $filepath = (string) trim((string) $arr_metadata[1]); $access_key = (string) trim((string) $arr_metadata[2]); $unique_key = (string) trim((string) $arr_metadata[3]); //-- unset($arr_metadata); //-- $timed_hours = 1; // default expire in 1 hour if (defined('SMART_FRAMEWORK_DOWNLOAD_EXPIRE')) { if ((int) SMART_FRAMEWORK_DOWNLOAD_EXPIRE > 0) { if ((int) SMART_FRAMEWORK_DOWNLOAD_EXPIRE <= 24) { // max is 24 hours (since download link is bind to unique browser signature + unique cookie ... make non-sense to keep more) $timed_hours = (int) SMART_FRAMEWORK_DOWNLOAD_EXPIRE; } //end if } //end if } //end if //-- if ((int) $timed_hours > 0) { if ((int) $crrtime < (int) (time() - 60 * 60 * $timed_hours)) { Smart::log_info('File Download', 'Failed: 403 / Download expired at: ' . date('Y-m-d H:i:s O', (int) $crrtime) . ' for: ' . $filepath . ' on Client: ' . $client_signature); self::Raise403Error('ERROR: The Access Key for this Download is Expired !'); return ''; } //end if } //end if //-- if ((string) $access_key != (string) sha1('DownloadLink:' . SMART_SOFTWARE_NAMESPACE . '-' . SMART_FRAMEWORK_SECURITY_KEY . '-' . SMART_APP_VISITOR_COOKIE . ':' . $filepath . '^' . $controller_key)) { Smart::log_info('File Download', 'Failed: 403 / Invalid Access Key for: ' . $filepath . ' on Client: ' . $client_signature); self::Raise403Error('ERROR: Invalid Access Key for this Download !'); return ''; } //end if //-- if ((string) $unique_key != (string) SmartHashCrypto::sha1('Time=' . $crrtime . '#' . SMART_SOFTWARE_NAMESPACE . '-' . SMART_FRAMEWORK_SECURITY_KEY . '-' . $access_key . '-' . SmartUtils::unique_auth_client_private_key() . ':' . $filepath . '+' . $controller_key)) { Smart::log_info('File Download', 'Failed: 403 / Invalid Client (Unique) Key for: ' . $filepath . ' on Client: ' . $client_signature); self::Raise403Error('ERROR: Invalid Client Key to Access this Download !'); return ''; } //end if //-- if (SmartFileSysUtils::check_file_or_dir_name($filepath)) { //-- $skip_log = 'no'; // default log if (defined('SMART_FRAMEWORK_DOWNLOAD_SKIP_LOG')) { $skip_log = 'yes'; // do not log if accessed via admin area and user is authenticated } //end if //-- $tmp_file_ext = (string) strtolower(SmartFileSysUtils::get_file_extension_from_path($filepath)); // [OK] $tmp_file_name = (string) strtolower(SmartFileSysUtils::get_file_name_from_path($filepath)); //-- $tmp_eval = SmartFileSysUtils::mime_eval($tmp_file_name); $mime_type = (string) $tmp_eval[0]; $mime_disp = (string) $tmp_eval[1]; //-- the path must not start with / but this is tested below $tmp_arr_paths = (array) explode('/', $filepath, 2); // only need 1st part for testing //-- allow file downloads just from specific folders like wpub/ or wsys/ (this is a very important security fix to dissalow any downloads that are not in the specific folders) if (substr((string) $filepath, 0, 1) != '/' and strpos((string) SMART_FRAMEWORK_DOWNLOAD_FOLDERS, '<' . trim((string) $tmp_arr_paths[0]) . '>') !== false and stripos((string) SMART_FRAMEWORK_DENY_UPLOAD_EXTENSIONS, '<' . $tmp_file_ext . '>') === false) { //-- SmartFileSysUtils::raise_error_if_unsafe_path($filepath); // re-test finally //-- @clearstatcache(); //-- if (is_file($filepath)) { //-- if (!headers_sent()) { //-- $fp = @fopen($filepath, 'rb'); $fsize = @filesize($filepath); //-- if (!$fp || $fsize <= 0) { //-- Smart::log_info('File Download', 'Failed: 404 / The requested File is Empty or Not Readable: ' . $filepath . ' on Client: ' . $client_signature); self::Raise404Error('WARNING: The requested File is Empty or Not Readable !'); return ''; //-- } //end if //-- set max execution time to zero ini_set('max_execution_time', 0); // we can expect a long time if file is big, but this will be anyway overriden by the WebServer Timeout Directive //-- // cache headers are presumed to be sent by runtime before of this step //-- header('Content-Type: ' . $mime_type); header('Content-Disposition: ' . $mime_disp); header('Content-Length: ' . $fsize); //-- @fpassthru($fp); // output without reading all in memory //-- @fclose($fp); //-- } else { //-- Smart::log_info('File Download', 'Failed: 500 / Headers Already Sent: ' . $filepath . ' on Client: ' . $client_signature); self::Raise500Error('ERROR: Download Failed, Headers Already Sent !'); return ''; //-- } //end if else //-- if ((string) $skip_log != 'yes') { //-- $downloaded_file = (string) $filepath; // return the file name to be logged //-- } //end if //-- } else { //-- Smart::log_info('File Download', 'Failed: 404 / The requested File does not Exists: ' . $filepath . ' on Client: ' . $client_signature); self::Raise404Error('WARNING: The requested File for Download does not Exists !'); return ''; //-- } //end if else } else { //-- Smart::log_info('File Download', 'Failed: 403 / Access to this File is Denied: ' . $filepath . ' on Client: ' . $client_signature); self::Raise403Error('ERROR: Download Access to this File is Denied !'); return ''; //-- } //end if else //-- } else { //-- Smart::log_info('File Download', 'Failed: 400 / Unsafe File Path: ' . $filepath . ' on Client: ' . $client_signature); self::Raise400Error('ERROR: Unsafe Download File Path !'); return ''; //-- } //end if else //-- } else { //-- Smart::log_info('File Download', 'Failed: 400 / Invalid Data Packet' . ' on Client: ' . $client_signature); self::Raise400Error('ERROR: Invalid Download Data Packet !'); return ''; //-- } //end if else //-- return (string) $downloaded_file; //-- }
/** * Load/Save a cache file from Memory or from a URL * * @param STRING $y_cache_file_extension :: File Extension (example: '.ext') * @param STRING $y_cache_prefix :: prefix dir (at least 3 chars) ended by slash (Example: 'prefix/') * @param STRING $y_load_url :: URL to Load (Ex: http(s)://some/test.txt ; memory://some.unique.key) * @param STRING $y_content :: just for memory:// ; contents of the file to be saved into cache - [set] mode ; if this is empty will just get * @param INT $y_cache_expire :: 0=never ; (>0)=seconds * @param ENUM $y_encrypted :: yes/no to encrypt the file content * @return MIXED :: cached contents */ public static function load_cached_content($y_cache_file_extension, $y_cache_prefix, $y_load_url, $y_content = '', $y_cache_expire = 0, $y_encrypted = 'no') { // v.150209 //-- $y_load_url = (string) $y_load_url; //-- if ((string) $y_load_url == '') { Smart::log_warning('Utils // Load From Cache ... Empty URL ...'); return ''; } //end if //-- //-- $y_cache_file_extension = Smart::safe_validname($y_cache_file_extension); //-- $y_cache_expire = Smart::format_number_int($y_cache_expire, '+'); //-- $y_cache_prefix = (string) $y_cache_prefix; //-- if (strlen($y_cache_prefix) >= 3 and strlen($y_cache_prefix) <= 64) { //-- $y_cache_prefix = SmartFileSysUtils::add_dir_last_slash($y_cache_prefix); // fix trailing slash //-- } else { //-- $y_cache_prefix = 'default/'; //-- } //end if //-- //-- $unique_id = (string) SmartHashCrypto::sha1('@@::SmartFramework::Content::Cache@@' . $y_load_url); //-- $dir = 'tmp/cache/' . $y_cache_prefix . SmartFileSysUtils::prefixed_sha1_path($unique_id); SmartFileSysUtils::raise_error_if_unsafe_path($dir); //-- $file = (string) $dir . $unique_id . $y_cache_file_extension; SmartFileSysUtils::raise_error_if_unsafe_path($file); //-- //-- if (!is_dir($dir)) { SmartFileSystem::dir_recursive_create($dir); } // end if //-- $protect_file = $dir . 'index.html'; if (!is_file($protect_file)) { SmartFileSystem::write($protect_file, ''); } //end if //-- //-- will go through this only if cache expired or no cache if (!is_file($file) or is_file($file) and $y_cache_expire > 0 and @filemtime($file) + $y_cache_expire < time()) { //-- read if (substr($y_load_url, 0, 9) == 'memory://' and (string) $y_content != '') { //-- set the content from memory $tmp_content = (string) $y_content; $tmp_result = '1'; $tmp_code = '200'; //-- } elseif (substr($y_load_url, 0, 9) != 'memory://') { //-- $arr = self::load_url_or_file($y_load_url); // [OK] $tmp_result = $arr['result']; $tmp_code = $arr['code']; $tmp_content = $arr['content']; $arr = array(); //-- } //end if else //-- if required, apply encryption if ((string) $y_encrypted == 'yes') { //-- $tmp_content = self::crypto_blowfish_encrypt($tmp_content); //-- } //end if //-- write to cache if ((string) $tmp_result == '1' and (string) $tmp_code == '200') { //-- SmartFileSystem::write($file, $tmp_content); // save file to cache (safe write is controlled via locks) //-- } //end if //-- $tmp_content = ''; //-- } //end if //-- //-- get from cache $out = SmartFileSystem::read($file); //-- if ((string) $y_encrypted == 'yes') { $out = self::crypto_blowfish_decrypt($out); } //end if //-- //-- return $out; //-- }