From c6efcf5e6d11a0f236daff3aa3bd6532c77726d3 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 12 Jan 2015 05:44:28 -0500 Subject: [PATCH] Fix blocked.gif image usage with assets_dir set --- CHANGELOG | 1 + program/include/rcmail.php | 23 +++++++++++++++++++++++ program/steps/mail/compose.inc | 26 ++++++++++++++++++++------ program/steps/mail/func.inc | 2 +- program/steps/mail/get.inc | 4 +++- 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b9d4e41a3..3029af2a9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix blocked.gif image usage with assets_dir set - Fix bug where max_group_members was ignored when adding a new contact (#1490214) - Hide MDN and DSN options in compose if disabled by admin (#1490221) - Fix checks based on window.ActiveXObject in IE > 10 diff --git a/program/include/rcmail.php b/program/include/rcmail.php index a16319f72..2327109c0 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -2284,6 +2284,29 @@ class rcmail extends rcube return $result; } + /** + * Get resource file content (with assets_dir support) + * + * @param string $name File name + */ + public function get_resource_content($name) + { + if (!strpos($name, '/')) { + $name = "program/resources/$name"; + } + + $assets_dir = $this->config->get('assets_dir'); + + if ($assets_dir) { + $path = slashify($assets_dir) . $name; + if (@file_exists($path)) { + $name = $path; + } + } + + return file_get_contents($name, false); + } + /************************************************************************ ********* Deprecated methods (to be removed) ********* diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 20a27ecb0..d4db232ea 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -781,12 +781,13 @@ function rcmail_prepare_message_body() unset($plugin); // add blocked.gif attachment (#1486516) - if ($isHtml && preg_match('#get_resource_content('blocked.gif'); + if ($content && ($attachment = rcmail_save_image('blocked.gif', 'image/gif', $content))) { $COMPOSE['attachments'][$attachment['id']] = $attachment; $url = sprintf('%s&_id=%s&_action=display-attachment&_file=rcmfile%s', $RCMAIL->comm_path, $COMPOSE['id'], $attachment['id']); - $body = preg_replace('#\./program/resources/blocked\.gif#', $url, $body); + $body = preg_replace('#program/resources/blocked\.gif#', $url, $body); } } @@ -1400,18 +1401,31 @@ function rcmail_save_attachment(&$message, $pid) return false; } -function rcmail_save_image($path, $mimetype='') +function rcmail_save_image($path, $mimetype = '', $data = null) { global $COMPOSE; // handle attachments in memory - $data = file_get_contents($path); + if (empty($data)) { + $data = file_get_contents($path); + $is_file = true; + } + $name = rcmail_basename($path); + if (empty($mimetype)) { + if ($is_file) { + $mimetype = rcube_mime::file_content_type($path, $name); + } + else { + $mimetype = rcube_mime::file_content_type($data, $name, 'application/octet-stream', true); + } + } + $attachment = array( 'group' => $COMPOSE['id'], 'name' => $name, - 'mimetype' => $mimetype ? $mimetype : rcube_mime::file_content_type($path, $name), + 'mimetype' => $mimetype, 'data' => $data, 'size' => strlen($data), ); diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 6423636f0..48d989954 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -815,7 +815,7 @@ function rcmail_wash_html($html, $p, $cid_replaces) $wash_opts = array( 'show_washed' => false, 'allow_remote' => $p['safe'], - 'blocked_src' => "./program/resources/blocked.gif", + 'blocked_src' => 'program/resources/blocked.gif', 'charset' => RCUBE_CHARSET, 'cid_map' => $cid_replaces, 'html_elements' => array('body'), diff --git a/program/steps/mail/get.inc b/program/steps/mail/get.inc index 775349d1c..150737a83 100644 --- a/program/steps/mail/get.inc +++ b/program/steps/mail/get.inc @@ -183,10 +183,12 @@ else if (strlen($part_id)) { // send blocked.gif for expected images if (empty($_REQUEST['_mimewarning']) && strpos($mimetype, 'image/') === 0) { // Do not cache. Failure might be the result of a misconfiguration, thus real content should be returned once fixed. + $content = $RCMAIL->get_resource_content('blocked.gif'); $OUTPUT->nocacheing_headers(); header("Content-Type: image/gif"); header("Content-Transfer-Encoding: binary"); - readfile(INSTALL_PATH . 'program/resources/blocked.gif'); + header("Content-Length: " . strlen($content)); + echo $content; } else { // html warning with a button to load the file anyway $OUTPUT = new rcmail_html_page();