diff -r de56132c008d -r bdac73ed481e includes/namespaces/file.php --- a/includes/namespaces/file.php Sun Mar 28 21:49:26 2010 -0400 +++ b/includes/namespaces/file.php Sun Mar 28 23:10:46 2010 -0400 @@ -13,255 +13,255 @@ class Namespace_File extends Namespace_Default { - function send() - { - global $output; - - $output->add_before_footer($this->show_info()); - $output->add_before_footer($this->display_categories()); - - if ( $this->exists ) - { - $this->send_from_db(); - } - else - { - $output->header(); - $this->error_404(); - $output->footer(); - } - } - - function show_info() - { - global $db, $session, $paths, $template, $plugins; // Common objects - global $lang; - - require_once(ENANO_ROOT . '/includes/log.php'); - - $local_page_id = $this->page_id; - $local_namespace = $this->namespace; - $html = ''; - - // Prevent unnecessary work - if ( $local_namespace != 'File' ) - return null; - - $selfn = $db->escape($this->page_id); - $q = $db->sql_query('SELECT f.mimetype,f.time_id,f.size,l.log_id FROM ' . table_prefix . "files AS f\n" - . " LEFT JOIN " . table_prefix . "logs AS l\n" - . " ON ( l.time_id = f.time_id AND ( l.action = 'reupload' OR l.action IS NULL ) )\n" - . " WHERE f.page_id = '$selfn'\n" - . " ORDER BY f.time_id DESC;"); - if ( !$q ) - { - $db->_die('The file type could not be fetched.'); - } - - if ( $db->numrows() < 1 ) - { - $html .= '
-

' . $lang->get('onpage_filebox_heading') . '

-

' . $lang->get('onpage_filebox_msg_not_found', array('upload_link' => makeUrlNS('Special', 'UploadFile/'.$local_page_id))) . '

-
-
'; - return $html; - } - $r = $db->fetchrow(); - $mimetype = $r['mimetype']; - $datestring = enano_date(ED_DATE | ED_TIME, (int)$r['time_id']); - $html .= '
-

' . $lang->get('onpage_filebox_heading') . '

-

' . $lang->get('onpage_filebox_lbl_type') . ' '.$r['mimetype'].'
'; - - $size = $r['size'] . ' ' . $lang->get('etc_unit_bytes'); - if ( $r['size'] >= 1048576 ) - { - $size .= ' (' . ( round($r['size'] / 1048576, 1) ) . ' ' . $lang->get('etc_unit_megabytes_short') . ')'; - } - else if ( $r['size'] >= 1024 ) - { - $size .= ' (' . ( round($r['size'] / 1024, 1) ) . ' ' . $lang->get('etc_unit_kilobytes_short') . ')'; - } - - $html .= $lang->get('onpage_filebox_lbl_size', array('size' => $size)); - - $html .= '
' . $lang->get('onpage_filebox_lbl_uploaded') . ' ' . $datestring . '

'; - // are we dealing with an image? - $is_image = substr($mimetype, 0, 6) == 'image/'; - - // for anything other than plain text and - if ( !$is_image && ( substr($mimetype, 0, 5) != 'text/' || $mimetype == 'text/html' || $mimetype == 'text/javascript' ) ) - { - $html .= '
- ' . $lang->get('onpage_filebox_msg_virus_warning') . ' -
'; - } - if ( $is_image ) - { - // show a thumbnail of the image - $html .= '

- - ' . htmlspecialchars($paths->page) . ' - -

'; - } - $html .= '

- - ' . $lang->get('onpage_filebox_btn_download') . ' - '; - // allow reupload if: - // * we are allowed to upload new versions, and - // - the file is unprotected, or - // - we have permission to override protection - - if ( !$this->perms ) - $this->perms = $session->fetch_page_acl($this->page_id, $this->namespace); - - if ( $this->perms->get_permissions('upload_new_version') && ( !$this->page_protected || $this->perms->get_permissions('even_when_protected') ) ) - { - // upload new version link - $html .= ' | - ' . $lang->get('onpage_filebox_btn_upload_new') . ' - '; - } - // close off paragraph - $html .= '

'; - // only show this if there's more than one revision - if ( $db->numrows() > 1 ) - { - // requery, sql_result_seek() doesn't work on postgres - $db->free_result(); - $q = $db->sql_query('SELECT f.mimetype,f.time_id,f.size,l.log_id FROM ' . table_prefix . "files AS f\n" - . " LEFT JOIN " . table_prefix . "logs AS l\n" - . " ON ( l.time_id = f.time_id AND ( l.action = 'reupload' OR l.action IS NULL ) )\n" - . " WHERE f.page_id = '$selfn'\n" - . " ORDER BY f.time_id DESC;"); - if ( !$q ) - $db->_die(); - - $log = new LogDisplay(); - $log->add_criterion('page', $paths->nslist['File'] . $this->page_id); - $log->add_criterion('action', 'reupload'); - $data = $log->get_data(); - $i = -1; - - $html .= '

' . $lang->get('onpage_filebox_heading_history') . '

'; - $last_rollback_id = false; - $download_flag = $is_image ? false : 'download'; - while ( $r = $db->fetchrow($q) ) - { - $html .= '(' . $lang->get('onpage_filebox_btn_this_version') . ') '; - if ( $session->get_permissions('history_rollback') && $last_rollback_id ) - $html .= ' (' . $lang->get('onpage_filebox_btn_revert') . ') '; - else if ( $session->get_permissions('history_rollback') && !$last_rollback_id ) - $html .= ' (' . $lang->get('onpage_filebox_btn_current') . ') '; - $last_rollback_id = $r['log_id']; - - $html .= $r['mimetype'].', '; - - $fs = $r['size']; - $fs = (int)$fs; - - if($fs >= 1048576) - { - $fs = round($fs / 1048576, 1); - $size = $fs . ' ' . $lang->get('etc_unit_megabytes_short'); - } - else - if ( $fs >= 1024 ) - { - $fs = round($fs / 1024, 1); - $size = $fs . ' ' . $lang->get('etc_unit_kilobytes_short'); - } - else - { - $size = $fs . ' ' . $lang->get('etc_unit_bytes'); - } - - $html .= $size; - if ( isset($data[++$i]) ) - $html .= ': ' . LogDisplay::render_row($data[$i], false, false); - - $html .= '
'; - } - $html .= '

'; - } - $db->free_result(); - $html .= '

'; - return $html; - } - - /** - * Delete a file from the database and filesystem based on file ID. - * @param int File ID - * @return null - */ - - public static function delete_file($file_id) - { - global $db, $session, $paths, $template, $plugins; // Common objects - - if ( !is_int($file_id) ) - // seriously? - return null; - - // pull file info - $q = $db->sql_query('SELECT filename, page_id, time_id, file_extension, file_key FROM ' . table_prefix . "files WHERE file_id = $file_id;"); - if ( !$q ) - $db->_die(); - - if ( $db->numrows() < 1 ) - { - $db->free_result(); - return null; - } - - $row = $db->fetchrow(); - $db->free_result(); - - // make sure the image isn't used by multiple revisions - $q = $db->sql_query('SELECT 1 FROM ' . table_prefix . "files WHERE file_key = '{$row['file_key']}';"); - if ( !$q ) - $db->_die(); - if ( $db->numrows() < 1 ) - { - // remove from filesystem - $file_path = ENANO_ROOT . "/files/{$row['file_key']}{$row['file_extension']}"; - @unlink($file_path); - // old filename standard - $file_path = ENANO_ROOT . "/files/{$row['file_key']}-{$row['time_id']}{$row['file_extension']}"; - @unlink($file_path); - } - $db->free_result(); - - // remove from cache - if ( $dp = @opendir(ENANO_ROOT . '/cache/') ) - { - $regexp = '#' . preg_quote($row['filename']) . '-' . $row['time_id'] . '-[0-9]+x[0-9]+' . preg_quote($row['file_extension']) . '#'; - while ( $dh = @readdir($dp) ) - { - if ( preg_match($regexp, $dh) ) - { - // it's a match, delete the cached thumbnail - @unlink(ENANO_ROOT . "/cache/$dh"); - } - } - closedir($dp); - } - - // remove from database - $q = $db->sql_query('DELETE FROM ' . table_prefix . "files WHERE file_id = $file_id;"); - if ( !$q ) - $db->_die(); - - // remove from logs - $page_id_db = $db->escape($row['page_id']); - $q = $db->sql_query('DELETE FROM ' . table_prefix . "logs WHERE page_id = '{$page_id_db}' AND namespace = 'File' AND action = 'reupload' AND time_id = {$row['time_id']};"); - if ( !$q ) - $db->_die(); - - return true; - } + function send() + { + global $output; + + $output->add_before_footer($this->show_info()); + $output->add_before_footer($this->display_categories()); + + if ( $this->exists ) + { + $this->send_from_db(); + } + else + { + $output->header(); + $this->error_404(); + $output->footer(); + } + } + + function show_info() + { + global $db, $session, $paths, $template, $plugins; // Common objects + global $lang; + + require_once(ENANO_ROOT . '/includes/log.php'); + + $local_page_id = $this->page_id; + $local_namespace = $this->namespace; + $html = ''; + + // Prevent unnecessary work + if ( $local_namespace != 'File' ) + return null; + + $selfn = $db->escape($this->page_id); + $q = $db->sql_query('SELECT f.mimetype,f.time_id,f.size,l.log_id FROM ' . table_prefix . "files AS f\n" + . " LEFT JOIN " . table_prefix . "logs AS l\n" + . " ON ( l.time_id = f.time_id AND ( l.action = 'reupload' OR l.action IS NULL ) )\n" + . " WHERE f.page_id = '$selfn'\n" + . " ORDER BY f.time_id DESC;"); + if ( !$q ) + { + $db->_die('The file type could not be fetched.'); + } + + if ( $db->numrows() < 1 ) + { + $html .= '
+

' . $lang->get('onpage_filebox_heading') . '

+

' . $lang->get('onpage_filebox_msg_not_found', array('upload_link' => makeUrlNS('Special', 'UploadFile/'.$local_page_id))) . '

+
+
'; + return $html; + } + $r = $db->fetchrow(); + $mimetype = $r['mimetype']; + $datestring = enano_date(ED_DATE | ED_TIME, (int)$r['time_id']); + $html .= '
+

' . $lang->get('onpage_filebox_heading') . '

+

' . $lang->get('onpage_filebox_lbl_type') . ' '.$r['mimetype'].'
'; + + $size = $r['size'] . ' ' . $lang->get('etc_unit_bytes'); + if ( $r['size'] >= 1048576 ) + { + $size .= ' (' . ( round($r['size'] / 1048576, 1) ) . ' ' . $lang->get('etc_unit_megabytes_short') . ')'; + } + else if ( $r['size'] >= 1024 ) + { + $size .= ' (' . ( round($r['size'] / 1024, 1) ) . ' ' . $lang->get('etc_unit_kilobytes_short') . ')'; + } + + $html .= $lang->get('onpage_filebox_lbl_size', array('size' => $size)); + + $html .= '
' . $lang->get('onpage_filebox_lbl_uploaded') . ' ' . $datestring . '

'; + // are we dealing with an image? + $is_image = substr($mimetype, 0, 6) == 'image/'; + + // for anything other than plain text and + if ( !$is_image && ( substr($mimetype, 0, 5) != 'text/' || $mimetype == 'text/html' || $mimetype == 'text/javascript' ) ) + { + $html .= '
+ ' . $lang->get('onpage_filebox_msg_virus_warning') . ' +
'; + } + if ( $is_image ) + { + // show a thumbnail of the image + $html .= '

+ + ' . htmlspecialchars($paths->page) . ' + +

'; + } + $html .= '

+ + ' . $lang->get('onpage_filebox_btn_download') . ' + '; + // allow reupload if: + // * we are allowed to upload new versions, and + // - the file is unprotected, or + // - we have permission to override protection + + if ( !$this->perms ) + $this->perms = $session->fetch_page_acl($this->page_id, $this->namespace); + + if ( $this->perms->get_permissions('upload_new_version') && ( !$this->page_protected || $this->perms->get_permissions('even_when_protected') ) ) + { + // upload new version link + $html .= ' | + ' . $lang->get('onpage_filebox_btn_upload_new') . ' + '; + } + // close off paragraph + $html .= '

'; + // only show this if there's more than one revision + if ( $db->numrows() > 1 ) + { + // requery, sql_result_seek() doesn't work on postgres + $db->free_result(); + $q = $db->sql_query('SELECT f.mimetype,f.time_id,f.size,l.log_id FROM ' . table_prefix . "files AS f\n" + . " LEFT JOIN " . table_prefix . "logs AS l\n" + . " ON ( l.time_id = f.time_id AND ( l.action = 'reupload' OR l.action IS NULL ) )\n" + . " WHERE f.page_id = '$selfn'\n" + . " ORDER BY f.time_id DESC;"); + if ( !$q ) + $db->_die(); + + $log = new LogDisplay(); + $log->add_criterion('page', $paths->nslist['File'] . $this->page_id); + $log->add_criterion('action', 'reupload'); + $data = $log->get_data(); + $i = -1; + + $html .= '

' . $lang->get('onpage_filebox_heading_history') . '

'; + $last_rollback_id = false; + $download_flag = $is_image ? false : 'download'; + while ( $r = $db->fetchrow($q) ) + { + $html .= '(' . $lang->get('onpage_filebox_btn_this_version') . ') '; + if ( $session->get_permissions('history_rollback') && $last_rollback_id ) + $html .= ' (' . $lang->get('onpage_filebox_btn_revert') . ') '; + else if ( $session->get_permissions('history_rollback') && !$last_rollback_id ) + $html .= ' (' . $lang->get('onpage_filebox_btn_current') . ') '; + $last_rollback_id = $r['log_id']; + + $html .= $r['mimetype'].', '; + + $fs = $r['size']; + $fs = (int)$fs; + + if($fs >= 1048576) + { + $fs = round($fs / 1048576, 1); + $size = $fs . ' ' . $lang->get('etc_unit_megabytes_short'); + } + else + if ( $fs >= 1024 ) + { + $fs = round($fs / 1024, 1); + $size = $fs . ' ' . $lang->get('etc_unit_kilobytes_short'); + } + else + { + $size = $fs . ' ' . $lang->get('etc_unit_bytes'); + } + + $html .= $size; + if ( isset($data[++$i]) ) + $html .= ': ' . LogDisplay::render_row($data[$i], false, false); + + $html .= '
'; + } + $html .= '

'; + } + $db->free_result(); + $html .= '

'; + return $html; + } + + /** + * Delete a file from the database and filesystem based on file ID. + * @param int File ID + * @return null + */ + + public static function delete_file($file_id) + { + global $db, $session, $paths, $template, $plugins; // Common objects + + if ( !is_int($file_id) ) + // seriously? + return null; + + // pull file info + $q = $db->sql_query('SELECT filename, page_id, time_id, file_extension, file_key FROM ' . table_prefix . "files WHERE file_id = $file_id;"); + if ( !$q ) + $db->_die(); + + if ( $db->numrows() < 1 ) + { + $db->free_result(); + return null; + } + + $row = $db->fetchrow(); + $db->free_result(); + + // make sure the image isn't used by multiple revisions + $q = $db->sql_query('SELECT 1 FROM ' . table_prefix . "files WHERE file_key = '{$row['file_key']}';"); + if ( !$q ) + $db->_die(); + if ( $db->numrows() < 1 ) + { + // remove from filesystem + $file_path = ENANO_ROOT . "/files/{$row['file_key']}{$row['file_extension']}"; + @unlink($file_path); + // old filename standard + $file_path = ENANO_ROOT . "/files/{$row['file_key']}-{$row['time_id']}{$row['file_extension']}"; + @unlink($file_path); + } + $db->free_result(); + + // remove from cache + if ( $dp = @opendir(ENANO_ROOT . '/cache/') ) + { + $regexp = '#' . preg_quote($row['filename']) . '-' . $row['time_id'] . '-[0-9]+x[0-9]+' . preg_quote($row['file_extension']) . '#'; + while ( $dh = @readdir($dp) ) + { + if ( preg_match($regexp, $dh) ) + { + // it's a match, delete the cached thumbnail + @unlink(ENANO_ROOT . "/cache/$dh"); + } + } + closedir($dp); + } + + // remove from database + $q = $db->sql_query('DELETE FROM ' . table_prefix . "files WHERE file_id = $file_id;"); + if ( !$q ) + $db->_die(); + + // remove from logs + $page_id_db = $db->escape($row['page_id']); + $q = $db->sql_query('DELETE FROM ' . table_prefix . "logs WHERE page_id = '{$page_id_db}' AND namespace = 'File' AND action = 'reupload' AND time_id = {$row['time_id']};"); + if ( !$q ) + $db->_die(); + + return true; + } }