Plugin API: added message_part_body hook, fixes around message structure handling by plugins

pull/229/merge
Aleksander Machniak 10 years ago
parent 7ff227eb3e
commit 9af8e22b8e

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail CHANGELOG Roundcube Webmail
=========================== ===========================
- Plugin API: Added message_part_body hook
- Add initdb.sh to create database from initial.sql script with prefix support (#1490188) - 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) - Plugin API: Add special onload() method to execute plugin actions before startup (session and GUI initialization)
- Password plugin: Added 'kpasswd' driver by Peter Allgeyer - Password plugin: Added 'kpasswd' driver by Peter Allgeyer

@ -1957,6 +1957,16 @@ class rcube_imap extends rcube_storage
for ($i=1; $i<count($part); $i++) { for ($i=1; $i<count($part); $i++) {
if (!is_array($part[$i])) { if (!is_array($part[$i])) {
$struct->ctype_secondary = strtolower($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; break;
} }
} }
@ -2364,36 +2374,38 @@ class rcube_imap extends rcube_storage
/** /**
* Returns the whole message source as string (or saves to a file) * Returns the whole message source as string (or saves to a file)
* *
* @param int $uid Message UID * @param int $uid Message UID
* @param resource $fp File pointer to save the message * @param resource $fp File pointer to save the message
* @param string $part Optional message part ID
* *
* @return string Message source string * @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()) { if (!$this->check_connection()) {
return null; return null;
} }
return $this->conn->handlePartBody($this->folder, $uid, return $this->conn->handlePartBody($this->folder, $uid,
true, null, null, false, $fp); true, $part, null, false, $fp);
} }
/** /**
* Returns the message headers as string * 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 * @return string Message headers string
*/ */
public function get_raw_headers($uid) public function get_raw_headers($uid, $part = null)
{ {
if (!$this->check_connection()) { if (!$this->check_connection()) {
return null; return null;
} }
return $this->conn->fetchPartHeader($this->folder, $uid, true); return $this->conn->fetchPartHeader($this->folder, $uid, true, $part);
} }

@ -53,13 +53,13 @@ class rcube_message
public $uid; public $uid;
public $folder; public $folder;
public $headers; public $headers;
public $parts = array(); public $sender;
public $mime_parts = array(); public $parts = array();
public $mime_parts = array();
public $inline_parts = array(); public $inline_parts = array();
public $attachments = array(); public $attachments = array();
public $subject = ''; public $subject = '';
public $sender = null; public $is_safe = false;
public $is_safe = false;
const BODY_MAX_SIZE = 1048576; // 1MB const BODY_MAX_SIZE = 1048576; // 1MB
@ -217,6 +217,10 @@ class rcube_message
return; 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 // only text parts can be formatted
$formatted = $formatted && $part->ctype_primary == 'text'; $formatted = $formatted && $part->ctype_primary == 'text';
@ -499,8 +503,9 @@ class rcube_message
$structure->headers = rcube_mime::parse_headers($headers); $structure->headers = rcube_mime::parse_headers($headers);
} }
} }
else else {
$mimetype = $structure->mimetype; $mimetype = $structure->mimetype;
}
// show message headers // show message headers
if ($recursive && is_array($structure->headers) && if ($recursive && is_array($structure->headers) &&
@ -516,11 +521,15 @@ class rcube_message
array('object' => $this, 'structure' => $structure, array('object' => $this, 'structure' => $structure,
'mimetype' => $mimetype, 'recursive' => $recursive)); 'mimetype' => $mimetype, 'recursive' => $recursive));
if ($plugin['abort']) if ($plugin['abort']) {
return; return;
}
$structure = $plugin['structure']; $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 // print body if message doesn't have multiple parts
if ($message_ctype_primary == 'text' && !$recursive) { if ($message_ctype_primary == 'text' && !$recursive) {
@ -673,7 +682,7 @@ class rcube_message
} }
else { else {
$part_mimetype = $part_orig_mimetype = $mail_part->mimetype; $part_mimetype = $part_orig_mimetype = $mail_part->mimetype;
} }
// multipart/alternative // multipart/alternative
if ($primary_type == 'multipart') { if ($primary_type == 'multipart') {

@ -492,22 +492,24 @@ abstract class rcube_storage
/** /**
* Returns the whole message source as string (or saves to a file) * Returns the whole message source as string (or saves to a file)
* *
* @param int $uid Message UID * @param int $uid Message UID
* @param resource $fp File pointer to save the message * @param resource $fp File pointer to save the message
* @param string $part Optional message part ID
* *
* @return string Message source string * @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 * 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 * @return string Message headers string
*/ */
abstract function get_raw_headers($uid); abstract function get_raw_headers($uid, $part = null);
/** /**

Loading…
Cancel
Save