--- 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 .= '<div class="mdg-comment" style="margin-left: 0;">
- <h3>' . $lang->get('onpage_filebox_heading') . '</h3>
- <p>' . $lang->get('onpage_filebox_msg_not_found', array('upload_link' => makeUrlNS('Special', 'UploadFile/'.$local_page_id))) . '</p>
- </div>
- <br />';
- return $html;
- }
- $r = $db->fetchrow();
- $mimetype = $r['mimetype'];
- $datestring = enano_date(ED_DATE | ED_TIME, (int)$r['time_id']);
- $html .= '<div class="mdg-comment" style="margin-left: 0;">
- <h3>' . $lang->get('onpage_filebox_heading') . '</h3>
- <p>' . $lang->get('onpage_filebox_lbl_type') . ' '.$r['mimetype'].'<br />';
-
- $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 .= '<br />' . $lang->get('onpage_filebox_lbl_uploaded') . ' ' . $datestring . '</p>';
- // 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 .= '<div class="warning-box">
- ' . $lang->get('onpage_filebox_msg_virus_warning') . '
- </div>';
- }
- if ( $is_image )
- {
- // show a thumbnail of the image
- $html .= '<p>
- <a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn).'">
- <img style="border: 0;" alt="' . htmlspecialchars($paths->page) . '" src="' . makeUrlNS('Special', "DownloadFile/$selfn/{$r['time_id']}", 'preview', true) . '" />
- </a>
- </p>';
- }
- $html .= '<p>
- <a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn.'/'.$r['time_id'].htmlspecialchars(urlSeparator).'download').'">
- ' . $lang->get('onpage_filebox_btn_download') . '
- </a>';
- // 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 .= ' | <a href="'.makeUrlNS('Special', "UploadFile/$selfn", false, true).'">
- ' . $lang->get('onpage_filebox_btn_upload_new') . '
- </a>';
- }
- // close off paragraph
- $html .= '</p>';
- // 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 .= '<h3>' . $lang->get('onpage_filebox_heading_history') . '</h3><p>';
- $last_rollback_id = false;
- $download_flag = $is_image ? false : 'download';
- while ( $r = $db->fetchrow($q) )
- {
- $html .= '(<a href="'.makeUrlNS('Special', "DownloadFile/$selfn/{$r['time_id']}", $download_flag, true).'">' . $lang->get('onpage_filebox_btn_this_version') . '</a>) ';
- if ( $session->get_permissions('history_rollback') && $last_rollback_id )
- $html .= ' (<a href="#rollback:' . $last_rollback_id . '" onclick="ajaxRollback(\''.$last_rollback_id.'\'); return false;">' . $lang->get('onpage_filebox_btn_revert') . '</a>) ';
- 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 .= '<br />';
- }
- $html .= '</p>';
- }
- $db->free_result();
- $html .= '</div><br />';
- 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 .= '<div class="mdg-comment" style="margin-left: 0;">
+ <h3>' . $lang->get('onpage_filebox_heading') . '</h3>
+ <p>' . $lang->get('onpage_filebox_msg_not_found', array('upload_link' => makeUrlNS('Special', 'UploadFile/'.$local_page_id))) . '</p>
+ </div>
+ <br />';
+ return $html;
+ }
+ $r = $db->fetchrow();
+ $mimetype = $r['mimetype'];
+ $datestring = enano_date(ED_DATE | ED_TIME, (int)$r['time_id']);
+ $html .= '<div class="mdg-comment" style="margin-left: 0;">
+ <h3>' . $lang->get('onpage_filebox_heading') . '</h3>
+ <p>' . $lang->get('onpage_filebox_lbl_type') . ' '.$r['mimetype'].'<br />';
+
+ $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 .= '<br />' . $lang->get('onpage_filebox_lbl_uploaded') . ' ' . $datestring . '</p>';
+ // 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 .= '<div class="warning-box">
+ ' . $lang->get('onpage_filebox_msg_virus_warning') . '
+ </div>';
+ }
+ if ( $is_image )
+ {
+ // show a thumbnail of the image
+ $html .= '<p>
+ <a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn).'">
+ <img style="border: 0;" alt="' . htmlspecialchars($paths->page) . '" src="' . makeUrlNS('Special', "DownloadFile/$selfn/{$r['time_id']}", 'preview', true) . '" />
+ </a>
+ </p>';
+ }
+ $html .= '<p>
+ <a href="'.makeUrlNS('Special', 'DownloadFile'.'/'.$selfn.'/'.$r['time_id'].htmlspecialchars(urlSeparator).'download').'">
+ ' . $lang->get('onpage_filebox_btn_download') . '
+ </a>';
+ // 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 .= ' | <a href="'.makeUrlNS('Special', "UploadFile/$selfn", false, true).'">
+ ' . $lang->get('onpage_filebox_btn_upload_new') . '
+ </a>';
+ }
+ // close off paragraph
+ $html .= '</p>';
+ // 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 .= '<h3>' . $lang->get('onpage_filebox_heading_history') . '</h3><p>';
+ $last_rollback_id = false;
+ $download_flag = $is_image ? false : 'download';
+ while ( $r = $db->fetchrow($q) )
+ {
+ $html .= '(<a href="'.makeUrlNS('Special', "DownloadFile/$selfn/{$r['time_id']}", $download_flag, true).'">' . $lang->get('onpage_filebox_btn_this_version') . '</a>) ';
+ if ( $session->get_permissions('history_rollback') && $last_rollback_id )
+ $html .= ' (<a href="#rollback:' . $last_rollback_id . '" onclick="ajaxRollback(\''.$last_rollback_id.'\'); return false;">' . $lang->get('onpage_filebox_btn_revert') . '</a>) ';
+ 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 .= '<br />';
+ }
+ $html .= '</p>';
+ }
+ $db->free_result();
+ $html .= '</div><br />';
+ 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;
+ }
}