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 .= ' '."\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