X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fimap_general.php;h=1cdd83a0d445716eaf86a63bc1febb8fe0325893;hb=90bc0b93cb30d88fa4199370b902ca8671895f7d;hp=5df2e3e9a26cd366677016a6472dbdbd9a1ed268;hpb=f6941f00e4e7dcc98aa6ff303aab9ea254a12bd2;p=squirrelmail.git diff --git a/functions/imap_general.php b/functions/imap_general.php index 5df2e3e9..1cdd83a0 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,20 +17,58 @@ 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, 4096); - 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(); + + $continue = true; + while ($continue) { + // Continue if needed for this single line + while (strpos($read, "\n") === false) { + $read .= fgets($imap_stream, 9096); + } + if ($imap_general_debug) { + echo "$read
\n"; + flush(); + } + + if (ereg("^$pre (OK|BAD|NO)(.*)$", $read, $regs)) { + if ($size) { + $dt = $data; + $dt[0] = $dt[count($dt)-1] = ""; + $d = implode ("", $dt); + if (strlen($d) >= $size) { + $continue = false; + } else { + $data[] = $read; + $read = fgets ($imap_stream, 9096); + } + } else { + $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") { + 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 : Could not complete request."); @@ -37,15 +76,15 @@ 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; } + } 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; @@ -58,7 +97,8 @@ function sqimap_login ($username, $password, $imap_server_address, $imap_port, $hide) { global $color, $squirrelmail_language, $HTTP_ACCEPT_LANGUAGE, $onetimepad; - $imap_stream = fsockopen ($imap_server_address, $imap_port, &$error_number, &$error_string); + $imap_stream = fsockopen ($imap_server_address, $imap_port, + &$error_number, &$error_string, 15); $server_info = fgets ($imap_stream, 1024); // Decrypt the password @@ -74,7 +114,8 @@ exit; } - fputs ($imap_stream, "a001 LOGIN \"$username\" \"$password\"\r\n"); + fputs ($imap_stream, "a001 LOGIN \"" . quotemeta($username) . + "\" \"" . quotemeta($password) . "\"\r\n"); $read = sqimap_read_data ($imap_stream, "a001", false, $response, $message); /** If the connection was not successful, lets see why **/ @@ -168,8 +209,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];