uri updated
[squirrelmail.git] / functions / mime.php
index 07cfe443d988e09c0e762165b743dc408ee58d3c..b9243f1b26c9d7d7e1e17e36f648aa2daf2f5a73 100644 (file)
@@ -9,7 +9,7 @@
  * This contains the functions necessary to detect and decode MIME
  * messages.
  *
- * $Id$
+ * @version $Id$
  * @package squirrelmail
  */
 
@@ -526,7 +526,7 @@ function formatAttachments($message, $exclude_id, $mailbox, $id) {
                         '<A HREF="'.$defaultlink.'">'.decodeHeader($display_filename).'</A>&nbsp;</TD>' .
                         '<TD><SMALL><b>' . show_readable_size($header->size) .
                         '</b>&nbsp;&nbsp;</small></TD>' .
-                        "<TD><SMALL>[ $type0/$type1 ]&nbsp;</SMALL></TD>" .
+                        '<TD><SMALL>[ '.htmlspecialchars($type0).'/'.htmlspecialchars($type1).' ]&nbsp;</SMALL></TD>' .
                         '<TD><SMALL>';
         $attachments .= '<b>' . $description . '</b>';
         $attachments .= '</SMALL></TD><TD><SMALL>&nbsp;';
@@ -558,7 +558,7 @@ function sqimap_base64_decode(&$string) {
     // remove the noise in order to check if the 4 bytes pairs are complete
     $string = str_replace(array("\r\n","\n", "\r", " "),array('','','',''),$string);
 
-    $sStringRem = '';    
+    $sStringRem = '';
     $iMod = strlen($string) % 4;
     if ($iMod) {
         $sStringRem = substr($string,-$iMod);
@@ -619,7 +619,7 @@ function decodeBody($body, $encoding) {
  * @return string decoded header string
  */
 function decodeHeader ($string, $utfencode=true,$htmlsave=true,$decide=false) {
-    global $languages, $squirrelmail_language;
+    global $languages, $squirrelmail_language,$default_charset;
     if (is_array($string)) {
         $string = implode("\n", $string);
     }
@@ -660,28 +660,42 @@ function decodeHeader ($string, $utfencode=true,$htmlsave=true,$decide=false) {
             $j = $i;
             $ret .= $res[1];
             $encoding = ucfirst($res[3]);
+
+            /* decide about valid decoding */
+            if ($decide && is_conversion_safe($res[2])) {
+              $utfencode=true;
+              $can_be_encoded=true;
+            } else {
+              $can_be_encoded=false;
+            }
             switch ($encoding)
             {
             case 'B':
                 $replace = base64_decode($res[4]);
-                $ret .= charset_decode($res[2],$replace);
+                if ($can_be_encoded) {
+                  /* convert string to different charset,
+                   * if functions asks for it (usually in compose)
+                   */
+                  $ret .= charset_convert($res[2],$replace,$default_charset);
+                } else {
+                  // convert string to html codes in order to display it
+                  $ret .= charset_decode($res[2],$replace);
+                }
                 break;
             case 'Q':
                 $replace = str_replace('_', ' ', $res[4]);
                 $replace = preg_replace('/=([0-9a-f]{2})/ie', 'chr(hexdec("\1"))',
                                     $replace);
-        /* decide about valid decoding */
-        if ($decide && is_conversion_safe($res[2])) {
-          $utfencode=true;
-          $can_be_decoded=true;
-        } else {
-          $can_be_decoded=false;
-        }
-                /* Only encode into entities by default. Some places
-                 * don't need the encoding, like the compose form.
-                 */
                 if ($utfencode) {
+                  if ($can_be_encoded) {
+                    /* convert string to different charset,
+                     * if functions asks for it (usually in compose)
+                     */
+                    $replace = charset_convert($res[2], $replace,$default_charset);
+                  } else {
+                    // convert string to html codes in order to display it
                     $replace = charset_decode($res[2], $replace);
+                  }
                 } else {
                     if ($htmlsave) {
                         $replace = htmlspecialchars($replace);
@@ -739,10 +753,6 @@ function encodeHeader ($string) {
         function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
         return  $languages[$squirrelmail_language]['XTRA_CODE']('encodeheader', $string);
     }
-    // instead of removing nbsp here, we don't add it in decodeHeader
-    //    if (strtolower($default_charset) == 'iso-8859-1') {
-    //    $string = str_replace("\240",' ',$string);
-    //}
 
     // Encode only if the string contains 8-bit characters or =?
     $j = strlen($string);
@@ -1616,7 +1626,7 @@ function sq_body2div($attary, $mailbox, $message, $id){
  * special description.
  *
  * Since the description is quite lengthy, see it here:
- * http://www.mricon.com/html/phpfilter.html
+ * http://linux.duke.edu/projects/mini/htmlfilter/
  *
  * @param $body                 the string with HTML you wish to filter
  * @param $tag_list             see description above