X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fmime.php;h=13a453a9ef89983746d790814344a98011d778c9;hb=66488126ca870faca2630ee5693f15f3423fa662;hp=765e140d30fffd8c5de4af6fbb1d4c703b8c9fce;hpb=8d8ab69aaf81e9fdd15396c783f0e40e698e839f;p=squirrelmail.git diff --git a/functions/mime.php b/functions/mime.php index 765e140d..13a453a9 100644 --- a/functions/mime.php +++ b/functions/mime.php @@ -23,10 +23,10 @@ /** msg_header contains generic variables for values that **/ /** could be in a header. **/ - var $type0, $type1, $boundary, $charset, $encoding; + var $type0, $type1, $boundary, $charset, $encoding, $size; var $to, $from, $date, $cc, $bcc, $reply_to, $subject; var $id, $mailbox, $description; - var $entity_id, $message_id; + var $entity_id, $message_id, $charset; } class message { @@ -59,12 +59,18 @@ $id = $header->id; fputs ($imap_stream, "a001 FETCH $id BODYSTRUCTURE\r\n"); $read = fgets ($imap_stream, 10000); - $endline = fgets($imap_stream, 1024); - $read = strtolower($read); + $response = substr($read, 0, 4); + while ($response != "a001") { + $bodystructure .= $read; + $read = fgets ($imap_stream, 10000); + $response = substr($read, 0, 4); + } + // $read = strtolower($bodystructure); + $read = $bodystructure; - if ($debug_mime) echo "$read

"; + if ($debug_mime) echo "$read

\n"; // isolate the body structure and remove beginning and end parenthesis - $read = trim(substr ($read, strpos($read, "bodystructure") + 13)); + $read = trim(substr ($read, strpos(strtolower($read), "bodystructure") + 13)); $read = trim(substr ($read, 0, -1)); $end = mime_match_parenthesis(0, $read); while ($end == strlen($read)-1) { @@ -73,9 +79,9 @@ $end = mime_match_parenthesis(0, $read); } - if ($debug_mime) echo "$read

"; + if ($debug_mime) echo "$read

\n"; - $msg = mime_parse_structure ($read); + $msg = mime_parse_structure ($read, 0); $msg->header = $header; return $msg; } @@ -89,7 +95,7 @@ // to mime_get_elements() function mime_parse_structure ($structure, $ent_id) { global $debug_mime; - if ($debug_mime) echo "START: mime_parse_structure()
"; + if ($debug_mime) echo "START: mime_parse_structure()
\n"; $msg = new message(); if (substr($structure, 0, 1) == "(") { $ent_id = mime_new_element_level($ent_id); @@ -155,7 +161,7 @@ $structure = trim($structure); $char = substr($structure, 0, 1); - if (substr($structure, 0, 3) == "nil") { + if (strtolower(substr($structure, 0, 3)) == "nil") { $text = ""; $structure = substr($structure, 3); } else if ($char == "\"") { @@ -190,20 +196,20 @@ // This is where all the text parts get put into the header switch ($elem_num) { case 1: - $msg->header->type0 = $text; - if ($debug_mime) echo "type0 = $text
"; + $msg->header->type0 = strtolower($text); + if ($debug_mime) echo "type0 = ".strtolower($text)."
"; break; case 2: - $msg->header->type1 = $text; - if ($debug_mime) echo "type1 = $text
"; + $msg->header->type1 = strtolower($text); + if ($debug_mime) echo "type1 = ".strtolower($text)."
"; break; case 5: $msg->header->description = $text; if ($debug_mime) echo "description = $text
"; break; case 6: - $msg->header->encoding = $text; - if ($debug_mime) echo "encoding = $text
"; + $msg->header->encoding = strtolower($text); + if ($debug_mime) echo "encoding = ".strtolower($text)."
"; break; case 7: $msg->header->size = $text; @@ -255,6 +261,7 @@ if ($debug_mime) echo "".$properties[$i]["name"]." = " . $properties[$i]["value"] . "
"; } } + return $msg; } @@ -300,7 +307,7 @@ $structure = trim(substr($structure, strlen($tmp) + 2)); $k = count($props); - $props[$k]["name"] = $tmp; + $props[$k]["name"] = strtolower($tmp); $props[$k]["value"] = $value; } else if ($char == "(") { $end = mime_match_parenthesis (0, $structure); @@ -330,11 +337,19 @@ $char = substr($structure, $pos, 1); // ignore all extra characters + // If inside of a string, skip string -- Boundary IDs and other + // things can have ) in them. while ($pos < strlen($structure)) { $pos++; $char = substr($structure, $pos, 1); if ($char == ")") { return $pos; + } else if ($char == '"') { + $pos ++; + while (substr($structure, $pos, 1) != '"' && + $pos < strlen($structure)) { + $pos ++; + } } else if ($char == "(") { $pos = mime_match_parenthesis ($pos, $structure); } @@ -348,10 +363,13 @@ fputs ($imap_stream, "a001 FETCH $id BODY[$ent_id]\r\n"); $topline = fgets ($imap_stream, 1024); - $size = substr ($topline, strpos($topline, "{")+1); - $size = substr ($size, 0, strpos($size, "}")); - $read = fread ($imap_stream, $size); - return $read; + if (ereg('\{([^\}]*)\}', $topline, $regs)) { + return fread ($imap_stream, $regs[1]); + } + else if (ereg('"([^"]*)"', $topline, $regs)) { + return $regs[1]; + } + return "Body retrival error, please report this bug!\n\nTop line is \"$topline\"\n"; } /* -[ END MIME DECODING ]----------------------------------------------------------- */ @@ -421,32 +439,35 @@ // 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 $username, $key, $imapServerAddress, $imapPort; + global $startMessage, $username, $key, $imapServerAddress, $imapPort; $id = $message->header->id; $urlmailbox = urlencode($message->header->mailbox); + // Get the right entity and redefine message to be this entity $ent_num = findDisplayEntity ($message); - $body = mime_fetch_body ($imap_stream, $id, $ent_num); - - // If there are other types that shouldn't be formatted, add - // them here - if ($message->header->type1 != "html") { - $body = translateText($body, $wrap_at, $charset); - } - - $body .= "
". _("Download this as a file") ."

"; - - /** Display the ATTACHMENTS: message if there's more than one part **/ - if ($message->entities) { - $body .= "
"; - $body .= "ATTACHMENTS:"; - $body .= "
"; - $num = 0; - - /** make this recurisve at some point **/ - $body .= formatAttachments ($message, $ent_num, $message->header->mailbox, $id); + $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 = decodeBody($body, $body_message->header->encoding); + + // If there are other types that shouldn't be formatted, add + // them here + if ($body_message->header->type1 != "html") { + translateText($body, $wrap_at, $body_message->header->charset); + } + + $body .= "
". _("Download this as a file") ."

"; + + /** Display the ATTACHMENTS: message if there's more than one part **/ $body .= "
"; + if ($message->entities) { + $body .= formatAttachments ($message, $ent_num, $message->header->mailbox, $id); + } + } else { + $body .= formatAttachments ($message, -1, $message->header->mailbox, $id); } return $body; } @@ -454,13 +475,35 @@ // A recursive function that returns a list of attachments with links // to where to download these attachments function formatAttachments ($message, $ent_id, $mailbox, $id) { + global $where, $what; + global $startMessage, $color; + static $ShownHTML; + + if ($ShownHTML == 0) + { + $ShownHTML = 1; + + $body .= "\n"; + $body .= "
\n"; + $body .= _('Attachments') . ':'; + $body .= "
\n"; + + $body .= "\n"; + + $body .= formatAttachments ($message, $ent_id, $mailbox, $id); + + $body .= "
"; + + return $body; + } + if ($message) { if (!$message->entities) { $type0 = strtolower($message->header->type0); $type1 = strtolower($message->header->type1); if ($message->header->entity_id != $ent_id) { - $filename = $message->header->filename; + $filename = decodeHeader($message->header->filename); if (trim($filename) == "") { $display_filename = "untitled-".$message->header->entity_id; } else { @@ -469,17 +512,51 @@ $urlMailbox = urlencode($mailbox); $ent = urlencode($message->header->entity_id); - $body .= "   " . $display_filename . "  (TYPE: $type0/$type1)"; + + $DefaultLink = + "../src/download.php?startMessage=$startMessage&passed_id=$id&mailbox=$urlMailbox&passed_ent_id=$ent"; + if ($where && $what) + $DefaultLink .= '&where=' . urlencode($where) . '&what=' . urlencode($what); + $Links['download link']['text'] = _('download'); + $Links['download link']['href'] = + "../src/download.php?absolute_dl=true&passed_id=$id&mailbox=$urlMailbox&passed_ent_id=$ent"; + $ImageURL = ''; + + $HookResults = do_hook("attachment $type0/$type1", $Links, + $startMessage, $id, $urlMailbox, $ent, $DefaultLink, + $display_filename, $where, $what); + + $Links = $HookResults[1]; + $DefaultLink = $HookResults[6]; + + $body .= '  '; + $body .= "$display_filename "; + $body .= '' . show_readable_size($message->header->size) . + '  '; + $body .= "[ $type0/$type1 ] "; + $body .= ''; if ($message->header->description) - $body .= "  " . htmlspecialchars($message->header->description).""; - if ($message->header->type0 == "image" && - ($message->header->type1 == "jpg" || - $message->header->type1 == "jpeg" || - $message->header->type1 == "gif" || - $message->header->type1 == "png")) - $body .= " ("._("view").")\n"; - $body .= "
"; - $num++; + $body .= '' . htmlspecialchars($message->header->description) . ''; + $body .= '
 '; + + + $SkipSpaces = 1; + foreach ($Links as $Val) + { + if ($SkipSpaces) + { + $SkipSpaces = 0; + } + else + { + $body .= '  |  '; + } + $body .= '' . $Val['text'] . ''; + } + + unset($Links); + + $body .= "\n"; } return $body; } else { @@ -494,6 +571,7 @@ /** this function decodes the body depending on the encoding type. **/ function decodeBody($body, $encoding) { + $body = str_replace("\r\n", "\n", $body); $encoding = strtolower($encoding); if ($encoding == "quoted-printable") { @@ -519,6 +597,11 @@ $replace = base64_decode($res[3]); } else { $replace = ereg_replace("_", " ", $res[3]); + // Convert lowercase Quoted Printable to uppercase for + // quoted_printable_decode to understand it. + while (ereg("(=([0-9][a-f])|([a-f][0-9])|([a-f][0-9]))", $replace, $res)) { + $replace = str_replace($res[1], strtoupper($res[1]), $replace); + } $replace = quoted_printable_decode($replace); } @@ -540,7 +623,7 @@ global $default_charset; // Encode only if the string contains 8-bit characters or =? - if (ereg("([\200-\377])|=\\?", $string)) { + if (ereg("([\200-\377]|=\\?)", $string)) { $newstring = "=?$default_charset?Q?"; // First the special characters