X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=functions%2Fimap_general.php;h=d23f0c375944ce4e66fc1c28fa392af5b65079a3;hb=1d82ead6a476578f3edf9ba558852ddbe0d4a447;hp=5e80c89cb8cfc8413fce3e81dd776c5fc42b9e30;hpb=98c2f0affd982ea365420d4c49a8a4509c3524ba;p=squirrelmail.git diff --git a/functions/imap_general.php b/functions/imap_general.php index 5e80c89c..d23f0c37 100755 --- a/functions/imap_general.php +++ b/functions/imap_general.php @@ -3,10 +3,11 @@ ** imap.php ** ** This implements all functions that do general imap functions. + ** + ** $Id$ **/ $imap_general_debug = false; - //$imap_general_debug = false; /****************************************************************************** ** Reads the output from the IMAP stream. If handle_errors is set to true, @@ -16,39 +17,86 @@ function sqimap_read_data ($imap_stream, $pre, $handle_errors, &$response, &$message) { global $color, $squirrelmail_language, $imap_general_debug; - $counter = 0; - do { - $data[$counter] = $read = fgets ($imap_stream, 9096); - if ($imap_general_debug) { echo "$read
"; flush(); } - $counter++; - } while (! ereg("^$pre (OK|BAD|NO)(.*)$", $read, $regs)); + $read = fgets($imap_stream, 9096); + + if (ereg("^\\* [0-9]+ FETCH.*\\{([0-9]+)\\}", $read, $regs)) { + $size = $regs[1]; + } else { + $size = 0; + } + + $data = Array(); + $total_size = 0; + + $continue = true; + while ($continue) { + // Continue if needed for this single line + while (strpos($read, "\n") === false) { + $read .= fgets($imap_stream, 9096); + } + // For debugging purposes + if ($imap_general_debug) { + echo "$read
\n"; + flush(); + } + + + // If we know the size, no need to look at the end parameters + if ($size > 0) { + if ($total_size == $size) { + $data[] = $read; + $read = fgets($imap_stream, 9096); + $read = fgets($imap_stream, 9096); + $continue = false; + } else if ($total_size > $size) { + $difference = $total_size - $size; + $total_size = $total_size - strlen($read); + $read = substr ($read, 0, strlen($read)-$difference); + $data[] = $read; + $junk = fgets($imap_stream, 9096); + $continue = false; + } else { + $data[] = $read; + $read = fgets($imap_stream, 9096); + } + $total_size += strlen($read); + } else { + if (ereg("^$pre (OK|BAD|NO)(.*)$", $read, $regs)) { + $continue = false; + } else { + $data[] = $read; + $read = fgets ($imap_stream, 9096); + } + } + } $response = $regs[1]; $message = trim($regs[2]); if ($imap_general_debug) echo "--
"; - if ($handle_errors == true) { - if ($response == "NO") { - // ignore this error from m$ exchange, it is not fatal (aka bug) - if (!ereg("command resulted in",$message)) { - set_up_language($squirrelmail_language); - echo "
\n"; - echo _("ERROR : Could not complete request."); - echo "
\n"; - echo _("Reason Given: "); - echo $message . "

\n"; - exit; - } - } else if ($response == "BAD") { + if ($handle_errors == false) + return $data; + + if ($response == "NO") { + // ignore this error from m$ exchange, it is not fatal (aka bug) + if (!ereg("command resulted in",$message)) { set_up_language($squirrelmail_language); echo "
\n"; - echo _("ERROR : Bad or malformed request."); + echo _("ERROR : Could not complete request."); echo "
\n"; - echo _("Server responded: "); + echo _("Reason Given: "); echo $message . "

\n"; exit; } + } else if ($response == "BAD") { + set_up_language($squirrelmail_language); + echo "
\n"; + echo _("ERROR : Bad or malformed request."); + echo "
\n"; + echo _("Server responded: "); + echo $message . "

\n"; + exit; } return $data; @@ -62,7 +110,7 @@ global $color, $squirrelmail_language, $HTTP_ACCEPT_LANGUAGE, $onetimepad; $imap_stream = fsockopen ($imap_server_address, $imap_port, - &$error_number, &$error_string, 15); + $error_number, $error_string, 15); $server_info = fgets ($imap_stream, 1024); // Decrypt the password @@ -173,8 +221,11 @@ function sqimap_capability($imap_stream, $capability) { $c = explode(' ', $read[0]); for ($i=2; $i < count($c); $i++) { - list($k, $v) = explode('=', $c[$i]); - $sqimap_capabilities[$k] = ($v)?$v:TRUE; + $cap_list = explode('=', $c[$i]); + if (isset($cap_list[1])) + $sqimap_capabilities[$cap_list[0]] = $cap_list[1]; + else + $sqimap_capabilities[$cap_list[0]] = TRUE; } } return $sqimap_capabilities[$capability];