X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fmime.php;h=1419d58854dd7a859d3140abc07a842c07a9886a;hb=da1b55add6a9207dfd72e141e2fe4ec74cf26e3e;hp=33b829c40218473d2f66e336cd95090333031e7a;hpb=43d678b68375c0516121d5a9780d40b6885c4089;p=squirrelmail.git
diff --git a/functions/mime.php b/functions/mime.php
index 33b829c4..989018ae 100644
--- a/functions/mime.php
+++ b/functions/mime.php
@@ -1,1202 +1,974 @@
entities[] = $msg;
- }
-}
-
-/* --------------------------------------------------------------------------------- */
-/* MIME DECODING */
-/* --------------------------------------------------------------------------------- */
+* mime.php
+*
+* Copyright (c) 1999-2005 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.
+*
+* @version $Id$
+* @package squirrelmail
+*/
-/* 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) {
+/** The typical includes... */
+require_once(SM_PATH . 'functions/imap.php');
+require_once(SM_PATH . 'functions/attachment_common.php');
- $ssid = sqimap_session_id();
- $lsid = strlen( $ssid );
- $id = $header->id;
- fputs ($imap_stream, "$ssid FETCH $id BODYSTRUCTURE\r\n");
- //
- // This should use sqimap_read_data instead of reading it itself
- //
- $read = fgets ($imap_stream, 9216);
- $bodystructure = '';
- while ( substr($read, 0, $lsid) <> $ssid &&
- !feof( $imap_stream ) ) {
- $bodystructure .= $read;
- $read = fgets ($imap_stream, 9216);
- }
- $read = $bodystructure;
+/* -------------------------------------------------------------------------- */
+/* MIME DECODING */
+/* -------------------------------------------------------------------------- */
- // isolate the body structure and remove beginning and end parenthesis
- $read = trim(substr ($read, strpos(strtolower($read), 'bodystructure') + 13));
+/**
+* Get the MIME 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.
+*/
+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));
$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);
- }
-
- $msg = mime_parse_structure ($read, 0);
- $msg->header = $header;
-
- 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_parse_structure ($structure, $ent_id) {
- global $mailbox;
- $properties = array();
- $msg = new message();
- if ($structure{0} == '(') {
- $old_ent_id = $ent_id;
- $ent_id = mime_new_element_level($ent_id);
- $start = $end = -1;
- do {
- $start = $end+1;
- $end = mime_match_parenthesis ($start, $structure);
-
- /* check if we are dealing with a new entity-level */
- $i = strrpos($ent_id,'.');
- if ($i>0) {
- $ent = substr($ent_id, $i+1);
- } else {
- $ent = '';
- }
- /* add "forgotten" parent entities (alternative and relative) */
- if ($ent == '0') {
- /* new entity levels have information about the type (type1) and
- * the properties. This information is situated at the end of the
- * structure string like for example (example between the brackets)
- * [ "RELATED" ("BOUNDARY" "myboundary" "TYPE" "plain/html") ]
- */
-
- /* get the involved properties for parsing to mime_get_properties */
- $startprop = strrpos($structure,'(');
- $properties_str = substr($structure,$startprop);
- $endprop = mime_match_parenthesis ($startprop, $structure);
- $propstr = substr($structure, $startprop + 1, ($endprop - $startprop)-1);
- /* cut off the used properties */
- if ($startprop) {
- $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));
- }
-
- /* process the found information */
- $properties = mime_get_props($properties, $properties_str);
- if (count($properties)>0) {
- $msg->header->entity_id = $old_ent_id;
- $msg->header->type0 = 'multipart';
- $msg->header->type1 = $type1;
- for ($i=0; $i < count($properties); $i++) {
- $msg->header->{$properties[$i]['name']} = $properties[$i]['value'];
- }
- }
- $structure = $structure . ' ' . $structure_end;
- }
- $element = substr($structure, $start+1, ($end - $start)-1);
- $ent_id = mime_increment_id ($ent_id);
- $newmsg = mime_parse_structure ($element, $ent_id);
- /* set mailbox in case of message/rfc822 entities */
- if (isset($newmsg->header->type0) && isset($newmsg->header->type1)) {
- if ($newmsg->header->type0 == 'message' && $newmsg->header->type1 == 'rfc822') {
- $newmsg->header->mailbox=$mailbox;
- }
- }
- $msg->addEntity ($newmsg);
-
- } while ($structure{$end+1} == '(');
- } else {
- // parse the elements
- $msg = mime_get_element ($structure, $msg, $ent_id);
- }
- return $msg;
-}
-
-
-/* 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) {
-
- if (strpos($id, '.')) {
- $first = substr($id, 0, strrpos($id, '.'));
- $last = substr($id, strrpos($id, '.')+1);
- $last++;
- $new = $first . '.' .$last;
- } else {
- $new = $id + 1;
- }
-
- return $new;
-}
-
-/*
- * See comment for mime_increment_id().
- * This adds another level on to the entity_id changing 1.3 to 1.3.0
- * NOTE: 1.3.0 is not a valid element ID. It MUST be incremented
- * before it can be used. I left it this way so as not to have
- * to make a special case if it is the first entity_id. It
- * always increments it, and that works fine.
- */
-function mime_new_element_level ($id) {
-
- if (!$id) {
- $id = 0;
- } else {
- $id = $id . '.0';
+ $i = 0;
+ $msg = Message::parseStructure($read,$i);
+ if (!is_object($msg)) {
+ include_once(SM_PATH . 'functions/display_messages.php');
+ global $color, $mailbox;
+ /* removed urldecode because $_GET is auto urldecoded ??? */
+ displayPageHeader( $color, $mailbox );
+ $errormessage = _("SquirrelMail could not decode the bodystructure of the message");
+ $errormessage .= '
'._("the provided bodystructure by your imap-server").':
';
+ $errormessage .= '
' . htmlspecialchars($read) . ''; + plain_error_message( $errormessage, $color ); + echo '