typo
[squirrelmail.git] / functions / mime.php
index 9b960ce4501319ee3b45a0b655ce18c9a1b47ca4..3563a9986074051a93211739e5bd13b5b767ebb6 100644 (file)
@@ -30,43 +30,44 @@ function mime_structure ($bodystructure, $flags=array()) {
     $read = trim(substr ($bodystructure, strpos(strtolower($bodystructure), 'bodystructure') + 13));
     $msg = &new message();
     $read = trim(substr ($read, 0, -1));
-    $msg = $msg->parseStructure($read,0);
+    $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_mdn = true;
-              }
-              break;
-            default:
-              break;
-          }
-       }
+        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);
+    //    listEntities($msg);
     return( $msg );
 }
 
@@ -163,52 +164,40 @@ function mime_print_body_lines ($imap_stream, $id, $ent_id, $encoding) {
        $sid_s = $sid;
     }
 
+    $body = mime_fetch_body ($imap_stream, $id, $ent_id);
+    echo decodeBody($body, $encoding);
+    return;
+/*
     fputs ($imap_stream, "$sid FETCH $id BODY[$ent_id]\r\n");
     $cnt = 0;
     $continue = true;
     $read = fgets ($imap_stream,8192);
 
 
-//    if (preg_match('/.*\{(\d+)\}.*/',$read,$regs)) {
-/*
-       $size = $regs[1];
-       $size_div = (int) ($size / 4096);
-       $size_mod = $size % 4096;
-       if (!$size_mod) $size_div++;
-       $read = '';
-       for ($i=0;$i<$size_div;$i++) { 
-           $read .= fread ($imap_stream,4096);
-       }
-       if ($size_mod > 0) {
-          $read .= fread ($imap_stream, $size_mod);
-       }
-       echo decodeBody($read, $encoding);
-    }
-*/
     // This could be bad -- if the section has sqimap_session_id() . ' OK'
     // or similar, it will kill the download.
     while (!ereg("^".$sid_s." (OK|BAD|NO)(.*)$", $read, $regs)) {
-      if (trim($read) == ')==') {
-          $read1 = $read;
-          $read = fgets ($imap_stream,4096);
-          if (ereg("^".$sid." (OK|BAD|NO)(.*)$", $read, $regs)) {
-              return;
-          } else {
-              echo decodeBody($read1, $encoding) .
-                   decodeBody($read, $encoding);
-          }
-      } else if ($cnt) {
-          echo decodeBody($read, $encoding);
-      }
-      $read = fgets ($imap_stream,4096);
-      $cnt++;
+        if (trim($read) == ')==') {
+            $read1 = $read;
+            $read = fgets ($imap_stream,4096);
+            if (ereg("^".$sid." (OK|BAD|NO)(.*)$", $read, $regs)) {
+                return;
+            } else {
+                echo decodeBody($read1, $encoding) .
+                     decodeBody($read, $encoding);
+            }
+        } else if ($cnt) {
+            echo decodeBody($read, $encoding);
+        }
+        $read = fgets ($imap_stream,4096);
+        $cnt++;
 //      break;
     }
+*/
 }
 
 /* -[ END MIME DECODING ]----------------------------------------------------------- */
 
-
 // This is here for debugging purposese.  It will print out a list
 // of all the entity IDs that are in the $message object.
 
@@ -227,126 +216,38 @@ function listEntities ($message) {
   } 
 }
 
+function getPriorityStr($priority) {
+   $priority_level = substr($priority,0,1);
 
-/* returns a $message object for a particular entity id */
-function getEntity ($message, $ent_id) {
-    return $message->getEntity($ent_id);
-}
-
-/*
- * figures out what entity to display and returns the $message object
- * for that entity.
- */
-function findDisplayEntity ($msg, $textOnly = true, $entity = array() )   {
-    global $show_html_default;
-    
-    $found = false;    
-    if ($msg) {
-        $type = $msg->type0.'/'.$msg->type1;
-        if ( $type == 'multipart/alternative') {
-           $msg = findAlternativeEntity($msg, $textOnly);
-           if (count($msg->entities) == 0) {
-               $entity[] = $msg->entity_id;
-           } else {
-               $found = true;
-                $entity =findDisplayEntity($msg,$textOnly, $entity);
-           }
-       } else  if ( $type == 'multipart/related') {
-            $msgs = findRelatedEntity($msg);
-           for ($i = 0; $i < count($msgs); $i++) {
-               $msg = $msgs[$i];
-               if (count($msg->entities) == 0) {
-                   $entity[] = $msg->entity_id;
-               } else {
-                   $found = true;
-                    $entity =findDisplayEntity($msg,$textOnly, $entity);
-               }
-           }
-       } else if ( count($entity) == 0 &&
-             $msg->type0 == 'text' &&
-             ( $msg->type1 == 'plain' ||
-               $msg->type1 == 'html' ) &&
-             isset($msg->entity_id) ) {
-            if (count($msg->entities) == 0) {
-               $entity[] = $msg->entity_id;
-            }
-        } 
-       $i = 0;
-       while ( isset($msg->entities[$i]) && count($entity) == 0 && !$found )  {
-           $entity = findDisplayEntity($msg->entities[$i], $textOnly, $entity);
-           $i++;
-       }
-    }
-    if ( !isset($entity[0]) ) {
-        $entity[]="";
-    }
-    return( $entity );
-}
+   switch($priority_level) {
+     /* check for a higher then normal priority. */
+     case '1':
+     case '2':
+        $priority_string = _("High");
+        break;
 
-/* Shows the HTML version */
-function findDisplayEntityHTML ($message) {
+      /* check for a lower then normal priority. */
+     case '4':
+     case '5':
+        $priority_string = _("Low");
+        break;
 
-    if ( $message->header->type0 == 'text' &&
-         $message->header->type1 == 'html' &&
-         isset($message->header->entity_id)) {
-        return $message->header->entity_id;
-    }
-    for ($i = 0; isset($message->entities[$i]); $i ++) {
-       if ( $message->header->type0 == 'message' &&
-           $message->header->type1 == 'rfc822' &&
-            isset($message->header->entity_id)) {
-           return 0;
-       }
-       
-        $entity = findDisplayEntityHTML($message->entities[$i]);
-        if ($entity != 0) {
-            return $entity;
-        }
-    }
+     /* check for a normal priority. */
+     case '3':
+     default:
+        $priority_level = '3';
+        $priority_string = _("Normal");
+        break;
 
-    return 0;
+   }
+   return $priority_string;
 }
 
-function findAlternativeEntity ($message, $textOnly) {
-    global $show_html_default;
-    /* if we are dealing with alternative parts then we choose the best 
-     * viewable message supported by SM.
-     */
-    if ($show_html_default && !$textOnly) {     
-       $alt_order = array ('text/plain','text/html');
-    } else {
-       $alt_order = array ('text/plain');
-    }
-    $best_view = 0;
-    $ent_id = 0;
-    $k = 0; 
-    for ($i = 0; $i < count($message->entities); $i ++) {
-        $type = $message->entities[$i]->header->type0.'/'.$message->entities[$i]->header->type1;
-       if ($type == 'multipart/related') {
-          $type = $message->entities[$i]->header->type;
-       }
-       for ($j = $k; $j < count($alt_order); $j++) {
-           if ($alt_order[$j] == $type && $j > $best_view) {
-               $best_view = $j;
-               $ent_id = $i;
-               $k = $j;
-           }
-       }
-    }
-    return $message->entities[$ent_id];
+/* returns a $message object for a particular entity id */
+function getEntity ($message, $ent_id) {
+    return $message->getEntity($ent_id);
 }
 
-function findRelatedEntity ($message) {
-    $msgs = array(); 
-    for ($i = 0; $i < count($message->entities); $i ++) {
-        $type = $message->entities[$i]->header->type0.'/'.$message->entities[$i]->header->type1;
-        if ($message->header->type == $type) {
-           $msgs[] = $message->entities[$i];
-       }
-    }
-    return $msgs;
-}    
-
 /*
  * translateText
  * Extracted from strings.php 23/03/2002
@@ -408,272 +309,200 @@ 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) {
+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;
-
-    $id = $message->id;
-
-    if ($message->type0 == 'message' && $message->type1 == 'rfc822') {
-       $message = $message->entities[0];
-    }
-    $urlmailbox = urlencode($message->mailbox);
+    $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 = 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('&nbsp;' => ' ',
+                                     '&gt;'   => '>',
+                                     '&lt;'   => '<');
                 $body = strip_tags( $body );
-                translateText($body, $wrap_at, $body_message->header->charset);
+                $body = strtr($body, $entity_conv);
+                $body = trim($body);
+                translateText($body, $wrap_at,
+                              $body_message->header->getParameter('charset'));
             } else {
-                $body = magicHTML( $body, $id, $message );
+                $body = magicHTML( $body, $id, $message, $mailbox );
             }
         } else {
-            translateText($body, $wrap_at, $body_message->header->charset);
+            translateText($body, $wrap_at, 
+                             $body_message->header->getParameter('charset'));
         }
-        $body .= "<CENTER><SMALL><A HREF=\"../src/download.php?absolute_dl=true&amp;passed_id=$id&amp;passed_ent_id=$ent_num&amp;mailbox=$urlmailbox&amp;showHeaders=1\">". _("Download this as a file") ."</A></SMALL></CENTER><BR>";
+
         if ($has_unsafe_images) {
             if ($view_unsafe_images) {
-                $body .= "<CENTER><SMALL><A HREF=\"read_body.php?passed_id=$id&amp;mailbox=$urlmailbox&amp;sort=$sort&amp;startMessage=$startMessage&amp;show_more=0\">". _("Hide Unsafe Images") ."</A></SMALL></CENTER><BR>\n";
+                $body .= "<CENTER><SMALL><A HREF=\"read_body.php?passed_id=$id&amp;passed_ent_id=".$message->entity_id."&amp;mailbox=$urlmailbox&amp;sort=$sort&amp;startMessage=$startMessage&amp;show_more=0\">". _("Hide Unsafe Images") ."</A></SMALL></CENTER><BR>\n";
             } else {
-                $body .= "<CENTER><SMALL><A HREF=\"read_body.php?passed_id=$id&amp;mailbox=$urlmailbox&amp;sort=$sort&amp;startMessage=$startMessage&amp;show_more=0&amp;view_unsafe_images=1\">". _("View Unsafe Images") ."</A></SMALL></CENTER><BR>\n";
+                $body .= "<CENTER><SMALL><A HREF=\"read_body.php?passed_id=$id&amp;passed_ent_id=".$message->entity_id."&amp;mailbox=$urlmailbox&amp;sort=$sort&amp;startMessage=$startMessage&amp;show_more=0&amp;view_unsafe_images=1\">". _("View Unsafe Images") ."</A></SMALL></CENTER><BR>\n";
             }
-        }
-
-        /** Display the ATTACHMENTS: message if there's more than one part **/
-       if ($message->type0 == 'message') {
-           $id = $message->id;
-           $mailbox = $message->mailbox;
-//         $message->header->setVar('message_id',$id);
-//         $message->header->setVar('mailbox',$mailbox);
-       }
-        if (isset($message->entities[1])) {
-           /* Header-type alternative means we choose the best one to display 
-              so don't show the alternatives as attachment. Header-type related
-              means that the attachments are already part of the related message.
-           */   
-           if ($message->header->type1 !='related' && $message->header->type1 !='alternative') {
-               $body .= formatAttachments ($message, $ent_num, $message->mailbox, $id);
-           }
-        }
-    } else {
-        $body = formatAttachments ($message, -1, $message->mailbox, $id);
-    }
+        } 
+    } 
     return ($body);
 }
 
-/*
- * 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;
+
+function formatAttachments($message, $exclude_id, $mailbox, $id) {
+    global $where, $what, $startMessage, $color;
     static $ShownHTML = 0;
 
-    $body = '';
-    if ($ShownHTML == 0) {
-
-        $ShownHTML = 1;
-        $body .= "<TABLE WIDTH=\"100%\" CELLSPACING=0 CELLPADDING=2 BORDER=0 BGCOLOR=\"$color[0]\"><TR>\n" .
-                "<TH ALIGN=\"left\" BGCOLOR=\"$color[9]\"><B>\n" .
-                _("Attachments") . ':' .
-                "</B></TH></TR><TR><TD>\n" .
-                "<TABLE CELLSPACING=0 CELLPADDING=1 BORDER=0>\n" .
-                formatAttachments($message, $ent_id, $mailbox, $id) .
-                "</TABLE></TD></TR></TABLE>";
-
-    } else if ($message) {
-       $header = $message->header;
+    $att_ar = $message->getAttachments($exclude_id);
+
+    if (!count($att_ar)) return '';
+
+    $attachments = '';
+
+    $urlMailbox = urlencode($mailbox);
+
+    foreach ($att_ar as $att) {
+        $ent = urldecode($att->entity_id);
+        $header = $att->header;
         $type0 = strtolower($header->type0);
         $type1 = strtolower($header->type1);
-       $name = '';
-       if (isset($header->name)) {
-           $name = decodeHeader($header->name);
-       }
-       if ($type0 =='message' && $type1 == 'rfc822') {
-        
-            $filename = decodeHeader($message->header->subject);
-            $display_filename = $filename;
-            
-            $urlMailbox = urlencode($mailbox);
-            $ent = urlencode($message->entity_id);
-
-            $DefaultLink =
-                "../src/read_body.php?startMessage=$startMessage&amp;passed_id=$id&amp;mailbox=$urlMailbox&amp;passed_ent_id=$ent";
-            if ($where && $what) {
-                $DefaultLink .= '&amp;where=' . urlencode($where) . '&amp;what=' . urlencode($what);
-            }
-            $Links['download link']['text'] = _("download");
-            $Links['download link']['href'] =
-                "../src/download.php?absolute_dl=true&amp;passed_id=$id&amp;mailbox=$urlMailbox&amp;passed_ent_id=$ent";
-            $ImageURL = '';
-
-            /* this executes the attachment hook with a specific MIME-type.
-                * if that doens't have results, it tries if there's a rule
-                * for a more generic type. */
-            $HookResults = do_hook("attachment $type0/$type1", $Links,
-                $startMessage, $id, $urlMailbox, $ent, $DefaultLink, $display_filename, $where, $what);
-            if(count($HookResults[1]) <= 1) {
-                $HookResults = do_hook("attachment $type0/*", $Links,
-                $startMessage, $id, $urlMailbox, $ent, $DefaultLink,
-                $display_filename, $where, $what);
+        $name = '';
+        $Links['download link']['text'] = _("download");
+        $Links['download link']['href'] =
+                "../src/download.php?absolute_dl=true&amp;passed_id=$id&amp;mailbox=$urlMailbox&amp;ent_id=$ent";
+        $ImageURL = '';
+        if ($type0 =='message' && $type1 == 'rfc822') {
+            $default_page = '../src/read_body.php';
+            $rfc822_header = $att->rfc822_header;
+            $filename = decodeHeader($rfc822_header->subject);
+
+            $from_o = $rfc822_header->from;
+            if (is_object($from_o)) {
+                $from_name = $from_o->getAddress(false);
+            } else {
+                $from_name = _("Unknown sender");
             }
-
-            $Links = $HookResults[1];
-            $DefaultLink = $HookResults[6];
-
-            $body .= '<TR><TD>&nbsp;&nbsp;</TD><TD>' .
-                        "<A HREF=\"$DefaultLink\">$display_filename</A>&nbsp;</TD>" .
-                        '<TD><SMALL><b>' . show_readable_size($message->header->size) .
-                        '</b>&nbsp;&nbsp;</small></TD>' .
-                        "<TD><SMALL>[ $type0/$type1 ]&nbsp;</SMALL></TD>" .
-                        '<TD><SMALL>';
-           $from_o = $message->header->from;
-           if (isset($from_o)) {
-               $from_name = $from_o->getAddress(false);
+            $from_name = decodeHeader(htmlspecialchars($from_name));
+           $description = $from_name;
+        } else {
+            $default_page = '../src/download.php';
+           if (is_object($header->disposition)) {
+               $filename = decodeHeader($header->disposition->getProperty('filename'));
+               if (trim($filename) == '') {
+                  $name = decodeHeader($header->disposition->getProperty('name'));
+                  if (trim($name) == '') {
+                     if ( trim( $header->id ) == '' )
+                        $filename = 'untitled-[' . $ent . ']' ;
+                     else
+                        $filename = 'cid: ' . $header->id;
+                  } else {
+                     $filename = $name;
+                  }
+               }
            } else {
-               $from_name = _("Unknown sender");
+              if ( trim( $header->id ) == '' )
+                  $filename = 'untitled-[' . $ent . ']' ;
+               else
+                  $filename = 'cid: ' . $header->id;
            }
-           $from_name = decodeHeader(htmlspecialchars($from_name));
-            $body .= '<b>' . $from_name . '</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 );    
-       
-        } elseif (!$message->entities) {
-
-            $type0 = strtolower($message->header->type0);
-            $type1 = strtolower($message->header->type1);
-            $name = decodeHeader($message->header->name);
-
-            if ($message->entity_id != $ent_id) {
-            $filename = decodeHeader($message->header->filename);
-            if (trim($filename) == '') {
-                if (trim($name) == '') {
-                    if ( trim( $message->header->id ) == '' )
-                        $display_filename = 'untitled-[' . $message->entity_id . ']' ;
-                    else
-                        $display_filename = 'cid: ' . $message->header->id;
-                    // $display_filename = 'untitled-[' . $message->entity_id . ']' ;
-                } else {
-                    $display_filename = $name;
-                    $filename = $name;
-                }
+            if ($header->description) {
+                $description = htmlspecialchars($header->description);
             } else {
-                $display_filename = $filename;
-            }
-
-            $urlMailbox = urlencode($mailbox);
-            $ent = urlencode($message->entity_id);
+               $description = '';
+           }
+        }
 
-            $DefaultLink =
-                "../src/download.php?startMessage=$startMessage&amp;passed_id=$id&amp;mailbox=$urlMailbox&amp;passed_ent_id=$ent";
-            if ($where && $what) {
-              $DefaultLink = '&amp;where='. urlencode($where).'&amp;what='.urlencode($what);
-            }
-            $Links['download link']['text'] = _("download");
-            $Links['download link']['href'] =
-                "../src/download.php?absolute_dl=true&amp;passed_id=$id&amp;mailbox=$urlMailbox&amp;passed_ent_id=$ent";
-            $ImageURL = '';
-
-            /* this executes the attachment hook with a specific MIME-type.
-                * if that doens't have results, it tries if there's a rule
-                * for a more generic type. */
-            $HookResults = do_hook("attachment $type0/$type1", $Links,
-                $startMessage, $id, $urlMailbox, $ent, $DefaultLink,
-                $display_filename, $where, $what);
-            if(count($HookResults[1]) <= 1) {
-                $HookResults = do_hook("attachment $type0/*", $Links,
-                $startMessage, $id, $urlMailbox, $ent, $DefaultLink,
-                $display_filename, $where, $what);
-            }
+        $display_filename = $filename;
+       if (isset($passed_ent_id)) {
+          $passed_ent_id_link = '&amp;passed_ent_id='.$passed_ent_id;
+       } else {
+          $passed_ent_id_link = '';
+       }
+        $DefaultLink = $default_page . "?startMessage=$startMessage"
+                     . "&amp;passed_id=$id&amp;mailbox=$urlMailbox"
+                     . '&amp;ent_id='.$ent.$passed_ent_id_link;
+        if ($where && $what) {
+           $DefaultLink = '&amp;where='. urlencode($where).'&amp;what='.urlencode($what);
+        }
+        /* this executes the attachment hook with a specific MIME-type.
+            * if that doens't have results, it tries if there's a rule
+            * for a more generic type. */
+        $HookResults = do_hook("attachment $type0/$type1", $Links,
+            $startMessage, $id, $urlMailbox, $ent, $DefaultLink,
+            $display_filename, $where, $what);
+        if(count($HookResults[1]) <= 1) {
+            $HookResults = do_hook("attachment $type0/*", $Links,
+                    $startMessage, $id, $urlMailbox, $ent, $DefaultLink,
+                    $display_filename, $where, $what);
+        }
 
-            $Links = $HookResults[1];
-            $DefaultLink = $HookResults[6];
+        $Links = $HookResults[1];
+        $DefaultLink = $HookResults[6];
 
-            $body .= '<TR><TD>&nbsp;&nbsp;</TD><TD>' .
+        $attachments .= '<TR><TD>' .
                         "<A HREF=\"$DefaultLink\">$display_filename</A>&nbsp;</TD>" .
-                        '<TD><SMALL><b>' . show_readable_size($message->header->size) .
+                        '<TD><SMALL><b>' . show_readable_size($header->size) .
                         '</b>&nbsp;&nbsp;</small></TD>' .
                         "<TD><SMALL>[ $type0/$type1 ]&nbsp;</SMALL></TD>" .
                         '<TD><SMALL>';
-            if ($message->header->description) {
-                $body .= '<b>' . htmlspecialchars(_($message->header->description)) . '</b>';
-            }
-            $body .= '</SMALL></TD><TD><SMALL>&nbsp;';
-
+        $attachments .= '<b>' . $description . '</b>';
+        $attachments .= '</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";
-            }
-        } else {
-            for ($i = 0; $i < count($message->entities); $i++) {
-                $body .= formatAttachments($message->entities[$i], $ent_id, $mailbox, $id);
+        $SkipSpaces = 1;
+        foreach ($Links as $Val) {
+            if ($SkipSpaces) {
+                $SkipSpaces = 0;
+            } else {
+                $attachments .= '&nbsp;&nbsp;|&nbsp;&nbsp;';
             }
+            $attachments .= '<a href="' . $Val['href'] . '">' .  $Val['text'] . '</a>';
         }
+        unset($Links);
+        $attachments .= "</TD></TR>\n";
     }
-    return( $body );
+    return $attachments;
 }
 
-
 /** this function decodes the body depending on the encoding type. **/
 function decodeBody($body, $encoding) {
-  $body = str_replace("\r\n", "\n", $body);
-  $encoding = strtolower($encoding);
-
-  global $show_html_default;
+    global $languages, $squirrelmail_language;
 
-  if ($encoding == 'quoted-printable' ||
-      $encoding == 'quoted_printable') {
-     $body = quoted_printable_decode($body);
-
-     while (ereg("=\n", $body))
-        $body = ereg_replace ("=\n", "", $body);
-
-  } else if ($encoding == 'base64') {
-     $body = base64_decode($body);
-  }
-
-  // All other encodings are returned raw.
-  return $body;
+    $body = str_replace("\r\n", "\n", $body);
+    $encoding = strtolower($encoding);
+    
+    global $show_html_default;
+    
+    if ($encoding == 'quoted-printable' ||
+    $encoding == 'quoted_printable') {
+        $body = quoted_printable_decode($body);
+    
+        while (ereg("=\n", $body)) {
+            $body = ereg_replace ("=\n", '', $body);
+        }
+    
+    } else if ($encoding == 'base64') {
+        $body = base64_decode($body);
+    }
+    
+    if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
+        function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
+        $body = $languages[$squirrelmail_language]['XTRA_CODE']('decode', $body);
+    }
+    
+    // All other encodings are returned raw.
+    return( $body );
 }
 
 /*
@@ -682,9 +511,16 @@ function decodeBody($body, $encoding) {
  * Patched by Christian Schmidt <christian@ostenfeld.dk>  23/03/2002
  */
 function decodeHeader ($string, $utfencode=true) {
+    global $languages, $squirrelmail_language;
     if (is_array($string)) {
         $string = implode("\n", $string);
     }
+
+    if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
+        function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
+        $string = $languages[$squirrelmail_language]['XTRA_CODE']('decodeheader', $string);
+    }
+
     $i = 0;
     while (preg_match('/^(.{' . $i . '})(.*)=\?([^?]*)\?(Q|B)\?([^?]*)\?=/Ui', 
                       $string, $res)) {
@@ -718,7 +554,12 @@ function decodeHeader ($string, $utfencode=true) {
  * be encoded.
  */
 function encodeHeader ($string) {
-    global $default_charset;
+    global $default_charset, $languages, $squirrelmail_language;
+
+    if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
+        function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
+        return  $languages[$squirrelmail_language]['XTRA_CODE']('encodeheader', $string);
+    }
 
     // Encode only if the string contains 8-bit characters or =?
     $j = strlen( $string  );
@@ -785,7 +626,9 @@ function find_ent_id( $id, $message ) {
  * @return           a string with the final tag representation.
  */
 function sq_tagprint($tagname, $attary, $tagtype){
-    $me = "sq_tagprint";
+    
+    $me = 'sq_tagprint';
+    
     if ($tagtype == 2){
         $fulltag = '</' . $tagname . '>';
     } else {
@@ -798,9 +641,9 @@ function sq_tagprint($tagname, $attary, $tagtype){
             $fulltag .= ' ' . join(" ", $atts);
         }
         if ($tagtype == 3){
-            $fulltag .= " /";
+            $fulltag .= ' /';
         }
-        $fulltag .= ">";
+        $fulltag .= '>';
     }
     return $fulltag;
 }
@@ -827,7 +670,7 @@ function sq_casenormalize(&$val){
  *                 non-whitespace char is located.
  */
 function sq_skipspace($body, $offset){
-    $me = "sq_skipspace";
+    $me = 'sq_skipspace';
     preg_match("/^(\s*)/s", substr($body, $offset), $matches);
     if (sizeof($matches{1})){
         $count = strlen($matches{1});
@@ -848,7 +691,7 @@ function sq_skipspace($body, $offset){
  *                 strlen($body) if needle wasn't found.
  */
 function sq_findnxstr($body, $offset, $needle){
-    $me = "sq_findnxstr";
+    $me = 'sq_findnxstr';
     $pos = strpos($body, $needle, $offset);
     if ($pos === FALSE){
         $pos = strlen($body);
@@ -870,7 +713,7 @@ function sq_findnxstr($body, $offset, $needle){
  *                 - string with whatever it is we matched
  */
 function sq_findnxreg($body, $offset, $reg){
-    $me = "sq_findnxreg";
+    $me = 'sq_findnxreg';
     $matches = Array();
     $retarr = Array();
     preg_match("%^(.*?)($reg)%s", substr($body, $offset), $matches);
@@ -899,7 +742,7 @@ function sq_findnxreg($body, $offset, $reg){
  *                 first three members will be false, if the tag is invalid.
  */
 function sq_getnxtag($body, $offset){
-    $me = "sq_getnxtag";
+    $me = 'sq_getnxtag';
     if ($offset > strlen($body)){
         return false;
     }
@@ -927,11 +770,11 @@ function sq_getnxtag($body, $offset){
      */
     $tagtype = false;
     switch (substr($body, $pos, 1)){
-    case "/":
+    case '/':
         $tagtype = 2;
         $pos++;
         break;
-    case "!":
+    case '!':
         /**
          * A comment or an SGML declaration.
          */
@@ -978,7 +821,7 @@ function sq_getnxtag($body, $offset){
      * Whatever else we find there indicates an invalid tag.
      */
     switch ($match){
-    case "/":
+    case '/':
         /**
          * This is an xhtml-style tag with a closing / at the
          * end, like so: <img src="blah"/>. Check if it's followed
@@ -992,7 +835,7 @@ function sq_getnxtag($body, $offset){
             $retary = Array(false, false, false, $lt, $gt);
             return $retary;
         }
-    case ">":
+    case '>':
         return Array($tagname, false, $tagtype, $lt, $pos);
         break;
     default:
@@ -1080,7 +923,7 @@ function sq_getnxtag($body, $offset){
          *      anything else means the attribute is invalid.
          */
         switch($match){
-        case "/":
+        case '/':
             /**
              * This is an xhtml-style tag with a closing / at the
              * end, like so: <img src="blah"/>. Check if it's followed
@@ -1094,7 +937,7 @@ function sq_getnxtag($body, $offset){
                 $retary = Array(false, false, false, $lt, $gt);
                 return $retary;
             }
-        case ">":
+        case '>':
             $attary{$attname} = '"yes"';
             return Array($tagname, $attary, $tagtype, $lt, $pos);
             break;
@@ -1183,7 +1026,7 @@ function sq_getnxtag($body, $offset){
  * @return           Translated value.
  */
 function sq_deent($attvalue){
-    $me="sq_deent";
+    $me = 'sq_deent';
     /**
      * See if we have to run the checks first. All entities must start
      * with "&".
@@ -1239,9 +1082,10 @@ function sq_fixatts($tagname,
                     $bad_attvals,
                     $add_attr_to_tag,
                     $message,
-                    $id
+                    $id,
+                   $mailbox
                     ){
-    $me = "sq_fixatts";
+    $me = 'sq_fixatts';
     while (list($attname, $attvalue) = each($attary)){
         /**
          * See if this attribute should be removed.
@@ -1290,7 +1134,7 @@ function sq_fixatts($tagname,
          * Turn cid: urls into http-friendly ones.
          */
         if (preg_match("/^[\'\"]\s*cid:/si", $attvalue)){
-            $attary{$attname} = sq_cid2http($message, $id, $attvalue);
+            $attary{$attname} = sq_cid2http($message, $id, $attvalue, $mailbox);
         }
     }
     /**
@@ -1315,7 +1159,7 @@ function sq_fixatts($tagname,
  */
 function sq_fixstyle($message, $id, $content){
     global $view_unsafe_images;
-    $me = "sq_fixstyle";
+    $me = 'sq_fixstyle';
     /**
      * First look for general BODY style declaration, which would be
      * like so:
@@ -1370,7 +1214,7 @@ function sq_fixstyle($message, $id, $content){
  * @param  $cidurl   the cid: url.
  * @return           a string with a http-friendly url
  */
-function sq_cid2http($message, $id, $cidurl){
+function sq_cid2http($message, $id, $cidurl, $mailbox){
     /**
      * Get rid of quotes.
      */
@@ -1378,8 +1222,8 @@ function sq_cid2http($message, $id, $cidurl){
     $cidurl = str_replace($quotchar, "", $cidurl);
     $cidurl = substr(trim($cidurl), 4);
     $httpurl = $quotchar . "../src/download.php?absolute_dl=true&amp;" .
-        "passed_id=$id&amp;mailbox=" . urlencode($message->mailbox) .
-        "&amp;passed_ent_id=" . find_ent_id($cidurl, $message) . $quotchar;
+        "passed_id=$id&amp;mailbox=" . urlencode($mailbox) .
+        "&amp;ent_id=" . find_ent_id($cidurl, $message) . $quotchar;
     return $httpurl;
 }
 
@@ -1391,23 +1235,23 @@ function sq_cid2http($message, $id, $cidurl){
  * @return          a modified array of attributes to be set for <div>
  */
 function sq_body2div($attary){
-    $me = "sq_body2div";
-    $divattary = Array("class"=>"'bodyclass'");
-    $bgcolor="#ffffff";
-    $text="#000000";
-    $styledef="";
+    $me = 'sq_body2div';
+    $divattary = Array( 'class' => "'bodyclass'" );
+    $bgcolor = '#ffffff';
+    $text = '#000000';
+    $styledef = '';
     if (is_array($attary) && sizeof($attary) > 0){
         foreach ($attary as $attname=>$attvalue){
             $quotchar = substr($attvalue, 0, 1);
             $attvalue = str_replace($quotchar, "", $attvalue);
             switch ($attname){
-            case "background":
+            case 'background':
                 $styledef .= "background-image: url('$attvalue'); ";
                 break;
-            case "bgcolor":
+            case 'bgcolor':
                 $styledef .= "background-color: $attvalue; ";
                 break;
-            case "text":
+            case 'text':
                 $styledef .= "color: $attvalue; ";
             }
         }
@@ -1447,9 +1291,10 @@ function sq_sanitize($body,
                      $bad_attvals,
                      $add_attr_to_tag,
                      $message,
-                     $id
+                     $id,
+                    $mailbox
                      ){
-    $me = "sq_sanitize";
+    $me = 'sq_sanitize';
     /**
      * Normalize rm_tags and rm_tags_with_content.
      */
@@ -1556,7 +1401,8 @@ function sq_sanitize($body,
                                                      $bad_attvals,
                                                      $add_attr_to_tag,
                                                      $message,
-                                                     $id
+                                                     $id,
+                                                    $mailbox
                                                      );
                             }
                             /**
@@ -1599,7 +1445,7 @@ function sq_sanitize($body,
  * @param  $id    the id of the message
  * @return        a string with html safe to display in the browser.
  */
-function magicHTML($body, $id, $message){
+function magicHTML($body, $id, $message, $mailbox = 'INBOX'){
     global $attachment_common_show_images, $view_unsafe_images,
         $has_unsafe_images;
     /**
@@ -1612,7 +1458,8 @@ function magicHTML($body, $id, $message){
                       "meta",
                       "html",
                       "head",
-                      "base"
+                      "base",
+                      "link"
                       );
 
     $rm_tags_with_content = Array(
@@ -1725,11 +1572,12 @@ function magicHTML($body, $id, $message){
                            $bad_attvals,
                            $add_attr_to_tag,
                            $message,
-                           $id
+                           $id,
+                          $mailbox
                            );
     if (preg_match("|$secremoveimg|si", $trusted)){
         $has_unsafe_images = true;
-    }
+    } 
     return $trusted;
 }