encodeheader / decodeHeader fixes. Removal of <space> between 2 encoded
authorstekkel <stekkel@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Wed, 28 May 2003 22:14:41 +0000 (22:14 +0000)
committerstekkel <stekkel@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Wed, 28 May 2003 22:14:41 +0000 (22:14 +0000)
header strings. The space is part of the protocol and should be ignored

git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@4950 7612ce4b-ef26-0410-bec9-ea0150e637f0

functions/mime.php

index b2fb5e2afbb9e9f7c45dfdee2e80708b324c8639..8e599f3bfaf6e346978d9dd3c48a0407cf73fe61 100644 (file)
@@ -100,9 +100,9 @@ function mime_fetch_body($imap_stream, $id, $ent_id=1) {
      * that it is the first one.  That is usually the case anyway.
      */
     if (!$ent_id) {
-       $cmd = "FETCH $id BODY[]";
+        $cmd = "FETCH $id BODY[]";
     } else {
-       $cmd = "FETCH $id BODY[$ent_id]";
+        $cmd = "FETCH $id BODY[$ent_id]";
     }
 
     $data = sqimap_run_command ($imap_stream, $cmd, true, $response, $message, $uid_support);
@@ -320,7 +320,7 @@ function formatBody($imap_stream, $message, $color, $wrap_at, $ent_num, $id, $ma
      */
     global $startMessage, $username, $key, $imapServerAddress, $imapPort,
            $show_html_default, $sort, $has_unsafe_images, $passed_ent_id;
-       global $languages, $squirrelmail_language;
+    global $languages, $squirrelmail_language;
 
     if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
         $view_unsafe_images = false;
@@ -368,24 +368,24 @@ function formatBody($imap_stream, $message, $color, $wrap_at, $ent_num, $id, $ma
             translateText($body, $wrap_at,
                           $body_message->header->getParameter('charset'));
         }
-       $link = 'read_body.php?passed_id=' . $id . '&amp;ent_id='.$ent_num.
-                 '&amp;mailbox=' . $urlmailbox .'&amp;sort=' . $sort .
-                '&amp;startMessage=' . $startMessage . '&amp;show_more=0'; 
-       if (isset($passed_ent_id)) {
-           $link .= '&amp;passed_ent_id='.$passed_ent_id;
-       }
+        $link = 'read_body.php?passed_id=' . $id . '&amp;ent_id='.$ent_num.
+                '&amp;mailbox=' . $urlmailbox .'&amp;sort=' . $sort .
+                '&amp;startMessage=' . $startMessage . '&amp;show_more=0'; 
+        if (isset($passed_ent_id)) {
+            $link .= '&amp;passed_ent_id='.$passed_ent_id;
+        }
         if ($view_unsafe_images) {
             $text = _("Hide Unsafe Images");
         } else {
-           if (isset($has_unsafe_images) && $has_unsafe_images) {
-               $link .= '&amp;view_unsafe_images=1';
-               $text = _("View Unsafe Images");
-           } else {
-               $text = '';
-           }
+            if (isset($has_unsafe_images) && $has_unsafe_images) {
+                $link .= '&amp;view_unsafe_images=1';
+                $text = _("View Unsafe Images");
+            } else {
+                $text = '';
+            }
         }
         $body .= '<center><small><a href="'.$link.'">'.$text.
-                '</a></small></center><br>' . "\n";
+                 '</a></small></center><br>' . "\n";
     }
     return $body;
 }
@@ -419,7 +419,7 @@ function formatAttachments($message, $exclude_id, $mailbox, $id) {
             $filename = $rfc822_header->subject;
             if (trim( $filename ) == '') {
                 $filename = 'untitled-[' . $ent . ']' ;
-           }           
+            }
             $from_o = $rfc822_header->from;
             if (is_object($from_o)) {
                 $from_name = $from_o->getAddress(false);
@@ -441,24 +441,24 @@ function formatAttachments($message, $exclude_id, $mailbox, $id) {
                                 $filename = 'untitled-[' . $ent . ']' ;
                             } else {
                                 $filename = 'cid: ' . $header->id;
-                           }
+                            }
                         } else {
-                           $filename = $name;
+                            $filename = $name;
                         }
                     } else {
                         $filename = $name;
                     }
                 }
             } else {
-               $filename = $header->getParameter('name');
-               if (!trim($filename)) {
-                   if (trim( $header->id ) == '') {
-                       $filename = 'untitled-[' . $ent . ']' ;
-                   } else {
-                       $filename = 'cid: ' . $header->id;
-                   }
-               }
-           }
+                $filename = $header->getParameter('name');
+                if (!trim($filename)) {
+                    if (trim( $header->id ) == '') {
+                        $filename = 'untitled-[' . $ent . ']' ;
+                    } else {
+                        $filename = 'cid: ' . $header->id;
+                    }
+                }
+            }
             if ($header->description) {
                 $description = decodeHeader($header->description);
             } else {
@@ -555,23 +555,42 @@ function decodeHeader ($string, $utfencode=true,$htmlsave=true) {
     if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
         function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
         $string = $languages[$squirrelmail_language]['XTRA_CODE']('decodeheader', $string);
-       // Do we need to return at this point?
-       // return $string;
+        // Do we need to return at this point?
+        // return $string;
     }
     $i = 0;
+    $iLastMatch = -2;
+    $encoded = false;
     $aString = explode(' ',$string);
+    $ret = '';
     foreach ($aString as $chunk) {
+        if ($encoded && !$chunk) {
+            continue;
+        } elseif (!$chunk) {
+            $ret .= ' ';
+            continue;
+        }
         $encoded = false;
-        $aString[$i] = '';
-        while (preg_match('/^(.*)=\?([^?]*)\?(Q|B)\?([^?]*)\?=(.*)$/Ui',$chunk,$res)) {
-            $aString[$i] .= $res[1];
-           //echo "$chunk match ". $res[5] . "<br>";
+        /* if encoded words are not separated by a linear-space-white we still catch them */
+        $j = $i-1;
+        while ($match = preg_match('/^(.*)=\?([^?]*)\?(Q|B)\?([^?]*)\?=(.*)$/Ui',$chunk,$res)) {
+            /* if the last chunk isn't an encoded string then put back the space, otherwise don't */
+            if ($iLastMatch !== $j) {
+                if ($htmlsave) {
+                    $ret .= '&nbsp;';
+                } else {
+                    $ret .= ' ';
+                }
+            }
+            $iLastMatch = $i;
+            $j = $i;
+            $ret .= $res[1];
             $encoding = ucfirst($res[3]);
             switch ($encoding)
             {
             case 'B':
                 $replace = base64_decode($res[4]);
-                $aString[$i] .= charset_decode($res[2],$replace);
+                $ret .= charset_decode($res[2],$replace);
                 break;
             case 'Q':
                 $replace = str_replace('_', ' ', $res[4]);
@@ -587,23 +606,30 @@ function decodeHeader ($string, $utfencode=true,$htmlsave=true) {
                         $replace = htmlspecialchars($replace);
                     }
                 }
-                $aString[$i] .= $replace;
+                $ret .= $replace;
                 break;
             default:
                 break;
             }
             $chunk = $res[5];
             $encoded = true;
-        } 
+        }
+        if (!$encoded) {
+            if ($htmlsave) {
+                $ret .= '&nbsp;';
+            } else {
+                $ret .= ' ';
+            }        
+        }
+
         if (!$encoded && $htmlsave) {
-            $aString[$i] = htmlspecialchars($chunk);
+            $ret .= htmlspecialchars($chunk);
         } else {
-            $aString[$i] .= $chunk;
+            $ret .= $chunk;
         }
         ++$i;
     }
-    return implode (' ',$aString);
-
+    return $ret;
 }
 
 /*
@@ -643,6 +669,7 @@ function encodeHeader ($string) {
             }
             $cur_l+=3;
             if ($cur_l > ($max_l-2)) {
+                /* if there is an stringpart that doesn't need encoding, add it */
                 $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);
                 $aRet[] = "=?$default_charset?Q?$ret?=";
                 $iOffset = $i;
@@ -656,7 +683,7 @@ function encodeHeader ($string) {
         case '(':
         case ')':
             if ($iEncStart !== false) {
-                $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);                        
+                $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);
                 $aRet[] = "=?$default_charset?Q?$ret?=";
                 $iOffset = $i;
                 $cur_l = 0;
@@ -668,13 +695,13 @@ function encodeHeader ($string) {
             if ($iEncStart !== false) {
                 $cur_l++;
                 if ($cur_l > $max_l) {
-                    $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);                        
+                    $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);
                     $aRet[] = "=?$default_charset?Q?$ret?=";
                     $iOffset = $i;
                     $cur_l = 0;
                     $ret = '';
                     $iEncStart = false;
-                } else {                
+                } else {
                     $ret .= '_';
                 }
             }
@@ -686,30 +713,28 @@ function encodeHeader ($string) {
                     $iEncStart = $i;
                 }
                 $cur_l += 3;
+                /* first we add the encoded string that reached it's max size */
                 if ($cur_l > ($max_l-2)) {
-                    if ($iEncStart !== false) {
-                        $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);                        
-                        $aRet[] = "=?$default_charset?Q?$ret?=";
-                    } else {
-                        $aRet[] = substr($string,$iOffset,$i-$iOffset);
-                    }
+                    $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);
+                    $aRet[] = "=?$default_charset?Q?$ret?= "; /* the next part is also encoded => separate by space */
                     $cur_l = 3;
                     $ret = '';
                     $iOffset = $i;
+                    $iEncStart = $i;
                 }
-                $enc_init = true;                    
+                $enc_init = true;
                 $ret .= sprintf("=%02X", $k);
             } else {
                 if ($iEncStart !== false) {
                     $cur_l++;
                     if ($cur_l > $max_l) {
-                        $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);  
+                        $aRet[] = substr($string,$iOffset,$iEncStart-$iOffset);
                         $aRet[] = "=?$default_charset?Q?$ret?=";
                         $iEncStart = false;
                         $iOffset = $i;
                         $cur_l = 0;
                         $ret = '';
-                    } else {                     
+                    } else {
                         $ret .= $string{$i};
                     }
                 }