summaryrefslogtreecommitdiffstats
path: root/system/application/models/file_mod.php
diff options
context:
space:
mode:
Diffstat (limited to 'system/application/models/file_mod.php')
-rw-r--r--system/application/models/file_mod.php419
1 files changed, 0 insertions, 419 deletions
diff --git a/system/application/models/file_mod.php b/system/application/models/file_mod.php
deleted file mode 100644
index 48ae5696b..000000000
--- a/system/application/models/file_mod.php
+++ /dev/null
@@ -1,419 +0,0 @@
-<?php
-/*
- * Copyright 2009-2010 Florian "Bluewind" Pritz <bluewind@server-speed.net>
- *
- * Licensed under GPLv3
- * (see COPYING for full license text)
- *
- */
-
-class File_mod extends Model {
-
- function __construct()
- {
- parent::Model();
- }
-
- // Returns an unused ID
- // TODO: make threadsafe
- function new_id()
- {
- $id = $this->random_id(3,6);
-
- if ($this->id_exists($id) || $id == 'file') {
- return $this->new_id();
- } else {
- return $id;
- }
- }
-
- function id_exists($id)
- {
- if(!$id) {
- return false;
- }
-
- $sql = '
- SELECT id
- FROM `files`
- WHERE `id` = ?
- LIMIT 1';
- $query = $this->db->query($sql, array($id));
-
- if ($query->num_rows() == 1) {
- return true;
- } else {
- return false;
- }
- }
-
- function get_filedata($id)
- {
- $sql = '
- SELECT hash, filename, mimetype, date
- FROM `files`
- WHERE `id` = ?
- LIMIT 1';
- $query = $this->db->query($sql, array($id));
-
- if ($query->num_rows() == 1) {
- $return = $query->result_array();
- return $return[0];
- } else {
- return false;
- }
- }
-
- // return the folder in which the file with $hash is stored
- function folder($hash) {
- return $this->config->item('upload_path').'/'.substr($hash, 0, 3);
- }
-
- // Returns the full path to the file with $hash
- function file($hash) {
- return $this->folder($hash).'/'.$hash;
- }
-
- function hash_password($password)
- {
- return sha1($this->config->item('passwordsalt').$password);
- }
-
- // Returns the password submitted by the user
- function get_password()
- {
- $password = $this->input->post('password');
- if ($password !== false && $password !== "") {
- return $this->hash_password($password);
- } elseif (isset($_SERVER['PHP_AUTH_PW']) && $_SERVER['PHP_AUTH_PW'] !== '') {
- return $this->hash_password($_SERVER['PHP_AUTH_PW']);
- }
- return 'NULL';
- }
-
- // Add a hash to the DB
- // TODO: Should only update not insert; see new_id()
- function add_file($hash, $id, $filename)
- {
- $mimetype = exec(FCPATH.'scripts/mimetype -b --orig-name '.escapeshellarg($filename).' '.escapeshellarg($this->file($hash)));
- $query = $this->db->query('
- INSERT INTO `files` (`hash`, `id`, `filename`, `password`, `date`, `mimetype`)
- VALUES (?, ?, ?, ?, ?, ?)',
- array($hash, $id, $filename, $this->get_password(), time(), $mimetype));
- }
-
- function show_url($id, $mode)
- {
- $data = array();
- $redirect = false;
-
- if ($mode) {
- $data['url'] = site_url($id).'/'.$mode;
- } else {
- $data['url'] = site_url($id).'/';
-
- $filedata = $this->get_filedata($id);
- $file = $this->file($filedata['hash']);
- $type = $filedata['mimetype'] ? $filedata['mimetype'] : exec(FCPATH.'scripts/mimetype -b --orig-name '.escapeshellarg($filedata['filename']).' '.escapeshellarg($file));
- $mode = $this->mime2extension($type);
- $mode = $this->filename2extension($filedata['filename']) ? $this->filename2extension($filedata['filename']) : $mode;
-
- // If we detected a highlightable file redirect,
- // otherwise show the URL because browsers would just show a DL dialog
- if ($mode) {
- $redirect = true;
- }
- }
-
- if ($this->var->cli_client) {
- echo $data['url']."\n";
- } else {
- if ($redirect) {
- redirect($data['url']);
- } else {
- $this->load->view('file/header', $data);
- $this->load->view('file/show_url', $data);
- $this->load->view('file/footer', $data);
- }
- }
- }
-
- function non_existent()
- {
- $data["title"] = "Not Found";
- $this->output->set_status_header(404);
- $this->load->view('file/header', $data);
- $this->load->view('file/non_existent', $data);
- $this->load->view('file/footer', $data);
- }
-
- // download a given ID
- // TODO: make smaller
- function download()
- {
- $data = array();
- $id = $this->uri->segment(1);
- $mode = $this->uri->segment(2);
-
- $filedata = $this->get_filedata($id);
- $file = $this->file($filedata['hash']);
-
- if (file_exists($file)) {
- $oldest_time = (time()-$this->config->item('upload_max_age'));
- if (filesize($file) > $this->config->item("small_upload_size") && $filedata["date"] < $oldest_time) {
- if (filemtime($file) < $oldest_time) {
- unlink($file);
- $this->db->query('DELETE FROM files WHERE hash = ?', array($filedata['hash']));
- } else {
- $this->db->query('DELETE FROM files WHERE id = ? LIMIT 1', array($id));
- }
- $this->non_existent();
- return;
- }
- // MODIFIED SINCE SUPPORT -- START
- // helps to keep traffic low when reloading an image
- $filedate = filectime($file);
- $etag = strtolower(md5_file($file));
- $modified = true;
-
- // No need to check because different files have different IDs/hashes
- if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
- $modified = false;
- }
-
- if(isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
- $oldtag = trim(strtolower($_SERVER['HTTP_IF_NONE_MATCH']), '"');
- if($oldtag == $etag) {
- $modified = false;
- } else {
- $modified = true;
- }
- }
- // MODIFIED SINCE SUPPORT -- END
-
- if (!$modified) {
- header("HTTP/1.1 304 Not Modified");
- header('Etag: "'.$etag.'"');
- } else {
- $type = $filedata['mimetype'] ? $filedata['mimetype'] : exec(FCPATH.'scripts/mimetype -b --orig-name '.escapeshellarg($filedata['filename']).' '.escapeshellarg($file));
-
- // /$mode at the end of the URL overwrites autodetection
- if (!$mode && substr_count(ltrim($this->uri->uri_string(), "/"), '/') >= 1) {
- $mode = $this->mime2extension($type);
- $mode = $this->filename2extension($filedata['filename']) ? $this->filename2extension($filedata['filename']) : $mode;
- }
- $mode = $this->extension_aliases($mode);
-
- // TODO: cleanup conditions
- if ($mode && $mode != 'plain' && $mode != 'qr'
- && $this->mime2extension($type)
- && filesize($file) <= $this->config->item('upload_max_text_size')
- ) {
- $data['title'] = $filedata['filename'];
- $data['raw_link'] = site_url($id);
- $data['new_link'] = site_url();
- $data['plain_link'] = site_url($id.'/plain');
- $data['auto_link'] = site_url($id).'/';
- $data['rmd_link'] = site_url($id.'/rmd');
- $data['delete_link'] = site_url("file/delete/".$id);
-
- header("Content-Type: text/html\n");
- if ($mode) {
- $data['current_highlight'] = $mode;
- } else {
- $data['current_highlight'] = $this->mime2extension($type);
- }
- if (filesize($file) > $this->config->item("small_upload_size")) {
- $data['timeout'] = date("r", $filedata["date"]+$this->config->item("upload_max_age"));
- } else {
- $data['timeout'] = "never";
- }
- echo $this->load->view('file/html_header', $data, true);
- $this->load->library("MemcacheLibrary");
- if (! $cached = $this->memcachelibrary->get($filedata['hash'].'_'.$mode)) {
- ob_start();
- if ($mode == "rmd") {
- echo '<td class="markdownrender">'."\n";
- passthru('/usr/bin/perl /usr/bin/perlbin/vendor/Markdown.pl '.escapeshellarg($file));
- } else {
- echo '<td class="numbers"><pre>';
- // generate line numbers (links)
- passthru('/usr/bin/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->output();
- }
- $cached = ob_get_contents();
- ob_end_clean();
- $this->memcachelibrary->set($filedata['hash'].'_'.$mode, $cached, 100);
- }
- echo $cached;
- echo $this->load->view('file/html_footer', $data, true);
- } else {
- if ($mode == 'plain') {
- header("Content-Type: text/plain\n");
- } elseif ($mode == "qr") {
- header("Content-disposition: inline; filename=\"".$id."_qr.png\"\n");
- header("Content-Type: image/png\n");
- passthru('/usr/bin/qrencode -s 10 -o - '.escapeshellarg(site_url($id).'/'));
- exit();
- } else {
- header("Content-Type: ".$type."\n");
- }
- header("Content-disposition: inline; filename=\"".$filedata['filename']."\"\n");
- header("Content-Length: ".filesize($file)."\n");
- header("Last-Modified: ".date('D, d M Y H:i:s', $filedate)." GMT");
- header('Etag: "'.$etag.'"');
- $fp = fopen($file,"r");
- while (!feof($fp)) {
- echo fread($fp,4096);
- }
- fclose($fp);
- }
- }
- exit();
- } else {
- if (isset($filedata["hash"])) {
- $this->db->query('DELETE FROM files WHERE hash = ?', array($filedata['hash']));
- }
- $this->non_existent();
- }
- }
-
- private function unused_file($hash)
- {
- $sql = '
- SELECT id
- FROM `files`
- WHERE `hash` = ?
- LIMIT 1';
- $query = $this->db->query($sql, array($hash));
-
- if ($query->num_rows() == 0) {
- return true;
- } else {
- return false;
- }
- }
-
- function delete_id($id)
- {
- $filedata = $this->get_filedata($id);
- $password = $this->get_password();
-
- if ($password == "NULL") {
- return false;
- }
-
- if(!$this->id_exists($id)) {
- return false;
- }
-
- $sql = '
- DELETE
- FROM `files`
- WHERE `id` = ?
- AND password = ?
- LIMIT 1';
- $this->db->query($sql, array($id, $password));
-
- if($this->id_exists($id)) {
- return false;
- }
-
- if($this->unused_file($filedata['hash'])) {
- unlink($this->file($filedata['hash']));
- @rmdir($this->folder($filedata['hash']));
- }
- return true;
- }
-
- // Generate a random ID
- private function random_id($min_length, $max_length)
- {
- $random = '';
- $char_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- $char_list .= "abcdefghijklmnopqrstuvwxyz";
- $char_list .= "1234567890";
- $length = rand()%($max_length-$min_length) + $min_length;
-
- for($i = 0; $i < $max_length; $i++) {
- if (strlen($random) == $length) break;
- $random .= substr($char_list,(rand()%(strlen($char_list))), 1);
- }
- return $random;
- }
-
- // Map MIME types to extensions needed for highlighting
- function mime2extension($type)
- {
- $typearray = array(
- 'text/plain' => 'text',
- 'text/x-python' => 'python',
- 'text/x-csrc' => 'c',
- 'text/x-chdr' => 'c',
- 'text/x-c++hdr' => 'c',
- 'text/x-c++src' => 'cpp',
- 'text/x-patch' => 'diff',
- 'text/x-lua' => 'lua',
- 'text/x-java' => 'java',
- 'text/x-haskell' => 'haskell',
- 'text/x-literate-haskell' => 'haskell',
- 'text/x-subviewer' => 'bash',
- 'text/x-makefile' => 'make',
- #'text/x-log' => 'log',
- 'text/html' => 'xml',
- 'text/css' => 'css',
- 'message/rfc822' => 'email',
- #'image/svg+xml' => 'xml',
- 'application/x-perl' => 'perl',
- 'application/xml' => 'xml',
- 'application/javascript' => 'javascript',
- 'application/x-desktop' => 'text',
- 'application/x-m4' => 'text',
- 'application/x-awk' => 'text',
- 'application/x-java' => 'java',
- 'application/x-php' => 'php',
- 'application/x-ruby' => 'ruby',
- 'application/x-shellscript' => 'bash',
- 'application/x-x509-ca-cert' => 'text',
- 'application/mbox' => 'email',
- 'application/x-genesis-rom' => 'text',
- 'application/x-applix-spreadsheet' => 'actionscript'
- );
- if (array_key_exists($type, $typearray)) return $typearray[$type];
-
- if (strpos($type, 'text/') === 0) return 'text';
-
- # default
- return false;
- }
-
- // Map special filenames to extensions
- function filename2extension($name)
- {
- $namearray = array(
- 'PKGBUILD' => 'bash',
- '.vimrc' => 'vim'
- );
- if (array_key_exists($name, $namearray)) return $namearray[$name];
-
- return false;
- }
-
- // Handle alias extensions
- function extension_aliases($alias)
- {
- if ($alias === false) return false;
- $aliasarray = array(
- 'py' => 'python'
- );
- if (array_key_exists($alias, $aliasarray)) return $aliasarray[$alias];
-
- return $alias;
- }
-
-}
-
-# vim: set noet: