Пример #1
0
 private static function test_filename_file_by_filter($file, $filter_fname, $filter_fext, $filter_special_extensions)
 {
     //--
     $out = 0;
     //--
     if (((string) $filter_fname == '' and (string) $filter_fext == '' or (string) $filter_fname != '' and stripos($file, $filter_fname) !== false or (string) $filter_fext != '' and (string) strtolower(SmartFileSysUtils::get_file_extension_from_path($file)) == (string) strtolower($filter_fext)) and (Smart::array_size($filter_special_extensions) <= 0 or Smart::array_size($filter_special_extensions) > 0 and in_array(strtolower(SmartFileSysUtils::get_file_extension_from_path($file)), $filter_special_extensions))) {
         //--
         $out = 1;
         //--
     }
     //end if
     //--
     return $out;
     //--
 }
 /**
  * [PUBLIC] Draw an Image Gallery
  *
  * @param STRING $y_title									:: a title for the gallery
  * @param STRING $y_dir										:: path to scan
  * @param *OPTIONAL[yes/no] $y_process_previews_and_images	:: If = 'yes', will create previews for images and videos (movies) and will create conformed images
  * @param *OPTIONAL[yes/no] $y_remove_originals				:: If = 'yes', will remove original (images) after creating previews [$y_process_previews_and_images must be yes]
  * @param *OPTIONAL[>=0]	$y_display_limit				:: Items limit to display
  */
 public function draw($y_title, $y_dir, $y_process_previews_and_images = 'no', $y_remove_originals = 'no', $y_display_limit = '0')
 {
     //--
     $y_title = (string) $y_title;
     //--
     $y_dir = (string) $y_dir;
     //--
     $y_process_previews_and_images = (string) $y_process_previews_and_images;
     if ((string) $y_process_previews_and_images != 'yes') {
         $y_process_previews_and_images = 'no';
     }
     //end if
     //--
     $y_display_limit = Smart::format_number_int($y_display_limit, '+');
     //--
     //--
     if ((string) $this->use_secure_links == 'yes') {
         if ((string) $this->secure_download_link == '' or (string) $this->secure_download_ctrl_key == '') {
             return '<h1>WARNING: Media Gallery / Secure Links Mode is turned ON but at least one of the: download link or the controller was NOT provided ...</h1>';
         }
         //end if
     }
     //end if
     //--
     //--
     if (!SmartFileSysUtils::check_file_or_dir_name($y_dir)) {
         return '<h1>ERROR: Invalid Folder for Media Gallery ...</h1>';
     }
     //end if
     //--
     $y_dir = SmartFileSysUtils::add_dir_last_slash($y_dir);
     SmartFileSysUtils::raise_error_if_unsafe_path($y_dir);
     //--
     if (!is_dir($y_dir)) {
         return '<h1>WARNING: The Folder for Media Gallery does not exists ...</h1>';
     }
     //end if
     //--
     //--
     $this->gallery_items = 0;
     //--
     //-- constraint of params
     if ((string) $y_process_previews_and_images != 'yes') {
         $y_remove_originals = 'no';
     }
     //end if
     //--
     if (strlen($this->preview_formvar) > 0) {
         // avoid processing if it is displayed in a form
         $y_process_previews_and_images = 'no';
         $y_remove_originals = 'no';
     }
     //end if
     //--
     //-- some inits ...
     $out = '';
     $arr_files = array();
     $processed = 0;
     //--
     //--
     $arr_storage = (array) (new SmartGetFileSystem(true))->get_storage($y_dir, false, false);
     $all_mg_files = (array) $arr_storage['list-files'];
     //--
     //--
     for ($i = 0; $i < Smart::array_size($all_mg_files); $i++) {
         //--
         $file = (string) $all_mg_files[$i];
         $ext = strtolower(SmartFileSysUtils::get_file_extension_from_path($file));
         //--
         if (substr($file, 0, 1) != '.' and strpos($file, '.#') === false and strpos($file, '#.') === false) {
             //--
             if (is_file($y_dir . $file) and ((string) $ext == 'jpeg' or (string) $ext == 'jpg' or (string) $ext == 'gif' or (string) $ext == 'png')) {
                 //--
                 if (SmartFileSysUtils::version_check($file, 'mg-preview')) {
                     //-- it is an image preview file
                     if (!is_file($y_dir . SmartFileSysUtils::version_add($file, 'mg-image'))) {
                         SmartFileSystem::delete($y_dir . $file);
                         // remove preview if orphan
                     }
                     //end if
                     //--
                 } elseif (SmartFileSysUtils::version_check($file, 'mg-image')) {
                     //-- it is an image file
                     if ((string) $y_process_previews_and_images == 'yes') {
                         //--
                         $tmp_file = $y_dir . SmartFileSysUtils::version_add($file, 'mg-preview');
                         //--
                         if (!is_file($tmp_file)) {
                             //--
                             $out .= $this->img_preview_create($y_dir . $file, $tmp_file) . '<br>';
                             $processed += 1;
                             //--
                         }
                         //end if
                         //--
                     }
                     //end if
                     //--
                     $arr_files[] = $file;
                     $this->gallery_items += 1;
                     //--
                 } elseif (SmartFileSysUtils::version_check($file, 'mg-vpreview')) {
                     //-- it is a movie preview file
                     if (stripos($file, '.#tmp-preview#.jpg') === false) {
                         //--
                         $tmp_linkback_file = SmartFileSysUtils::get_noext_file_name_from_path(SmartFileSysUtils::version_remove($file));
                         //--
                         if (!is_file($y_dir . $tmp_linkback_file)) {
                             SmartFileSystem::delete($y_dir . $file);
                             // remove if orphan
                         }
                         //end if
                         //--
                     }
                     //end if
                     //--
                 } else {
                     // unprocessed image
                     //--
                     if ((string) $y_process_previews_and_images == 'yes') {
                         //--
                         $tmp_file = $y_dir . SmartFileSysUtils::version_add($file, 'mg-image');
                         //--
                         if (!is_file($tmp_file)) {
                             //--
                             if ((string) $y_dir . $file != (string) $y_dir . strtolower($file)) {
                                 SmartFileSystem::rename($y_dir . $file, $y_dir . strtolower($file));
                                 // make sure is lowercase, to be ok for back-check since versioned is lowercase
                             }
                             //end if
                             //--
                             $out .= $this->img_conform_create($y_dir . $file, $tmp_file) . '<br>';
                             $processed += 1;
                             //--
                         } else {
                             //--
                             if ((string) $y_remove_originals == 'yes') {
                                 //--
                                 SmartFileSystem::delete($y_dir . $file);
                                 $out .= '<table width="550" bgcolor="#FF3300"><tr><td>removing original image: \'' . Smart::escape_html($file) . '\'</td></tr></table><br>';
                                 $processed += 1;
                                 //--
                             }
                             //end if
                             //--
                         }
                         //end if else
                         //--
                     }
                     //end if
                     //--
                 }
                 //end if else
                 //--
             } elseif (is_file($y_dir . $file) and ((string) $ext == 'webm' or (string) $ext == 'ogv' or (string) $ext == 'mp4' or (string) $ext == 'mov' or (string) $ext == 'flv')) {
                 // WEBM, OGV, MP4, MOV, FLV
                 //-- process preview FLV / MOV ...
                 if ((string) $y_process_previews_and_images == 'yes') {
                     //--
                     $tmp_file = $y_dir . SmartFileSysUtils::version_add($file, 'mg-vpreview') . '.jpg';
                     //--
                     if (!is_file($tmp_file)) {
                         //--
                         if ((string) $y_dir . $file != (string) $y_dir . strtolower($file)) {
                             SmartFileSystem::rename($y_dir . $file, $y_dir . strtolower($file));
                             // make sure is lowercase, to be ok for back-check since versioned is lowercase
                         }
                         //end if
                         //--
                         $out .= $this->mov_preview_create($y_dir . strtolower($file), $tmp_file) . '<br>';
                         $processed += 1;
                         //--
                     }
                     //end if
                     //--
                 }
                 //end if
                 //--
                 $arr_files[] = $file;
                 $this->gallery_items += 1;
                 //--
             }
             //end if else
             //--
         }
         //end if
         //--
     }
     //end for
     //--
     //--
     $out .= '<!-- START MEDIA GALLERY -->' . "\n";
     //--
     if ((string) $this->use_styles == 'yes') {
         $out .= '<div id="mediagallery_box">' . "\n";
     }
     //end if
     //--
     //--
     $out_arr = array();
     //--
     if ($processed <= 0) {
         //--
         $arr_files = Smart::array_sort($arr_files, 'natsort');
         //--
         $max_loops = Smart::array_size($arr_files);
         if ($y_display_limit > 0) {
             if ($y_display_limit < $max_loops) {
                 $max_loops = $y_display_limit;
             }
             //end if
         }
         //end if
         //--
         for ($i = 0; $i < $max_loops; $i++) {
             //--
             $tmp_the_ext = strtolower(SmartFileSysUtils::get_file_extension_from_path($arr_files[$i]));
             // [OK]
             //--
             if ((string) $tmp_the_ext == 'webm' or (string) $tmp_the_ext == 'ogv' or (string) $tmp_the_ext == 'mp4' or (string) $tmp_the_ext == 'mov' or (string) $tmp_the_ext == 'flv') {
                 $out_arr[] = $this->mov_draw_box($y_dir, $arr_files[$i], $tmp_the_ext);
             } else {
                 $out_arr[] = $this->img_draw_box($y_dir, $arr_files[$i]);
             }
             //end if
             //--
         }
         //end for
         //--
         $out .= '<div title="' . Smart::escape_html($this->gallery_show_counter) . '">' . "\n";
         //--
         if ((string) $y_title != '') {
             $out .= '<div id="mediagallery_title">' . Smart::escape_html($y_title) . '</div><br>';
         }
         //end if
         $out .= '<div id="mediagallery_row">';
         for ($i = 0; $i < Smart::array_size($out_arr); $i++) {
             $out .= '<div id="mediagallery_cell">';
             $out .= $out_arr[$i];
             $out .= '</div>' . "\n";
         }
         //end for
         $out .= '</div>';
         //--
         $out .= '</div>' . "\n";
         //--
     }
     //end if
     //--
     $out_arr = array();
     //--
     //--
     if ((string) $this->use_styles == 'yes') {
         $out .= '</div>' . "\n";
     }
     //end if
     //--
     $out .= '<!-- END MEDIA GALLERY -->' . "\n";
     //--
     //--
     if ((string) SMART_FRAMEWORK_DEBUG_MODE != 'yes') {
         if ($processed > 0) {
             $out = '<img src="' . $this->pict_reloading . '" alt="[Reloading Page ...]" title="[Reloading Page ...]"><script type="text/javascript">setTimeout(function(){ self.location = self.location; }, 2000);</script>' . '<br><hr><br>' . $out;
             define('SMART_FRAMEWORK__MEDIA_GALLERY_IS_PROCESSING', $processed);
             // notice that the media galery is processing
         }
         //end if
     }
     //end if
     //--
     //--
     return $out;
     //--
 }
    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 &nbsp;&nbsp;&nbsp; :: &nbsp;&nbsp;&nbsp; グッド ... パーフェクト</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 ... &nbsp;&nbsp;&nbsp; :: &nbsp;&nbsp;&nbsp; エラーが発生しました ...</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;
        //--
    }
Пример #4
0
 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;
     //--
 }
 /**
  * Generate a PDF Document on the fly from a piece of HTML code.
  *
  * Notice: this is using a secured cache folder, unique per visitor ID
  *
  * @param STRING $y_html_content				:: The HTML Code
  * @param ENUM $y_orientation					:: Page Orientation: 'normal' | 'wide'
  * @param STRING $y_runtime_script 				:: The allowed Runtime Script to allow send credentials for sub-downloads. Ex: admin.php
  * @param STRING $y_runtime_url					:: The allowed Runtime URL ended by '/' to allow send credentials for sub-downloads. Ex: http(s)://some-server/some_path/ ; normally this should be set in config to enforce https:// and a single URL only
  * @param BOOLEAN $y_allow_send_credentials 	:: Set to TRUE to allow or set to FALSE to dissalow sending the auth credentials for sub-downloads: in the case there are embedded pictures generated by admin.php which may need authentication before to work, the credentials need to be set automatically in this case
  *
  * @returns STRING 							:: The PDF Document Contents
  *
  */
 public static function generate($y_html_content, $y_orientation = 'normal', $y_runtime_script = '', $y_runtime_url = '', $y_allow_send_credentials = false)
 {
     //--
     $pdfdata = '';
     //--
     $htmldoc = self::is_active();
     //--
     if ((string) $htmldoc != '') {
         //--
         if ((string) $y_orientation == 'wide') {
             $orientation = self::tag_page_wide();
         } else {
             $orientation = self::tag_page_normal();
         }
         //end if else
         //--
         $tmp_prefix_dir = 'tmp/cache/pdf/';
         $protect_file = $tmp_prefix_dir . '.htaccess';
         $dir = $tmp_prefix_dir . SMART_FRAMEWORK_SESSION_PREFIX . '/';
         // we use different for index / admin / @
         //--
         $uniquifier = SmartUtils::unique_auth_client_private_key() . SMART_APP_VISITOR_COOKIE;
         $the_dir = $dir . Smart::safe_varname(Smart::uuid_10_seq() . '_' . Smart::uuid_10_num() . '_' . SmartHashCrypto::sha1($uniquifier)) . '/';
         //--
         $tmp_uuid = Smart::uuid_45($uniquifier) . Smart::uuid_36($uniquifier);
         $file = $the_dir . '__document_' . SmartHashCrypto::sha256('@@PDF#File::Cache@@' . $tmp_uuid) . '.html';
         $logfile = $the_dir . '__headers_' . SmartHashCrypto::sha256('@@PDF#File::Cache@@' . $tmp_uuid) . '.log';
         //--
         if (is_dir($the_dir)) {
             SmartFileSystem::dir_delete($the_dir);
         }
         //end if
         //--
         if (!is_dir($the_dir)) {
             SmartFileSystem::dir_recursive_create($the_dir);
         }
         // end if
         //--
         SmartFileSystem::write_if_not_exists($protect_file, trim(SMART_FRAMEWORK_HTACCESS_FORBIDDEN) . "\n", 'yes');
         //-- process the code
         $y_html_content = (string) self::remove_between_tags((string) $y_html_content);
         $y_html_content = (string) self::safe_charset((string) $y_html_content);
         //-- extract images
         $htmlparser = new SmartHtmlParser((string) $y_html_content);
         $arr_imgs = $htmlparser->get_tags('img');
         $htmlparser = '';
         unset($htmlparser);
         //--
         $chk_duplicates_arr = array();
         //--
         for ($i = 0; $i < Smart::array_size($arr_imgs); $i++) {
             //--
             $tmp_img_src = trim((string) $arr_imgs[$i]['src']);
             //--
             if (strlen($chk_duplicates_arr[$tmp_img_src]) <= 0) {
                 //--
                 $tmp_url_img_src = '';
                 //--
                 if ((string) $y_runtime_script != '' and (string) $y_runtime_url != '') {
                     // replace relative paths
                     if (substr($tmp_img_src, 0, @strlen($y_runtime_script)) == (string) $y_runtime_script) {
                         $tmp_url_img_src = (string) $y_runtime_url . $tmp_img_src;
                         $y_html_content = (string) @str_replace('src="' . $tmp_img_src . '"', 'src="' . $tmp_url_img_src . '"', (string) $y_html_content);
                         $tmp_img_src = (string) $tmp_url_img_src;
                     }
                     //end if
                 }
                 //end if
                 //--
                 $tmp_img_ext = '.' . strtolower(SmartFileSysUtils::get_file_extension_from_path($tmp_img_src));
                 // [OK]
                 $tmp_img_cache = 'pdf_img_' . SmartHashCrypto::sha256('@@PDF#File::Cache::IMG@@' . '#' . $i . '@' . $tmp_img_src . '//' . $tmp_uuid);
                 //--
                 $tmp_arr = array();
                 //--
                 if (substr($tmp_img_src, 0, 7) == 'http://' or substr($tmp_img_src, 0, 8) == 'https://') {
                     //--
                     $tmp_img_ext = '';
                     // we clear the extension as we don't know yet (we will get it from headers)
                     $tmp_img_cache = 'pdf_url_img_' . SmartHashCrypto::sha256('@@PDF#File::Cache::URL::IMG@@' . '#' . $i . '@' . $tmp_img_src . '//' . $tmp_uuid);
                     //--
                 }
                 //end if
                 //--
                 if ($y_allow_send_credentials === true) {
                     $allow_set_credentials = 'yes';
                 } else {
                     $allow_set_credentials = 'no';
                 }
                 //end if else
                 //--
                 $tmp_arr = SmartUtils::load_url_or_file($tmp_img_src, SMART_FRAMEWORK_NETSOCKET_TIMEOUT, 'GET', '', '', '', $allow_set_credentials);
                 // [OK] :: allow set credentials
                 //--
                 $tmp_img_ext = '.noextension';
                 $tmp_where_we_guess = '';
                 //--
                 $guess_arr = array();
                 //--
                 $guess_arr = SmartUtils::guess_image_extension_by_url_head($tmp_arr['headers']);
                 $tmp_img_ext = (string) $guess_arr['extension'];
                 $tmp_where_we_guess = (string) $guess_arr['where-was-detected'];
                 $guess_arr = array();
                 if ((string) $tmp_img_ext == '') {
                     $tmp_img_ext = SmartUtils::guess_image_extension_by_first_bytes(substr($tmp_arr['content'], 0, 256));
                     if ((string) $tmp_img_ext != '') {
                         $tmp_where_we_guess = ' First Bytes ...';
                     }
                     //end if
                 }
                 //end if
                 //--
                 if ((string) SMART_FRAMEWORK_DEBUG_MODE == 'yes') {
                     // if debug, append information to log
                     SmartFileSystem::write($logfile, '####################' . "\n" . '#################### [FILE # ' . $i . ' = \'' . $tmp_img_src . '\']' . "\n\n" . '==== [MODE] :: ' . $tmp_arr['mode'] . "\n" . '==== [LOG] :: ' . "\n" . $tmp_arr['log'] . "\n" . '==== [HEADERS] ::' . "\n" . $tmp_arr['headers'] . "\n" . '########' . "\n" . '==== [GUESS EXTENSION] :: ' . $tmp_where_we_guess . "\n\n" . '###################' . "\n\n\n\n", 'a');
                 }
                 //end if
                 //--
                 if ((string) $tmp_arr['result'] == '1' and (string) $tmp_arr['code'] == '200') {
                     //--
                     SmartFileSystem::write($the_dir . $tmp_img_cache . $tmp_img_ext, $tmp_arr['content']);
                     //-- if empty, it may be a file
                     if ((string) $tmp_img_ext == '' or (string) $tmp_img_ext == '.png' or (string) $tmp_img_ext == '.gif' or (string) $tmp_img_ext == '.jpg') {
                         $y_html_content = (string) @str_replace('src="' . $tmp_img_src . '"', 'src="' . $tmp_img_cache . $tmp_img_ext . '"', (string) $y_html_content);
                     } else {
                         // we want to avoid html code to be loaded as image by mistakes of http browser class or servers
                         $y_html_content = (string) @str_replace('src="' . $tmp_img_src . '"', 'src="' . $y_runtime_url . 'lib/framework/img/sign_warn.png"', (string) $y_html_content);
                     }
                     //end if else
                     //--
                 } else {
                     //--
                     $y_html_content = (string) @str_replace('src="' . $tmp_img_src . '"', 'src="' . $y_runtime_url . 'lib/framework/img/sign_error.png"', (string) $y_html_content);
                     //--
                 }
                 //end if
                 //--
             }
             //end if
             //--
             $chk_duplicates_arr[$tmp_img_src] = 'processed';
             //--
         }
         //end for
         //--
         $chk_duplicates_arr = array();
         unset($chk_duplicates_arr);
         $arr_imgs = array();
         unset($arr_imgs);
         //--
         SmartFileSystem::write($file, $orientation . "\n" . $y_html_content);
         //--
         if (is_file($file)) {
             //--
             ob_start();
             //--
             @passthru($htmldoc . ' ' . self::pdf_options($file));
             //--
             $pdfdata = ob_get_clean();
             //--
         } else {
             //--
             Smart::log_warning('ERROR: PDF Generator Failed to find the PDF Document: ' . $file . "\n" . $y_html_content);
             //--
         }
         //end if else
         //-- cleanup
         if ((string) SMART_FRAMEWORK_DEBUG_MODE != 'yes') {
             // if not debug, cleanup the dir
             if (is_dir($the_dir)) {
                 SmartFileSystem::dir_delete($the_dir);
             }
             //end if
         }
         //end if
         //--
     } else {
         //--
         Smart::log_notice('NOTICE: PDF Generator is INACTIVE ...');
         //--
     }
     //end if
     //--
     return (string) $pdfdata;
     //--
 }
Пример #6
0
 public static function guess_image_extension_by_url_head($y_headers)
 {
     //--
     $y_headers = (string) $y_headers;
     //--
     $temp_image_extension = '';
     $temp_where_was_detected = '???';
     //--
     if (strlen($y_headers) > 0) {
         //-- {{{SYNC-DATA-IMAGE}}}
         if (strtolower(substr($y_headers, 0, 11)) == 'data:image/' and stripos($y_headers, ';base64,') !== false) {
             //--
             $temp_where_was_detected = '??? Try to guess by data:image/ ...';
             //--
             $y_headers = substr($y_headers, 11);
             $eimg = explode(';base64,', $y_headers);
             $eimg[0] = strtolower(trim($eimg[0]));
             if ((string) $eimg[0] == 'jpeg') {
                 $eimg[0] = 'jpg';
                 // correction
             }
             //end if
             if ((string) $eimg[0] == 'png' or (string) $eimg[0] == 'gif' or (string) $eimg[0] == 'jpg') {
                 $temp_image_extension = '.' . $eimg[0];
                 // add the point
                 $temp_where_was_detected = ' * Embedded in HTML as # data:image/ + ;base64, = ' . $eimg[0];
             }
             //end if
             //--
         } else {
             //--
             $temp_where_was_detected = '??? Try to guess by headers ...';
             //-- try to get file extension by the content (strategy 1)
             $temp_guess_ext_tmp = array();
             preg_match("/^content\\-disposition:(.*)\$/mi", (string) $y_headers, $temp_guess_ext_tmp);
             $temp_guess_extension = (string) trim((string) $temp_guess_ext_tmp[1]);
             $temp_guess_extension = (array) explode(' filename=', (string) $temp_guess_extension);
             $temp_guess_extension = (string) trim((string) $temp_guess_extension[1]);
             $temp_guess_extension = (array) explode('"', (string) $temp_guess_extension);
             $temp_guess_extension = (string) trim((string) $temp_guess_extension[1]);
             $temp_guess_extension = (string) trim(strtolower(SmartFileSysUtils::get_file_extension_from_path((string) $temp_guess_extension)));
             // [OK]
             $temp_guess_ext_tmp = array();
             //-- test
             if ((string) $temp_guess_extension == 'jpeg') {
                 $temp_guess_extension = 'jpg';
                 // correction
             }
             //end if
             if ((string) $temp_guess_extension == 'png' or (string) $temp_guess_extension == 'gif' or (string) $temp_guess_extension == 'jpg') {
                 // OK, we guess it
                 $temp_where_was_detected = '[content-disposition]: \'' . $temp_guess_extension . '\'';
                 $temp_image_extension = '.' . strtolower(Smart::safe_validname($temp_guess_extension));
                 // add the point
             } else {
                 //-- try to guess by the content type (strategy 2)
                 $temp_guess_ext_tmp = array();
                 preg_match("/^content\\-type:(.*)\$/mi", (string) $y_headers, $temp_guess_ext_tmp);
                 $temp_guess_extension = (string) trim((string) $temp_guess_ext_tmp[1]);
                 $temp_guess_extension = (array) explode('/', (string) $temp_guess_extension);
                 $temp_guess_extension = (string) trim((string) $temp_guess_extension[1]);
                 $temp_guess_extension = (array) explode(';', (string) $temp_guess_extension);
                 $temp_guess_extension = (string) trim((string) $temp_guess_extension[0]);
                 //--
                 switch ((string) $temp_guess_extension) {
                     case 'gif':
                         $temp_image_extension = '.gif';
                         $temp_where_was_detected = '[content-type]: \'' . $temp_image_extension . '\'';
                         break;
                     case 'png':
                         $temp_image_extension = '.png';
                         $temp_where_was_detected = '[content-type]: \'' . $temp_image_extension . '\'';
                         break;
                     case 'jpg':
                     case 'jpeg':
                         $temp_image_extension = '.jpg';
                         $temp_where_was_detected = '[content-type]: \'' . $temp_image_extension . '\'';
                         break;
                     case 'html':
                         $temp_image_extension = '.htm';
                         // we want to avoid a wrong answer from server to be get as image
                         $temp_where_was_detected = '[content-type]: \'' . $temp_image_extension . '\'';
                         break;
                     default:
                         // nothing
                         $temp_where_was_detected = '[content-type]: COULD NOT GUESS EXTENSION ! :: \'' . $temp_guess_extension . '\'';
                 }
                 //end switch
                 //--
             }
             //end if else
             //--
         }
         //end if
         //--
     }
     //end if else
     //--
     return array('extension' => (string) $temp_image_extension, 'where-was-detected' => (string) $temp_where_was_detected);
     //--
 }