X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fmime.php;h=202028ee3840cf3499757d2dd6ec953020ed5bf4;hp=7bbfa3741d32a3b4460d3e287e40fe11077597cd;hb=008989da27741b9839b7e99e72f7979ee16ee28c;hpb=c828931cd4c67314e0d3dbf02b7c1381d5500349;ds=sidebyside diff --git a/functions/mime.php b/functions/mime.php index 7bbfa374..202028ee 100644 --- a/functions/mime.php +++ b/functions/mime.php @@ -128,11 +128,11 @@ function mime_parse_structure ($structure, $ent_id) { $structure_end = substr($structure, $endprop+2); $structure = trim(substr($structure,0,$startprop)); } - /* get type1 */ $pos = strrpos($structure,' '); + if ($structure{$pos+1} =='(') $pos++; + $type1 = strtolower(substr($structure, $pos+2, (count($structure)-2))); - /* cut off type1 */ if ($pos && $startprop) { $structure = trim(substr($structure, 0, $pos)); @@ -229,6 +229,21 @@ function mime_get_element (&$structure, $msg, $ent_id) { $pos++; } $structure = substr($structure, strlen($text) + 2); + } else if ($char == '{') { + /** + * loop through until we find the matching quote, + * and return that as a string + */ + $pos = 1; + $len = ''; + while (($char = $structure{$pos}) != '}' + && $pos < strlen($structure)) { + $len .= $char; + $pos++; + } + $structure = substr($structure, strlen($len) + 4); + $text = substr($structure, 0, $len); + $structure = substr($structure, $len + 1); } else if ($char == '(') { // comment me $end = mime_match_parenthesis (0, $structure); @@ -426,7 +441,7 @@ function mime_match_parenthesis ($pos, $structure) { return( $pos ); } -function mime_fetch_body($imap_stream, $id, $ent_id ) { +function mime_fetch_body($imap_stream, $id, $ent_id) { /* * do a bit of error correction. If we couldn't find the entity id, just guess @@ -435,10 +450,9 @@ function mime_fetch_body($imap_stream, $id, $ent_id ) { if (!$ent_id) { $ent_id = 1; } - $cmd = "FETCH $id BODY[$ent_id]"; - $data = sqimap_run_command ($imap_stream, $cmd, true, $response, $message); + $data = sqimap_run_command ($imap_stream, $cmd, true, $response, $message); do { $topline = trim(array_shift( $data )); } while( $topline && $topline[0] == '*' && !preg_match( '/\* [0-9]+ FETCH.*/i', $topline )) ; @@ -603,36 +617,49 @@ function getEntity ($message, $ent_id) { * figures out what entity to display and returns the $message object * for that entity. */ -function findDisplayEntity ($msg, $textOnly = 1) { +function findDisplayEntity ($msg, $textOnly = 1, $entity = array() ) { global $show_html_default; - $entity = 0; - + $found = false; if ($msg) { - if ( $msg->header->type0 == 'multipart' && - ( $msg->header->type1 == 'alternative' || - $msg->header->type1 == 'mixed' || - $msg->header->type1 == 'related' ) && - $show_html_default && ! $textOnly ) { - $entity = findDisplayEntityHTML($msg); - } - - // Show text/plain or text/html -- the first one we find. - if ( $entity == 0 && + $type = $msg->header->type0.'/'.$msg->header->type1; + if ( $type == 'multipart/alternative') { + $msg = findAlternativeEntity($msg); + if (count($msg->entities) == 0) { + $entity[] = $msg->header->entity_id; + } else { + $found = true; + $entity =findDisplayEntity($msg,$textOnly, $entity); + } + } else if ( $type == 'multipart/related') { + $msgs = findRelatedEntity($msg); + for ($i = 0; $i < count($msgs); $i++) { + $msg = $msgs[$i]; + if (count($msg->entities) == 0) { + $entity[] = $msg->header->entity_id; + } else { + $found = true; + $entity =findDisplayEntity($msg,$textOnly, $entity); + } + } + } else if ( count($entity) == 0 && $msg->header->type0 == 'text' && ( $msg->header->type1 == 'plain' || $msg->header->type1 == 'html' ) && isset($msg->header->entity_id) ) { - $entity = $msg->header->entity_id; - } - - $i = 0; - while ($entity == 0 && isset($msg->entities[$i]) ) { - $entity = findDisplayEntity($msg->entities[$i], $textOnly); - $i++; - } + if (count($msg->entities) == 0) { + $entity[] = $msg->header->entity_id; + } + } + $i = 0; + while ( isset($msg->entities[$i]) && count($entity) == 0 && !$found ) { + $entity = findDisplayEntity($msg->entities[$i], $textOnly, $entity); + $i++; + } + } + if ( !isset($entity[0]) ) { + $entity[]=""; } - return( $entity ); } @@ -650,6 +677,7 @@ function findDisplayEntityHTML ($message) { isset($message->header->entity_id)) { return 0; } + $entity = findDisplayEntityHTML($message->entities[$i]); if ($entity != 0) { return $entity; @@ -659,6 +687,46 @@ function findDisplayEntityHTML ($message) { return 0; } +function findAlternativeEntity ($message) { + global $show_html_default; + /* if we are dealing with alternative parts then we choose the best + * viewable message supported by SM. + */ + if ($show_html_default) { + $alt_order = array ('text/plain','text/html'); + } else { + $alt_order = array ('text/plain'); + } + $best_view = 0; + $ent_id = 0; + $k = 0; + for ($i = 0; $i < count($message->entities); $i ++) { + $type = $message->entities[$i]->header->type0.'/'.$message->entities[$i]->header->type1; + if ($type == 'multipart/related') { + $type = $message->entities[$i]->header->type; + } + for ($j = $k; $j < count($alt_order); $j++) { + if ($alt_order[$j] == $type && $j > $best_view) { + $best_view = $j; + $ent_id = $i; + $k = $j; + } + } + } + return $message->entities[$ent_id]; +} + +function findRelatedEntity ($message) { + $msgs = array(); + for ($i = 0; $i < count($message->entities); $i ++) { + $type = $message->entities[$i]->header->type0.'/'.$message->entities[$i]->header->type1; + if ($message->header->type == $type) { + $msgs[] = $message->entities[$i]; + } + } + return $msgs; +} + /* * translateText * Extracted from strings.php 23/03/2002 @@ -750,11 +818,11 @@ be displayed as the actual message in the HTML. It contains everything needed, including HTML Tags, Attachments at the bottom, etc. */ -function formatBody($imap_stream, $message, $color, $wrap_at) { +function formatBody($imap_stream, $message, $color, $wrap_at, $ent_num) { // this if statement checks for the entity to show as the // primary message. To add more of them, just put them in the // order that is their priority. - global $startMessage, $username, $key, $imapServerAddress, $imapPort, $body, + global $startMessage, $username, $key, $imapServerAddress, $imapPort, $show_html_default, $has_unsafe_images, $view_unsafe_images, $sort; $has_unsafe_images = 0; @@ -762,13 +830,12 @@ function formatBody($imap_stream, $message, $color, $wrap_at) { $id = $message->header->id; $urlmailbox = urlencode($message->header->mailbox); - // Get the right entity and redefine message to be this entity - // Pass the 0 to mean that we want the 'best' viewable one - $ent_num = findDisplayEntity ($message, 0); + $body_message = getEntity($message, $ent_num); if (($body_message->header->type0 == 'text') || ($body_message->header->type0 == 'rfc822')) { - $body = mime_fetch_body ($imap_stream, $id, $ent_num); + $body = mime_fetch_body ($imap_stream, $id, $ent_num); + $body = decodeBody($body, $body_message->header->encoding); $hookResults = do_hook("message_body", $body); $body = $hookResults[1]; @@ -779,12 +846,11 @@ function formatBody($imap_stream, $message, $color, $wrap_at) { $body = strip_tags( $body ); translateText($body, $wrap_at, $body_message->header->charset); } else { - $body = MagicHTML( $body, $id ); + $body = magicHTML( $body, $id, $message ); } } else { translateText($body, $wrap_at, $body_message->header->charset); } - $body .= "