X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=functions%2Fmime.php;h=8186b747961b2dc1f2fa98a930de0f5ce9eebd8d;hb=4809f4894f2e81992b5e172aacb3e337da29e615;hp=aabd9cd88ec5ea5f2faad34127325f6fe77cf212;hpb=14d10786d1a604815a1867805143e4b279737bc0;p=squirrelmail.git diff --git a/functions/mime.php b/functions/mime.php index aabd9cd8..8186b747 100644 --- a/functions/mime.php +++ b/functions/mime.php @@ -5,111 +5,190 @@ **/ - function decodeMime($body, $bound, $type0, $type1) { - echo "$type0/$type1
"; + /** This is the first function called. It decides if this is a multipart + message or if it should be handled as a single entity + **/ + function decodeMime($body, $bound, $type0, $type1, &$entities) { if ($type0 == "multipart") { - if ($body[0] == "") - $i = 1; - else - $i = 0; - $bound = trim($bound); - $bound = "--$bound"; - while ($i < count($body)) { - if (trim($body[$i]) == $bound) { - $j = $i + 1; + while (($i < count($body)) && (substr($body[$i], 0, strlen("--$bound--")) != "--$bound--")) { + if (trim($body[$i]) == "--$bound") { + $j = $i+1; $p = 0; - while (substr(trim($body[$j]), 0, strlen($bound)) != $bound) { - $entity_body[$p] = $body[$j]; + /** Lets find the header for this entity **/ + /** If the first line after the boundary is blank, we use default values **/ + if (trim($body[$j]) == "") { + $ent_type0 = "text"; + $ent_type1 = "plain"; + $charset = "us-ascii"; $j++; - $p++; + /** If the first line ISNT blank, read in the header for this entity **/ + } else { + while ((substr(trim($body[$j]), 0, strlen("--$bound")) != "--$bound") && (trim($body[$j]) != "")) { + $entity_header[$p] = $body[$j]; + $j++; + $p++; + } + /** All of these values are getting passed back to us **/ + fetchEntityHeader($imapConnection, $entity_header, $ent_type0, $ent_type1, $ent_bound, $encoding, $charset, $filename); } - fetchEntityHeader($imapConnection, $entity_body, $ent_type0, $ent_type1, $ent_bound, &$encoding, &$charset); - $entity = getEntity($entity_body, $ent_bound, $ent_type0, $ent_type1, $encoding, $charset); - $q = count($full_message); - $full_message[$q] = $entity[0]; + + /** OK, we have the header information, now lets decide what to do with it **/ + if ($ent_type0 == "multipart") { + $y = 0; + while (substr($body[$j], 0, strlen("--$bound--")) != "--$bound--") { + $ent_body[$y] = $body[$j]; + $y++; + $j++; + } + $ent = decodeMime($ent_body, $ent_bound, $ent_type0, $ent_type1, $entities); + $entities = $ent; + } else if ($ent_type0 == "text") { + while (substr(trim($body[$j]), 0, strlen("--$bound")) != "--$bound") { + $entity_body[$p] = $body[$j]; + $j++; + $p++; + } + $count = count($entities); + $entities[$count] = getEntity($entity_body, $ent_bound, $ent_type0, $ent_type1, $encoding, $charset, $filename); + + } else { + $j++; + $entity_body = ""; + while (substr(trim($body[$j]), 0, strlen("--$bound")) != "--$bound") { + $entity_body .= $body[$j]; + $j++; + } + $count = count($entities); + $entities[$count] = getEntity($entity_body, $ent_bound, $ent_type0, $ent_type1, $encoding, $charset, $filename); + } } $i++; } } else { - $full_message = getEntity($body, $bound, $type0, $type1); + $count = count($entities); + $entities[$count] = getEntity($body, $bound, $type0, $type1, $encoding, $charset, $filename); } - return $full_message; + return $entities; } /** This gets one entity's properties **/ - function getEntity($body, $bound, $type0, $type1, $encoding, $charset) { - echo "$type0/$type1
"; - $msg[0]["TYPE0"] = $type0; - $msg[0]["TYPE1"] = $type1; - $msg[0]["ENCODING"] = $encoding; - $msg[0]["CHARSET"] = $charset; + function getEntity($body, $bound, $type0, $type1, $encoding, $charset, $filename) { + $msg["TYPE0"] = $type0; + $msg["TYPE1"] = $type1; + $msg["ENCODING"] = $encoding; + $msg["CHARSET"] = $charset; + $msg["FILENAME"] = $filename; + $msg["BODY"][0] = $body; if ($type0 == "text") { + // error correcting if they didn't follow RFC standards + if (trim($type1) == "") + $type1 = "plain"; + if ($type1 == "plain") { - $msg[0]["PRIORITY"] = 10; for ($p = 0;$p < count($body);$p++) { - $msg[0]["BODY"][$p] = parsePlainTextMessage($body[$p]); + $msg["BODY"][$p] = parsePlainTextMessage($body[$p]); } } else if ($type1 == "html") { - $msg[0]["PRIORITY"] = 20; - $msg[0]["BODY"] = $body; + for ($p = 0;$p < count($body);$p++) { + $msg["BODY"][$p] = parseHTMLMessage($body[$p]); + } } else { - $msg[0]["PRIORITY"] = 1; - $msg[0]["BODY"][0] = "This attachment is an unknown text format: $type0/$type1"; + $msg["BODY"] = $body; } - } else if ($type0 == "image") { - $msg[0]["BODY"][0] = "This is an image. Squirrelmail currently cannot decode images."; } else { - $msg[0]["BODY"][0] = "This attachment is of an unknown format: $type0/$type1"; + $msg["BODY"][0] = $body; } return $msg; } + /** This will check whether or not the message contains a certain type. It + searches through all the entities for a match. + **/ + function containsType($message, $type0, $type1, &$ent_num) { + $type0 = strtolower($type0); + $type1 = strtolower($type1); + for ($i = 0; $i < count($message["ENTITIES"]); $i++) { + /** Check only on type0 **/ + if ( $type1 == "any_type" ) { + if ( ($message["ENTITIES"][$i]["TYPE0"] == $type0) ) { + $ent_num = $i; + return true; + } + + /** Check on type0 and type1 **/ + } else { + if ( ($message["ENTITIES"][$i]["TYPE0"] == $type0) && ($message["ENTITIES"][$i]["TYPE1"] == $type1) ) { + $ent_num = $i; + return true; + } + } + } + return false; + } + + /** 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($message) { - for ($i=0; $i < count($message["ENTITIES"]); $i++) { - if ($message["ENTITIES"][$i]["TYPE0"] == "text") { - if ($message["ENTITIES"][$i]["PRIORITY"] > $priority) - $priority = $message["ENTITIES"][$i]["PRIORITY"]; + /** 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. + **/ + if (containsType($message, "text", "html", $ent_num)) { + $body = decodeBody($message["ENTITIES"][$ent_num]["BODY"], $message["ENTITIES"][$ent_num]["ENCODING"]); + } else if (containsType($message, "text", "plain", $ent_num)) { + $body = decodeBody($message["ENTITIES"][$ent_num]["BODY"], $message["ENTITIES"][$ent_num]["ENCODING"]); + } + // add other primary displaying message types here + else { + // find any type that's displayable + if (containsType($message, "text", "any_type", $ent_num)) { + $body = decodeBody($message["ENTITIES"][$ent_num]["BODY"], $message["ENTITIES"][$ent_num]["ENCODING"]); + } else if (containsType($message, "message", "any_type", $ent_num)) { + $body = decodeBody($message["ENTITIES"][$ent_num]["BODY"], $message["ENTITIES"][$ent_num]["ENCODING"]); } } - for ($i = 0; $i < count($message["ENTITIES"]); $i++) { - switch ($priority) { - /** HTML **/ - case 20: for ($i=0; $i < count($message["ENTITIES"]); $i++) { - if (($message["ENTITIES"][$i]["TYPE0"] == "text") && ($message["ENTITIES"][$i]["TYPE1"] == "html")) { - $body = decodeBody($message["ENTITIES"][$i]["BODY"], $message["ENTITIES"][$i]["ENCODING"]); - } - } - break; - /** PLAIN **/ - case 10: for ($i=0; $i < count($message["ENTITIES"]); $i++) { - if (($message["ENTITIES"][$i]["TYPE0"] == "text") && ($message["ENTITIES"][$i]["TYPE1"] == "plain")) { - $body = decodeBody($message["ENTITIES"][$i]["BODY"], $message["ENTITIES"][$i]["ENCODING"]); - } - } - break; - /** UNKNOWN...SEND WHAT WE GOT **/ - case 1: for ($i=0; $i < count($message["ENTITIES"]); $i++) { - if (($message["ENTITIES"][$i]["TYPE0"] == "text")) { - $pos = count($body); - for ($b=0; $b < count($message["ENTITIES"][$i]["BODY"]); $b++) { - $pos = $pos + $b; - $body[$pos] = $message["ENTITIES"][$i]["BODY"][$b]; - } - } - } - break; + /** Display the ATTACHMENTS: message if there's more than one part **/ + if (count($message["ENTITIES"]) > 1) { + $pos = count($body); + $body[$pos] .= "
ATTACHMENTS:
"; + $num = 0; + + for ($i = 0; $i < count($message["ENTITIES"]); $i++) { + /** If we've displayed this entity, go to the next one **/ + if ($ent_num == $i) + continue; + + $type0 = strtolower($message["ENTITIES"][$i]["TYPE0"]); + $type1 = strtolower($message["ENTITIES"][$i]["TYPE1"]); + + $num++; + $filename = $message["ENTITIES"][$i]["FILENAME"]; + if (trim($filename) == "") { + $filename = "UNKNOWN_FORMAT_" . time() . $i; + $display_filename = "Attachment $i"; + } else { + $display_filename = $filename; + } + + $urlMailbox = urlencode($message["INFO"]["MAILBOX"]); + $id = $message["INFO"]["ID"]; + $body[$pos] .= "   " . $display_filename . "  (TYPE: $type0/$type1)
"; } } return $body; } + + + /** this function decodes the body depending on the encoding type. **/ function decodeBody($body, $encoding) { $encoding = strtolower($encoding); if ($encoding == "us-ascii") { @@ -129,6 +208,8 @@ $body[$q] = ereg_replace("=3D", "=", $body[$q]); } $newbody = $body; + } else if ($encoding == "base64") { + $newbody = base64_decode($body); } else { $newbody = $body; }