Added missing ';' in ISO-8859-1
[squirrelmail.git] / functions / mime.php
index f56f54d86db02e3c159750b50852ad48444ea982..13a453a9ef89983746d790814344a98011d778c9 100644 (file)
@@ -23,7 +23,7 @@
       /** 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, $charset;
       $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);
          }
 
       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 ]----------------------------------------------------------- */
       // Get the right entity and redefine message to be this entity
       $ent_num = findDisplayEntity ($message);
       $body_message = getEntity($message, $ent_num);
-
-      $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 ($message->header->type1 != "html") {   
-         $body = translateText($body, $wrap_at, $body_message->header->charset);
-      }   
-
-      $body .= "<SMALL><CENTER><A HREF=\"../src/download.php?absolute_dl=true&passed_id=$id&passed_ent_id=$ent_num&mailbox=$urlmailbox\">". _("Download this as a file") ."</A></CENTER><BR></SMALL>";
-
-      /** Display the ATTACHMENTS: message if there's more than one part **/
-      if ($message->entities) {
-         $body .= "</TD></TR></TABLE>";
-         $body .= "<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=4 BORDER=0><TR><TD BGCOLOR=\"$color[0]\">";
-         $body .= "<TT><B>ATTACHMENTS:</B></TT>";
-         $body .= "</TD></TR><TR><TD BGCOLOR=\"$color[0]\">";
-         $num = 0;
-
-         $body .= formatAttachments ($message, $ent_num, $message->header->mailbox, $id);
+      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 .= "<SMALL><CENTER><A HREF=\"../src/download.php?absolute_dl=true&passed_id=$id&passed_ent_id=$ent_num&mailbox=$urlmailbox\">". _("Download this as a file") ."</A></CENTER><BR></SMALL>";
+   
+         /** Display the ATTACHMENTS: message if there's more than one part **/
          $body .= "</TD></TR></TABLE>";
+         if ($message->entities) {
+            $body .= formatAttachments ($message, $ent_num, $message->header->mailbox, $id);
+         }
       } else {
-         $body .= "</TD></TR></TABLE>";
+         $body .= formatAttachments ($message, -1, $message->header->mailbox, $id);
       }
       return $body;
    }
    // to where to download these attachments
    function formatAttachments ($message, $ent_id, $mailbox, $id) {
       global $where, $what;
-      global $startMessage;
+      global $startMessage, $color;
+      static $ShownHTML;
+      
+      if ($ShownHTML == 0)
+      {
+            $ShownHTML = 1;
+            
+            $body .= "<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=2 BORDER=0 BGCOLOR=\"$color[0]\"><TR>\n";
+            $body .= "<TH ALIGN=\"left\" BGCOLOR=\"$color[9]\"><B>\n";
+            $body .= _('Attachments') . ':';
+            $body .= "</B></TH></TR><TR><TD>\n";
+            
+            $body .= "<TABLE CELLSPACING=0 CELLPADDING=1 BORDER=0>\n";
+            
+            $body .= formatAttachments ($message, $ent_id, $mailbox, $id);
+            
+            $body .= "</TABLE></TD></TR></TABLE>";
+            
+            return $body;
+      }
+      
       if ($message) {
          if (!$message->entities) {
             $type0 = strtolower($message->header->type0);
    
                $urlMailbox = urlencode($mailbox);
                $ent = urlencode($message->header->entity_id);
-               if ($where && $what) {   
-                  // from a search
-                  $body .= "<TT>&nbsp;&nbsp;&nbsp;<A HREF=\"../src/download.php?startMessage=$startMessage&where=".urlencode($where)."&what=".urlencode($what)."&passed_id=$id&mailbox=$urlMailbox&passed_ent_id=$ent\">" . $display_filename . "</A>&nbsp;&nbsp;(TYPE: $type0/$type1)";
-               } else {   
-                  $body .= "<TT>&nbsp;&nbsp;&nbsp;<A HREF=\"../src/download.php?startMessage=$startMessage&passed_id=$id&mailbox=$urlMailbox&passed_ent_id=$ent\">" . $display_filename . "</A>&nbsp;&nbsp;(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 .= '<TR><TD>&nbsp;&nbsp;</TD><TD>';
+               $body .= "<A HREF=\"$DefaultLink\">$display_filename</A>&nbsp;</TD>";
+               $body .= '<TD><SMALL><b>' . show_readable_size($message->header->size) . 
+                   '</b>&nbsp;&nbsp;</small></TD>';
+               $body .= "<TD><SMALL>[ $type0/$type1 ]&nbsp;</SMALL></TD>";
+               $body .= '<TD><SMALL>';
                if ($message->header->description)
-                  $body .= "&nbsp;&nbsp;<b>" . htmlspecialchars($message->header->description)."</b>";
-               $body .= "&nbsp;(<a href=\"../src/download.php?absolute_dl=true&passed_id=$id&mailbox=$urlMailbox&passed_ent_id=$ent\">"._("download")."</a>)\n";     
-               do_hook("attachment $type0/$type1");
-               $body .= "</TT><BR>";
-               $num++;
+                  $body .= '<b>' . htmlspecialchars($message->header->description) . '</b>';
+               $body .= '</SMALL></TD><TD><SMALL>&nbsp;';
+               
+               
+               $SkipSpaces = 1;
+               foreach ($Links as $Val)
+               {
+                  if ($SkipSpaces)
+                  {
+                     $SkipSpaces = 0;
+                  }
+                  else
+                  {
+                     $body .= '&nbsp;&nbsp;|&nbsp;&nbsp;';
+                  }
+                  $body .= '<a href="' . $Val['href'] . '">' .  $Val['text'] . '</a>';
+               }
+               
+               unset($Links);
+               
+               $body .= "</SMALL></TD></TR>\n";
             }
             return $body;
          } else {
       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