From 08b7f7cc34b458ca70cadf0a3a0239afa0ecda56 Mon Sep 17 00:00:00 2001 From: stekkel Date: Wed, 28 May 2003 22:14:41 +0000 Subject: [PATCH] encodeheader / decodeHeader fixes. Removal of between 2 encoded 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 | 131 +++++++++++++++++++++++++++------------------ 1 file changed, 78 insertions(+), 53 deletions(-) diff --git a/functions/mime.php b/functions/mime.php index b2fb5e2a..8e599f3b 100644 --- a/functions/mime.php +++ b/functions/mime.php @@ -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 . '&ent_id='.$ent_num. - '&mailbox=' . $urlmailbox .'&sort=' . $sort . - '&startMessage=' . $startMessage . '&show_more=0'; - if (isset($passed_ent_id)) { - $link .= '&passed_ent_id='.$passed_ent_id; - } + $link = 'read_body.php?passed_id=' . $id . '&ent_id='.$ent_num. + '&mailbox=' . $urlmailbox .'&sort=' . $sort . + '&startMessage=' . $startMessage . '&show_more=0'; + if (isset($passed_ent_id)) { + $link .= '&passed_ent_id='.$passed_ent_id; + } if ($view_unsafe_images) { $text = _("Hide Unsafe Images"); } else { - if (isset($has_unsafe_images) && $has_unsafe_images) { - $link .= '&view_unsafe_images=1'; - $text = _("View Unsafe Images"); - } else { - $text = ''; - } + if (isset($has_unsafe_images) && $has_unsafe_images) { + $link .= '&view_unsafe_images=1'; + $text = _("View Unsafe Images"); + } else { + $text = ''; + } } $body .= '
'.$text. - '

' . "\n"; + '
' . "\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] . "
"; + /* 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 .= ' '; + } 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 .= ' '; + } 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}; } } -- 2.25.1