Merge branch 'master' of github.com:roundcube/roundcubemail

pull/52/head
Aleksander Machniak 12 years ago
commit 25bf00ecbc

@ -320,8 +320,15 @@ class rcube_message
private function parse_structure($structure, $recursive = false) private function parse_structure($structure, $recursive = false)
{ {
// real content-type of message/rfc822 part // real content-type of message/rfc822 part
if ($structure->mimetype == 'message/rfc822' && $structure->real_mimetype) if ($structure->mimetype == 'message/rfc822' && $structure->real_mimetype) {
$mimetype = $structure->real_mimetype; $mimetype = $structure->real_mimetype;
// parse headers from message/rfc822 part
if (!isset($structure->headers['subject'])) {
list($headers, $dump) = explode("\r\n\r\n", $this->get_part_content($structure->mime_id, null, true, 4096));
$structure->headers = rcube_mime::parse_headers($headers);
}
}
else else
$mimetype = $structure->mimetype; $mimetype = $structure->mimetype;

@ -235,6 +235,22 @@ class rcube_message_header
$this->others[$name] = $value; $this->others[$name] = $value;
} }
} }
/**
* Factory method to instantiate headers from a data array
*
* @param array Hash array with header values
* @return object rcube_message_header instance filled with headers values
*/
public static function from_array($arr)
{
$obj = new rcube_message_header;
foreach ($arr as $k => $v)
$obj->set($k, $v);
return $obj;
}
} }

@ -5,7 +5,7 @@
| program/steps/mail/func.inc | | program/steps/mail/func.inc |
| | | |
| This file is part of the Roundcube Webmail client | | This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2010, The Roundcube Dev Team | | Copyright (C) 2005-2012, The Roundcube Dev Team |
| | | |
| Licensed under the GNU General Public License version 3 or | | Licensed under the GNU General Public License version 3 or |
| any later version with exceptions for skins & plugins. | | any later version with exceptions for skins & plugins. |
@ -939,13 +939,13 @@ function rcmail_html_tag_callback($matches)
/** /**
* return table with message headers * return table with message headers
*/ */
function rcmail_message_headers($attrib, $headers=NULL) function rcmail_message_headers($attrib, $headers=null)
{ {
global $OUTPUT, $MESSAGE, $PRINT_MODE, $RCMAIL; global $OUTPUT, $MESSAGE, $PRINT_MODE, $RCMAIL;
static $sa_attrib; static $sa_attrib;
// keep header table attrib // keep header table attrib
if (is_array($attrib) && !$sa_attrib) if (is_array($attrib) && !$sa_attrib && !$attrib['valueof'])
$sa_attrib = $attrib; $sa_attrib = $attrib;
else if (!is_array($attrib) && is_array($sa_attrib)) else if (!is_array($attrib) && is_array($sa_attrib))
$attrib = $sa_attrib; $attrib = $sa_attrib;
@ -954,8 +954,13 @@ function rcmail_message_headers($attrib, $headers=NULL)
return FALSE; return FALSE;
// get associative array of headers object // get associative array of headers object
if (!$headers) if (!$headers) {
$headers = is_object($MESSAGE->headers) ? get_object_vars($MESSAGE->headers) : $MESSAGE->headers; $headers_obj = $MESSAGE->headers;
$headers = get_object_vars($MESSAGE->headers);
}
else {
$headers_obj = rcube_message_header::from_array($headers);
}
// show these headers // show these headers
$standard_headers = array('subject', 'from', 'to', 'cc', 'bcc', 'replyto', $standard_headers = array('subject', 'from', 'to', 'cc', 'bcc', 'replyto',
@ -1031,7 +1036,7 @@ function rcmail_message_headers($attrib, $headers=NULL)
} }
$plugin = $RCMAIL->plugins->exec_hook('message_headers_output', $plugin = $RCMAIL->plugins->exec_hook('message_headers_output',
array('output' => $output_headers, 'headers' => $MESSAGE->headers, 'exclude' => $exclude_headers)); array('output' => $output_headers, 'headers' => $headers_obj, 'exclude' => $exclude_headers));
// single header value is requested // single header value is requested
if (!empty($attrib['valueof'])) if (!empty($attrib['valueof']))
@ -1110,8 +1115,9 @@ function rcmail_message_body($attrib)
if (!empty($MESSAGE->parts)) { if (!empty($MESSAGE->parts)) {
foreach ($MESSAGE->parts as $i => $part) { foreach ($MESSAGE->parts as $i => $part) {
if ($part->type == 'headers') if ($part->type == 'headers') {
$out .= rcmail_message_headers(sizeof($header_attrib) ? $header_attrib : NULL, $part->headers); $out .= html::div('message-partheaders', rcmail_message_headers(sizeof($header_attrib) ? $header_attrib : null, $part->headers));
}
else if ($part->type == 'content') { else if ($part->type == 'content') {
// unsapported // unsapported
if ($part->realtype) { if ($part->realtype) {
@ -1139,6 +1145,15 @@ function rcmail_message_body($attrib)
if (!isset($part->body)) if (!isset($part->body))
$part->body = $MESSAGE->get_part_content($part->mime_id); $part->body = $MESSAGE->get_part_content($part->mime_id);
// extract headers from message/rfc822 parts
if ($part->mimetype == 'message/rfc822') {
list($hdrs, $body) = explode("\r\n\r\n", $part->body, 2);
if ($hdrs && $body && preg_match('/^[\w-]+:\s/i', $hdrs)) {
$out .= html::div('message-partheaders', rcmail_message_headers(sizeof($header_attrib) ? $header_attrib : null, rcube_mime::parse_headers($hdrs)));
$part->body = $body;
}
}
// message is cached but not exists (#1485443), or other error // message is cached but not exists (#1485443), or other error
if ($part->body === false) { if ($part->body === false) {
rcmail_message_error($MESSAGE->uid); rcmail_message_error($MESSAGE->uid);

@ -266,6 +266,11 @@ else if (strlen($pid = get_input_value('_part', RCUBE_INPUT_GET))) {
$filename = str_ireplace('attachment', 'attach', $filename); $filename = str_ireplace('attachment', 'attach', $filename);
} }
// add filename extension if missing
if (!pathinfo($filename, PATHINFO_EXTENSION) && ($extensions = rcube_mime::get_mime_extensions($mimetype))) {
$filename .= '.' . $extensions[0];
}
header("Content-Disposition: $disposition; filename=\"$filename\""); header("Content-Disposition: $disposition; filename=\"$filename\"");
// handle tiff to jpeg conversion // handle tiff to jpeg conversion

@ -1070,6 +1070,17 @@ table.headers-table
background-color: #F4F4F4; background-color: #F4F4F4;
} }
#messagebody table.headers-table
{
margin: 16px 6px 6px 6px;
}
div.message-partheaders + div.message-part
{
border-top: 0;
padding-top: 4px;
}
table.headers-table tr td table.headers-table tr td
{ {
font-size: 11px; font-size: 11px;

@ -999,12 +999,14 @@ div.hide-headers {
} }
div.message-part, div.message-part,
div.message-htmlpart { div.message-htmlpart,
padding: 0 2px 10px 2px; div.message-partheaders {
padding: 10px 2px;
border-top: 1px solid #ccc; border-top: 1px solid #ccc;
} }
#messagebody div:first-child { #messagebody div:first-child {
padding-top: 0;
border-top: 0; border-top: 0;
} }
@ -1045,6 +1047,24 @@ div.message-part blockquote blockquote blockquote {
border-right: 2px solid #bb0000; border-right: 2px solid #bb0000;
} }
div.message-partheaders {
margin-top: 8px;
padding: 8px 0;
}
div.message-partheaders .headers-table {
width: 100%;
}
div.message-partheaders .headers-table td.header-title {
width: auto;
padding-left: 0;
}
div.message-partheaders .headers-table td.header {
width: 88%;
}
#messagebody > hr { #messagebody > hr {
color: #fff; color: #fff;
background: #fff; background: #fff;

@ -64,7 +64,7 @@
</div> </div>
<div class="leftcol"> <div class="leftcol">
<roundcube:object name="messageObjects" id="message-objects" /> <roundcube:object name="messageObjects" id="message-objects" />
<roundcube:object name="messageBody" id="messagebody" /> <roundcube:object name="messageBody" id="messagebody" headertableclass="message-partheaders headers-table" />
</div> </div>
</div> </div>

@ -47,7 +47,7 @@
</div> </div>
<div class="leftcol"> <div class="leftcol">
<roundcube:object name="messageObjects" id="message-objects" /> <roundcube:object name="messageObjects" id="message-objects" />
<roundcube:object name="messageBody" id="messagebody" /> <roundcube:object name="messageBody" id="messagebody" headertableclass="message-partheaders headers-table" />
</div> </div>
</div> </div>

Loading…
Cancel
Save