X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fmime.php;h=6ec1c6292e8a7b93b537cdab2738638e000b1958;hp=3227aebb3caa292df10f7945ae285109b9e72a33;hb=caf0ab1de11a5cafc878e424ef0d55dbc0350dd1;hpb=c2503a4e44d5f357538180126fd5740033ed5115 diff --git a/functions/mime.php b/functions/mime.php index 3227aebb..6ec1c629 100644 --- a/functions/mime.php +++ b/functions/mime.php @@ -6,7 +6,7 @@ * This contains the functions necessary to detect and decode MIME * messages. * - * @copyright 1999-2017 The SquirrelMail Project Team + * @copyright 1999-2019 The SquirrelMail Project Team * @license http://opensource.org/licenses/gpl-license.php GNU Public License * @version $Id$ * @package squirrelmail @@ -514,7 +514,8 @@ function formatBody($imap_stream, $message, $color, $wrap_at, $ent_num, $id, $ma * @param integer $id message id */ function buildAttachmentArray($message, $exclude_id, $mailbox, $id) { - global $where, $what, $startMessage, $color, $passed_ent_id, $base_uri; + global $where, $what, $startMessage, $color, $passed_ent_id, + $base_uri, $block_svg_download; $att_ar = $message->getAttachments($exclude_id); $urlMailbox = urlencode($mailbox); @@ -525,6 +526,9 @@ function buildAttachmentArray($message, $exclude_id, $mailbox, $id) { $header = $att->header; $type0 = strtolower($header->type0); $type1 = strtolower($header->type1); + if ($block_svg_download && strpos($type1, 'svg') === 0) + continue; + $name = ''; $links = array(); $links['download link']['text'] = _("Download"); @@ -791,7 +795,7 @@ function decodeBody($string, $encoding, $force_crlf='') { * @return string decoded header string */ function decodeHeader ($string, $utfencode=true,$htmlsafe=true,$decide=false) { - global $languages, $squirrelmail_language,$default_charset; + global $languages, $squirrelmail_language,$default_charset, $fix_broken_base64_encoded_messages; if (is_array($string)) { $string = implode("\n", $string); } @@ -848,6 +852,13 @@ function decodeHeader ($string, $utfencode=true,$htmlsafe=true,$decide=false) { switch ($encoding) { case 'B': + // fix broken base64-encoded strings (remove end = padding, + // change any = to + in middle of string, add padding back + // to the end) + if ($fix_broken_base64_encoded_messages) { + $encoded_string_minus_padding = strtr(rtrim($res[4], '='), '=', '+'); + $res[4] = str_pad($encoded_string_minus_padding, strlen($res[4]), '='); + } $replace = base64_decode($res[4]); if ($utfencode) { if ($can_be_encoded) { @@ -1861,7 +1872,9 @@ function sq_fixatts($tagname, /** * Use white list based filtering on attributes which can contain url's */ - else if ($attname == 'href' || $attname == 'src' || $attname == 'background') { + else if ($attname == 'href' || $attname == 'xlink:href' || $attname == 'src' + || $attname == 'poster' || $attname == 'formaction' + || $attname == 'background' || $attname == 'action') { sq_fix_url($attname, $attvalue, $message, $id, $mailbox); $attary{$attname} = $attvalue; } @@ -2169,7 +2182,7 @@ function sq_fixstyle($body, $pos, $message, $id, $mailbox){ * be set to relative and move itself anywhere it wants to, * displaying content in areas it shouldn't be allowed to touch. */ - $match = Array('/\/\*.*\*\//', + $match = Array('/\/\*.*\*\//', // removes /* blah blah */ '/expression/i', '/behaviou*r/i', '/binding/i', @@ -2503,7 +2516,7 @@ function magicHTML($body, $id, $message, $mailbox = 'INBOX', $take_mailto_links // require_once(SM_PATH . 'functions/url_parser.php'); // for $MailTo_PReg_Match global $attachment_common_show_images, $view_unsafe_images, - $has_unsafe_images; + $has_unsafe_images, $block_svg_display; /** * Don't display attached images in HTML mode. * @@ -2512,7 +2525,6 @@ function magicHTML($body, $id, $message, $mailbox = 'INBOX', $take_mailto_links $attachment_common_show_images = false; $tag_list = Array( false, - "object", "meta", "html", "head", @@ -2521,25 +2533,28 @@ function magicHTML($body, $id, $message, $mailbox = 'INBOX', $take_mailto_links "frame", "iframe", "plaintext", - "marquee" + "marquee", ); $rm_tags_with_content = Array( "script", + "object", "applet", "embed", "title", "frameset", "xmp", - "xml" + "xml", ); + if ($block_svg_display) + $rm_tags_with_content[] = 'svg'; $self_closing_tags = Array( "img", "br", "hr", "input", - "outbind" + "outbind", ); $force_tag_closing = true; @@ -2551,7 +2566,7 @@ function magicHTML($body, $id, $message, $mailbox = 'INBOX', $take_mailto_links "/^on.*/i", "/^dynsrc/i", "/^data.*/i", - "/^lowsrc.*/i" + "/^lowsrc.*/i", ) ); @@ -2685,19 +2700,25 @@ function magicHTML($body, $id, $message, $mailbox = 'INBOX', $take_mailto_links if ($take_mailto_links) { // parseUrl($trusted); // this even parses URLs inside of tags... too aggressive global $MailTo_PReg_Match; - $MailTo_PReg_Match = '/mailto:' . substr($MailTo_PReg_Match, 1) ; + // some mailers (Microsoft, surprise surprise) produce mailto strings without being + // inside an anchor (link) tag, so we have to make sure the regex looks for the + // quote before mailto, and we'll also try to convert the non-links back into links + $MailTo_PReg_Match = '/([\'"])?mailto:' . substr($MailTo_PReg_Match, 1) ; if ((preg_match_all($MailTo_PReg_Match, $trusted, $regs)) && ($regs[0][0] != '')) { foreach ($regs[0] as $i => $mailto_before) { - $mailto_params = $regs[10][$i]; + $mailto_params = $regs[11][$i]; + + // get rid of any leading quote we may have captured but don't care about + // + $mailto_before = ltrim($mailto_before, '"\''); + // get rid of any tailing quote since we have to add send_to to the end // - if (substr($mailto_before, strlen($mailto_before) - 1) == '"') - $mailto_before = substr($mailto_before, 0, strlen($mailto_before) - 1); - if (substr($mailto_params, strlen($mailto_params) - 1) == '"') - $mailto_params = substr($mailto_params, 0, strlen($mailto_params) - 1); + $mailto_before = rtrim($mailto_before, '"\''); + $mailto_params = rtrim($mailto_params, '"\''); - if ($regs[1][$i]) { //if there is an email addr before '?', we need to merge it with the params - $to = 'to=' . $regs[1][$i]; + if ($regs[2][$i]) { //if there is an email addr before '?', we need to merge it with the params + $to = 'to=' . $regs[2][$i]; if (strpos($mailto_params, 'to=') > -1) //already a 'to=' $mailto_params = str_replace('to=', $to . '%2C%20', $mailto_params); else { @@ -2722,8 +2743,12 @@ function magicHTML($body, $id, $message, $mailbox = 'INBOX', $take_mailto_links // remove