From 9af8e22b8ea3bd4fe9e05860058d7fce29019455 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sun, 08 Mar 2015 05:51:19 -0400
Subject: [PATCH] Plugin API: added message_part_body hook, fixes around message structure handling by plugins

---
 CHANGELOG                               |    1 
 program/lib/Roundcube/rcube_imap.php    |   26 +++++++++---
 program/lib/Roundcube/rcube_message.php |   29 +++++++++-----
 program/lib/Roundcube/rcube_storage.php |   12 +++--
 4 files changed, 46 insertions(+), 22 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index bae3609..4376812 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Plugin API: Added message_part_body hook
 - Add initdb.sh to create database from initial.sql script with prefix support (#1490188)
 - Plugin API: Add special onload() method to execute plugin actions before startup (session and GUI initialization)
 - Password plugin: Added 'kpasswd' driver by Peter Allgeyer
diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php
index d17b33f..65e0950 100644
--- a/program/lib/Roundcube/rcube_imap.php
+++ b/program/lib/Roundcube/rcube_imap.php
@@ -1957,6 +1957,16 @@
             for ($i=1; $i<count($part); $i++) {
                 if (!is_array($part[$i])) {
                     $struct->ctype_secondary = strtolower($part[$i]);
+
+                    // read content type parameters
+                    if (is_array($part[$i+1])) {
+                        $struct->ctype_parameters = array();
+                        for ($j=0; $j<count($part[$i+1]); $j+=2) {
+                            $param = strtolower($part[$i+1][$j]);
+                            $struct->ctype_parameters[$param] = $part[$i+1][$j+1];
+                        }
+                    }
+
                     break;
                 }
             }
@@ -2364,36 +2374,38 @@
     /**
      * Returns the whole message source as string (or saves to a file)
      *
-     * @param int      $uid Message UID
-     * @param resource $fp  File pointer to save the message
+     * @param int      $uid  Message UID
+     * @param resource $fp   File pointer to save the message
+     * @param string   $part Optional message part ID
      *
      * @return string Message source string
      */
-    public function get_raw_body($uid, $fp=null)
+    public function get_raw_body($uid, $fp=null, $part = null)
     {
         if (!$this->check_connection()) {
             return null;
         }
 
         return $this->conn->handlePartBody($this->folder, $uid,
-            true, null, null, false, $fp);
+            true, $part, null, false, $fp);
     }
 
 
     /**
      * Returns the message headers as string
      *
-     * @param int $uid  Message UID
+     * @param int    $uid  Message UID
+     * @param string $part Optional message part ID
      *
      * @return string Message headers string
      */
-    public function get_raw_headers($uid)
+    public function get_raw_headers($uid, $part = null)
     {
         if (!$this->check_connection()) {
             return null;
         }
 
-        return $this->conn->fetchPartHeader($this->folder, $uid, true);
+        return $this->conn->fetchPartHeader($this->folder, $uid, true, $part);
     }
 
 
diff --git a/program/lib/Roundcube/rcube_message.php b/program/lib/Roundcube/rcube_message.php
index 8af3344..b135ae0 100644
--- a/program/lib/Roundcube/rcube_message.php
+++ b/program/lib/Roundcube/rcube_message.php
@@ -53,13 +53,13 @@
     public $uid;
     public $folder;
     public $headers;
-    public $parts = array();
-    public $mime_parts = array();
+    public $sender;
+    public $parts        = array();
+    public $mime_parts   = array();
     public $inline_parts = array();
-    public $attachments = array();
-    public $subject = '';
-    public $sender = null;
-    public $is_safe = false;
+    public $attachments  = array();
+    public $subject      = '';
+    public $is_safe      = false;
 
     const BODY_MAX_SIZE = 1048576; // 1MB
 
@@ -216,6 +216,10 @@
         if (!($part = $this->mime_parts[$mime_id])) {
             return;
         }
+
+        // allow plugins to modify part body
+        $plugin = $this->app->plugins->exec_hook('message_part_body',
+            array('object' => $this, 'part' => $part));
 
         // only text parts can be formatted
         $formatted = $formatted && $part->ctype_primary == 'text';
@@ -499,8 +503,9 @@
                 $structure->headers = rcube_mime::parse_headers($headers);
             }
         }
-        else
+        else {
             $mimetype = $structure->mimetype;
+        }
 
         // show message headers
         if ($recursive && is_array($structure->headers) &&
@@ -516,11 +521,15 @@
             array('object' => $this, 'structure' => $structure,
                 'mimetype' => $mimetype, 'recursive' => $recursive));
 
-        if ($plugin['abort'])
+        if ($plugin['abort']) {
             return;
+        }
 
         $structure = $plugin['structure'];
-        list($message_ctype_primary, $message_ctype_secondary) = explode('/', $plugin['mimetype']);
+        $mimetype  = $plugin['mimetype'];
+        $recursive = $plugin['recursive'];
+
+        list($message_ctype_primary, $message_ctype_secondary) = explode('/', $mimetype);
 
         // print body if message doesn't have multiple parts
         if ($message_ctype_primary == 'text' && !$recursive) {
@@ -673,7 +682,7 @@
                 }
                 else {
                     $part_mimetype = $part_orig_mimetype = $mail_part->mimetype;
-                  }
+                }
 
                 // multipart/alternative
                 if ($primary_type == 'multipart') {
diff --git a/program/lib/Roundcube/rcube_storage.php b/program/lib/Roundcube/rcube_storage.php
index ccb28c6..23e6577 100644
--- a/program/lib/Roundcube/rcube_storage.php
+++ b/program/lib/Roundcube/rcube_storage.php
@@ -492,22 +492,24 @@
     /**
      * Returns the whole message source as string (or saves to a file)
      *
-     * @param int      $uid Message UID
-     * @param resource $fp  File pointer to save the message
+     * @param int      $uid  Message UID
+     * @param resource $fp   File pointer to save the message
+     * @param string   $part Optional message part ID
      *
      * @return string Message source string
      */
-    abstract function get_raw_body($uid, $fp = null);
+    abstract function get_raw_body($uid, $fp = null, $part = null);
 
 
     /**
      * Returns the message headers as string
      *
-     * @param int $uid  Message UID
+     * @param int    $uid  Message UID
+     * @param string $part Optional message part ID
      *
      * @return string Message headers string
      */
-    abstract function get_raw_headers($uid);
+    abstract function get_raw_headers($uid, $part = null);
 
 
     /**

--
Gitblit v1.9.1