'DateTimeOriginal' ); // $conf['use_iptc'] set to true if you want to use IPTC informations of the // element according to get_sync_iptc_data function mapping, otherwise, set // to false $conf['use_iptc'] = false; // use_iptc_mapping : in which IPTC fields will PhpWebGallery find image // information ? This setting is used during metadata synchronisation. It // associates a phpwebgallery_images column name to a IPTC key $conf['use_iptc_mapping'] = array( 'keywords' => '2#025', 'date_creation' => '2#055', 'author' => '2#122', 'name' => '2#005', 'comment' => '2#120'); // index.php content for command 'protect' $conf['protect_content'] = ''; // directories names $conf['thumbs'] = 'thumbnail'; // thumbnails $conf['high'] = 'pwg_high'; // high resolution $conf['represent'] = 'pwg_representative'; // non pictures representative files // +-----------------------------------------------------------------------+ // | Advanced script configuration | // +-----------------------------------------------------------------------+ // url of icon directory in yoga template $pwg_conf['icon_dir'] = $conf['gallery'].'/template/yoga/icon/'; // list of actions managed by this script $pwg_conf['scan_action'] = array('clean', 'test', 'generate', 'protect'); // url of this script $pwg_conf['this_url'] = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; // list of reserved directory names $pwg_conf['reserved_directory_names'] = array($conf['thumbs'], $conf['high'], $conf['represent'], ".", "..", ".svn"); // content of index.php generated in protect action $pwg_conf['protect_content'] = ''; // backup of PHP safe_mode INI parameter (used for time limitation) $pwg_conf['safe_mode'] = (ini_get('safe_mode') == '1') ? true : false; // Error level management // true : show warnings // false : hide warnings $pwg_conf['warning']['protect'] = true; // +-----------------------------------------------------------------------+ // | functions | // +-----------------------------------------------------------------------+ /** * write line in log file * * @param string line * @return string */ function pwg_log($line) { $log_file = fopen(__FILE__.'.log', 'a'); fwrite($log_file, $line); fclose($log_file); } /** * returns xml lines * * @param integer $dir_start * @param integer $dir_number * @return string */ function pwg_close_level($dir_start, $dir_number) { //~ pwg_log('>>>>> pwg_close_level($dir_start = '.var_export($dir_start, TRUE).', $dir_number = '.var_export($dir_number, TRUE).') >>>>>'."\n"); $lines =''; do { $lines .= str_repeat(' ', 2*$dir_start).'\n"; $dir_number--; $dir_start--; } while(($dir_number > 0) && ($dir_start >= 0)); //~ pwg_log('<<<<< pwg_close_level returns '.var_export($lines, TRUE).' <<<<<'."\n"); return $lines; } /** * return a cleaned IPTC value * * @param string value * @return string */ function pwg_clean_iptc_value($value) { //~ pwg_log('>>>>> pwg_clean_iptc_value ($value = '.var_export($value, TRUE).') >>>>>'."\n"); // strip leading zeros (weird Kodak Scanner software) while (isset($value[0]) and $value[0] == chr(0)) { $value = substr($value, 1); } // remove binary nulls $value = str_replace(chr(0x00), ' ', $value); //~ pwg_log('<<<<< pwg_clean_iptc_value() returns '.var_export($value, TRUE).' <<<<<'."\n"); return $value; } /** * returns informations from IPTC metadata, mapping is done at the beginning * of the function * * @param string $filename * @param string $map * @return array */ function pwg_get_iptc_data($filename, $map) { //~ pwg_log('>>>>> pwg_get_iptc_data ($filename = '.var_export($filename, TRUE).', $map = '.var_export($map, TRUE).') >>>>>'."\n"); $result = array(); // Read IPTC data $iptc = array(); $imginfo = array(); getimagesize($filename, $imginfo); if (isset($imginfo['APP13'])) { $iptc = iptcparse($imginfo['APP13']); if (is_array($iptc)) { $rmap = array_flip($map); foreach (array_keys($rmap) as $iptc_key) { if (isset($iptc[$iptc_key][0])) { if ($iptc_key == '2#025') { $value = implode(',', array_map('pwg_clean_iptc_value', $iptc[$iptc_key])); } else { $value = pwg_clean_iptc_value($iptc[$iptc_key][0]); } foreach (array_keys($map, $iptc_key) as $pwg_key) { $result[$pwg_key] = $value; } } } } } //~ pwg_log('<<<<< pwg_get_iptc_data() returns '.var_export($result, TRUE).' <<<<<'."\n"); return $result; } /** * returns informations from IPTC metadata * * @param string $file * @return array iptc */ function pwg_get_sync_iptc_data($file) { //~ pwg_log('>>>>> pwg_get_sync_iptc_data ($file = '.var_export($file, TRUE).') >>>>>'."\n"); global $conf; $map = $conf['use_iptc_mapping']; $datefields = array('date_creation', 'date_available'); $iptc = pwg_get_iptc_data($file, $map); foreach ($iptc as $pwg_key => $value) { if (in_array($pwg_key, $datefields)) { if ( preg_match('/(\d{4})(\d{2})(\d{2})/', $value, $matches)) { $value = $matches[1].'-'.$matches[2].'-'.$matches[3]; } } if ($pwg_key == 'keywords') { // official keywords separator is the comma $value = preg_replace('/[.;]/', ',', $value); $value = preg_replace('/^,+|,+$/', '', $value); } $iptc[$pwg_key] = htmlentities($value); } $iptc['keywords'] = implode(',', array_unique(explode(',', $iptc['keywords']))); //~ pwg_log('<<<<< pwg_get_sync_iptc_data() returns '.var_export($iptc, TRUE).' <<<<<'."\n"); return $iptc; } /** * return extension of the representative file * * @param string $file_dir * @param string $file_short * @return string */ function pwg_get_representative_ext($file_dir, $file_short) { //~ pwg_log('>>>>> pwg_get_representative_ext($file_dir = '.var_export($file_dir, TRUE).', $file_short = '.var_export($file_short, TRUE).') >>>>>'."\n"); global $conf; $rep_ext = ''; foreach ($conf['picture_ext'] as $ext) { if (file_exists($file_dir.'/'.$conf['represent'].'/'.$file_short.'.'.$ext)) { $rep_ext = $ext; break; } } //~ pwg_log('<<<<< pwg_get_representative_ext() returns '.var_export($rep_ext, TRUE).' <<<<<'."\n"); return $rep_ext; } /** * return 'true' if high resolution picture exists else '' * * @param string $file_dir * @param string $file_base * @return boolean */ function pwg_get_high($file_dir, $file_base) { //~ pwg_log('>>>>> pwg_get_high($file = '.var_export($file_dir, TRUE).', $line = '.var_export($file_base, TRUE).') >>>>>'."\n"); global $conf; $high = false; if (file_exists($file_dir.'/'.$conf['high'].'/'.$file_base)) { $high = true; } //~ pwg_log('<<<<< pwg_get_high() returns '.var_export($high, TRUE).' <<<<<'."\n"); return $high; } /** * return filename without extension * * @param string $filename * @return string */ function pwg_get_filename_wo_extension($filename) { //~ pwg_log('>>>>> _get_filename_wo_extension($filename = '.var_export($filename, TRUE).') >>>>>'."\n"); $short_name = substr($filename, 0, strrpos($filename, '.')); //~ pwg_log('<<<<< _get_filename_wo_extension() returns '.var_export($short_name, TRUE).' <<<<<'."\n"); return $short_name; } /** * return extension of the thumbnail * * @param string $file_dir * @param string $file_short * @return string */ function pwg_get_thumbnail_ext($file_dir, $file_short) { //~ pwg_log('>>>>> pwg_get_thumbnail_ext($file_dir = '.var_export($file_dir, TRUE).', $file_short = '.var_export($file_short, TRUE).') >>>>>'."\n"); global $conf; $thumb_ext = ''; foreach ($conf['picture_ext'] as $ext) { if (file_exists($file_dir.'/'.$conf['thumbs'].'/'.$conf['prefix_thumbnail'].$file_short.'.'.$ext)) { $thumb_ext = $ext; break; } } //~ pwg_log('<<<<< pwg_get_thumbnail_ext() returns '.var_export($thumb_ext, TRUE).' <<<<<'."\n"); return $thumb_ext; } /** * completes xml line and returns error log * * @param string $file * @param string &$line * @return string */ function pwg_scan_file($file_full, &$line) { //~ pwg_log('>>>>> pwg_scan_file($file = '.var_export($file_full, TRUE).', $line = '.var_export($line, TRUE).') >>>>>'."\n"); global $conf, $pwg_conf; $error_log =''; $file_base = basename($file_full); $file_short = pwg_get_filename_wo_extension($file_base); $file_ext = pwg_get_file_extension($file_base); $file_dir = dirname($file_full); $element['file'] = $file_base; $element['path'] = 'http://'.dirname($_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']).substr($file_dir, 1).'/'.$file_base; if (in_array($file_ext, $conf['picture_ext'])) { // Here we scan a picture : thumbnail is mandatory, high is optionnal, representative is not scanned $element['tn_ext'] = pwg_get_thumbnail_ext($file_dir, $file_short); if ($element['tn_ext'] != '') { // picture has a thumbnail, get image width, heigth, size in Mo $element['filesize'] = floor(filesize($file_full) / 1024); if ($image_size = getimagesize($file_full)) { $element['width'] = $image_size[0]; $element['height'] = $image_size[1]; } // get high resolution if (pwg_get_high($file_dir, $file_base)) { $element['has_high'] = 'true'; } // get EXIF meta datas if ($conf['use_exif']) { // Verify activation of exif module if (extension_loaded('exif')) { if ($exif = read_exif_data($file_full)) { foreach ($conf['use_exif_mapping'] as $pwg_key => $exif_key ) { if (isset($exif[$exif_key])) { if ( in_array($pwg_key, array('date_creation','date_available') ) ) { if (preg_match('/^(\d{4}):(\d{2}):(\d{2})/', $exif[$exif_key], $matches)) { $element[$pwg_key] = $matches[1].'-'.$matches[2].'-'.$matches[3]; } } else { $element[$pwg_key] = $exif[$exif_key]; } } } } } } // get IPTC meta datas if ($conf['use_iptc']) { $iptc = pwg_get_sync_iptc_data($file_full); if (count($iptc) > 0) { foreach (array_keys($iptc) as $key) { $element[$key] = addslashes($iptc[$key]); } } } } else { $error_log .= ' Failure - Thumbnail is missing for '.$file_dir.'/'.$file_base.''; $error_log .= '
'."\n"; } } else { // Here we scan a non picture file : thumbnail and high are unused, representative is optionnal $ext = pwg_get_representative_ext($file_dir, $file_short); if ($ext != '') { $element['representative_ext'] = $ext; } } if (strlen($error_log) == 0) { $line = pwg_get_indent('element').' $value) { $line .= $key.'="'.$value.'" '; } $line .= '/>'."\n"; } //~ pwg_log('<<<<< pwg_scan_file() returns '.var_export($error_log, TRUE).' <<<<<'."\n"); return $error_log; } /** * returns current level in tree * * @return integer */ function pwg_get_level($dir) { //~ pwg_log('>>>>> pwg_get_level($dir = '.var_export($dir, TRUE).') >>>>>'."\n"); $level = substr_count($dir, '/') - 1; // -1 because of ./ at the beginning of path //~ pwg_log('<<<<< pwg_get_level() returns '.var_export($level, TRUE).' <<<<<'."\n"); return $level; } /** * returns indentation of element * * @param string $element_type : 'root', 'element', 'dir' * @return string */ function pwg_get_indent($element_type) { //~ pwg_log('>>>>> pwg_get_indent($element_type = '.var_export($element_type, TRUE).') >>>>>'."\n"); $level = substr_count($_SESSION['scan_list_fold'][0], '/') - 1; // because of ./ at the beginning switch($element_type) { case 'dir' : { $indent = str_repeat(' ', 2*pwg_get_level($_SESSION['scan_list_fold'][0])); break; } case 'root' : { $indent = str_repeat(' ', 2*pwg_get_level($_SESSION['scan_list_fold'][0])+2); break; } case 'element' : { $indent = str_repeat(' ', 2*pwg_get_level($_SESSION['scan_list_fold'][0])+4); break; } default : { $indent = ''; break; } } //~ pwg_log('<<<<< pwg_get_indent() returns '.var_export(strlen($indent), TRUE).' spaces <<<<<'."\n"); return $indent; } /** * create index.php in directory and reserved sub_directories, return logs * * @param string dir * @return string */ function pwg_protect_directories($directory) { global $conf, $pwg_conf; //~ pwg_log('>>>>> pwg_protect_directories($directory = '.var_export($directory, true).') >>>>>'."\n"); $error_log = ''; $dirlist = array($directory, $directory.'/'.$conf['thumbs'], $directory.'/'.$conf['high'], $directory.'/'.$conf['represent']); foreach ($dirlist as $dir) { if (file_exists($dir)) { if (!file_exists($dir.'/index.php')) { $file = @fopen($dir.'/index.php', 'w'); if ($file != false) { fwrite($file, $pwg_conf['protect_content']); // the return code should be verified $error_log .= ' Success - index.php created in directory '.$dir."
\n"; $_SESSION['scan_cnt_fold']++; } else { $error_log .= ' Failure - Can not create index.php in directory '.$dir."
\n"; } } else { if ($pwg_conf['warning']['protect']) { $error_log .= ' Warning - index.php already exists in directory '.$dir."
\n"; $_SESSION['scan_cnt_fold']++; } } } } //~ pwg_log('<<<<< pwg_protect_directories() returns '.var_export($error_log, true).' <<<<<'."\n"); return $error_log; } /** * returns file extension (.xxx) * * @param string $file * @return string */ function pwg_get_file_extension($file) { //~ pwg_log('>>>>> pwg_get_file_extension($file = '.var_export($file, true).') >>>>>'."\n"); $ext = substr(strrchr($file, '.'), 1, strlen ($file)); //~ pwg_log('<<<<< pwg_get_file_extension() returns '.var_export($ext, true).' <<<<<'."\n"); return $ext; } /** * completes directory list of supported files and returns error logs * * @param string $directory * @return string */ function pwg_get_file_list($directory) { //~ pwg_log('>>>>> pwg_get_file_list($directory = '.var_export($directory, true).') >>>>>'."\n"); global $conf, $pwg_conf; $errorLog = ''; $dir = opendir($directory); while (($file = readdir($dir)) !== false) { switch (filetype($directory."/".$file)) { case 'file' : { if (in_array(pwg_get_file_extension($file), $conf['file_ext'])) { // The file pointed is a regular file with a supported extension array_push($_SESSION['scan_list_file'], $directory.'/'.$file); //~ pwg_log('--->> Push in $_SESSION[scan_list_file] value "'.$directory.'/'.$file.'"'."\n"); if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $file)) { $errorLog .= ' Failure - Invalid file name for '.$file.' in '.$directory.''; $errorLog .= ' > Push in $_SESSION[scan_list_fold] value "'.$directory.'/'.$file.'"'."\n"); if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $file)) { $errorLog .= ' Failure - Invalid directory name for '.$directory.'/'.$file.''; $errorLog .= ' >>>> pwg_get_moment() >>>>>'."\n"); $t1 = explode(' ', microtime()); $t2 = explode('.', $t1[0]); $t2 = $t1[1].'.'.$t2[1]; //~ pwg_log('<<<<< pwg_get_moment() returns '.var_export($t2, true).' <<<<<'."\n"); return $t2; } /** * return true if HTTP_REFERER and PHP_SELF are similar * * return boolean */ function pwg_referer_is_me() { //~ pwg_log('>>>>> pwg_referer_is_me() >>>>>'."\n"); $response = false; $server = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; $caller = $_SERVER['HTTP_REFERER']; if (strcasecmp($server, $caller) == 0) { $response = true; } //~ pwg_log('<<<<< pwg_referer_is_me() returns '.var_export($response, true).' <<<<<'."\n"); return $response; } // +-----------------------------------------------------------------------+ // | pwg__ FUNCTIONS | // +-----------------------------------------------------------------------+ function pwg_test_start() { //~ pwg_log('>>>>> pwg_test_start() >>>>>'."\n"); global $g_message, $conf; if (isset($_REQUEST['version'])) { if ($_REQUEST['version'] != $conf['version']) { $g_message = '0'; } else { $g_message = '1'; } } else { $g_message = '1'; } $_SESSION['scan_step'] = 'exit'; //~ pwg_log('<<<<< pwg_test_start() <<<<<'."\n"); } function pwg_test_exit() { //~ pwg_log('>>>>> pwg_test_exit() >>>>>'."\n"); global $g_header, $g_message, $g_footer, $conf, $pwg_conf; if (pwg_referer_is_me()) { $g_header = ' : Test'."\n"; $g_message = ' This script is tagged : '.$conf['version'].''."\n"; $g_footer = ''."\n"; } else { // compare version in GET parameter with $conf['version'] if ($g_message == '1') { exit('
PWG-INFO-2: test successful
'); } else { exit('
PWG-ERROR-4: PhpWebGallery versions differs
'); } } //~ pwg_log('<<<<< pwg_test_exit() <<<<<'."\n"); } function pwg_clean_start() { //~ pwg_log('>>>>> pwg_clean_start() >>>>>'."\n"); global $g_message; if(@unlink('./listing.xml')) { $g_message = '1'; } else { $g_message = '0'; } $_SESSION['scan_step'] = 'exit'; //~ pwg_log('<<<<< pwg_clean_start() <<<<<'."\n"); } function pwg_clean_exit() { //~ pwg_log('>>>>> pwg_clean_exit() >>>>>'."\n"); global $g_header, $g_message, $g_footer, $conf, $pwg_conf; if(pwg_referer_is_me()) { $g_header = ' : Clean'; if ($g_message == '1') { $g_message = ' Success - listing.xml file deleted'."\n"; } else { $g_message = ' Failure - listing.xml does not exist or is read only'."\n"; } $g_footer = ''; } else { if ($g_message == '1') { exit('
PWG-INFO-3 : listing.xml file deleted
'); } else { exit('
PWG-ERROR-3 : listing.xml does not exist
'); } } //~ pwg_log('<<<<< pwg_clean_exit() <<<<<'."\n"); } function pwg_protect_start() { //~ pwg_log('>>>>> pwg_protect_start() >>>>>'."\n"); $_SESSION['scan_logs'] = pwg_get_file_list('.'); sort($_SESSION['scan_list_fold']); // Erase first file list because root directory does not contain images. $_SESSION['scan_list_file'] = array(); // What are we doing at next step if(count($_SESSION['scan_list_fold']) > 0) { $_SESSION['scan_step'] = 'list'; } else { $_SESSION['scan_step'] = 'stop'; } //~ pwg_log('<<<<< pwg_protect_start() <<<<<'."\n"); } function pwg_protect_list() { //~ pwg_log('>>>>> pwg_protect_list() >>>>>'."\n"); // Get list of files and directories $_SESSION['scan_logs'] .= pwg_get_file_list($_SESSION['scan_list_fold'][0]); sort($_SESSION['scan_list_fold']); // Delete unused file list $_SESSION['scan_list_file'] = array(); // Position next step $_SESSION['scan_step'] = 'scan'; //~ pwg_log('<<<<< pwg_protect_list() <<<<<'."\n"); } function pwg_protect_scan() { //~ pwg_log('>>>>> pwg_protect_scan() >>>>>'."\n"); $_SESSION['scan_logs'] .= pwg_protect_directories($_SESSION['scan_list_fold'][0]); if (isset($_SESSION['scan_list_fold'][1])) { array_shift($_SESSION['scan_list_fold']); $_SESSION['scan_step'] = 'list'; } else { $_SESSION['scan_step'] = 'stop'; } //~ pwg_log('<<<<< pwg_protect_scan() <<<<<'."\n"); } function pwg_protect_stop() { //~ pwg_log('>>>>> pwg_protect_stop() >>>>>'."\n"); global $g_header, $g_message, $g_footer, $pwg_conf; $time_elapsed = number_format(pwg_get_moment() - $_SESSION['scan_time'], 3, '.', ' '); $g_header = ' : Protect'; $g_message = '
'."\n".$_SESSION['scan_logs'].'
'."\n"; $g_message .= '
'.$_SESSION['scan_cnt_fold'].' directories protected
'."\n"; $g_message .= '
Gallery protected in : '.$time_elapsed.' s
'; $g_footer = ''; // What are we doing at next step $_SESSION['scan_step'] = 'exit'; //~ pwg_log('<<<<< pwg_protect_stop() <<<<<'."\n"); } function pwg_generate_start() { //~ pwg_log('>>>>> pwg_generate_start() >>>>>'."\n"); //~ pwg_log("GENARATE start >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE start >>>\n"); global $g_listing, $conf; // Flush line $xml_header_url = 'http://'.dirname($_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']).'/'; $xml_header_date = date('Y-m-d'); $xml_header_version = htmlentities($conf['version']); $attrs = array(); if ($conf['use_iptc']) { $attrs = array_merge($attrs, array_keys($conf['use_iptc_mapping']) ); } if ($conf['use_exif']) { $attrs = array_merge($attrs, array_keys($conf['use_exif_mapping']) ); } $xml_header_metadata = implode(',',array_unique($attrs)); $xml_header = ' 0) { $_SESSION['scan_step'] = 'list'; } else { $_SESSION['scan_step'] = 'stop'; } //~ pwg_log("GENARATE start <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE start <<<\n"); //~ pwg_log('<<<<< pwg_generate_start() <<<<<'."\n"); } function pwg_generate_list() { //~ pwg_log('>>>>> pwg_generate_list() >>>>>'."\n"); //~ pwg_log("GENARATE list >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE list >>>\n"); global $g_listing; // Flush line in xml file $dirname = basename($_SESSION['scan_list_fold'][0]); $line = pwg_get_indent('dir').''."\n"; fwrite($g_listing, $line); // Get list of files and directories $_SESSION['scan_logs'] .= pwg_get_file_list($_SESSION['scan_list_fold'][0]); sort($_SESSION['scan_list_fold']); // Mandatory to keep the tree order sort($_SESSION['scan_list_file']); // Easier to read when sorted // Flush line $line = pwg_get_indent('root').''."\n"; fwrite($g_listing, $line); // What are we doing at next step $_SESSION['scan_step'] = 'scan'; //~ pwg_log("GENARATE list <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE list <<<\n"); //~ pwg_log('<<<<< pwg_generate_list() <<<<<'."\n"); } function pwg_generate_scan() { //~ pwg_log('>>>>> pwg_generate_scan() >>>>>'."\n"); //~ pwg_log("GENARATE scan >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE scan >>>\n"); global $g_listing; while (pwg_continue() and count($_SESSION['scan_list_file']) > 0) { $line = ''; $_SESSION['scan_logs'] .= pwg_scan_file($_SESSION['scan_list_file'][0], $line); if (strlen($line) > 0) { fwrite($g_listing, $line); } //~ pwg_log('---<< Pull of $_SESSION[scan_list_file] value "'.$_SESSION['scan_list_file'][0].'"'."\n"); array_shift($_SESSION['scan_list_file']); $_SESSION['scan_cnt_file']++; } if (count($_SESSION['scan_list_file']) <= 0) { // Flush line $line = pwg_get_indent('root').''."\n"; fwrite($g_listing, $line); // How many directories to close $current_level = pwg_get_level($_SESSION['scan_list_fold'][0]); if (isset($_SESSION['scan_list_fold'][1])) { //~ pwg_log('---<< Pull of $_SESSION[scan_list_fold] value "'.$_SESSION['scan_list_fold'][0].'"'."\n"); array_shift($_SESSION['scan_list_fold']); $_SESSION['scan_cnt_fold']++; $next_level = pwg_get_level($_SESSION['scan_list_fold'][0]); $_SESSION['scan_step'] = 'list'; } else { $next_level = -1; $_SESSION['scan_step'] = 'stop'; } if ($current_level == $next_level) { fwrite($g_listing, pwg_close_level($current_level, 1)); } else { if (($current_level > $next_level)) { fwrite($g_listing, pwg_close_level($current_level, $current_level-$next_level+1)); } // Nothing to do if current_level < next_level } } //~ pwg_log("GENERATE scan <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE scan <<<\n"); //~ pwg_log('<<<<< pwg_generate_scan() <<<<<'."\n"); } function pwg_generate_stop() { //~ pwg_log('>>>>> pwg_generate_stop() >>>>>'."\n"); //~ pwg_log("GENARATE stop >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE stop >>>\n"); global $pwg_conf, $g_listing, $g_header, $g_message, $g_footer; // Flush line fwrite($g_listing, ''."\n"); // backup error log before cleaning session $time_elapsed = number_format(pwg_get_moment() - $_SESSION['scan_time'], 3, '.', ' '); $g_header = ' : Generate'; $g_message = '
'."\n".$_SESSION['scan_logs'].'
'."\n"; $g_message .= '
'.$_SESSION['scan_cnt_fold'].' directories parsed
'."\n"; $g_message .= ' '.$_SESSION['scan_cnt_file'].' files scanned
'."\n"; $g_message .= '
View listing.xml
'."\n"; $g_message .= '
Listing generated in : '.$time_elapsed.' s
'; $g_footer = ''; // What are we doing at next step $_SESSION['scan_step'] = 'exit'; //~ pwg_log("GENARATE stop <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE stop <<<\n"); //~ pwg_log('<<<<< pwg_generate_stop() <<<<<'."\n"); } // +-----------------------------------------------------------------------+ // | ALWAYS CALLED FUNCTIONS | // +-----------------------------------------------------------------------+ /** * This function check step and time ellapsed to determine end of loop * * @return bool */ function pwg_continue() { //~ pwg_log('>>>>> pwg_continue() >>>>>'."\n"); global $conf, $pwg_conf, $g_refresh, $g_header, $g_message, $g_footer, $start_time; if (!isset($_SESSION['scan_step']) or $_SESSION['scan_step'] == 'exit') { // evident end of process $return = false; } else { if ($pwg_conf['safe_mode']) { // can not reset the time $time_elapsed = pwg_get_moment() - $start_time; if ($time_elapsed < $conf['max_execution_time']) { $return = true; } else { $start_time = $_SESSION['scan_time']; $formated_time = number_format(pwg_get_moment() - $start_time, 3, '.', ' '); $g_refresh = ''."\n"; $g_header = ' : '.ucfirst($_SESSION['scan_action']).''; $g_message = ''; if ($_SESSION['scan_cnt_fold'] != 0) { $g_message .= ''.$_SESSION['scan_cnt_fold'].' directories scanned
'."\n"; } if ($_SESSION['scan_cnt_file'] != 0) { $g_message .= ''.$_SESSION['scan_cnt_file'].' files scanned
'."\n"; } $nb = count($_SESSION['scan_list_fold']); if ($nb > 0) { $g_message .= ''.$nb.' directories to scan
'."\n"; } $nb = count($_SESSION['scan_list_file']); if ($nb > 0) { $g_message .= ''.$nb.' files to scan
'."\n"; } $g_message .= '
Time elapsed : '.$formated_time.' s
'; $g_footer = ''."\n"; $return = false; } } else { // reset the time set_time_limit(intval(ini_get('max_execution_time'))); $return = true; } } //~ pwg_log('<<<<< pwg_continue() returns '.var_export($return, true).' <<<<<'."\n"); return $return; } /** * This function : * -> Verify the script call * -> Lock the script * -> Open listing.xml if action is 'generate' * -> Initialize output and session variables * * @return nothing */ function pwg_init() { //~ pwg_log('>>>>> pwg_init() >>>>>'."\n"); global $g_message, $g_listing, $g_footer, $conf, $pwg_conf, $start_time; // Lock other script sessions, this lock will be remove during 'exit' step if (!isset($_SESSION['scan_step'])) { $fp = @fopen(__FILE__.'.lock', 'x+'); // return false if __FILE__.lock exists or if cannot create if ($fp == false) { $g_header = $_SESSION['scan_action']; $g_message = ' Failure - Another script is running'; $g_message .= ' '; $g_message .= "\n"; $g_footer = ''."\n"; $_SESSION['scan_step'] = 'exit'; //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n"); return; } else { fwrite($fp, session_id()); // Writing session_id to trace lock fclose($fp); $_SESSION['scan_step'] = 'init'; } } // Verify and backup parameter action. This backup will be removed during step 'exit' if (isset($_REQUEST['action'])) { if (in_array($_REQUEST['action'], $pwg_conf['scan_action'])) { if (isset($_SESSION['scan_action'])) { if ($_SESSION['scan_action'] != $_REQUEST['action']) { // Fatal error $g_message = ' Failure - Parameter action differs between url and session'; $g_message .= "\n"; $g_footer = ''."\n"; $_SESSION['scan_step'] = 'exit'; //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n"); return; } } else { $_SESSION['scan_action'] = $_REQUEST['action']; } } else { // Fatal error $g_message = ' Failure - Problem with action parameter'; $g_message .= ' '; $g_message .= "\n"; $g_footer = ''."\n"; $_SESSION['scan_step'] = 'exit'; //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n"); return; } } else { // Here we are on welcome page $g_message = '
    '."\n"; $g_message .= '
  • Test
  • '."\n"; $g_message .= '
  • Clean
  • '."\n"; $g_message .= '
  • Listing
  • '."\n"; $g_message .= '
  • Protect
  • '."\n"; $g_message .= '
'."\n"; $g_footer = ''; $g_footer .= ''."\n"; $_SESSION['scan_step'] = 'exit'; } // Open listing.xml if ($_SESSION['scan_action'] == 'generate') { $mode = ($_SESSION['scan_step'] == 'init') ? 'w' : 'a'; // Erase old listing.xml at the beginning of generation (mode w) $g_listing = @fopen('listing.xml', $mode); if ($g_listing === false) { $g_header = $_SESSION['scan_action']; $g_message = ' Failure - Can not write file listing.xml'; $g_message .= "\n"; $g_footer = ''."\n"; $_SESSION['scan_step'] = 'exit'; //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n"); return; } } // Initializing session counters. This counters will be completely unset during step 'exit' if ($_SESSION['scan_step'] == 'init') { $_SESSION['scan_list_file'] = array(); $_SESSION['scan_list_fold'] = array(); $_SESSION['scan_cnt_file'] = 0; $_SESSION['scan_cnt_fold'] = 0; $_SESSION['scan_time'] = $start_time; $_SESSION['scan_step'] = 'start'; $_SESSION['scan_logs'] = ''; } //~ pwg_log('<<<<< pwg_init() success <<<<<'."\n"); } /** * This function : * -> Close listing.xml if action is 'generate' * -> Unlock the script * -> Erase session variables * * @return nothing */ function pwg_exit() { //~ pwg_log('>>>>> pwg_exit() >>>>>'."\n"); global $g_listing; // Close XML file if ($_SESSION['scan_action'] == 'generate' and $g_listing != false) { fclose($g_listing); } // Unlock script unlink(__FILE__.'.lock'); // Erase session counters unset($_SESSION['scan_list_file']); unset($_SESSION['scan_list_fold']); unset($_SESSION['scan_cnt_file']); unset($_SESSION['scan_cnt_fold']); unset($_SESSION['scan_time']); unset($_SESSION['scan_step']); $local_action = $_SESSION['scan_action']; unset($_SESSION['scan_action']); unset($_SESSION['scan_logs']); // Call specific action post process if (is_callable('pwg_'.$local_action.'_exit')) { call_user_func('pwg_'.$local_action.'_exit'); } //~ pwg_log('<<<<< pwg_exit() <<<<<'."\n"); } // +-----------------------------------------------------------------------+ // | script | // +-----------------------------------------------------------------------+ session_start(); $start_time = pwg_get_moment(); // Initializing message for web page $g_refresh = ''; $g_header = ''; $g_message = ''; $g_footer = ''; $g_listing = ''; pwg_init(); while(pwg_continue()) { if (is_callable('pwg_'.$_SESSION['scan_action'].'_'.$_SESSION['scan_step'])) { call_user_func('pwg_'.$_SESSION['scan_action'].'_'.$_SESSION['scan_step']); // Run the step : start, list, scan, stop are available } else { $g_header = $_SESSION['scan_action']; $g_message = ' Failure - INTERNAL STEP ERROR : pwg_'.$_SESSION['scan_action'].'_'.$_SESSION['scan_step'].'() undefined'; $g_message .= "\n"; $g_footer = ''."\n"; $_SESSION['scan_step'] = 'exit'; } } if ($_SESSION['scan_step'] == 'exit') { pwg_exit(); } ?> Manage distant gallery
Php Web Gallery  distant site