diff options
-rw-r--r-- | admin/site_manager.php | 150 | ||||
-rw-r--r-- | admin/site_reader_remote.php | 249 | ||||
-rw-r--r-- | admin/site_update.php | 20 | ||||
-rw-r--r-- | admin/themes/default/template/site_manager.tpl | 25 | ||||
-rw-r--r-- | include/functions.inc.php | 1 | ||||
-rw-r--r-- | include/functions_xml.inc.php | 134 | ||||
-rw-r--r-- | language/en_UK/admin.lang.php | 12 | ||||
-rw-r--r-- | tools/create_listing_file.php | 1713 | ||||
-rw-r--r-- | tools/create_listing_file_local.inc.php | 14 |
9 files changed, 9 insertions, 2309 deletions
diff --git a/admin/site_manager.php b/admin/site_manager.php index 8b2134b04..e4b318959 100644 --- a/admin/site_manager.php +++ b/admin/site_manager.php @@ -38,43 +38,6 @@ if (!empty($_POST) or isset($_GET['action'])) check_pwg_token(); } -/** - * requests the given $url (a remote create_listing_file.php) and fills a - * list of lines corresponding to request output - * - * @param string $url - * @return void - */ -function remote_output($url) -{ - global $template, $page; - - if (fetchRemote($url, $result)) - { - $lines = explode("\r\n", $result); - // cleaning lines from HTML tags - foreach ($lines as $line) - { - $line = trim(strip_tags($line)); - if (preg_match('/^PWG-([A-Z]+)-/', $line, $matches)) - { - $template->append( - 'remote_output', - array( - 'CLASS' => 'remote'.ucfirst(strtolower($matches[1])), - 'CONTENT' => $line - ) - ); - } - } - } - else - { - array_push($page['errors'], l10n('file create_listing_file.php on remote site was not found')); - } -} - - // +-----------------------------------------------------------------------+ // | template init | // +-----------------------------------------------------------------------+ @@ -86,14 +49,15 @@ $template->set_filenames(array('site_manager'=>'site_manager.tpl')); if (isset($_POST['submit']) and !empty($_POST['galleries_url'])) { $is_remote = url_is_remote( $_POST['galleries_url'] ); + if ($is_remote) + { + fatal_error('remote sites not supported'); + } $url = preg_replace('/[\/]*$/', '', $_POST['galleries_url']); $url.= '/'; - if (! $is_remote) + if ( ! (strpos($url, '.') === 0 ) ) { - if ( ! (strpos($url, '.') === 0 ) ) - { - $url = './' . $url; - } + $url = './' . $url; } // site must not exists @@ -110,38 +74,10 @@ SELECT COUNT(id) AS count } if (count($page['errors']) == 0) { - if ($is_remote) + if ( ! file_exists($url) ) { - if ( ! isset($_POST['no_check']) ) - { - $clf_url = $url.'create_listing_file.php'; - $get_data = array( - 'action' => 'test', - 'version' => PHPWG_VERSION, - ); - if (fetchRemote($clf_url, $result, $get_data)) - { - $lines = explode("\r\n", $result); - $first_line = strip_tags($lines[0]); - if (!preg_match('/^PWG-INFO-2:/', $first_line)) - { - array_push($page['errors'], - l10n('an error happened').' : '.$first_line); - } - } - else - { - array_push($page['errors'], l10n('file create_listing_file.php on remote site was not found') ); - } - } - } - else - { // local directory - if ( ! file_exists($url) ) - { - array_push($page['errors'], - l10n('Directory does not exist').' ['.$url.']'); - } + array_push($page['errors'], + l10n('Directory does not exist').' ['.$url.']'); } } @@ -176,24 +112,6 @@ SELECT galleries_url list($galleries_url) = pwg_db_fetch_row(pwg_query($query)); switch($_GET['action']) { - case 'generate' : - { - $title = $galleries_url.' : '.l10n('generate listing'); - remote_output($galleries_url.'create_listing_file.php?action=generate'); - break; - } - case 'test' : - { - $title = $galleries_url.' : '.l10n('test'); - remote_output($galleries_url.'create_listing_file.php?action=test&version='.PHPWG_VERSION); - break; - } - case 'clean' : - { - $title = $galleries_url.' : '.l10n('clean'); - remote_output($galleries_url.'create_listing_file.php?action=clean'); - break; - } case 'delete' : { delete_site($page['site']); @@ -212,23 +130,6 @@ $template->assign( ) ); -// +-----------------------------------------------------------------------+ -// | remote sites list | -// +-----------------------------------------------------------------------+ - -if ( is_file(PHPWG_ROOT_PATH.'listing.xml') ) -{ - $xml_content = getXmlCode(PHPWG_ROOT_PATH.'listing.xml'); - $local_listing_site_url = getAttribute( - getChild($xml_content, 'informations'), - 'url' - ); - if ( !url_is_remote($local_listing_site_url) ) - { - $local_listing_site_url = null; - } -} - $query = ' SELECT c.site_id, COUNT(DISTINCT c.id) AS nb_categories, COUNT(i.id) AS nb_images FROM '.CATEGORIES_TABLE.' AS c LEFT JOIN '.IMAGES_TABLE.' AS i @@ -266,16 +167,6 @@ while ($row = pwg_db_fetch_assoc($result)) 'U_SYNCHRONIZE' => $update_url ); - if ($is_remote) - { - $tpl_var['remote'] = - array( - 'U_TEST' => $base_url.'test', - 'U_GENERATE' => $row['galleries_url'].'create_listing_file.php?action=generate', - 'U_CLEAN' => $base_url.'clean', - ); - } - if ($row['id'] != 1) { $tpl_var['U_DELETE'] = $base_url.'delete'; @@ -289,30 +180,7 @@ while ($row = pwg_db_fetch_assoc($result)) $tpl_var['plugin_links'] = $plugin_links; $template->append('sites', $tpl_var); - - if ( isset($local_listing_site_url) and - $row['galleries_url']==$local_listing_site_url ) - { - $local_listing_site_id = $row['id']; - $template->assign( 'local_listing', - array( - 'URL' => $local_listing_site_url, - 'U_SYNCHRONIZE' => $update_url.'&local_listing=1' - ) - ); - } } -if ( isset($local_listing_site_url) and !isset($local_listing_site_id) ) -{ - $template->assign( 'local_listing', - array( - 'URL' => $local_listing_site_url, - 'CREATE' => true - ) - ); -} - - $template->assign_var_from_handle('ADMIN_CONTENT', 'site_manager'); ?> diff --git a/admin/site_reader_remote.php b/admin/site_reader_remote.php deleted file mode 100644 index bec4c63ee..000000000 --- a/admin/site_reader_remote.php +++ /dev/null @@ -1,249 +0,0 @@ -<?php -// +-----------------------------------------------------------------------+ -// | Piwigo - a PHP based photo gallery | -// +-----------------------------------------------------------------------+ -// | Copyright(C) 2008-2012 Piwigo Team http://piwigo.org | -// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net | -// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick | -// +-----------------------------------------------------------------------+ -// | This program is free software; you can redistribute it and/or modify | -// | it under the terms of the GNU General Public License as published by | -// | the Free Software Foundation | -// | | -// | This program is distributed in the hope that it will be useful, but | -// | WITHOUT ANY WARRANTY; without even the implied warranty of | -// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | -// | General Public License for more details. | -// | | -// | You should have received a copy of the GNU General Public License | -// | along with this program; if not, write to the Free Software | -// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | -// | USA. | -// +-----------------------------------------------------------------------+ - - -// provides data for site synchronization from a remote listing.xml -class RemoteSiteReader -{ - -var $site_url; -var $listing_url; -var $site_dirs; -var $site_files; -var $insert_attributes; -var $metadata_attributes; - -function RemoteSiteReader($url, $listing_url) -{ - $this->site_url = $url; - $this->insert_attributes = array( - 'tn_ext', - ); - $this->update_attributes = array( - 'tn_ext', 'representative_ext', 'has_high', - ); - $this->metadata_attributes = array( - 'filesize', 'width', 'height', 'high_filesize', 'high_width', 'high_height', - ); - - if (!isset($listing_url)) - { - $this->listing_url = $this->site_url.'listing.xml'; - } - else - { - $this->listing_url = $listing_url; - } -} - -/** - * Is this remote site ok ? - * - * @return true on success, false otherwise - */ -function open() -{ - global $errors; - - if ($xml_content = getXmlCode($this->listing_url)) - { - $this->site_dirs = array(); - $this->site_files = array(); - $info_xml_element = getChild($xml_content, 'informations'); - if (getAttribute($info_xml_element , 'phpwg_version') != PHPWG_VERSION) - { - array_push( - $errors, - array( - 'path' => $this->listing_url, - 'type' => 'PWG-ERROR-VERSION' - ) - ); - - return false; - } - - $additional_metadata = getAttribute($info_xml_element, 'metadata'); - - if ($additional_metadata != '') - { - $this->metadata_attributes = array_merge( - $this->metadata_attributes, - explode(',', $additional_metadata) - ); - } - - $this->build_structure($xml_content, '', 0); - - return true; - } - else - { - array_push( - $errors, - array( - 'path' => $this->listing_url, - 'type' => 'PWG-ERROR-NOLISTING' - ) - ); - - return false; - } -} - -// retrieve xml sub-directories fulldirs -function get_full_directories($basedir) -{ - $dirs = array(); - foreach ( array_keys($this->site_dirs) as $dir) - { - $full_dir = $this->site_url . $dir; - if ($full_dir != $basedir - and strpos($full_dir, $basedir) === 0 - ) - { - array_push($dirs, $full_dir); - } - } - return $dirs; -} - -/** - * Returns a hash with all elements (images and files) inside the full $path - * according to listing.xml - * @param string $path recurse in this directory only - * @return array like "pic.jpg"=>array('tn_ext'=>'jpg' ... ) - */ -function get_elements($path) -{ - $elements = array(); - foreach ( $this->site_dirs as $dir=>$files) - { - $full_dir = $this->site_url . $dir; - if (strpos($full_dir, $path) === 0) - { - foreach ($files as $file) - { - $data = $this->get_element_attributes( - $file, - $this->insert_attributes - ); - $elements[$file] = $data; - } - } - } - - return $elements; -} - -// returns the name of the attributes that are supported for -// files update/synchronization -function get_update_attributes() -{ - return $this->update_attributes; -} - -function get_element_update_attributes($file) -{ - return $this->get_element_attributes( - $file, - $this->update_attributes - ); -} - -// returns the name of the attributes that are supported for -// metadata update/synchronization according to listing.xml -function get_metadata_attributes() -{ - return $this->metadata_attributes; -} - -// returns a hash of attributes (metadata+width,...) for file -function get_element_metadata($file, $has_high = false) -{ - return $this->get_element_attributes( - $file, - $this->metadata_attributes - ); -} - -//-------------------------------------------------- private functions -------- -/** - * Returns a hash of image/file attributes - * @param string $file fully qualified file name - * @param array $attributes specifies which attributes to retrieve - * returned -*/ -function get_element_attributes($file, $attributes) -{ - $xml_element = $this->site_files[$file]; - if (!isset($xml_element)) - { - return null; - } - $data = array(); - foreach($attributes as $att) - { - if (getAttribute($xml_element, $att) != '') - { - $val = getAttribute($xml_element, $att); - $data[$att] = addslashes($val); - } - } - return $data; -} - -// recursively parse the xml_content for later usage -function build_structure($xml_content, $basedir, $level) -{ - $temp_dirs = getChildren($xml_content, 'dir'.$level); - foreach ($temp_dirs as $temp_dir) - { - $dir_name = $basedir; - if ($dir_name != '' ) - { - $dir_name .= '/'; - } - $dir_name .= getAttribute($temp_dir, 'name'); - $this->site_dirs[ $dir_name ] = array(); - $this->build_structure($temp_dir, $dir_name, $level+1); - } - - if ($basedir != '') - { - $xml_elements = getChildren( - getChild($xml_content, 'root'), - 'element' - ); - foreach ($xml_elements as $xml_element) - { - $path = getAttribute($xml_element, 'path'); - $this->site_files[$path] = $xml_element; - array_push($this->site_dirs[$basedir], $path); - } - } -} - -} - -?> diff --git a/admin/site_update.php b/admin/site_update.php index 2021ac984..2861dc81f 100644 --- a/admin/site_update.php +++ b/admin/site_update.php @@ -58,22 +58,10 @@ $error_labels = array( l10n('wrong filename'), l10n('The name of directories and files must be composed of letters, numbers, "-", "_" or "."') ), - 'PWG-UPDATE-2' => array( - l10n('missing thumbnail'), - l10n('a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :').implode(',', $conf['picture_ext']) - ), 'PWG-ERROR-NO-FS' => array( l10n('File/directory read error'), l10n('The file or directory cannot be accessed (either it does not exist or the access is denied)') ), - 'PWG-ERROR-VERSION' => array( - l10n('Piwigo version differs on the remote site'), - l10n('Version of create_listing_file.php on the remote site and Piwigo must be the same') - ), - 'PWG-ERROR-NOLISTING' => array( - l10n('listing.xml file was not found'), - l10n('listing.xml file was not found on the remote site. This file is generated by choosing the "generate listing" command in the Site manager') - ) ); $errors = array(); $infos = array(); @@ -81,14 +69,6 @@ $infos = array(); if ($site_is_remote) { fatal_error('remote sites not supported'); - include_once(PHPWG_ROOT_PATH.'admin/site_reader_remote.php'); - $local_listing = null; - if ( isset($_GET['local_listing']) - and $_GET['local_listing'] ) - { - $local_listing = PHPWG_ROOT_PATH.'listing.xml'; - } - $site_reader = new RemoteSiteReader($site_url, $local_listing); } else { diff --git a/admin/themes/default/template/site_manager.tpl b/admin/themes/default/template/site_manager.tpl index 50320b935..b881220db 100644 --- a/admin/themes/default/template/site_manager.tpl +++ b/admin/themes/default/template/site_manager.tpl @@ -12,25 +12,6 @@ </div> {/if} -{if isset($local_listing)} -{'A local listing.xml file has been found for'|@translate} {$local_listing.URL} -{if isset($local_listing.CREATE)} -<form action="{$F_ACTION}" method="post"> - <p> - <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}"> - {'Create this site'|@translate}: - <input type="hidden" name="no_check" value="1"> - <input type="hidden" name="galleries_url" value="{$local_listing.URL}"> - <input type="submit" name="submit" value="{'Submit'|@translate}"> - </p> -</form> -{/if} -{if isset($local_listing.U_SYNCHRONIZE)} - <a href="{$local_listing.U_SYNCHRONIZE}" title="{'read local listing.xml and update'|@translate}">{'Synchronize'|@translate}</a> -<br><br> -{/if} -{/if} - {if not empty($sites)} <table class="table2"> <tr class="throw"> @@ -46,12 +27,6 @@ [<a href="{$site.U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|escape:'javascript'}');" title="{'delete this site and all its attached elements'|@translate}">{'delete'|@translate}</a>] {/if} - {if isset($site.remote)} - <br> - [<a href="{$site.remote.U_TEST}" title="{'test this remote site'|@translate}">{'test'|@translate}</a>] - [<a href="{$site.remote.U_GENERATE}" title="{'generate file listing.xml on remote site'|@translate}">{'generate listing'|@translate}</a>] - [<a href="{$site.remote.U_CLEAN}" title="{'remove remote listing.xml file'|@translate}">{'clean'|@translate}</a>] - {/if} {if not empty($site.plugin_links)} <br> {foreach from=$site.plugin_links item=plugin_link} diff --git a/include/functions.inc.php b/include/functions.inc.php index 2e4052ce9..77e00dd6a 100644 --- a/include/functions.inc.php +++ b/include/functions.inc.php @@ -25,7 +25,6 @@ include_once( PHPWG_ROOT_PATH .'include/functions_user.inc.php' ); include_once( PHPWG_ROOT_PATH .'include/functions_cookie.inc.php' ); include_once( PHPWG_ROOT_PATH .'include/functions_session.inc.php' ); include_once( PHPWG_ROOT_PATH .'include/functions_category.inc.php' ); -include_once( PHPWG_ROOT_PATH .'include/functions_xml.inc.php' ); include_once( PHPWG_ROOT_PATH .'include/functions_html.inc.php' ); include_once( PHPWG_ROOT_PATH .'include/functions_tag.inc.php' ); include_once( PHPWG_ROOT_PATH .'include/functions_url.inc.php' ); diff --git a/include/functions_xml.inc.php b/include/functions_xml.inc.php deleted file mode 100644 index 00d69f3f8..000000000 --- a/include/functions_xml.inc.php +++ /dev/null @@ -1,134 +0,0 @@ -<?php -// +-----------------------------------------------------------------------+ -// | Piwigo - a PHP based photo gallery | -// +-----------------------------------------------------------------------+ -// | Copyright(C) 2008-2012 Piwigo Team http://piwigo.org | -// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net | -// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick | -// +-----------------------------------------------------------------------+ -// | This program is free software; you can redistribute it and/or modify | -// | it under the terms of the GNU General Public License as published by | -// | the Free Software Foundation | -// | | -// | This program is distributed in the hope that it will be useful, but | -// | WITHOUT ANY WARRANTY; without even the implied warranty of | -// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | -// | General Public License for more details. | -// | | -// | You should have received a copy of the GNU General Public License | -// | along with this program; if not, write to the Free Software | -// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | -// | USA. | -// +-----------------------------------------------------------------------+ -define( 'ATT_REG', '\w+' ); -define( 'VAL_REG', '[^"]*' ); - -//------------------------------------------------------------------- functions -// getContent returns the content of a tag -// -// example : getContent( "<name>Joe</name>" ) returns "Joe" -// -// It also works with strings containing themself sub-tags : -// <perso><name>Jean</name><firstname>Billie</fisrtname></perso> -> -// <name>Jean</name><firstname>Billie</firstname> -function getContent( $element ) -{ - // deleting start of the tag - $content = preg_replace( '/^<[^>]+>/', '', $element ); - // deleting end of the tag - $content = preg_replace( '/<\/[^>]+>$/', '', $content ); - // replacing multiple instance of space character - $content = preg_replace( '/\s+/', ' ', $content ); - - return $content; -} - -// The function get Attribute returns the value corresponding to the -// attribute $attribute for the tag $element. -function getAttribute( $element, $attribute ) -{ -// echo htmlentities($element).'<br /><br />'; - $regex = '/^<\w+[^>]*\b'.$attribute.'\s*=\s*"('.VAL_REG.')"/i'; - if ( preg_match( $regex, $element, $out ) ) - { - return html_entity_decode($out[1], ENT_QUOTES); - } - else return ''; -} - -// The function encode Attribute returns the xml attribute $attribute="$value" -function encodeAttribute( $attribute, $value ) -{ - return $attribute.'="'.htmlspecialchars($value, ENT_QUOTES).'" '; -} - -// The function getChild returns the first child -// exemple : getChild( "<table><tr>XXX</tr><tr>YYY</tr></table>", "tr" ) -// returns "<tr>XXX</tr>" -function getChild( $document, $node ) -{ - $regex = '/<'.$node.'(\s+'.ATT_REG.'="'.VAL_REG.'")*'; - $regex.= '(\s*\/>|>.*<\/'.$node.'>)/U'; - - if - ( - preg_match( $regex, $document, $out ) - or - preg_last_error() == PREG_NO_ERROR - ) - { - return $out[0]; - } - else - { - die('getChild: error ['.preg_last_error().'] with preg_match function'); - } -} - -// getChildren returns a list of the children identified by the $node -// example : -// getChild( "<table><tr>XXX</tr><tr>YYY</tr></table>", "tr" ) -// returns an array with : -// $array[0] equals "<tr>XXX</tr>" -// $array[1] equals "<tr>YYY</tr>" -function getChildren( $document, $node ) -{ - $regex = '/<'.$node.'(\s+'.ATT_REG.'="'.VAL_REG.'")*'; - $regex.= '(\s*\/>|>.*<\/'.$node.'>)/U'; - - if - ( - preg_match_all( $regex, $document, $out ) - or - preg_last_error() == PREG_NO_ERROR - ) - { - return $out[0]; - } - else - { - die('getChild: error ['.preg_last_error().'] with preg_match_all function'); - } -} - -// get_CodeXML places the content of a text file in a PHP variable and -// return it. If the file can't be opened, returns false. -function getXmlCode( $filename ) -{ - if (function_exists('ini_set')) - { - // limit must be growed with php5 and "big" listing file - ini_set("pcre.backtrack_limit", pow(2, 31)); - } - - if (!fetchRemote($filename, $xml_content)) - { - return false; - } - - $xml_content = str_replace( "\n", '', $xml_content ); - $xml_content = str_replace( "\t", '', $xml_content ); - - return $xml_content; -} -?> diff --git a/language/en_UK/admin.lang.php b/language/en_UK/admin.lang.php index b74698a68..b46825c60 100644 --- a/language/en_UK/admin.lang.php +++ b/language/en_UK/admin.lang.php @@ -85,9 +85,7 @@ $lang['(this tag will be deleted)'] = '(this tag will be deleted)'; $lang['+ Add an upload box'] = '+ Add an upload box'; $lang[', click on'] = ", click on"; $lang['... or '] = '... or '; -$lang['A local listing.xml file has been found for'] = "A local listing.xml file has been found for"; $lang['A new version of Piwigo is available.'] = "A new version of Piwigo is available."; -$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = "a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory \"thumbnail\" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :"; $lang['Access type'] = "Access type"; $lang['ACCESS_0'] = "Free access"; $lang['ACCESS_1'] = "Access to all"; @@ -298,7 +296,6 @@ $lang['existing album'] = 'existing album'; $lang['Extend for templates'] = "Extend templates"; $lang['Extensions Update'] = 'Extensions Update'; $lang['Failed to write file to disk'] = 'Failed to write file to disk'; -$lang['file create_listing_file.php on remote site was not found'] = "file create_listing_file.php not found on the remote site"; $lang['File upload stopped by extension'] = 'File upload stopped by extension'; $lang['File'] = "File"; $lang['File/directory read error'] = "File/directory read error"; @@ -318,8 +315,6 @@ $lang['Gallery title'] = "Gallery title"; $lang['GD library is missing'] = "GD library is missing"; $lang['GD version'] = "GD version"; $lang['General statistics'] = "General statistics"; -$lang['generate file listing.xml on remote site'] = "generate file listing.xml on the remote site"; -$lang['generate listing'] = "generate listing"; $lang['Get Support on Piwigo Forum'] = 'Get support on Piwigo forum'; $lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'; $lang['global mode'] = "global mode"; @@ -404,8 +399,6 @@ $lang['Level 8'] = "Admins"; $lang['Link all album photos to a new album'] = "Link all album photos to a new album"; $lang['Link all album photos to some existing albums'] = "Link all album photos to some existing albums"; $lang['Linked albums'] = "Linked albums"; -$lang['listing.xml file was not found on the remote site. This file is generated by choosing the "generate listing" command in the Site manager'] = "listing.xml file not found on the remote site. This file is generated with the \"generate listing\" command in the Site manager"; -$lang['listing.xml file was not found'] = "listing.xml file not found"; $lang['Local'] = "Local"; $lang['Lock albums'] = "Lock albums"; $lang['Lock gallery'] = "Lock gallery"; @@ -448,7 +441,6 @@ $lang['Minimum privacy level'] = "Minimum privacy level"; $lang['Miscellaneous'] = 'Miscellaneous'; $lang['Missing a temporary folder'] = 'Missing a temporary folder'; $lang['Missing Plugins'] = 'Missing Plugins'; -$lang['missing thumbnail'] = "missing thumbnail"; $lang['Modify information'] = "Modify information"; $lang['Month'] = "Month"; $lang['Move albums'] = "Move albums"; @@ -541,7 +533,6 @@ $lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo cannot retrie $lang['Piwigo configuration'] = "Piwigo configuration"; $lang['Piwigo Update'] = 'Piwigo Update'; $lang['Piwigo Uploader'] = 'Piwigo Uploader'; -$lang['Piwigo version differs on the remote site'] = "Piwigo version differs on the remote site"; $lang['Piwigo version'] = "Piwigo version"; $lang['pixels'] = 'pixels'; $lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = "Please check \"plugins\" folder and sub-folders permissions (CHMOD)."; @@ -577,7 +568,6 @@ $lang['Rate date'] = "Rate date"; $lang['Rate'] = "Rate"; $lang['Rating by guests'] = "Rating by guests"; $lang['Rating'] = "Rating"; -$lang['read local listing.xml and update'] = "read local listing.xml and update"; $lang['Read Piwigo Documentation'] = 'Read Piwigo Documentation'; $lang['reduce to single existing albums'] = "reduce to single existing albums"; $lang['Refresh photo set'] = 'Refresh photo set'; @@ -593,7 +583,6 @@ $lang['Remove all filters'] = 'Remove all filters'; $lang['remove author'] = 'remove author'; $lang['remove creation date'] = 'remove creation date'; $lang['Remove from caddie'] = 'Remove from caddie'; -$lang['remove remote listing.xml file'] = "remove remote listing.xml file"; $lang['remove tags'] = "remove tags"; $lang['remove this filter'] = 'remove this filter'; $lang['remove title'] = 'remove title'; @@ -778,7 +767,6 @@ $lang['user_status_normal'] = "User"; $lang['user_status_webmaster'] = "Webmaster"; $lang['Validate'] = "Validate"; $lang['Validation'] = "Validation"; -$lang['Version of create_listing_file.php on the remote site and Piwigo must be the same'] = "Versions of create_listing_file.php on the remote site and Piwigo must be the same"; $lang['Version'] = "Version"; $lang['Virtual album added'] = "Virtual album added"; $lang['Virtual album deleted'] = "Virtual album deleted"; diff --git a/tools/create_listing_file.php b/tools/create_listing_file.php deleted file mode 100644 index 62ce048ef..000000000 --- a/tools/create_listing_file.php +++ /dev/null @@ -1,1713 +0,0 @@ -<?php -// +-----------------------------------------------------------------------+ -// | Piwigo - a PHP based photo gallery | -// +-----------------------------------------------------------------------+ -// | Copyright(C) 2008-2012 Piwigo Team http://piwigo.org | -// | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net | -// | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick | -// +-----------------------------------------------------------------------+ -// | This program is free software; you can redistribute it and/or modify | -// | it under the terms of the GNU General Public License as published by | -// | the Free Software Foundation | -// | | -// | This program is distributed in the hope that it will be useful, but | -// | WITHOUT ANY WARRANTY; without even the implied warranty of | -// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | -// | General Public License for more details. | -// | | -// | You should have received a copy of the GNU General Public License | -// | along with this program; if not, write to the Free Software | -// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | -// | USA. | -// +-----------------------------------------------------------------------+ - -// +-----------------------------------------------------------------------+ -// | User configuration | -// +-----------------------------------------------------------------------+ - -// ****** Gallery configuration ****** // -// Script version -$conf['version'] = '2.4.0RC2'; - -// URL of main gallery -// Example : http://www.my.domain/my/directory -$conf['gallery'] = 'http://piwigo.org/demo'; - -// prefix for thumbnails in "thumbnail" sub directories -$conf['prefix_thumbnail'] = 'TN-'; - -// $conf['file_ext'] lists all extensions (case insensitive) allowed -// for your Piwigo installation -$conf['file_ext'] = array('jpg','JPG','jpeg','JPEG', - 'png','PNG','gif','GIF','mpg','zip', - 'avi','mp3','ogg'); - - -// $conf['picture_ext'] must be a subset of $conf['file_ext'] -$conf['picture_ext'] = array('jpg','JPG','jpeg','JPEG', - 'png','PNG','gif','GIF'); - -// ****** Time limitation functionality ****** // -// max execution time before refresh in seconds -$conf['max_execution_time'] = (5*ini_get('max_execution_time'))/6; // 25 seconds with default PHP configuration -// force the use of refresh method -// in order to have live informations -// or -// to fix system witch are not safe mode but not autorized set_time_limit -$conf['force_refresh_method'] = true; - -// refresh delay is seconds -$conf['refresh_delay'] = 0; - -// ****** EXIF support functionality ****** // -// $conf['use_exif'] set to true if you want to use Exif information -$conf['use_exif'] = true; - -// use_exif_mapping: same behaviour as use_iptc_mapping -$conf['use_exif_mapping'] = array( - 'date_creation' => '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'] = '<?php header("Location: '.$conf['gallery'].'") ?>'; - -// 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 .= ' <code class="warning">Warning -</code> Your server can not generate thumbnails. Thumbnail creation switched off.<br />'."\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'], (isset($info['JPG Support']) and $info['JPG Support']) or (isset($info['JPEG Support']) and $info['JPEG 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 .= ' <code class="warning">Warning -</code> Your server does not support thumbnail\'s <code>'; - $log .= $conf['thumbnail_format'].'</code> format. Thumbnail creation switched off.<br />'."\n"; - } - - switch ($conf['thumbnail_method']) - { - case 'exif': - { - // exif_thumbnail() must be callable - if (!is_callable('exif_thumbnail')) - { - $log .= ' <code class="warning">Warning -</code> Your server does not support thumbnail creation through EXIF datas. Thumbnail creation switched off.<br />'."\n"; - } - break; - } - case 'fixed': - { - // $conf['thumbnail_width'] > 0 - if (!is_numeric($conf['thumbnail_width']) or $conf['thumbnail_width'] <= 0) - { - $log .= ' <code class="failure">Failure -</code> Bad value <code>thumbnail_width = '; - $log .= var_export($conf['thumbnail_width'], true).'</code>. Thumbnail creation switched off.<br />'."\n"; - } - // $conf['thumbnail_height'] > 0 - if (!is_numeric($conf['thumbnail_height']) or $conf['thumbnail_height'] <= 0) - { - $log .= ' <code class="failure">Failure -</code> Bad value <code>thumbnail_height = '; - $log .= var_export($conf['thumbnail_height'], true).'</code>. Thumbnail creation switched off.<br />'."\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 .= ' <code class="failure">Failure -</code> Bad value <code>thumbnail_ratio = '; - $log .= var_export($conf['thumbnail_ratio'], true).'</code>. Thumbnail creation switched off.<br />'."\n"; - } - break; - } - case 'width': - { - // $conf['thumbnail_width'] > 0 - if (!is_numeric($conf['thumbnail_width']) or $conf['thumbnail_width'] <= 0) - { - $log .= ' <code class="failure">Failure -</code> Bad value <code>thumbnail_width = '; - $log .= var_export($conf['thumbnail_width'], true).'</code>. Thumbnail creation switched off.<br />'."\n"; - } - break; - } - case 'height': - { - // $conf['thumbnail_height'] > 0 - if (!is_numeric($conf['thumbnail_height']) or $conf['thumbnail_height'] <= 0) - { - $log .= ' <code class="failure">Failure -</code> Bad value <code>thumbnail_height = '; - $log .= var_export($conf['thumbnail_height'], true).'</code>. Thumbnail creation switched off.<br />'."\n"; - } - break; - } - default: - { - // unknown method - $log .= ' <code class="failure">Failure -</code> Bad value <code>thumbnail_method = '; - $log .= var_export($conf['thumbnail_method'], true).'</code>. Thumbnail creation switched off.<br />'."\n"; - break; - } - } - - if (strlen($log)) - { - $conf['thumbnail'] = false; - } - } - - //~ pwg_log('<<<<< pwg_check_graphics() returns '.var_export($log, TRUE).' <<<<<'."\n"); - return $log; -} - -/** - * returns xml </dirX> 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).'</dir'.$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, &$icon_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']; - } - $icon_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 = ''; - - // Create thumbnail directory if not exists - if (!file_exists($file_dir.'/'.$conf['thumbs'])) - { - mkdir($file_dir.'/'.$conf['thumbs']); - } - - // 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 .= ' <code class="failure">Failure -</code> Can not generate icon for <code>'; - $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code>'; - $error_log .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="width/height are unreadable" /><br />'."\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 .= ' <code class="failure">Failure -</code> Can not generate icon for <code>'; - $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code>'; - $error_log .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="format not supported" /><br />'."\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 .= ' <code class="failure">Failure -</code> No EXIF thumbnail in <code>'; - $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n"; - return $error_log; - } - $dst = imagecreatefromstring($src); - if ($src === false) - { - $error_log .= ' <code class="failure">Failure -</code> EXIF thumbnail format not supported in <code>'; - $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\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 .= ' <code class="failure">Failure -</code> Internal error for <code>imagecreatefrom'.$src_format.'()</code>'; - $error_log .= 'with <code>'.$file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\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 .= ' <code class="failure">Failure -</code> Internal error for <code>imagecopyresized()</code>'; - $error_log .= 'with <code>'.$file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n"; - return $error_log; - } - } - else - { - if (!imagecopyresampled($dst, $src, 0, 0, 0, 0, $dst_width, $dst_height, $src_width, $src_height)) - { - $error_log .= ' <code class="failure">Failure -</code> Internal error for <code>imagecopyresampled()</code>'; - $error_log .= 'with <code>'.$file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\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 .= ' <code class="failure">Failure -</code> Can not write <code>'; - $error_log .= $file_dir.'/'.$conf['thumbs'].'/'.$conf['prefix_thumbnail'].$file_short.'.'.$file_ext.'</code> to generate thumbnail<br />'."\n"; - return $error_log; - } - - $error_log .= ' <code class="success">Success -</code> Thumbnail generated for <code>'; - $error_log .= $file_dir.'/'.$file_short.'.'.$file_ext.'</code><br />'."\n"; - - //~ pwg_log('<<<<< pwg_icon_file() returns '.var_export($error_log, TRUE).' <<<<<'."\n"); - return $error_log; -} - -/** - * completes xml line <element .../> 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 =''; - $icon_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, $icon_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); - - if ($high_size = @getimagesize($high_file)) - { - $element['high_width'] = $high_size[0]; - $element['high_height'] = $high_size[1]; - } - } - - // 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 .= ' <code class="failure">Failure -</code> Thumbnail is missing for <code>'.$file_dir.'/'.$file_base.'</code>'; - $error_log .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="'.$file_dir.'/thumbnail/'.$conf['prefix_thumbnail'].$file_short; - $error_log .= '.xxx ('.implode(', ', $conf['picture_ext']).')" /><br />'."\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').'<element '; - foreach($element as $key => $value) - { - $line .= $key.'="'.$value.'" '; - } - $line .= '/>'."\n"; - } - - // Adding Icon generation log to message - $error_log .= $icon_log; - - //~ 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 .= ' <code class="success">Success -</code> index.php created in directory <a href="'.$dir.'">'.$dir."</a><br />\n"; - } - else - { - $error_log .= ' <code class="failure">Failure -</code> Can not create index.php in directory <code>'.$dir."</code><br />\n"; - } - } - else - { - if ($conf['protect_warnings']) - { - $error_log .= ' <code class="warning">Warning -</code> index.php already exists in directory <a href="'.$dir.'">'.$dir."</a><br />\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 .= ' <code class="failure">Failure -</code> Invalid file name for <code>'.$file.'</code> in <code>'.$directory.'</code>'; - $errorLog .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png"'; - $errorLog .= ' title="Name should be composed of letters, figures, -, _ or . ONLY" /><br />'."\n"; - } - } - break; // End of filetype FILE - } - case 'dir' : - { - if(!in_array($file, $pwg_conf['reserved_directory_names'])) - { - // The file pointed is a directory but neither system directory nor reserved by PWG - array_push($_SESSION['scan_list_fold'], $directory.'/'.$file); - //~ pwg_log('--->> Push in $_SESSION[scan_list_fold] value "'.$directory.'/'.$file.'"'."\n"); - if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $file)) - { - $errorLog .= ' <code class="failure">Failure -</code> Invalid directory name for <code>'.$directory.'/'.$file.'</code>'; - $errorLog .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png"'; - $errorLog .= ' title="Name should be composed of letters, figures, -, _ or . ONLY" /><br />'."\n"; - } - } - break; // End of filetype DIR - } - case 'fifo' : - case 'char' : - case 'block' : - case 'link' : - case 'unknown': - default : - { - // PWG does not manage these cases - break; - } - } - } - closedir($dir); - - //~ pwg_log('<<<<< pwg_get_file_list() returns '.var_export($errorLog, true).' <<<<<'."\n"); - - return $errorLog; -} - -/** - * returns a float value coresponding to the number of seconds since the - * unix epoch (1st January 1970) and the microseconds are precised : - * e.g. 1052343429.89276600 - * - * @return float - */ -function pwg_get_moment() -{ - //~ pwg_log('>>>>> 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_<ACTION>_<STEP> 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 = ' : <span class="success">Test</span>'."\n"; - $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n"; - - // Write version - $g_message = ' <h3>Script version</h3>'."\n"; - $g_message .= ' This script is tagged : <code class="failure">'.$conf['version'].'</code>'."\n"; - // write GD support - if (!is_callable('gd_info')) - { - $g_message .= ' <code class="failure">Failure -</code> Your server can not generate imagess<br />'."\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 .= ' <h3>Image generation</h3>'."\n"; - $g_message .= ' <code class="success">Success -</code> Your server can generate images<br />'."\n"; - $g_message .= ' <code class="warning">Warning -</code> Your server support GD'.$gd_version.' (v'.$gd_full_version.')<br />'."\n"; - $format_list = array(); - $format = ($info['GIF Create Support']) ? '<code>gif</code>' : NULL; - array_push($format_list, $format); - $format = ((isset($info['JPG Support']) and $info['JPG Support']) or (isset($info['JPEG Support']) and $info['JPEG Support'])) ? '<code>jpg</code>' : NULL; - array_push($format_list, $format); - $format = ($info['PNG Support']) ? '<code>png</code>' : NULL; - array_push($format_list, $format); - $g_message .= ' <code class="warning">Warning -</code> Your server support format: '.implode(', ', $format_list)."\n"; - } - - $g_message .= ' <h3>Directory parsing</h3>'."\n"; - if ($pwg_conf['safe_mode']) - { - $g_message .= ' <code class="warning">Warning -</code> Your server does not support to resize execution time'."\n"; - } - else - { - $g_message .= ' <code class="success">Success -</code> Your server supports to resize execution time'."\n"; - } - } - else - { - // compare version in GET parameter with $conf['version'] - if ($g_message == '1') - { - exit('<pre>PWG-INFO-2: test successful</pre>'); - } - else - { - exit('<pre>PWG-ERROR-4: Piwigo versions differs</pre>'); - } - } - - //~ 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 = ' : <span class="success">Clean</span>'; - if ($g_message == '1') - { - $g_message = ' <code class="success">Success -</code> <code>listing.xml</code> file deleted'."\n"; - } - else - { - $g_message = ' <code class="failure">Failure -</code> <code>listing.xml</code> does not exist or is read only'."\n"; - } - $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'; - } - else - { - if ($g_message == '1') - { - exit('<pre>PWG-INFO-3 : listing.xml file deleted</pre>'); - } - else - { - exit('<pre>PWG-ERROR-3 : listing.xml does not exist</pre>'); - } - } - - //~ 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 <informations> - $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 = '<informations'; - $xml_header .= ' generation_date="'.$xml_header_date.'"'; - $xml_header .= ' phpwg_version="'.$xml_header_version.'"'; - $xml_header .= ' metadata="'.$xml_header_metadata.'"'; - $xml_header .= ' url="'.$xml_header_url.'/"'; - $xml_header .= '>'."\n"; - - fwrite($g_listing, $xml_header); - - // Initialization of directory and file lists - $_SESSION['scan_list_fold'] = array(); - $_SESSION['scan_list_file'] = array(); - $_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("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 <dirX name=""> in xml file - $dirname = basename($_SESSION['scan_list_fold'][0]); - $line = pwg_get_indent('dir').'<dir'.pwg_get_level($_SESSION['scan_list_fold'][0]).' name="'.$dirname.'">'."\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 <root> - $line = pwg_get_indent('root').'<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 </root> - $line = pwg_get_indent('root').'</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 </informations> - fwrite($g_listing, '</informations>'."\n"); - - // backup error log before cleaning session - $time_elapsed = number_format(pwg_get_moment() - $_SESSION['scan_time'], 3, '.', ' '); - - $g_header = ' : <span class="success">Generate</span>'; - $g_message = ' <div>'."\n".$_SESSION['scan_logs'].' </div>'."\n"; - $g_message .= ' <div><code class="success">'.$_SESSION['scan_cnt_fold'].'</code> directories parsed<br />'."\n"; - $g_message .= ' <code class="success">'.$_SESSION['scan_cnt_file'].'</code> files scanned</div>'."\n"; - $g_message .= ' <div>View <a href="listing.xml">listing.xml</a></div>'."\n"; - $g_message .= ' <div style="{text-align: right;}">Listing generated in : <code>'.$time_elapsed.' s</code></div>'; - $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'; - - // 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'] or $conf['force_refresh_method']) - { - // 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 = '<meta http-equiv="Refresh" content="'.$conf['refresh_delay'].'">'."\n"; - $g_header = ' : <span class="success">'.ucfirst($_SESSION['scan_action']).'</span>'; - $g_message = ''; - if ($_SESSION['scan_cnt_fold'] != 0) - { - $g_message .= '<code class="success">'.$_SESSION['scan_cnt_fold'].'</code> directories scanned<br />'."\n"; - } - if ($_SESSION['scan_cnt_file'] != 0) - { - $g_message .= '<code class="success">'.$_SESSION['scan_cnt_file'].'</code> files scanned<br />'."\n"; - } - $nb = count($_SESSION['scan_list_fold']); - if ($nb > 0) - { - $g_message .= '<code class="warning">'.$nb.'</code> directories to scan<br />'."\n"; - } - $nb = count($_SESSION['scan_list_file']); - if ($nb > 0) - { - $g_message .= '<code class="warning">'.$nb.'</code> files to scan<br />'."\n"; - } - $g_message .= ' <div style="{text-align: right;}">Time elapsed : <code>'.$formated_time.' s</code></div>'; - $g_footer = '<a href="'.$pwg_conf['this_url'].'?action='.$_SESSION['scan_action'].'" title="Continue"><img src="'.$pwg_conf['icon_dir'].'right.png" /></a>'."\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; - $init_message = ''; - - // 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 = ' <code class="failure">Failure -</code> Another script is running'; - $g_message .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="Delete file '.__FILE__.'.lock and retry" />'; - $g_message .= "\n"; - $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\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 = ' <code class="failure">Failure -</code> Parameter <code>action</code> differs between url and session'; - $g_message .= "\n"; - $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n"; - $_SESSION['scan_step'] = 'exit'; - //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n"); - return; - } - } - else - { - $_SESSION['scan_action'] = $_REQUEST['action']; - } - } - else - { - // Fatal error - $g_message = ' <code class="failure">Failure -</code> Problem with <code>action</code> parameter'; - $g_message .= ' <img src="'.$pwg_conf['icon_dir'].'add_tag.png" title="empty, '.implode(', ', $pwg_conf['scan_action']).'" />'; - $g_message .= "\n"; - $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n"; - $_SESSION['scan_step'] = 'exit'; - //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n"); - return; - } - } - else - { - // Here we are on welcome page - $g_message = ' <ul>'."\n"; - $g_message .= ' <li><a href="'.$pwg_conf['this_url'].'?action=test" title="Display/Compare script version">Test</a></li>'."\n"; - $g_message .= ' <li><a href="'.$pwg_conf['this_url'].'?action=clean" title="Delete listing.xml if exists">Clean</a></li>'."\n"; - $g_message .= ' <li><a href="'.$pwg_conf['this_url'].'?action=generate" title="Scan all images from this directory and write informations in listing.xml">Listing</a></li>'."\n"; - $g_message .= ' </ul>'."\n"; - $g_footer = '<a href="'.$conf['gallery'].'/admin.php?page=site_manager" title="Main gallery :: site manager">'; - $g_footer .= '<img src="'.$pwg_conf['icon_dir'].'home.png" /></a>'."\n"; - $_SESSION['scan_step'] = 'exit'; - $_SESSION['scan_action'] = ''; - } - - // Actions to do at the init of generate - if ($_SESSION['scan_action'] == 'generate') - { - // Open XML file - $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 = ' <code class="failure">Failure -</code> Can not write file <code>listing.xml</code>'; - $g_message .= "\n"; - $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n"; - $_SESSION['scan_step'] = 'exit'; - //~ pwg_log('<<<<< pwg_init() failure <<<<<'."\n"); - return; - } - - // Check graphical capabilities - $init_message = pwg_check_graphics(); - } - - // 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'] = $init_message; - } - - //~ 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']); - session_destroy(); - - // 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_save_path('.'); -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 = ' <code class="failure">Failure -</code> INTERNAL STEP ERROR : <code>pwg_'.$_SESSION['scan_action'].'_'.$_SESSION['scan_step'].'()</code> undefined'; - $g_message .= "\n"; - $g_footer = '<a href="'.$pwg_conf['this_url'].'" title="Main menu"><img src="'.$pwg_conf['icon_dir'].'up.png" /></a>'."\n"; - $_SESSION['scan_step'] = 'exit'; - } -} - -if ($_SESSION['scan_step'] == 'exit') -{ - pwg_exit(); -} - -?> -<html> - <head> - <?php echo $g_refresh; ?> - <title>Manage remote gallery</title> - </head> - <style type="text/css"> - code {font-weight: bold} - img {border-style: none; vertical-align: middle} - ul {list-style-image: url(<?php echo $pwg_conf['icon_dir']; ?>add_tag.png)} - .success {color: green} - .warning {color: orange} - .failure {color: red} - .header {text-align: center; font-variant: small-caps; font-weight: bold;} - .p {color: #F93;} - .w {color: #ccc;} - .g {color: #69C;} - .pwg {text-decoration: none; border-bottom-style: dotted; border-bottom-width: 1px;} - .content {width: 75%; position: absolute; top: 10%; left: 12%;} - .footer {text-align: right;} - .pwg_block {float: left;} - </style> - <body> - <div class="content"> - <fieldset class="header"> - <span class="p">Pi</span> - <span class="w">wi</span> - <span class="g">go</span> - remote site<? echo $g_header; ?> - </fieldset> - <fieldset> -<?php echo $g_message; ?> - </fieldset> - <fieldset class="footer"> - <div class="pwg_block"> - Powered by <a href="http://piwigo.org" class="pwg">Piwigo</a> - </div> - <?php echo $g_footer; ?> - </fieldset> - </div> - </body> -</html> diff --git a/tools/create_listing_file_local.inc.php b/tools/create_listing_file_local.inc.php deleted file mode 100644 index 8d914cf88..000000000 --- a/tools/create_listing_file_local.inc.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -// this file is provided as an example. -// Move it to "create_listing_file.php" -// directory if you want to modify default configuration. - -// URL of main gallery -// Example : http://www.my.domain/my/directory -$conf['gallery'] = 'http://demo.piwigo.net/'; - -$conf['file_ext'] = array_merge($conf['file_ext'], array('flv', 'FLV')); - -$conf['force_refresh_method'] = true; - -?>
\ No newline at end of file |