<?php
/*
 * Copyright 2009-2010 Florian "Bluewind" Pritz <bluewind@server-speed.net>
 *
 * Licensed under GPLv3
 * (see COPYING for full license text)
 *
 */

class File extends Controller {
  // TODO: Add comments

  function __construct()
  {
    parent::Controller();
    $this->load->helper('form');
    $this->load->model('file_mod');
  }

  function index()
  {
    if(isset($_FILES['file'])) {
      $this->do_upload();
    } elseif ($this->input->post('content')) {
      $this->do_paste();
    } elseif ($this->file_mod->id_exists($this->uri->segment(1))) {
      $this->file_mod->download();
    } else {
      $this->upload_form();
    }
  }

  function upload_form()
  {
    $data = array();
    $data['title'] = 'Upload';

    $this->load->view('file/header', $data);
    $this->load->view('file/upload_form', $data);
    $this->load->view('file/footer', $data);
  }

  function delete()
  {
    $id = $this->uri->segment(3);
    $password = $this->input->post('password');
    if ($this->file_mod->delete_id($id, $password)) {
      echo $id." deleted\n";
    } else {
      echo 'Couldn\'t delete '.$id."\n";
    }
    die();
  }

  function do_paste() 
  {
    $data = array();
    $content = $this->input->post('content')."\n";
    $extension = $this->input->post('extension');
    if($content === "\n") {
      $this->upload_form();
      return;
    }
    if(strlen($content) >= $this->config->item('upload_max_size')) {
      $this->load->view('file/header', $data);
      $this->load->view('file/too_big');
      $this->load->view('file/footer');
      return;
    }

    $id = $this->file_mod->new_id();
    $hash = md5($content);
    $folder = $this->file_mod->folder($hash);
    file_exists($folder) || mkdir ($folder);
    $file = $this->file_mod->file($hash);

    file_put_contents($file, $content);
    chmod($file, 0600);
    $this->file_mod->add_file($hash, $id, 'stdin');
    $this->file_mod->show_url($id, $extension);
  }

  function do_upload()
  {
    $data = array();
    $extension = $this->input->post('extension');
    if(!isset($_FILES['file'])) {
      $this->load->view('file/header', $data);
      $this->load->view('file/upload_error');
      $this->load->view('file/footer');
      return;
    }
    if ($_FILES['file']['error'] !== 0) {
      $this->upload_form();
      return;
    }
    $filesize = filesize($_FILES['file']['tmp_name']);
    if ($filesize >= $this->config->item('upload_max_size')) {
      $this->load->view('file/header', $data);
      $this->load->view('file/too_big');
      $this->load->view('file/footer');
      return;
    }

    $id = $this->file_mod->new_id();
    $hash = md5_file($_FILES['file']['tmp_name']);
    $filename = $_FILES['file']['name'];
    $folder = $this->file_mod->folder($hash);
    file_exists($folder) || mkdir ($folder);
    $file = $this->file_mod->file($hash);
    
    move_uploaded_file($_FILES['file']['tmp_name'], $file);
    chmod($file, 0600);
    $this->file_mod->add_file($hash, $id, $filename);
    $this->file_mod->show_url($id, $extension);
  }

  function cron()
  {
    $oldest_time = (time()-$this->config->item('upload_max_age'));
    $query = $this->db->query('SELECT hash, id FROM files WHERE date < ?',
      array($oldest_time));

    foreach($query->result_array() as $row) {
      $file = $this->file_mod->file($row['hash']);
      if(file_exists($file) && filemtime($file) < $oldest_time) {
        unlink($file);
        $this->db->query('DELETE FROM files WHERE hash = ?', array($row['hash']));
      } else {
        $this->db->query('DELETE FROM files WHERE id = ? LIMIT 1', array($row['id']));
      }
    }
  }
}

# vim: set ts=2 sw=2 et:
/* End of file file.php */
/* Location: ./system/application/controllers/file.php */