From c6efcf5e6d11a0f236daff3aa3bd6532c77726d3 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Mon, 12 Jan 2015 05:44:28 -0500
Subject: [PATCH] Fix blocked.gif image usage with assets_dir set

---
 CHANGELOG                      |    1 +
 program/steps/mail/compose.inc |   26 ++++++++++++++++++++------
 program/include/rcmail.php     |   23 +++++++++++++++++++++++
 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 b9d4e41..3029af2 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 a16319f..2327109 100644
--- a/program/include/rcmail.php
+++ b/program/include/rcmail.php
@@ -2284,6 +2284,29 @@
         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 20a27ec..d4db232 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -781,12 +781,13 @@
     unset($plugin);
 
     // add blocked.gif attachment (#1486516)
-    if ($isHtml && preg_match('#<img src="\./program/resources/blocked\.gif"#', $body)) {
-        if ($attachment = rcmail_save_image('program/resources/blocked.gif', 'image/gif')) {
+    if ($isHtml && preg_match('#<img src="program/resources/blocked\.gif"#', $body)) {
+        $content = $RCMAIL->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 @@
     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 6423636..48d9899 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -815,7 +815,7 @@
     $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 775349d..150737a 100644
--- a/program/steps/mail/get.inc
+++ b/program/steps/mail/get.inc
@@ -183,10 +183,12 @@
                 // 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();

--
Gitblit v1.9.1