you can download individual attachments

This commit is contained in:
SJ 2012-10-04 10:00:54 +02:00
parent 0c20a5f1e1
commit d6b0c3def4
5 changed files with 129 additions and 0 deletions

View File

@ -72,6 +72,7 @@ define('DIR_IMAP', '/var/piler/imap');
define('DIR_TMP', '/var/piler/tmp');
define('DECRYPT_BINARY', '/usr/local/bin/pilerget');
define('DECRYPT_ATTACHMENT_BINARY', '/usr/local/bin/pileraget');
define('DECRYPT_BUFFER_LENGTH', 65536);
define('QSHAPE_ACTIVE_INCOMING', DIR_STAT . '/active+incoming');
@ -220,6 +221,8 @@ define('ACTION_CHANGE_USER_SETTINGS', 12);
define('ACTION_REMOVE_MESSAGE', 13);
define('ACTION_UNAUTHORIZED_REMOVE_MESSAGE', 14);
define('ACTION_DOWNLOAD_ATTACHMENT', 15);
define('ACTION_UNAUTHORIZED_DOWNLOAD_ATTACHMENT', 16);
define('NOW', time());

View File

@ -0,0 +1,51 @@
<?php
class ControllerMessageAttachment extends Controller {
public function index(){
$this->id = "content";
$this->template = "message/headers.tpl";
$this->layout = "common/layout-empty";
$request = Registry::get('request');
$db = Registry::get('db');
$this->load->model('search/search');
$this->load->model('search/message');
$this->document->title = $this->data['text_message'];
$this->data['id'] = @$this->request->get['id'];
if(!verify_piler_id($this->data['id'])) {
AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown id: ' . $this->data['id']);
die("invalid id: " . $this->data['id']);
}
$this->data['attachment'] = $this->model_search_message->get_attachment_by_id($this->data['id']);
if(!isset($this->data['attachment']['filename'])) {
die("invalid filename");
}
AUDIT(ACTION_DOWNLOAD_ATTACHMENT, '', '', $this->data['id'], '');
header("Cache-Control: public, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . $this->data['attachment']['filename'] . "\"");
header("Content-Transfer-Encoding: binary\n");
print $this->data['attachment']['attachment'];
exit;
}
}
?>

View File

@ -59,6 +59,8 @@ class ControllerMessageView extends Controller {
$this->data['piler_id'] = $this->model_search_message->get_piler_id_by_id($this->data['id']);
$this->data['attachments'] = $this->model_search_message->get_attachment_list($this->data['piler_id']);
$this->data['message'] = $this->model_search_message->extract_message($this->data['piler_id']);
$this->data['message']['tag'] = $this->model_search_message->get_message_tag($this->data['id'], $_SESSION['uid']);
$this->data['message']['note'] = $this->model_search_message->get_message_note($this->data['id'], $_SESSION['uid']);

View File

@ -54,6 +54,25 @@ class ModelSearchMessage extends Model {
}
public function get_attachment($piler_id = '', $attachment_id = '') {
$data = '';
if($piler_id == '' || $attachment_id == '' || !preg_match("/^([0-9a-f]+)$/", $piler_id) || !preg_match("/^([0-9]+)$/", $attachment_id)) { return $data; }
$handle = popen(DECRYPT_ATTACHMENT_BINARY . " $piler_id $attachment_id", "r");
while(($buf = fread($handle, DECRYPT_BUFFER_LENGTH))){
$data .= $buf;
}
pclose($handle);
/* TODO: decode only if it's a base64 encoded attachment */
return base64_decode(preg_replace("/\s/", "", $data));
}
public function get_message_headers($id = '') {
$data = '';
@ -383,6 +402,56 @@ class ModelSearchMessage extends Model {
}
public function get_id_by_piler_id($piler_id = '') {
if($piler_id == '') { return -1; }
$query = $this->db->query("SELECT `id` FROM `" . TABLE_META . "` WHERE piler_id=?", array($piler_id));
if(isset($query->row['id'])) { return $query->row['id']; }
return -1;
}
public function get_attachment_by_id($id = 0) {
if($id <= 0) { return array(); }
$query = $this->db->query("SELECT id, piler_id, attachment_id, name, type, ptr FROM " . TABLE_ATTACHMENT . " WHERE id=?", array($id));
if(isset($query->row)) {
$metaid = $this->get_id_by_piler_id($query->row['piler_id']);
if($metaid > 0 && $this->model_search_search->check_your_permission_by_id($metaid) == 1) {
if($query->row['ptr'] > 0) {
$query = $this->db->query("SELECT id, piler_id, attachment_id, name, type FROM " . TABLE_ATTACHMENT . " WHERE id=?", array($query->row['ptr']));
}
$attachment = $this->get_attachment($query->row['piler_id'], $query->row['attachment_id']);
return array('filename' => $query->row['name'], 'attachment' => $attachment);
}
}
return array();
}
public function get_attachment_list($piler_id = 0) {
$data = array();
if($piler_id == '') { return array(); }
$query = $this->db->query("SELECT id, name, type, ptr FROM " . TABLE_ATTACHMENT . " WHERE piler_id=?", array($piler_id));
if(!isset($query->rows)) { return array(); }
foreach($query->rows as $q) {
array_push($data, $q);
}
return $data;
}
public function get_message_tag($id = '', $uid = 0) {
if($id == '' || $uid <= 0) { return ''; }

View File

@ -10,5 +10,9 @@
<strong><?php print $message['to']; ?></strong><br />
<strong><?php print $message['date']; ?></strong> <?php print $text_notes; ?>: <input type="text" size="60" id="note" name="note" class="advtextgrey" style="width: 500px;margin: 0px; color: #000000; height:10px;" value="<?php print $message['note']; ?>" /> <input type="button" value="<?php print $text_save; ?>" style="vertical-align: middle; font: bold 11px Arial, sans-serif; height:16px;" onclick="javascript:var p = 'id=<?php print $id; ?>&note=' + encodeURI(document.getElementById('note').value); send_ajax_post_request('<?php print MESSAGE_NOTE_URL; ?>', p); show_message('messagebox1', '<p>SAVED</p>', 0.85); " /><br />
<?php foreach($attachments as $a) { ?>
<span><img src="<?php print ICON_ATTACHMENT; ?>" /><a href="index.php?route=message/attachment&id=<?php print $a['id']; ?>"><?php print $a['name']; ?></a></span>
<?php } ?>
<hr />
<?php print $message['message']; ?><br />