'DateTimeOriginal'
);
// ****** IPTC support functionality ****** //
// $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 Piwigo find image
// information ? This setting is used during metadata synchronisation. It
// associates a piwigo_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');
// ****** Directory protection functionality ****** //
// Define if directories have to be protected if they are not
$conf['protect'] = false;
// true/false : show/hide warnings
$conf['protect_warnings'] = true;
// ****** Thumbnails generation functionality ****** //
// Define if images have to be reduced if they are not
$conf['thumbnail'] = false;
// Define method to generate thumbnails :
// - fixed (width and height required);
// - width (only width required);
// - height (only height required);
// - ratio (only ratio is required)
// - exif (no other parameter required)
$conf['thumbnail_method'] = 'ratio';
// Height in pixels (greater than 0)
$conf['thumbnail_height'] = 128;
// Width in pixels (greater than 0)
$conf['thumbnail_width'] = 128;
// Ratio between original and thumbnail size (strictly between 0 and 1)
$conf['thumbnail_ratio'] = 0.2;
// Define thumbnail format : jpeg, png or gif (will be verified)
$conf['thumbnail_format'] = 'jpeg';
// ****** Directory mapping ****** //
// directories names
$conf['thumbs'] = 'thumbnail'; // thumbnails
$conf['high'] = 'pwg_high'; // high resolution
$conf['represent'] = 'pwg_representative'; // non pictures representative files
// +-----------------------------------------------------------------------+
// | Overload configurations |
// +-----------------------------------------------------------------------+
@include(dirname(__FILE__).'/'.basename(__FILE__, '.php').'_local.inc.php');
// +-----------------------------------------------------------------------+
// | 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');
// url of this script
$pwg_conf['this_url'] =
(empty($_SERVER['HTTPS']) ? 'http://' : 'https://')
.str_replace(':'.$_SERVER['SERVER_PORT'], '', $_SERVER['HTTP_HOST'])
.($_SERVER['SERVER_PORT'] != 80 ? ':'.$_SERVER['SERVER_PORT'] : '')
.$_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;
// This parameter will be fixed in pwg_init()
$pwg_conf['gd_version_major'] = '';
$pwg_conf['gd_version_full'] = '';
$pwg_conf['gd_supported_format'] = array();
// +-----------------------------------------------------------------------+
// | 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);
}
/**
* Check web server graphical capabilities
*
* @return string
*/
function pwg_check_graphics()
{
//~ pwg_log('>>>>> pwg_check_graphics() >>>>>'."\n");
global $conf, $pwg_conf;
$log = '';
// Verify gd library for thumbnail generation
if ($conf['thumbnail'] and !is_callable('gd_info'))
{
$log .= ' Warning - Your server can not generate thumbnails. Thumbnail creation switched off. '."\n";
// Switch off thumbnail generation
$conf['thumbnail'] = false;
return $log;
}
// Verify thumnail format
if ($conf['thumbnail'])
{
$info = gd_info();
// Backup GD major version
$pwg_conf['gd_version_full'] = preg_replace('/[[:alpha:][:space:]()]+/', '', $info['GD Version']);
list($pwg_conf['gd_version_major']) = preg_split('/[.]+/', $pwg_conf['gd_version_full']);
// Backup input/output format support
array_push($pwg_conf['gd_supported_format'], $info['JPG Support'] ? 'jpeg' : NULL);
array_push($pwg_conf['gd_supported_format'], $info['PNG Support'] ? 'png' : NULL);
array_push($pwg_conf['gd_supported_format'], ($info['GIF Read Support'] and $info['GIF Create Support']) ? 'gif' : NULL);
// Check output format support
if (!in_array($conf['thumbnail_format'], $pwg_conf['gd_supported_format']))
{
$log .= ' Warning - Your server does not support thumbnail\'s ';
$log .= $conf['thumbnail_format'].' format. Thumbnail creation switched off. '."\n";
}
switch ($conf['thumbnail_method'])
{
case 'exif':
{
// exif_thumbnail() must be callable
if (!is_callable('exif_thumbnail'))
{
$log .= ' Warning - Your server does not support thumbnail creation through EXIF datas. Thumbnail creation switched off. '."\n";
}
break;
}
case 'fixed':
{
// $conf['thumbnail_width'] > 0
if (!is_numeric($conf['thumbnail_width']) or $conf['thumbnail_width'] <= 0)
{
$log .= ' Failure - Bad value thumbnail_width = ';
$log .= var_export($conf['thumbnail_width'], true).'. Thumbnail creation switched off. '."\n";
}
// $conf['thumbnail_height'] > 0
if (!is_numeric($conf['thumbnail_height']) or $conf['thumbnail_height'] <= 0)
{
$log .= ' Failure - Bad value thumbnail_height = ';
$log .= var_export($conf['thumbnail_height'], true).'. Thumbnail creation switched off. '."\n";
}
break;
}
case 'ratio':
{
// 0 < $conf['thumbnail_ratio'] < 1
if (!is_numeric($conf['thumbnail_ratio']) or $conf['thumbnail_ratio'] <= 0 or $conf['thumbnail_ratio'] >= 1)
{
$log .= ' Failure - Bad value thumbnail_ratio = ';
$log .= var_export($conf['thumbnail_ratio'], true).'. Thumbnail creation switched off. '."\n";
}
break;
}
case 'width':
{
// $conf['thumbnail_width'] > 0
if (!is_numeric($conf['thumbnail_width']) or $conf['thumbnail_width'] <= 0)
{
$log .= ' Failure - Bad value thumbnail_width = ';
$log .= var_export($conf['thumbnail_width'], true).'. Thumbnail creation switched off. '."\n";
}
break;
}
case 'height':
{
// $conf['thumbnail_height'] > 0
if (!is_numeric($conf['thumbnail_height']) or $conf['thumbnail_height'] <= 0)
{
$log .= ' Failure - Bad value thumbnail_height = ';
$log .= var_export($conf['thumbnail_height'], true).'. Thumbnail creation switched off. '."\n";
}
break;
}
default:
{
// unknown method
$log .= ' Failure - Bad value thumbnail_method = ';
$log .= var_export($conf['thumbnail_method'], true).'. Thumbnail creation switched off. '."\n";
break;
}
}
if (strlen($log))
{
$conf['thumbnail'] = false;
}
}
//~ pwg_log('<<<<< pwg_check_graphics() returns '.var_export($log, TRUE).' <<<<<'."\n");
return $log;
}
/**
* 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'] = isset($iptc['keywords']) ? implode(',', array_unique(explode(',', $iptc['keywords']))) : NULL;
//~ 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 and complete error_log
*
* @param string $file_dir
* @param string $file_short
* @param string $file_ext
* @param string &$error_log
* @return string
*/
function pwg_get_thumbnail_ext($file_dir, $file_short, $file_ext, &$error_log)
{
//~ 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;
}
}
if ($thumb_ext == '')
{
if ($conf['thumbnail'])
{
$log = pwg_icon_file($file_dir, $file_short, $file_ext);
if (strpos($log, 'success'))
{
$thumb_ext = $conf['thumbnail_format'];
}
$error_log .= $log;
}
}
//~ pwg_log('<<<<< pwg_get_thumbnail_ext() returns '.var_export($thumb_ext, TRUE).' <<<<<'."\n");
return $thumb_ext;
}
/**
* return error logs
*
* @param string $file_dir
* @param string $file_short
* @param string $file_ext
* @return string
*/
function pwg_icon_file($file_dir, $file_short, $file_ext)
{
//~ pwg_log('>>>>> pwg_icon_file($file_dir = '.var_export($file_dir, TRUE).', $file_short = '.var_export($file_short, TRUE).') >>>>>'."\n");
global $conf, $pwg_conf;
$error_log = '';
// Get original properties (width, height)
if ($image_size = getimagesize($file_dir.'/'.$file_short.'.'.$file_ext))
{
$src_width = $image_size[0];
$src_height = $image_size[1];
}
else
{
$error_log .= ' Failure - Can not generate icon for ';
$error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'';
$error_log .= ' '."\n";
return $error_log;
}
// Check input format
$dst_format = $conf['thumbnail_format'];
$src_format = ($file_ext == 'jpg' or $file_ext == 'JPG') ? 'jpeg' : strtolower($file_ext);
if (!in_array($src_format, $pwg_conf['gd_supported_format']))
{
$error_log .= ' Failure - Can not generate icon for ';
$error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'';
$error_log .= ' '."\n";
return $error_log;
}
// Calculate icon properties (width, height)
switch ($conf['thumbnail_method'])
{
case 'fixed':
{
$dst_width = $conf['thumbnail_width'];
$dst_height = $conf['thumbnail_height'];
break;
}
case 'width':
{
$dst_width = $conf['thumbnail_width'];
$dst_height = $dst_width * $src_height / $src_width;
break;
}
case 'height':
{
$dst_height = $conf['thumbnail_height'];
$dst_width = $dst_height * $src_width / $src_height;
break;
}
case 'ratio':
{
$dst_width = round($src_width * $conf['thumbnail_ratio']);
$dst_height = round($src_height * $conf['thumbnail_ratio']);
break;
}
case 'exif':
default:
{
// Nothing to do
}
}
// Creating icon
if ($conf['thumbnail_method'] == 'exif')
{
$src = exif_thumbnail($file_dir.'/'.$file_short.'.'.$file_ext, $width, $height, $imagetype);
if ($src === false)
{
$error_log .= ' Failure - No EXIF thumbnail in ';
$error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.' '."\n";
return $error_log;
}
$dst = imagecreatefromstring($src);
if ($src === false)
{
$error_log .= ' Failure - EXIF thumbnail format not supported in ';
$error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.' '."\n";
return $error_log;
}
}
else
{
if (($pwg_conf['gd_version_major'] != 2)) // or ($conf['thumbnail_format'] == 'gif'))
{
$dst = imagecreate($dst_width, $dst_height);
}
else
{
$dst = imagecreatetruecolor($dst_width, $dst_height);
}
$src = call_user_func('imagecreatefrom'.$src_format, $file_dir.'/'.$file_short.'.'.$file_ext);
if (!$src)
{
$error_log .= ' Failure - Internal error for imagecreatefrom'.$src_format.'()';
$error_log .= 'with '.$file_dir.'/'.$file_short.'.'.$file_ext.' '."\n";
return $error_log;
}
if (($pwg_conf['gd_version_major'] != 2))
{
if (!imagecopyresized($dst, $src, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height))
{
$error_log .= ' Failure - Internal error for imagecopyresized()';
$error_log .= 'with '.$file_dir.'/'.$file_short.'.'.$file_ext.' '."\n";
return $error_log;
}
}
else
{
if (!imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height))
{
$error_log .= ' Failure - Internal error for imagecopyresampled()';
$error_log .= 'with '.$file_dir.'/'.$file_short.'.'.$file_ext.' '."\n";
return $error_log;
}
}
}
if (!call_user_func('image'.$dst_format, $dst, $file_dir.'/'.$conf['thumbs'].'/'.$conf['prefix_thumbnail'].$file_short.'.'.$conf['thumbnail_format']))
{
$error_log .= ' Failure - Can not write ';
$error_log .= $file_dir.'/'.$conf['thumbs'].'/'.$conf['prefix_thumbnail'].$file_short.'.'.$file_ext.' to generate thumbnail '."\n";
return $error_log;
}
$error_log .= ' Success - Thumbnail generated for ';
$error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.' '."\n";
//~ pwg_log('<<<<< pwg_icon_file() returns '.var_export($error_log, TRUE).' <<<<<'."\n");
return $error_log;
}
/**
* 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'] = dirname($pwg_conf['this_url']).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, $file_ext, $error_log);
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';
$high_file = $file_dir.'/'.$conf['high'].'/'.$file_base;
$element['high_filesize'] = floor(filesize($high_file) / 1024);
}
// 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
$element['tn_ext'] = pwg_get_thumbnail_ext($file_dir, $file_short, $file_ext, $log);
$ext = pwg_get_representative_ext($file_dir, $file_short);
if ($ext != '')
{
$element['representative_ext'] = $ext;
}
$element['filesize'] = floor(filesize($file_full) / 1024);
}
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)
{
//~ pwg_log('>>>>> pwg_protect_directories($directory = '.var_export($directory, true).') >>>>>'."\n");
global $conf;
$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";
}
else
{
$error_log .= ' Failure - Can not create index.php in directory '.$dir." \n";
}
}
else
{
if ($conf['protect_warnings'])
{
$error_log .= ' Warning - index.php already exists in directory '.$dir." \n";
}
}
}
}
//~ 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()
{
global $pwg_conf;
//~ pwg_log('>>>>> pwg_referer_is_me() >>>>>'."\n");
$response = false;
$caller = (isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
if (strcasecmp($pwg_conf['this_url'], $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_footer = ''."\n";
// Write version
$g_message = '
Script version
'."\n";
$g_message .= ' This script is tagged : '.$conf['version'].''."\n";
// write GD support
if (!is_callable('gd_info'))
{
$g_message .= ' Failure - Your server can not generate imagess '."\n";
}
else
{
$info = gd_info();
$gd_full_version = preg_replace('/[[:alpha:][:space:]()]+/', '', $info['GD Version']);
list($gd_version) = preg_split('/[.]+/', $gd_full_version);
$g_message .= '
Image generation
'."\n";
$g_message .= ' Success - Your server can generate images '."\n";
$g_message .= ' Warning - Your server support GD'.$gd_version.' (v'.$gd_full_version.') '."\n";
$format_list = array();
$format = ($info['GIF Create Support']) ? 'gif' : NULL;
array_push($format_list, $format);
$format = ($info['JPG Support']) ? 'jpg' : NULL;
array_push($format_list, $format);
$format = ($info['PNG Support']) ? 'png' : NULL;
array_push($format_list, $format);
$g_message .= ' Warning - Your server support format: '.implode(', ', $format_list)."\n";
}
$g_message .= '
Directory parsing
'."\n";
if ($pwg_conf['safe_mode'])
{
$g_message .= ' Warning - Your server does not support to resize execution time'."\n";
}
else
{
$g_message .= ' Success - Your server supports to resize execution time'."\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: Piwigo 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_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, $pwg_conf, $conf;
// Flush line
$xml_header_url = dirname($pwg_conf['this_url']);
$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, $conf;
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)
{
$_SESSION['scan_step'] = 'prot';
}
//~ 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_prot()
{
//~ pwg_log('>>>>> pwg_generate_prot() >>>>>'."\n");
//~ pwg_log("GENARATE prot >>>\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE prot >>>\n");
global $conf, $g_listing;
// Flush line
$line = pwg_get_indent('root').''."\n";
fwrite($g_listing, $line);
if ($conf['protect'])
{
$_SESSION['scan_logs'] .= pwg_protect_directories($_SESSION['scan_list_fold'][0]);
}
// 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_cnt_fold']++;
$_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 prot <<<\n".var_export($_SESSION['scan_list_fold'], true)."\n".var_export($_SESSION['scan_list_file'], true)."\nGENERATE prot <<<\n");
//~ pwg_log('<<<<< pwg_generate_prot() <<<<<'."\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 = '