Fix handling of invalid characters in message headers and output (#1489032)

Conflicts:

	CHANGELOG
pull/88/head
Aleksander Machniak 11 years ago
parent 9404f4a7a6
commit 6f4b50abea

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Fix handling of invalid characters in message headers and output (#1489032)
- Avoid race-conditions with concurrent attachment uploads (#1488422)
- Fix selecting collapsed rows on select-all (#1489036)
- Fix possible header duplicates when using additional headers (#1489033)

@ -35,6 +35,7 @@ class html
public static $common_attrib = array('id','class','style','title','align');
public static $containers = array('iframe','div','span','p','h1','h2','h3','form','textarea','table','thead','tbody','tr','th','td','style','script');
/**
* Constructor
*
@ -332,7 +333,16 @@ class html
*/
public static function quote($str)
{
return @htmlspecialchars($str, ENT_COMPAT, RCUBE_CHARSET);
static $flags;
if (!$flags) {
$flags = ENT_COMPAT;
if (defined('ENT_SUBSTITUTE')) {
$flags |= ENT_SUBSTITUTE;
}
}
return @htmlspecialchars($str, $flags, RCUBE_CHARSET);
}
}

@ -85,12 +85,13 @@ class rcube_message
$this->headers = $this->storage->get_message($uid);
if (!$this->headers)
if (!$this->headers) {
return;
}
$this->mime = new rcube_mime($this->headers->charset);
$this->subject = $this->mime->decode_mime_string($this->headers->subject);
$this->subject = $this->headers->get('subject');
list(, $this->sender) = each($this->mime->decode_address_list($this->headers->from, 1));
$this->set_safe((intval($_GET['_safe']) || $_SESSION['safe_messages'][$this->folder.':'.$uid]));
@ -125,15 +126,11 @@ class rcube_message
*/
public function get_header($name, $raw = false)
{
if (empty($this->headers))
if (empty($this->headers)) {
return null;
}
if ($this->headers->$name)
$value = $this->headers->$name;
else if ($this->headers->others[$name])
$value = $this->headers->others[$name];
return $raw ? $value : $this->mime->decode_header($value);
return $this->headers->get($name, !$raw);
}

@ -215,7 +215,12 @@ class rcube_message_header
$value = $this->others[$name];
}
return $decode ? rcube_mime::decode_header($value, $this->charset) : $value;
if ($decode) {
$value = rcube_mime::decode_header($value, $this->charset);
$value = rcube_charset::clean($value);
}
return $value;
}
/**

@ -211,9 +211,9 @@ if (!empty($msg_uid) && empty($COMPOSE['as_attachment']))
}
}
else if ($compose_mode == RCUBE_COMPOSE_DRAFT) {
if ($MESSAGE->headers->others['x-draft-info']) {
if ($draft_info = $MESSAGE->headers->get('x-draft-info')) {
// get reply_uid/forward_uid to flag the original message when sending
$info = rcmail_draftinfo_decode($MESSAGE->headers->others['x-draft-info']);
$info = rcmail_draftinfo_decode($draft_info);
if ($info['type'] == 'reply')
$COMPOSE['reply_uid'] = $info['uid'];
@ -230,8 +230,8 @@ if (!empty($msg_uid) && empty($COMPOSE['as_attachment']))
}
}
if ($MESSAGE->headers->in_reply_to)
$COMPOSE['reply_msgid'] = '<'.$MESSAGE->headers->in_reply_to.'>';
if ($in_reply_to = $MESSAGE->headers->get('in-reply-to'))
$COMPOSE['reply_msgid'] = '<' . $in_reply_to . '>';
$COMPOSE['references'] = $MESSAGE->headers->references;
}

@ -888,7 +888,7 @@ function rcmail_washtml_callback($tagname, $attrib, $content, $washtml)
* return table with message headers
*/
function rcmail_message_headers($attrib, $headers=null)
{
{
global $OUTPUT, $MESSAGE, $PRINT_MODE, $RCMAIL;
static $sa_attrib;

@ -97,7 +97,7 @@ if ($uid = get_input_value('_uid', RCUBE_INPUT_GET)) {
$OUTPUT->set_env('skip_deleted', true);
if ($CONFIG['display_next'])
$OUTPUT->set_env('display_next', true);
if ($MESSAGE->headers->others['list-post'])
if ($MESSAGE->headers->get('list-post', false))
$OUTPUT->set_env('list_post', true);
if ($CONFIG['forward_attachment'])
$OUTPUT->set_env('forward_attachment', true);

Loading…
Cancel
Save