public static function Run() { //-- global $configs; //-- //== //-- if (self::$MiddlewareCompleted !== false) { // avoid to execute more than 1 this middleware ! self::Raise500Error('Middleware App Execution already completed ...'); return; } //end if self::$MiddlewareCompleted = true; //-- $the_midmark = '[A]'; //-- if (SMART_FRAMEWORK_ADMIN_AREA !== true) { Smart::raise_error('Admin Middleware ERROR: SMART_FRAMEWORK_ADMIN_AREA is not set to TRUE', 'Invalid Area / This middleware is designed for Admin area and requires to turn ON the Administration flag ...'); return; } //end if //-- if (!defined('SMART_APP_TEMPLATES_DIR')) { self::Raise500Error('The SMART_APP_TEMPLATES_DIR not defined ...'); return; } //end if //-- if (defined('SMART_APP_MODULE_AREA')) { self::Raise500Error('Smart App Area must NOT be Defined outside controllers ...'); return; } //end if if (defined('SMART_APP_MODULE_AUTH')) { self::Raise500Error('Smart App Module Auth must NOT be Defined outside controllers ...'); return; } //end if if (defined('SMART_APP_MODULE_REALM_AUTH')) { self::Raise500Error('Smart App Module Realm Auth must NOT be Defined outside controllers ...'); return; } //end if if (defined('SMART_APP_MODULE_DIRECT_OUTPUT')) { self::Raise500Error('Smart App Module Direct Output must NOT be Defined outside controllers ...'); return; } //end if //-- //== //-- $smartframeworkservice = ''; // special operation if (SmartFrameworkRegistry::issetRequestVar('smartframeworkservice') === true) { $smartframeworkservice = (string) strtolower((string) SmartUnicode::utf8_to_iso((string) SmartFrameworkRegistry::getRequestVar('smartframeworkservice'))); switch ((string) $smartframeworkservice) { case 'status': case 'debug': break; default: // invalid value $smartframeworkservice = ''; } //end switch } //end if //-- //== //-- switch language by cookie (this needs to be before loading the app core) if (strlen(trim((string) $_COOKIE['SmartApp_ADM_LANGUAGE_SET'])) > 0) { SmartTextTranslations::setLanguage(trim((string) $_COOKIE['SmartApp_ADM_LANGUAGE_SET'])); } //end if //-- switch language by print cookie (this needs to be before loading the app core and after language by cookie) if (SmartFrameworkRegistry::issetRequestVar((string) SMART_FRAMEWORK_URL_PARAM_PRINTABLE) === true) { if (strtolower((string) SmartFrameworkRegistry::getRequestVar((string) SMART_FRAMEWORK_URL_PARAM_PRINTABLE)) == strtolower((string) SMART_FRAMEWORK_URL_VALUE_ENABLED)) { if (strlen(trim((string) $_COOKIE['SmartApp_ADM_PRINT_LANGUAGE_SET'])) > 0) { SmartTextTranslations::setLanguage(trim((string) $_COOKIE['SmartApp_ADM_PRINT_LANGUAGE_SET'])); } //end if } //end if } //end if //-- //== RAW OUTPUT FOR STATUS //-- if ((string) $smartframeworkservice == 'status') { //-- if (SMART_SOFTWARE_DISABLE_STATUS_POWERED === true) { $status_powered_info = ''; } else { $status_powered_info = (string) SmartComponents::draw_powered_info('no'); } //end if else //-- self::HeadersNoCache(); // headers: cache control, force no-cache echo SmartComponents::http_status_message('Smart.Framework :: Status :: [OK]', '<script type="text/javascript">setTimeout(function(){ self.location = self.location; }, 60000);</script><img src="lib/core/img/busy_bar.gif"><div><h1>' . date('Y-m-d H:i:s O') . ' // Service Ready :: ' . $the_midmark . '</h1></div>' . $status_powered_info . '<br>'); //-- return; // break stop //-- } //end if //-- //== OVERALL AUTHENTICATION BREAKPOINT //-- SmartAppBootstrap::Authenticate('admin'); // if the auth uses session it may start now //-- //== RAW OUTPUT FOR DEBUG //-- if ((string) $smartframeworkservice == 'debug') { //-- if ((string) SMART_FRAMEWORK_DEBUG_MODE == 'yes') { self::HeadersNoCache(); // headers: cache control, force no-cache $the_debug_cookie = trim((string) $_COOKIE['SmartFramework__DebugAdmID']); echo SmartDebugProfiler::print_debug_info('adm', $the_debug_cookie); } else { http_response_code(404); echo SmartComponents::http_message_404_notfound('No Debug service has been activated on this server ...'); } //end if //-- return; // break stop //-- } //end if else //-- //== LOAD THE MODULE (OR DEFAULT MODULE) //-- $reserved_controller_names = ['php', 'html', 'stml', 'css', 'js', 'json', 'xml', 'rss', 'txt', 'csv', 'sql', 'png', 'gif', 'jpg', 'pdf', 'svg', 'zip', '7z', 'netarch']; // these are reserved extensions and cannot be used as controller names because they need to be used also with friendly URLs as the 2nd param if module is missing from URL page param //-- $err404 = ''; $arr = array(); //-- $page = (string) SmartUnicode::utf8_to_iso((string) SmartFrameworkRegistry::getRequestVar('page')); $page = trim(str_replace(array('/', '\\', ':', '?', '&', '=', '%'), array('', '', '', '', '', '', ''), $page)); // fix for get as it automatically replaces . with _ (so, reverse), but also fix some invalid characters ... if ((string) $page == '') { $page = (string) $configs['app']['admin-home']; } //end if //-- if (strpos($page, '.') !== false) { // page can be as module.controller / module.controller(.php|html|stml|css|js|json|xml|rss|txt|csv|sql|png|gif|jpg|pdf|svg|zip|7z|netarch) //-- $arr = (array) explode('.', (string) $page, 3); // separe 1st and 2nd from the rest //-- //# //# $arr[0] = trim(strtolower((string) $arr[0])); // module $arr[1] = trim(strtolower((string) $arr[1])); // controller //# //# Admin will NOT integrate with friendly URLs SMART_FRAMEWORK_SEMANTIC_URL_SKIP_MODULE //# that feature is just for Index //# //-- } elseif ((string) $configs['app']['admin-default-module'] != '') { //-- $arr[0] = trim(strtolower((string) $configs['app']['admin-default-module'])); // get default module $arr[1] = trim(strtolower((string) $page)); // controller //-- } else { //-- if ((string) $err404 == '') { $err404 = 'Invalid Page (Invalid URL Page Segments Syntax): ' . $page; } //end if //-- } //end if else //-- if ((string) $arr[0] == '' or (string) $arr[1] == '') { if ((string) $err404 == '') { $err404 = 'Invalid Page (Empty or Missing URL Page Segments): ' . $page; } //end if } //end if if (!preg_match('/^[a-z0-9_\\-]+$/', (string) $arr[0]) or !preg_match('/^[a-z0-9_\\-]+$/', (string) $arr[1])) { if ((string) $err404 == '') { $err404 = 'Invalid Page (Invalid Characters in the URL Page Segments): ' . $page; } //end if } //end if if (in_array((string) $arr[1], (array) $reserved_controller_names)) { if ((string) $err404 == '') { $err404 = 'Invalid Page (Reserved Page Controller Name): [' . $arr[1] . '] in: ' . $page; } //end if } //end if //-- $the_controller_name = (string) $arr[0] . '.' . $arr[1]; $the_path_to_module = Smart::safe_pathname(SmartFileSysUtils::add_dir_last_slash('modules/mod-' . Smart::safe_filename($arr[0]))); $the_module = Smart::safe_pathname($the_path_to_module . Smart::safe_filename($arr[1]) . '.php'); if (!is_file($the_module)) { if ((string) $err404 == '') { $err404 = 'Page does not exist: ' . $page; } //end if } //end if //-- if ((string) $err404 != '') { self::Raise404Error((string) $err404); return; } //end if //-- if (!SmartFileSysUtils::check_file_or_dir_name($the_path_to_module) or !SmartFileSysUtils::check_file_or_dir_name($the_module)) { self::Raise400Error('Insecure Module Access for Page: ' . $page); return; } //end if //-- if (class_exists('SmartAppIndexController') or class_exists('SmartAppAdminController')) { self::Raise500Error('Module Class Runtimes must be defined only in modules ...'); return; } //end if //-- require (string) $the_module; //-- if ((string) SMART_APP_MODULE_AREA !== 'ADMIN' and (string) SMART_APP_MODULE_AREA !== 'SHARED') { self::Raise403Error('Page Access Denied for Admin Area: ' . $page); return; } //end if if (defined('SMART_APP_MODULE_AUTH')) { if (SmartAuth::check_login() !== true) { self::Raise403Error('Page Access Denied ! No Authentication: ' . $page); return; } //end if if (defined('SMART_APP_MODULE_REALM_AUTH')) { if ((string) SmartAuth::get_login_realm() !== (string) SMART_APP_MODULE_REALM_AUTH) { self::Raise403Error('Page Access Denied ! Invalid Login Realm: ' . $page); return; } //end if } //end if } //end if //-- if (!class_exists('SmartAppAdminController')) { self::Raise500Error('Invalid Module Class Runtime for Page: ' . $page); return; } //end if if (!is_subclass_of('SmartAppAdminController', 'SmartAbstractAppController')) { self::Raise500Error('Invalid Module Class Inheritance for Controller Page: ' . $page); return; } //end if //-- //== PATHS //-- $base_script = SmartUtils::get_server_current_script(); $base_full_path = SmartUtils::get_server_current_path(); $base_full_url = SmartUtils::get_server_current_url(); //-- //== RUN THE MODULE //-- $appModule = new SmartAppAdminController($the_path_to_module, $base_script, $base_full_path, $base_full_url, $page, $the_controller_name); //-- if (SMART_APP_MODULE_DIRECT_OUTPUT !== true) { ob_start(); } //end if $appStatusCode = (int) $appModule->Run(); $appModule->ShutDown(); if (SMART_APP_MODULE_DIRECT_OUTPUT !== true) { $ctrl_output = ob_get_contents(); ob_end_clean(); if ((string) $ctrl_output != '') { Smart::log_warning('The middleware service ' . $the_midmark . ' detected an illegal output in the controller: ' . $page . "\n" . 'The result of this output is: ' . $ctrl_output); } //end if $ctrl_output = ''; } else { return; // break stop after the controller has terminated the direct output } //end if else //-- $appSettings = (array) $appModule->PageViewGetCfgs(); //-- //== CACHE CONTROL //-- if ((int) $appSettings['expires'] > 0 and (string) SMART_FRAMEWORK_DEBUG_MODE != 'yes') { self::HeadersCacheExpire((int) $appSettings['expires'], (int) $appSettings['modified']); // headers: cache expiration control } else { self::HeadersNoCache(); // headers: cache control, force no-cache } //end if else //-- //== STATUS CODE //-- switch ((int) $appStatusCode) { //-- client errors case 400: self::Raise400Error((string) $appSettings['error']); return; break; case 401: self::Raise401Error((string) $appSettings['error']); return; break; case 403: self::Raise403Error((string) $appSettings['error']); return; break; case 404: self::Raise404Error((string) $appSettings['error']); return; break; case 429: self::Raise429Error((string) $appSettings['error']); return; break; //-- server errors //-- server errors case 500: self::Raise500Error((string) $appSettings['error']); return; break; case 502: self::Raise502Error((string) $appSettings['error']); return; break; case 503: self::Raise503Error((string) $appSettings['error']); return; break; case 504: self::Raise504Error((string) $appSettings['error']); return; break; //-- extended 2xx statuses: NOTICE / WARNING / ERROR that can be used for REST / API //-- extended 2xx statuses: NOTICE / WARNING / ERROR that can be used for REST / API case 202: // NOTICE if (!headers_sent()) { http_response_code(202); // Accepted (this should be used only as an alternate SUCCESS code instead of 200 for NOTICES) } else { Smart::log_warning('Headers Already Sent before 202 ...'); } //end if else break; case 203: // WARNING if (!headers_sent()) { http_response_code(203); // Non-Authoritative Information (this should be used only as an alternate SUCCESS code instead of 200 for WARNINGS) } else { Smart::log_warning('Headers Already Sent before 203 ...'); } //end if else break; case 208: // ERROR if (!headers_sent()) { http_response_code(208); // Already Reported (this should be used only as an alternate SUCCESS code instead of 200 for ERRORS) } else { Smart::log_warning('Headers Already Sent before 208 ...'); } //end if else break; //-- DEFAULT: OK //-- DEFAULT: OK case 200: default: // any other codes not listed above are not supported and will be interpreted as 200 // nothing to do here ... } //end switch //-- //== PREPARE THE OUTPUT //-- if (stripos((string) $configs['js']['popup-override-mobiles'], '<' . SmartUtils::get_os_browser_ip('os') . '>') !== false) { $configs['js']['popup-mode'] = 'popup'; // particular os settings for mobiles } //end if //-- $rawpage = ''; if (isset($appSettings['rawpage'])) { $rawpage = strtolower((string) $appSettings['rawpage']); if ((string) $rawpage == 'yes') { $rawpage = 'yes'; // standardize the value } //end if } //end if if ((string) $rawpage != 'yes') { $rawpage = ''; } //end if //-- $rawmime = ''; if (isset($appSettings['rawmime'])) { $rawmime = (string) $appSettings['rawmime']; if ((string) $rawmime != '') { $rawmime = SmartValidator::validate_mime_type($rawmime); } //end if } //end if else //-- $rawdisp = ''; if (isset($appSettings['rawdisp'])) { $rawdisp = (string) $appSettings['rawdisp']; if ((string) $rawdisp != '') { $rawdisp = SmartValidator::validate_mime_disposition($rawdisp); } //end if } //end if else //-- $appData = (array) $appModule->PageViewGetVars(); //-- $appData['base-path'] = (string) $base_full_path; $appData['base-url'] = (string) $base_full_url; //-- //== REDIRECTION HANDLER (this can be set only explicit from Controllers) //-- if ((string) $appSettings['redirect-url'] != '') { // expects a valid URL //-- $the_redirect_link = '<a href="' . Smart::escape_html((string) $appSettings['redirect-url']) . '">' . Smart::escape_html((string) $appSettings['redirect-url']) . '</a>'; //-- if (headers_sent()) { Smart::log_warning('Headers Already Sent before Redirection: [' . $appStatusCode . '] ; URL: ' . $appSettings['redirect-url']); self::Raise500Error('The app failed to Redirect to: ' . $the_redirect_link); return; } //end if switch ((int) $appStatusCode) { case 301: http_response_code(301); $the_redirect_text = 'Moved Permanently'; // permanent redirect for HTTP 1.0 / HTTP 1.1 break; case 302: default: // any other code will be interpreted as 302 (the default redirection in PHP) http_response_code(302); $the_redirect_text = 'Found'; // temporary redirect for HTTP 1.0 / HTTP 1.1 break; } //end switch header('Location: ' . SmartFrameworkSecurity::FilterUnsafeString((string) $appSettings['redirect-url'])); echo '<h1>' . Smart::escape_html($the_redirect_text) . '</h1>' . '<br>' . 'If the page redirection fails, click on the below link:' . '<br>' . $the_redirect_link; return; // break stop } //end if //-- //== DOWNLOADS HANDLER (downloads can be set only explicit from Controllers) //-- if ((string) $appSettings['download-packet'] != '' and (string) $appSettings['download-key'] != '') { // expects an encrypted data packet and a key $dwl_result = self::DownloadsHandler((string) $appSettings['download-packet'], (string) $appSettings['download-key']); if ((string) $dwl_result != '') { Smart::log_info('File Download - Client: ' . SmartUtils::get_visitor_signature(), (string) $dwl_result); // log result and mark it as finalized } //end if return; // break stop } //end if //-- //== RAW OUTPUT FOR PAGES //-- if ((string) $rawpage == 'yes') { //-- {{{SYNC-RESOURCES}}} if (function_exists('memory_get_peak_usage')) { $res_memory = @memory_get_peak_usage(false); } else { $res_memory = 'unknown'; } //end if else $res_time = (double) (microtime(true) - (double) SMART_FRAMEWORK_RUNTIME_READY); //-- #END-SYNC if ((string) SMART_FRAMEWORK_DEBUG_MODE == 'yes') { //-- {{{SYNC-DEBUG-META-INFO}}} SmartFrameworkRegistry::setDebugMsg('stats', 'memory', $res_memory); // bytes SmartFrameworkRegistry::setDebugMsg('stats', 'time', $res_time); // seconds //-- #END-SYNC $the_debug_cookie = trim((string) $_COOKIE['SmartFramework__DebugAdmID']); SmartDebugProfiler::save_debug_info('adm', $the_debug_cookie, false); } else { $the_debug_cookie = ''; } //end if //-- if (headers_sent()) { Smart::raise_error('Middleware ERROR: Headers already sent', 'ERROR: Headers already sent !'); return; // avoid serve raw pages with errors injections before headers } //end if //-- if ((string) $rawmime != '') { header('Content-Type: ' . $rawmime); } //end if if ((string) $rawdisp != '') { header('Content-Disposition: ' . $rawdisp); } //end if header('Content-Length: ' . (0 + strlen((string) $appData['main']))); // must be strlen NOT SmartUnicode::str_len as it must get number of bytes not characters echo (string) $appData['main']; return; // break stop //-- } //end if else //-- //== DEFAULT OUTPUT //-- if (isset($appSettings['template-path'])) { if ((string) $appSettings['template-path'] == '@') { // if template path is set to self (module) $the_template_path = '@'; // this is a special setting } else { $the_template_path = Smart::safe_pathname(SmartFileSysUtils::add_dir_last_slash(trim((string) $appSettings['template-path']))); } //end if else } else { $the_template_path = Smart::safe_pathname(SmartFileSysUtils::add_dir_last_slash(trim((string) $configs['app']['admin-template-path']))); // use default template path } //end if else //-- if (isset($appSettings['template-file'])) { $the_template_file = Smart::safe_filename(trim((string) $appSettings['template-file'])); } else { $the_template_file = Smart::safe_filename(trim((string) $configs['app']['admin-template-file'])); // use default template } //end if else //-- if ((string) $the_template_path == '@') { $the_template_path = (string) $the_path_to_module . 'templates/'; // must have the dir last slash as above } else { $the_template_path = (string) SMART_APP_TEMPLATES_DIR . $the_template_path; // finally normalize and set the complete template path } //end if else $the_template_file = (string) $the_template_file; // finally normalize //-- if (!SmartFileSysUtils::check_file_or_dir_name($the_template_path)) { Smart::log_warning('Invalid Page Template Path: ' . $the_template_path); self::Raise500Error('Invalid Page Template Path. See the error log !'); return; } //end if if (!is_dir($the_template_path)) { Smart::log_warning('Page Template Path does not Exists: ' . $the_template_path); self::Raise500Error('Page Template Path does not Exists. See the error log !'); return; } //end if if (!SmartFileSysUtils::check_file_or_dir_name($the_template_path . $the_template_file)) { Smart::log_warning('Invalid Page Template File: ' . $the_template_path . $the_template_file); self::Raise500Error('Invalid Page Template File. See the error log !'); return; } //end if if (!is_file($the_template_path . $the_template_file)) { Smart::log_warning('Page Template File does not Exists: ' . $the_template_path . $the_template_file); self::Raise500Error('Page Template File does not Exists. See the error log !'); return; } //end if //-- $the_template_content = trim(SmartMarkersTemplating::read_template_file($the_template_path . $the_template_file)); if ((string) $the_template_content == '') { Smart::log_warning('Page Template File is Empty or cannot be read: ' . $the_template_path . $the_template_file); self::Raise500Error('Page Template File is Empty or cannot be read. See the error log !'); return; } //end if //-- if ((string) SMART_FRAMEWORK_DEBUG_MODE == 'yes') { $the_template_content = str_ireplace('</head>', "\n" . SmartDebugProfiler::js_headers_debug('admin.php?smartframeworkservice=debug') . "\n" . '</head>', $the_template_content); $the_template_content = str_ireplace('</body>', "\n" . SmartDebugProfiler::div_main_debug() . "\n" . '</body>', $the_template_content); } //end if //-- $appData['app-domain'] = (string) $configs['app']['admin-domain']; $appData['template-file'] = $the_template_path . $the_template_file; $appData['template-path'] = $the_template_path; $appData['js.settings'] = SmartComponents::js_inc_settings((string) $configs['js']['popup-mode'], true, (bool) SMART_APP_VISITOR_COOKIE); $appData['head-meta'] = (string) $appData['head-meta']; if ((string) $appData['head-meta'] == '') { $appData['head-meta'] = '<!-- Head Meta -->'; } //end if $appData['title'] = (string) $appData['title']; $appData['main'] = (string) $appData['main']; $appData['lang'] = SmartTextTranslations::getLanguage(); //-- if ((string) SMART_FRAMEWORK_DEBUG_MODE == 'yes') { //-- $the_debug_cookie = 'adm-' . Smart::uuid_10_seq() . '-' . Smart::uuid_10_num() . '-' . Smart::uuid_10_str(); @setcookie('SmartFramework__DebugAdmID', (string) $the_debug_cookie, 0, '/'); // debug token cookie is set just on main request //-- } //end if //-- echo SmartMarkersTemplating::render_mixed_template((string) $the_template_content, (array) $appData, (string) $appData['template-path'], 'no', 'no'); //-- {{{SYNC-RESOURCES}}} if (function_exists('memory_get_peak_usage')) { $res_memory = @memory_get_peak_usage(false); } else { $res_memory = 'unknown'; } //end if else $res_time = (double) (microtime(true) - (double) SMART_FRAMEWORK_RUNTIME_READY); //-- #END-SYNC if ((string) SMART_FRAMEWORK_DEBUG_MODE == 'yes') { //-- {{{SYNC-DEBUG-META-INFO}}} SmartFrameworkRegistry::setDebugMsg('stats', 'memory', $res_memory); // bytes SmartFrameworkRegistry::setDebugMsg('stats', 'time', $res_time); // seconds //-- #END-SYNC SmartDebugProfiler::save_debug_info('adm', $the_debug_cookie, true); //-- } //end if else //-- if (SMART_SOFTWARE_DISABLE_STATUS_POWERED !== true) { echo "\n" . '<!-- Smart.Framework スマート.フレームワーク :: ' . SMART_FRAMEWORK_RELEASE_TAGVERSION . ' / ' . SMART_FRAMEWORK_RELEASE_VERSION . ' @ ' . $the_midmark . ' :: ' . SMART_FRAMEWORK_RELEASE_URL . ' -->'; } //end if echo "\n" . '<!-- Resources: [' . Smart::format_number_dec($res_time, 13, '.', '') . ' sec.] / [' . Smart::format_number_dec($res_memory, 0, '.', ' ') . ' by.]' . ' -->' . "\n"; //-- }
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; //-- }
private function build_multipart() { //-- $timeduid = Smart::uuid_10_seq(); // 10 chars, timed based, can repeat only once in 1000 years for the same millisecond $timedrid = strrev($timeduid); $entropy = Smart::unique_entropy('mail/send'); // this generate a very random value $boundary = '_===-Mime.Part____.' . $timeduid . '_' . md5('@MimePart---#Boundary@' . $entropy) . '_P_.-=_'; // 69 chars of 70 max $relatedboundary = '_-==-Mime.Related_.' . $timedrid . '_' . md5('@MimeRelated#Boundary@' . $entropy) . '_R_.=-_'; // 69 chars of 70 max //-- $multipart = ''; $multipart .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . "\r\n" . "\r\n"; $multipart .= 'This is a multi-part message in MIME format.' . "\r\n" . "\r\n"; $multipart .= '--' . $boundary . "\r\n"; $multipart .= 'Content-Type: multipart/related; boundary="' . $relatedboundary . '"' . "\r\n"; //-- cid parts $multipart .= "\r\n"; for ($i = Smart::array_size($this->parts) - 1; $i >= 0; $i--) { $multipart .= '--' . $relatedboundary . "\r\n"; $multipart .= $this->build_message($this->parts[$i]); } //end for $multipart .= "\r\n"; $multipart .= '--' . $relatedboundary . '--' . "\r\n"; //-- attachments $multipart .= "\r\n"; for ($i = Smart::array_size($this->atts) - 1; $i >= 0; $i--) { $multipart .= '--' . $boundary . "\r\n"; $multipart .= $this->build_message($this->atts[$i]); } //end for //-- $multipart .= "\r\n"; $multipart .= '--' . $boundary . '--' . "\r\n"; //-- return $multipart; //-- }
/** * 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; //-- }
/** * Get A UNIQUE (SAFE) ID for DB Tables / Schema * * @param ENUM $y_mode :: mode: uid10str | uid10num | uid10seq | uid36 | uid45 * @param STRING $y_field_name :: the field name * @param STRING $y_table_name :: the table name * @param STRING $y_schema :: the schema * @param RESOURCE $y_connection :: pgsql connection * @return STRING :: the generated Unique ID * */ public static function new_safe_id($y_mode, $y_id_field, $y_table_name, $y_schema = 'public', $y_connection = 'DEFAULT') { //== $y_connection = self::check_connection($y_connection, 'NEW-SAFE-ID'); //== //-- if (!self::validate_table_and_fields_names($y_id_field)) { self::error($y_connection, 'NEW-SAFE-ID', 'Get New Safe ID', 'Invalid Field Name', $y_id_field . ' / [Schema=' . $y_schema . ';Table=' . $y_table_name . ']'); return ''; } //end if if (!self::validate_table_and_fields_names($y_table_name)) { self::error($y_connection, 'NEW-SAFE-ID', 'Get New Safe ID', 'Invalid Table Name', $y_table_name); return ''; } //end if if (!self::validate_table_and_fields_names($y_schema)) { self::error($y_connection, 'NEW-SAFE-ID', 'Get New Safe ID', 'Invalid Schema Name', $y_schema); return ''; } //end if //-- //-- $use_safe_id_record = true; if (defined('SMART_SOFTWARE_DB_DISABLE_SAFE_IDS')) { if (SMART_SOFTWARE_DB_DISABLE_SAFE_IDS === true) { $use_safe_id_record = false; } //end if } //end if //-- if ($use_safe_id_record === true) { //-- if (self::check_if_table_exists('_safe_id_records', 'smart_runtime', $y_connection) !== 1) { if (self::check_if_schema_exists('smart_runtime', $y_connection) !== 1) { self::write_data('CREATE SCHEMA "smart_runtime"', 'Initialize SafeID Schema', $y_connection); } //end if self::write_data((string) self::schema_safe_id_records_table(), 'Initialize SafeID Table', $y_connection); } //end if //-- if ((int) Smart::random_number(0, 99) == 1) { // 1% chance to run it for cleanup records older than 24 hours self::write_data('DELETE FROM "smart_runtime"."_safe_id_records" WHERE ("date_time" < \'' . self::escape_str(date('Y-m-d H:i:s', @strtotime('-1 day')), 'no', $y_connection) . '\')', 'Safe ID Records Cleanup (OLDs)', $y_connection); // cleanup olds } //end if //-- } //end if //-- $tmp_result = 'NO-ID-INIT'; //init (must be not empty) $counter = 0; $id_is_ok = false; //-- while ($id_is_ok !== true) { // while we cannot find an unused ID //-- $counter += 1; //-- if ($counter > 7500) { // loop to max 7500 self::error($y_connection, 'NEW-SAFE-ID', 'Get New Safe ID', 'Could Not Assign a Unique ID', '(timeout / 7500) ... try again !'); return ''; } //end if //-- if ($counter % 500 == 0) { sleep(1); } //end if //-- $new_id = 'NO-ID-ALGO'; switch ((string) $y_mode) { case 'uid45': $new_id = (string) Smart::uuid_45(SMART_FRAMEWORK_NETSERVER_ID . SmartUtils::get_server_current_url()); // will use the server ID.Host as Prefix to ensure it is true unique in a cluster break; case 'uid36': $new_id = (string) Smart::uuid_36(SMART_FRAMEWORK_NETSERVER_ID . SmartUtils::get_server_current_url()); // will use the server ID.Host as Prefix to ensure it is true unique in a cluster break; case 'uid10seq': if ($use_safe_id_record === true) { // sequences are not safe without a second registry allocation table as the chance to generate the same ID in the same time moment is just 1 in 999 $new_id = (string) Smart::uuid_10_seq(); } else { $new_id = (string) Smart::uuid_10_str(); } //end if else break; case 'uid10num': $new_id = (string) Smart::uuid_10_num(); break; case 'uid10str': default: $new_id = (string) Smart::uuid_10_str(); } //end switch //-- $result_arr = array(); $chk_uniqueness = 'SELECT ' . self::escape_identifier($y_id_field, $y_connection) . ' FROM ' . self::escape_identifier($y_schema, $y_connection) . '.' . self::escape_identifier($y_table_name, $y_connection) . ' WHERE (' . self::escape_identifier($y_id_field, $y_connection) . ' = ' . self::escape_literal($new_id, 'no', $y_connection) . ') LIMIT 1 OFFSET 0'; $result_arr = self::read_data($chk_uniqueness, 'Safe Check if NEW ID Exists into Table', $y_connection); $tmp_result = (string) trim((string) $result_arr[0]); $result_arr = array(); //-- if ((string) $tmp_result == '') { //-- if ($use_safe_id_record === true) { // with safety check against safe ID records table //-- reserve this ID to bse sure will not be assigned to another instance $uniqueness_mark = (string) $y_schema . '.' . $y_table_name . ':' . $y_id_field; $write_res = self::write_igdata('INSERT INTO "smart_runtime"."_safe_id_records" ("id", "table_space", "date_time") ( SELECT \'' . self::escape_str($new_id, 'no', $y_connection) . '\', \'' . self::escape_str($uniqueness_mark, 'no', $y_connection) . '\', \'' . self::escape_str(date('Y-m-d H:i:s'), 'no', $y_connection) . '\' WHERE (NOT EXISTS ( SELECT 1 FROM "smart_runtime"."_safe_id_records" WHERE (("id" = \'' . self::escape_str($new_id, 'no', $y_connection) . '\') AND ("table_space" = \'' . self::escape_str($uniqueness_mark, 'no', $y_connection) . '\')) LIMIT 1 OFFSET 0 ) AND NOT EXISTS (' . $chk_uniqueness . ') ) )', 'Safe Record of NEW ID of Table into Zone Control', $y_connection); //-- if ($write_res[1] === 1) { $id_is_ok = true; } //end if //-- } else { // default (not safe in very high load environments ... //-- $id_is_ok = true; //-- } //end if else //-- } //end if //-- } //end while //-- //-- return (string) $new_id; //-- }