Aleksander Machniak
2015-03-08 9af8e22b8ea3bd4fe9e05860058d7fce29019455
Plugin API: added message_part_body hook, fixes around message structure handling by plugins
4 files modified
44 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_imap.php 20 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_message.php 17 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_storage.php 6 ●●●●● patch | view | raw | blame | history
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
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;
                }
            }
@@ -2366,17 +2376,18 @@
     *
     * @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);
    }
@@ -2384,16 +2395,17 @@
     * Returns the message headers as string
     *
     * @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);
    }
program/lib/Roundcube/rcube_message.php
@@ -53,12 +53,12 @@
    public $uid;
    public $folder;
    public $headers;
    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;
    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) {
program/lib/Roundcube/rcube_storage.php
@@ -494,20 +494,22 @@
     *
     * @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 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);
    /**