Custom option page values now repopulate correctly when save action goes back to...
[squirrelmail.git] / functions / mime.php
index 3c54d79947dfd08d2f7c0725f6b53d10a2983f67..b9243f1b26c9d7d7e1e17e36f648aa2daf2f5a73 100644 (file)
@@ -9,7 +9,7 @@
  * This contains the functions necessary to detect and decode MIME
  * messages.
  *
- * $Id$
+ * @version $Id$
  * @package squirrelmail
  */
 
@@ -374,9 +374,11 @@ function formatBody($imap_stream, $message, $color, $wrap_at, $ent_num, $id, $ma
             if ($show_html_default <> 1) {
                 $entity_conv = array('&nbsp;' => ' ',
                                      '<p>'    => "\n",
-                                     '<br>'   => "\n",
                                      '<P>'    => "\n",
+                                     '<br>'   => "\n",
                                      '<BR>'   => "\n",
+                                     '<br />' => "\n",
+                                     '<BR />' => "\n",
                                      '&gt;'   => '>',
                                      '&lt;'   => '<');
                 $body = strtr($body, $entity_conv);
@@ -524,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;';
@@ -548,10 +550,30 @@ function formatAttachments($message, $exclude_id, $mailbox, $id) {
 }
 
 function sqimap_base64_decode(&$string) {
-    $string = str_replace("\r\n", "\n", $string);
+
+    // base64 enoded data goes in pairs of 4 bytes. To achieve on the
+    // fly decoding (to reduce memory usage) you have to check if the
+    // data has incomplete pairs
+
+    // 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 = '';
+    $iMod = strlen($string) % 4;
+    if ($iMod) {
+        $sStringRem = substr($string,-$iMod);
+        // check if $sStringRem contains padding characters
+        if (substr($sStringRem,-1) != '=') {
+            $string = substr($string,0,-$iMod);
+        } else {
+            $sStringRem = '';
+        }
+    }
     $string = base64_decode($string);
+    return $sStringRem;
 }
 
+
 /* This function decodes the body depending on the encoding type. */
 function decodeBody($body, $encoding) {
     global $show_html_default;
@@ -597,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);
     }
@@ -638,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);
@@ -717,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);
@@ -1594,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
@@ -1970,7 +2002,7 @@ function magicHTML($body, $id, $message, $mailbox = 'INBOX') {
      // The best thing you can do for IE is to upgrade to the latest
      // version
      //set all the Cache Control Headers for IE
-     if ($isIE && !$isIE6) {
+     if ($isIE) {
          header ("Pragma: public");
          header ("Cache-Control: no-store, max-age=0, no-cache, must-revalidate"); # HTTP/1.1
          header ("Cache-Control: post-check=0, pre-check=0", false);
@@ -2027,4 +2059,4 @@ function magicHTML($body, $id, $message, $mailbox = 'INBOX') {
 
 }  // end fn SendDownloadHeaders
 
-?>
\ No newline at end of file
+?>