X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fmime.php;h=9573299476485b30265996cdc405c229d91457e2;hb=a9e67ec391e80d1df7fe52c21d7f106ddc3c5583;hp=c8399e4643144a2321265bc1c371f2906056102f;hpb=ea48eb255bae656e7e429478abf8c5a3039ceed4;p=squirrelmail.git
diff --git a/functions/mime.php b/functions/mime.php
index c8399e46..95732994 100644
--- a/functions/mime.php
+++ b/functions/mime.php
@@ -1,542 +1,1603 @@
entities[count($this->entities)] = $msg;
- }
- }
+/**
+ * mime.php
+ *
+ * Copyright (c) 1999-2002 The SquirrelMail Project Team
+ * Licensed under the GNU GPL. For full terms see the file COPYING.
+ *
+ * This contains the functions necessary to detect and decode MIME
+ * messages.
+ *
+ * $Id$
+ */
+require_once('../functions/imap.php');
+require_once('../functions/attachment_common.php');
- /* --------------------------------------------------------------------------------- */
- /* MIME DECODING */
- /* --------------------------------------------------------------------------------- */
-
- /** This function gets the structure of a message and stores it in the "message" class.
- It will return this object for use with all relevant header information and
- fully parsed into the standard "message" object format.
- **/
- function mime_structure ($imap_stream, $header) {
- global $debug_mime;
- sqimap_messages_flag ($imap_stream, $header->id, $header->id, "Seen");
-
- $id = $header->id;
- fputs ($imap_stream, "a001 FETCH $id BODYSTRUCTURE\r\n");
- $read = fgets ($imap_stream, 10000);
- $read = strtolower($read);
-
- if ($debug_mime) echo "$read
";
- // isolate the body structure and remove beginning and end parenthesis
- $read = trim(substr ($read, strpos($read, "bodystructure") + 13));
- $read = trim(substr ($read, 0, -1));
- $end = mime_match_parenthesis(0, $read);
- while ($end == strlen($read)-1) {
- $read = trim(substr ($read, 0, -1));
- $read = trim(substr ($read, 1));
- $end = mime_match_parenthesis(0, $read);
- }
-
- if ($debug_mime) echo "$read
";
-
- $msg = mime_parse_structure ($read);
- $msg->header = $header;
- return $msg;
- }
+/* --------------------------------------------------------------------------------- */
+/* MIME DECODING */
+/* --------------------------------------------------------------------------------- */
- function mime_parse_structure ($structure, $ent_id) {
- global $debug_mime;
- if ($debug_mime) echo "START: mime_parse_structure()
";
- $msg = new message();
- if (substr($structure, 0, 1) == "(") {
- $ent_id = mime_new_element_level($ent_id);
- $start = $end = -1;
- if ($debug_mime) echo "
$structure
";
- do {
- if ($debug_mime) echo "Found entity...
";
- $start = $end+1;
- $end = mime_match_parenthesis ($start, $structure);
-
- $element = substr($structure, $start+1, ($end - $start)-1);
- $ent_id = mime_increment_id ($ent_id);
- $newmsg = mime_parse_structure ($element, $ent_id);
- $msg->addEntity ($newmsg);
- } while (substr($structure, $end+1, 1) == "(");
- } else {
- // parse the elements
- if ($debug_mime) echo "
$structure
";
- $msg = mime_get_element (&$structure, $msg, $ent_id);
- if ($debug_mime) echo "
";
- }
- return $msg;
- if ($debug_mime) echo " END: mime_parse_structure()
";
- }
+/* This function gets the structure of a message and stores it in the "message" class.
+ * It will return this object for use with all relevant header information and
+ * fully parsed into the standard "message" object format.
+ */
- // Increments the element ID. An element id can look like any of
- // the following: 1, 1.2, 4.3.2.4.1, etc. This function increments
- // the last number of the element id, changing 1.2 to 1.3.
- function mime_increment_id ($id) {
- global $debug_mime;
- if (strpos($id, ".")) {
- $first = substr($id, 0, strrpos($id, "."));
- $last = substr($id, strrpos($id, ".")+1);
- $last++;
- $new = $first . "." .$last;
- } else {
- $new = $id + 1;
- }
- if ($debug_mime) echo "INCREMENT: $new
";
- return $new;
- }
+function mime_structure ($bodystructure, $flags=array()) {
+
+ // isolate the body structure and remove beginning and end parenthesis
+ $read = trim(substr ($bodystructure, strpos(strtolower($bodystructure), 'bodystructure') + 13));
+ $msg = &new message();
+ $read = trim(substr ($read, 0, -1));
+ $res = $msg->parseStructure($read);
+ $msg = $res[0];
+ $msg->setEnt('0');
+ if (count($flags)) {
+ foreach ($flags as $flag) {
+ $char = strtoupper($flag{1});
+ switch ($char) {
+ case 'S':
+ if (strtolower($flag) == '\\seen') {
+ $msg->is_seen = true;
+ }
+ break;
+ case 'A':
+ if (strtolower($flag) == '\\answered') {
+ $msg->is_answered = true;
+ }
+ break;
+ case 'D':
+ if (strtolower($flag) == '\\deleted') {
+ $msg->is_deleted = true;
+ }
+ break;
+ case 'F':
+ if (strtolower($flag) == '\\flagged') {
+ $msg->is_flagged = true;
+ }
+ break;
+ case 'M':
+ if (strtolower($flag) == '$mdnsent') {
+ $msg->is_mdnsent = true;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ // listEntities($msg);
+ return( $msg );
+}
+
+/* this starts the parsing of a particular structure. It is called recursively,
+ * so it can be passed different structures. It returns an object of type
+ * $message.
+ * First, it checks to see if it is a multipart message. If it is, then it
+ * handles that as it sees is necessary. If it is just a regular entity,
+ * then it parses it and adds the necessary header information (by calling out
+ * to mime_get_elements()
+ */
+
+function mime_fetch_body($imap_stream, $id, $ent_id) {
+ global $uid_support;
+ /*
+ * do a bit of error correction. If we couldn't find the entity id, just guess
+ * that it is the first one. That is usually the case anyway.
+ */
+ if (!$ent_id) {
+ $ent_id = 1;
+ }
+ $cmd = "FETCH $id BODY[$ent_id]";
+
+ $data = sqimap_run_command ($imap_stream, $cmd, true, $response, $message, $uid_support);
+ do {
+ $topline = trim(array_shift( $data ));
+ } while( $topline && $topline[0] == '*' && !preg_match( '/\* [0-9]+ FETCH.*/i', $topline )) ;
+
+ $wholemessage = implode('', $data);
+ if (ereg('\\{([^\\}]*)\\}', $topline, $regs)) {
+
+ $ret = substr( $wholemessage, 0, $regs[1] );
+ /*
+ There is some information in the content info header that could be important
+ in order to parse html messages. Let's get them here.
+ */
+ if ( $ret{0} == '<' ) {
+ $data = sqimap_run_command ($imap_stream, "FETCH $id BODY[$ent_id.MIME]", true, $response, $message, $uid_support);
+ }
+ } else if (ereg('"([^"]*)"', $topline, $regs)) {
+ $ret = $regs[1];
+ } else {
+ global $where, $what, $mailbox, $passed_id, $startMessage;
+ $par = 'mailbox=' . urlencode($mailbox) . "&passed_id=$passed_id";
+ if (isset($where) && isset($what)) {
+ $par .= '&where='. urlencode($where) . "&what=" . urlencode($what);
+ } else {
+ $par .= "&startMessage=$startMessage&show_more=0";
+ }
+ $par .= '&response=' . urlencode($response) .
+ '&message=' . urlencode($message).
+ '&topline=' . urlencode($topline);
+
+ echo '
' .
+ '' .
+ ' ' .
+ '' .
+ _("Body retrieval error. The reason for this is most probably that the message is malformed. Please help us making future versions better by submitting this message to the developers knowledgebase!") .
+ "
" .
+ _("Submit message") . '
' .
+ '' . _("Command:") . " $cmd " .
+ '' . _("Response:") . " $response " .
+ '' . _("Message:") . " $message " .
+ '' . _("FETCH line:") . " $topline " .
+ "
' . implode("\n", $body_ary) . ''; +} + + +/* This returns a parsed string called $body. That string can then +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, $ent_num, $id, $mailbox='INBOX') { + // 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, + $show_html_default, $has_unsafe_images, $view_unsafe_images, $sort; + + $has_unsafe_images= 0; + $body = ''; + $urlmailbox = urlencode($mailbox); + $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); + $hookResults = do_hook("message_body", $body); + $body = $hookResults[1]; + + // If there are other types that shouldn't be formatted, add + // them here + + if ($body_message->header->type1 == 'html') { + if ( $show_html_default <> 1 ) { + $entity_conv = array(' ' => ' ', + '>' => '>', + '<' => '<'); + $body = strip_tags( $body ); + $body = strtr($body, $entity_conv); + $body = trim($body); + translateText($body, $wrap_at, + $body_message->header->getParameter('charset')); + } else { + $body = magicHTML( $body, $id, $message, $mailbox ); + } + } else { + translateText($body, $wrap_at, + $body_message->header->getParameter('charset')); + } + + if ($has_unsafe_images) { + if ($view_unsafe_images) { + $body .= "
"; - $body .= "ATTACHMENTS:"; - $body .= " |
"; - $num = 0; - - /** make this recurisve at some point **/ - $body .= formatAttachments ($message, $ent_num, $message->header->mailbox, $id); - $body .= " |