diff options
Diffstat (limited to 'application/models')
-rw-r--r-- | application/models/file_mod.php | 214 |
1 files changed, 7 insertions, 207 deletions
diff --git a/application/models/file_mod.php b/application/models/file_mod.php index f203f8ef9..a60292138 100644 --- a/application/models/file_mod.php +++ b/application/models/file_mod.php @@ -9,17 +9,13 @@ class File_mod extends CI_Model { - public $data; - function __construct() { parent::__construct(); - $this->data =& get_instance()->data; $this->load->model("muser"); } // Returns an unused ID - // TODO: make threadsafe function new_id() { $id = random_alphanum(3,6); @@ -79,7 +75,6 @@ class File_mod extends CI_Model { } // Add a hash to the DB - // TODO: Should only update not insert; see new_id() function add_file($hash, $id, $filename) { $userid = $this->muser->get_userid(); @@ -103,58 +98,6 @@ class File_mod extends CI_Model { ", array($userid, $id)); } - function show_url($id, $mode) - { - $redirect = false; - - if (!$this->muser->logged_in()) { - // keep the upload but require the user to login - $this->session->set_userdata("last_upload", array( - "id" => $id, - "mode" => $mode - )); - $this->session->set_flashdata("uri", "file/claim_id"); - $this->muser->require_access(); - } - - if ($mode) { - $this->data['url'] = site_url($id).'/'.$mode; - } else { - $this->data['url'] = site_url($id).'/'; - - $filedata = $this->get_filedata($id); - $file = $this->file($filedata['hash']); - $type = $filedata['mimetype']; - $mode = $this->mime2mode($type); - - // If we detected a highlightable file redirect, - // otherwise show the URL because browsers would just show a DL dialog - if ($mode) { - $redirect = true; - } - } - - if (is_cli_client()) { - $redirect = false; - } - if ($redirect) { - redirect($this->data['url'], "location", 303); - } else { - $this->load->view($this->var->view_dir.'/header', $this->data); - $this->load->view($this->var->view_dir.'/show_url', $this->data); - $this->load->view($this->var->view_dir.'/footer', $this->data); - } - } - - function non_existent() - { - $this->data["title"] .= " - Not Found"; - $this->output->set_status_header(404); - $this->load->view($this->var->view_dir.'/header', $this->data); - $this->load->view($this->var->view_dir.'/non_existent', $this->data); - $this->load->view($this->var->view_dir.'/footer', $this->data); - } - // remove old/invalid/broken IDs function valid_id($id) { @@ -194,140 +137,6 @@ class File_mod extends CI_Model { return true; } - private function handle_etag($etag) { - $etag = strtolower($etag); - $modified = true; - - if(isset($_SERVER['HTTP_IF_NONE_MATCH'])) { - $oldtag = trim(strtolower($_SERVER['HTTP_IF_NONE_MATCH']), '"'); - if($oldtag == $etag) { - $modified = false; - } else { - $modified = true; - } - } - - header('Etag: "'.$etag.'"'); - - if (!$modified) { - header("HTTP/1.1 304 Not Modified"); - exit(); - } - } - - // download a given ID - // TODO: make smaller - function download() - { - $id = $this->uri->segment(1); - $mode = $this->uri->segment(2); - - $filedata = $this->get_filedata($id); - $file = $this->file($filedata['hash']); - - if (!$this->valid_id($id)) { - $this->non_existent(); - return; - } - - // don't allow unowned files to be downloaded - if ($filedata["user"] == 0) { - $this->non_existent(); - return; - } - - // helps to keep traffic low when reloading - $etag = $filedata["hash"]."-".$filedata["date"]; - - $type = $filedata['mimetype']; - - // autodetect the mode for highlighting if the URL contains a / after the ID (/ID/) - // /ID/mode disables autodetection - $autodetect_mode = !$mode && substr_count(ltrim($this->uri->uri_string(), "/"), '/') >= 1; - - if ($autodetect_mode) { - $mode = $this->get_highlight_mode($type, $filedata["filename"]); - } - // resolve aliases of modes - // this is mainly used for compatibility - $mode = $this->resolve_mode_alias($mode); - - // create the qr code for /ID/ - if ($mode == "qr") { - $this->handle_etag($etag); - header("Content-disposition: inline; filename=\"".$id."_qr.png\"\n"); - header("Content-Type: image/png\n"); - passthru('qrencode -s 10 -o - '.escapeshellarg(site_url($id).'/')); - exit(); - } - - // user wants to the the plain file - if ($mode == 'plain') { - $this->handle_etag($etag); - rangeDownload($file, $filedata["filename"], "text/plain"); - exit(); - } - - if ($mode == 'info') { - $this->display_info($id); - return; - } - - // if there is no mimetype mapping we can't highlight it - $can_highlight = $this->can_highlight($type); - - $filesize_too_big = filesize($file) > $this->config->item('upload_max_text_size'); - - if (!$can_highlight || $filesize_too_big || !$mode) { - $this->handle_etag($etag); - foreach (array("X-WebKit-CSP", "X-Content-Security-Policy") as $header_name) { - header("$header_name: allow 'none'; img-src *; media-src *; font-src *; style-src * 'unsafe-inline'; script-src 'none'; object-src *; frame-src 'none'; "); - } - rangeDownload($file, $filedata["filename"], $type); - exit(); - } - - $this->data['title'] = htmlspecialchars($filedata['filename']); - $this->data['id'] = $id; - - header("Content-Type: text/html\n"); - - $this->data['current_highlight'] = htmlspecialchars($mode); - $this->data['timeout'] = $this->get_timeout_string($id); - - echo $this->load->view($this->var->view_dir.'/html_header', $this->data, true); - - // highlight the file and chache the result - $this->load->library("MemcacheLibrary"); - if (! $cached = $this->memcachelibrary->get($filedata['hash'].'_'.$mode)) { - ob_start(); - if ($mode == "rmd") { - echo '<td class="markdownrender">'."\n"; - passthru('perl '.FCPATH.'scripts/Markdown.pl '.escapeshellarg($file)); - } elseif ($mode == "ascii") { - echo '<td class="code"><pre class="text">'."\n"; - passthru('perl '.FCPATH.'scripts/ansi2html '.escapeshellarg($file)); - echo "</pre>\n"; - } else { - echo '<td class="numbers"><pre>'; - // generate line numbers (links) - passthru('perl -ne \'print "<a href=\"#n$.\" class=\"no\" id=\"n$.\">$.</a>\n"\' '.escapeshellarg($file)); - echo '</pre></td><td class="code">'."\n"; - $this->load->library('geshi'); - $this->geshi->initialize(array('set_language' => $mode, 'set_source' => file_get_contents($file), 'enable_classes' => 'true')); - echo $this->geshi->parse_code(); - } - $cached = ob_get_contents(); - ob_end_clean(); - $this->memcachelibrary->set($filedata['hash'].'_'.$mode, $cached, 100); - } - echo $cached; - - echo $this->load->view($this->var->view_dir.'/html_footer', $this->data, true); - - exit(); - } - function get_timeout_string($id) { $filedata = $this->get_filedata($id); @@ -356,22 +165,6 @@ class File_mod extends CI_Model { } } - function display_info($id) - { - $this->data["title"] .= " - Info $id"; - $this->data["filedata"] = $this->get_filedata($id); - $this->data["id"] = $id; - $this->data['timeout'] = $this->get_timeout_string($id); - - if (!isset($this->data["can_delete"])) { - $this->data["can_delete"] = false; - } - - $this->load->view($this->var->view_dir.'/header', $this->data); - $this->load->view($this->var->view_dir.'/file_info', $this->data); - $this->load->view($this->var->view_dir.'/footer', $this->data); - } - function delete_id($id) { $this->muser->require_access(); @@ -401,6 +194,13 @@ class File_mod extends CI_Model { return true; } + function should_highlight($type) + { + if ($this->mime2mode($type)) return true; + + return false; + } + // Allow certain types to be highlight without doing it automatically function can_highlight($type) { |