From 46f7b7096450939fe03c95aa81ce06ae4bfca89d Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Mon, 28 Mar 2016 06:51:43 -0400 Subject: [PATCH] Enable reply/reply-all/forward buttons also in preview frame of message/rfc822 --- program/steps/mail/attachments.inc | 173 ++++++++++++++++++++++++++------------------------------- 1 files changed, 78 insertions(+), 95 deletions(-) diff --git a/program/steps/mail/attachments.inc b/program/steps/mail/attachments.inc index c8b7f95..fe2f845 100644 --- a/program/steps/mail/attachments.inc +++ b/program/steps/mail/attachments.inc @@ -1,6 +1,6 @@ <?php -/* +/** +-----------------------------------------------------------------------+ | program/steps/mail/attachments.inc | | | @@ -38,7 +38,7 @@ // remove an attachment -if ($RCMAIL->action=='remove-attachment') { +if ($RCMAIL->action == 'remove-attachment') { $id = 'undefined'; if (preg_match('/^rcmfile(\w+)$/', $_POST['_file'], $regs)) { @@ -67,67 +67,7 @@ $id = $regs[1]; } - if ($attachment = $COMPOSE['attachments'][$id]) { - $attachment = $RCMAIL->plugins->exec_hook('attachment_display', $attachment); - } - - if ($attachment['status']) { - if (empty($attachment['size'])) { - $attachment['size'] = $attachment['data'] ? strlen($attachment['data']) : @filesize($attachment['path']); - } - - // generate image thumbnail for file browser in HTML editor - if (!empty($_GET['_thumbnail'])) { - $temp_dir = $RCMAIL->config->get('temp_dir'); - $thumbnail_size = 80; - list(,$ext) = explode('/', $attachment['mimetype']); - $mimetype = $attachment['mimetype']; - $file_ident = $attachment['id'] . ':' . $attachment['mimetype'] . ':' . $attachment['size']; - $cache_basename = $temp_dir . '/' . md5($file_ident . ':' . $RCMAIL->user->ID . ':' . $thumbnail_size); - $cache_file = $cache_basename . '.' . $ext; - - // render thumbnail image if not done yet - if (!is_file($cache_file)) { - if (!$attachment['path']) { - $orig_name = $filename = $cache_basename . '.orig.' . $ext; - file_put_contents($orig_name, $attachment['data']); - } - else { - $filename = $attachment['path']; - } - - $image = new rcube_image($filename); - if ($imgtype = $image->resize($thumbnail_size, $cache_file, true)) { - $mimetype = 'image/' . $imgtype; - - if ($orig_name) { - unlink($orig_name); - } - } - } - - if (is_file($cache_file)) { - // cache for 1h - $RCMAIL->output->future_expire_header(3600); - header('Content-Type: ' . $mimetype); - header('Content-Length: ' . filesize($cache_file)); - - readfile($cache_file); - exit; - } - } - - header('Content-Type: ' . $attachment['mimetype']); - header('Content-Length: ' . $attachment['size']); - - if ($attachment['data']) { - echo $attachment['data']; - } - else if ($attachment['path']) { - readfile($attachment['path']); - } - } - + $RCMAIL->display_uploaded_file($COMPOSE['attachments'][$id]); exit; } @@ -136,8 +76,41 @@ // clear all stored output properties (like scripts and env vars) $OUTPUT->reset(); -$uploadid = rcube_utils::get_input_value('_uploadid', rcube_utils::INPUT_GET); +$uploadid = rcube_utils::get_input_value('_uploadid', rcube_utils::INPUT_GPC); +$uri = rcube_utils::get_input_value('_uri', rcube_utils::INPUT_POST); +// handle dropping a reference to an attachment part of some message +if ($uri) { + $url = parse_url($uri); + parse_str($url['query'], $params); + + if (strlen($params['_mbox']) && $params['_uid'] && $params['_part']) { + // @TODO: at some point we might support drag-n-drop between + // two different accounts on the same server, for now make sure + // this is the same server and the same user + list($host, $port) = explode(':', $_SERVER['HTTP_HOST']); + if ($host == $url['host'] && $port == $url['port'] + && $RCMAIL->get_user_name() == rawurldecode($url['user']) + ) { + $message = new rcube_message($params['_uid'], $params['_mbox']); + } + } + + if ($message && !empty($message->headers) + && ($attachment = rcmail_save_attachment($message, $params['_part'], $COMPOSE_ID)) + ) { + rcmail_attachment_success($attachment, $uploadid); + } + else { + $OUTPUT->command('display_message', $RCMAIL->gettext('filelinkerror'), 'error'); + $OUTPUT->command('remove_from_attachment_list', $uploadid); + } + + $OUTPUT->send(); + return; +} + +// handle file(s) upload if (is_array($_FILES['_attachments']['tmp_name'])) { $multiple = count($_FILES['_attachments']['tmp_name']) > 1; @@ -156,40 +129,11 @@ } if (!$err && $attachment['status'] && !$attachment['abort']) { - $id = $attachment['id']; - // store new attachment in session unset($attachment['status'], $attachment['abort']); - $RCMAIL->session->append($SESSION_KEY.'.attachments', $id, $attachment); + $RCMAIL->session->append($SESSION_KEY . '.attachments', $attachment['id'], $attachment); - if (($icon = $COMPOSE['deleteicon']) && is_file($icon)) { - $button = html::img(array( - 'src' => $icon, - 'alt' => $RCMAIL->gettext('delete') - )); - } - else if ($COMPOSE['textbuttons']) { - $button = rcube::Q($RCMAIL->gettext('delete')); - } - else { - $button = ''; - } - - $content = html::a(array( - 'href' => "#delete", - 'onclick' => sprintf("return %s.command('remove-attachment','rcmfile%s', this)", rcmail_output::JS_OBJECT_NAME, $id), - 'title' => $RCMAIL->gettext('delete'), - 'class' => 'delete', - ), $button); - - $content .= rcube::Q($attachment['name']); - - $OUTPUT->command('add2attachment_list', "rcmfile$id", array( - 'html' => $content, - 'name' => $attachment['name'], - 'mimetype' => $attachment['mimetype'], - 'classname' => rcube_utils::file2class($attachment['mimetype'], $attachment['name']), - 'complete' => true), $uploadid); + rcmail_attachment_success($attachment, $uploadid); } else { // upload failed if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE) { @@ -230,3 +174,42 @@ // send html page with JS calls as response $OUTPUT->command('auto_save_start', false); $OUTPUT->send('iframe'); + + +function rcmail_attachment_success($attachment, $uploadid) +{ + global $RCMAIL, $COMPOSE; + + $id = $attachment['id']; + + if (($icon = $COMPOSE['deleteicon']) && is_file($icon)) { + $button = html::img(array( + 'src' => $icon, + 'alt' => $RCMAIL->gettext('delete') + )); + } + else if ($COMPOSE['textbuttons']) { + $button = rcube::Q($RCMAIL->gettext('delete')); + } + else { + $button = ''; + } + + $content = html::a(array( + 'href' => "#delete", + 'onclick' => sprintf("return %s.command('remove-attachment','rcmfile%s', this)", rcmail_output::JS_OBJECT_NAME, $id), + 'title' => $RCMAIL->gettext('delete'), + 'class' => 'delete', + 'aria-label' => $RCMAIL->gettext('delete') . ' ' . $attachment['name'], + ), $button); + + $content .= sprintf('%s <span class="attachment-size">(%s)</span>', + rcube::Q($attachment['name']), $RCMAIL->show_bytes($attachment['size'])); + + $RCMAIL->output->command('add2attachment_list', "rcmfile$id", array( + 'html' => $content, + 'name' => $attachment['name'], + 'mimetype' => $attachment['mimetype'], + 'classname' => rcube_utils::file2class($attachment['mimetype'], $attachment['name']), + 'complete' => true), $uploadid); +} -- Gitblit v1.9.1