$aResponse = '';
$resultlist = array();
$data = array();
+ $sCommand = '';
+ if (preg_match("/^(\w+)\s*/",$query,$aMatch)) {
+ $sCommand = strtoupper($aMatch[1]);
+ } else {
+ // error reporting (shouldn't happen)
+ }
$read = sqimap_fgets($imap_stream);
$i = 0;
while ($read) {
case '*':
{
- if (preg_match('/^\*\s\d+\sFETCH/',$read)) {
+ if (($sCommand == "FETCH" || $sCommand == "STORE") && preg_match('/^\*\s\d+\sFETCH/',$read)) {
/* check for literal */
$s = substr($read,-3);
$fetch_data = array();
* Implementing IMAP STARTTLS (rfc2595) in php 5.1.0+
* http://www.php.net/stream-socket-enable-crypto
*/
- if ($tls == 2) {
+ if ($tls === 2) {
if (function_exists('stream_socket_enable_crypto')) {
// check starttls capability, don't use cached capability version
if (! sqimap_capability($imap_stream, 'STARTTLS', false)) {
// starttls command failed
sqimap_error_box(sprintf(_("Error connecting to IMAP server: %s."), $server),
'STARTTLS',
- _("Server replied: "),
+ _("Server replied:") . ' ',
$starttls_message);
exit();
}
// starttls was successful
/**
- * RFC 2595 requires to discard CAPABILITY information after successful
- * STARTTLS command. We don't follow RFC, because SquirrelMail stores CAPABILITY
- * information only after successful login (src/redirect.php) and cached information
- * is used only in other php script connections after successful STARTTLS. If script
- * issues sqimap_capability() call before sqimap_login() and wants to get initial
- * capability response, script should set third sqimap_capability() argument to false.
+ * RFC 2595 requires to discard CAPABILITY information after successful
+ * STARTTLS command. We don't follow RFC, because SquirrelMail stores CAPABILITY
+ * information only after successful login (src/redirect.php) and cached information
+ * is used only in other php script connections after successful STARTTLS. If script
+ * issues sqimap_capability() call before sqimap_login() and wants to get initial
+ * capability response, script should set third sqimap_capability() argument to false.
*/
- //sqsession_unregister('sqimap_capabilities');
+ //sqsession_unregister('sqimap_capabilities');
} else {
/**
* stream_socket_enable_crypto() call failed. Possible issues:
* - broken ssl certificate (uw drops connection, error is in syslog mail facility)
- * - some ssl error (can reproduce with STREAM_CRYPTO_METHOD_SSLv3_CLIENT, PHP E_WARNING
+ * - some ssl error (can reproduce with STREAM_CRYPTO_METHOD_SSLv3_CLIENT, PHP E_WARNING
* suppressed in stream_socket_enable_crypto() call)
*/
sqimap_error_box(sprintf(_("Error connecting to IMAP server: %s."), $server),
'','',
_("Unable to start TLS."));
/**
- * Bug: stream_socket_enable_crypto() does not register SSL errors in
- * openssl_error_string() or stream notification wrapper and displays
- * them in E_WARNING level message. It is impossible to retrieve error
+ * Bug: stream_socket_enable_crypto() does not register SSL errors in
+ * openssl_error_string() or stream notification wrapper and displays
+ * them in E_WARNING level message. It is impossible to retrieve error
* message without own error handler.
*/
exit;
* else returns array of all capabilities.
* @param stream $imap_stream
* @param string $capability (since 1.3.0)
- * @param boolean $bUseCache (since 1.5.1) Controls use of capability data stored in session
+ * @param boolean $bUseCache (since 1.5.1) Controls use of capability data stored in session
* @return mixed (string if $capability is set and found,
* false, if $capability is set and not found,
* array if $capability not set)
* @deprecated
*/
function sqimap_get_num_messages ($imap_stream, $mailbox) {
- $read_ary = sqimap_run_command ($imap_stream, 'EXAMINE ' . sqimap_encode_mailbox_name($mailbox), false, $result, $message);
- for ($i = 0; $i < count($read_ary); $i++) {
- if (ereg("[^ ]+ +([^ ]+) +EXISTS", $read_ary[$i], $regs)) {
- return $regs[1];
- }
- }
- return false; //"BUG! Couldn't get number of messages in $mailbox!";
+ $aStatus = sqimap_status_messages($imap_stream,$mailbox,array('MESSAGES'));
+ return $aStatus['MESSAGES'];
}
/**
}
$i++;
}
- return array('MESSAGES' => $messages,
+
+ $status=array('MESSAGES' => $messages,
'UNSEEN'=>$unseen,
'RECENT' => $recent,
'UIDNEXT' => $uidnext,
'UIDVALIDITY' => $uidvalidity);
+
+ if (!empty($messages)) { $hook_status['MESSAGES']=$messages; }
+ if (!empty($unseen)) { $hook_status['UNSEEN']=$unseen; }
+ if (!empty($recent)) { $hook_status['RECENT']=$recent; }
+ if (!empty($hook_status)) {
+ $hook_status['MAILBOX']=$mailbox;
+ $hook_status['CALLER']='sqimap_status_messages';
+ do_hook_function('folder_status',$hook_status);
+ }
+ return $status;
}
* @param stream $imap_stream
* @param string $sent_folder
* @param $length
+ * @return string $sid
*/
-function sqimap_append ($imap_stream, $sent_folder, $length) {
- fputs ($imap_stream, sqimap_session_id() . ' APPEND ' . sqimap_encode_mailbox_name($sent_folder) . " (\\Seen) {".$length."}\r\n");
+function sqimap_append ($imap_stream, $sMailbox, $length) {
+ $sid = sqimap_session_id();
+ $query = $sid . ' APPEND ' . sqimap_encode_mailbox_name($sMailbox) . " (\\Seen) {".$length."}";
+ fputs ($imap_stream, "$query\r\n");
$tmp = fgets ($imap_stream, 1024);
- sqimap_append_checkresponse($tmp, $sent_folder);
+ sqimap_append_checkresponse($tmp, $sMailbox,$sid, $query);
+ return $sid;
}
/**
* @param stream imap_stream
* @param string $folder (since 1.3.2)
*/
-function sqimap_append_done ($imap_stream, $folder='') {
+function sqimap_append_done ($imap_stream, $sMailbox='') {
fputs ($imap_stream, "\r\n");
$tmp = fgets ($imap_stream, 1024);
- sqimap_append_checkresponse($tmp, $folder);
+ while (!sqimap_append_checkresponse($tmp, $sMailbox)) {
+ $tmp = fgets ($imap_stream, 1024);
+ }
}
/**
* Displays error messages, if there are errors in responses to
* commands issues by sqimap_append() and sqimap_append_done() functions.
* @param string $response
- * @param string $folder
- * @since 1.5.1
+ * @param string $sMailbox
+ * @return bool $bDone
+ * @since 1.5.1 and 1.4.5
*/
-function sqimap_append_checkresponse($response, $folder) {
+function sqimap_append_checkresponse($response, $sMailbox, $sid='', $query='') {
+ // static vars to keep them available when sqimap_append_done calls this function.
+ static $imapquery, $imapsid;
- if (preg_match("/(.*)(BAD|NO)(.*)$/", $response, $regs)) {
- global $squirrelmail_language, $color;
- set_up_language($squirrelmail_language);
- require_once(SM_PATH . 'functions/display_messages.php');
+ $bDone = false;
- $reason = $regs[3];
- if ($regs[2] == 'NO') {
- $string = "<b><font color=\"$color[2]\">\n" .
- _("ERROR: Could not append message to") ." $folder." .
- "</b><br />\n" .
- _("Server responded:") . ' ' .
- $reason . "<br />\n";
- if (preg_match("/(.*)(quota)(.*)$/i", $reason, $regs)) {
- $string .= _("Solution:") . ' ' .
- _("Remove unneccessary messages from your folder and start with your Trash folder.")
- ."<br />\n";
- }
- $string .= "</font>\n";
- error_box($string,$color);
- } else {
- $string = "<b><font color=\"$color[2]\">\n" .
- _("ERROR: Bad or malformed request.") .
- "</b><br />\n" .
- _("Server responded:") . ' ' .
- $reason . "</font><br />\n";
- error_box($string,$color);
- exit;
+ if ($query) {
+ $imapquery = $query;
+ }
+ if ($sid) {
+ $imapsid = $sid;
+ }
+ if ($response{0} == '+') {
+ // continuation request triggerd by sqimap_append()
+ $bDone = true;
+ } else {
+ $i = strpos($response, ' ');
+ $sRsp = substr($response,0,$i);
+ $sMsg = substr($response,$i+1);
+ $aExtra = array('MAILBOX' => $sMailbox);
+ switch ($sRsp) {
+ case '*': //untagged response
+ $i = strpos($sMsg, ' ');
+ $sRsp = strtoupper(substr($sMsg,0,$i));
+ $sMsg = substr($sMsg,$i+1);
+ if ($sRsp == 'NO' || $sRsp == 'BAD') {
+ // for the moment disabled. Enable after 1.5.1 release.
+ // Notices could give valueable information about the mailbox
+ // sqm_trigger_imap_error('SQM_IMAP_APPEND_NOTICE',$imapquery,$sRsp,$sMsg);
+ }
+ $bDone = false;
+ case $imapsid:
+ // A001 OK message
+ // $imapsid<space>$sRsp<space>$sMsg
+ $bDone = true;
+ $i = strpos($sMsg, ' ');
+ $sRsp = strtoupper(substr($sMsg,0,$i));
+ $sMsg = substr($sMsg,$i+1);
+ switch ($sRsp) {
+ case 'NO':
+ if (preg_match("/(.*)(quota)(.*)$/i", $sMsg, $aMatch)) {
+ sqm_trigger_imap_error('SQM_IMAP_APPEND_QUOTA_ERROR',$imapquery,$sRsp,$sMsg,$aExtra);
+ } else {
+ sqm_trigger_imap_error('SQM_IMAP_APPEND_ERROR',$imapquery,$sRsp,$sMsg,$aExtra);
+ }
+ break;
+ case 'BAD':
+ sqm_trigger_imap_error('SQM_IMAP_ERROR',$imapquery,$sRsp,$sMsg,$aExtra);
+ break;
+ case 'BYE':
+ sqm_trigger_imap_error('SQM_IMAP_BYE',$imapquery,$sRsp,$sMsg,$aExtra);
+ break;
+ case 'OK':
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ // should be false because of the unexpected response but i'm not sure if
+ // that will cause an endless loop in sqimap_append_done
+ $bDone = true;
}
}
+ return $bDone;
}
/**