$this->TemplateName = $sTemplateFile;
$this->Template =& $oTemplate;
$this->aErrors = array();
+ $this->header_sent = false;
}
/**
$this->TemplateFile = $sTemplateFile;
}
+ /**
+ * Sets if the page header is already sent
+ * @since 1.5.1
+ */
+ function HeaderSent() {
+ $this->header_sent = true;
+ }
+
+ /**
+ * Sets the error template
+ * @since 1.5.1
+ */
+ function AssignDelayedErrors(&$aDelayedErrors) {
+ $aErrors = array_merge($this->aErrors,$aDelayedErrors);
+ $this->aErrors = $aErrors;
+ $this->Template->assign('aErrors',$this->aErrors);
+ $aDelayedErrors = false;
+ }
+
+
/**
* Custom Error handler (set with set_error_handler() )
* @private
// Show the error immediate in case of fatal errors
if ($iType == SQM_ERROR) {
+ if (!$this->header_sent) {
+ // replace this with template that can be assigned
+ displayHtmlHeader(_("Error"),'',false);
+ }
$this->DisplayErrors();
exit(_("Terminating SquirrelMail due to a fatal error"));
}
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)) {
+ if (!empty($hook_status)) {
$hook_status['MAILBOX']=$mailbox;
$hook_status['CALLER']='sqimap_status_messages';
do_hook_function('folder_status',$hook_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
+ * @param string $sMailbox
+ * @return bool $bDone
* @since 1.5.1 and 1.4.5
*/
-function sqimap_append_checkresponse($response, $folder) {
- // TODO use error handler, see how sort and thread errors are handled and see errors.php
- if (preg_match("/(.*)(BAD|NO)(.*)$/", $response, $regs)) {
- global $squirrelmail_language, $color;
- set_up_language($squirrelmail_language);
- require_once(SM_PATH . 'functions/display_messages.php');
+function sqimap_append_checkresponse($response, $sMailbox, $sid='', $query='') {
+ global $color;
+ // static vars to keep them available when sqimap_append_done calls this function.
+ static $imapquery, $imapsid;
- $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;
+ $bDone = false;
+
+ 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;
}
/**
* @return void
*/
function displayHtmlHeader( $title = 'SquirrelMail', $xtra = '', $do_hook = TRUE, $frames = FALSE ) {
- global $squirrelmail_language, $sTplDir;
+ global $squirrelmail_language, $sTplDir, $oErroHandler;
if ( !sqgetGlobalVar('base_uri', $base_uri, SQ_SESSION) ) {
global $base_uri;
/* this is used to check elsewhere whether we should call this function */
$pageheader_sent = TRUE;
+ if (isset($oErrorHandler)) {
+ $oErrorHander->HeaderSent();
+ }
}
/**
'tip' => _("Run \"configure\", choose option 4 (General options) and set option 12 (Allow server charset search) to false) or choose option 10 (Language settings) and set option 2 (Default charset) to a charset supported by your IMAP server.")
);
+$aErrors['SQM_IMAP_APPEND_QUOTA_ERROR'] = array(
+ 'level' => E_USER_NOTICE,
+ 'category' => SQM_ERROR_IMAP,
+ 'message' => _( "Out of quota error."),
+ 'link' => '',
+ 'tip' => _("Remove unneccessary messages from your folder and start with your Trash folder.")
+);
+
+$aErrors['SQM_IMAP_APPEND_ERROR'] = array(
+ 'level' => E_USER_NOTICE,
+ 'category' => SQM_ERROR_IMAP,
+ 'message' => _( "An error occured when SquirrelMail appended a message to the mailbox as listed in this message."),
+ 'link' => ''
+);
+
$aErrors['SQM_IMAP_ERROR'] = array(
'level' => E_USER_ERROR,
'category' => SQM_ERROR_IMAP,
_("Please contact your system administrator and report this error."),
'link' => ''
);
+
+$aErrors['SQM_IMAP_BYE'] = array(
+ 'level' => E_USER_ERROR,
+ 'category' => SQM_ERROR_IMAP,
+ 'message' => _( "IMAP server closed the connection.") . "\n" .
+ _("Please contact your system administrator and report this error."),
+ 'link' => ''
+);
+
//$aError['SQM_FS'] // Filesystem related errors
?>
\ No newline at end of file
sqgetGlobalVar('composesession', $composesession, SQ_SESSION);
sqgetGlobalVar('compose_messages', $compose_messages, SQ_SESSION);
+sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
+if (is_array($delayed_errors)) {
+ $oErrorHandler->AssignDelayedErrors($delayed_errors);
+ sqsession_unregister("delayed_errors");
+}
/** SESSION/POST/GET VARS */
sqgetGlobalVar('session',$session);
}
sqimap_logout($imap_stream);
}
+ if (count($oErrorHandler->aErrors)) {
+ sqsession_register($oErrorHandler->aErrors,"delayed_errors");
+ }
session_write_close();
if ($compose_new_win == '1') {
if ( !isset($pageheader_sent) || !$pageheader_sent ) {
$composeMessage=$compose_messages[$session];
$Result = deliverMessage($composeMessage);
+
do_hook('compose_send_after', $Result, $composeMessage);
if (! $Result) {
showInputForm($session);
}
sqimap_logout($imap_stream);
}
+ /*
+ * Store the error array in the session because they will be lost on a redirect
+ */
+ if (count($oErrorHandler->aErrors)) {
+ sqsession_register($oErrorHandler->aErrors,"delayed_errors");
+ }
session_write_close();
if ($compose_new_win == '1') {
if ( !isset($pageheader_sent) || !$pageheader_sent ) {
} else {
unset ($deliver);
if (sqimap_mailbox_exists ($imapConnection, $sent_folder)) {
- sqimap_append ($imapConnection, $sent_folder, $length);
+ $sid = sqimap_append ($imapConnection, $sent_folder, $length);
require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
$imap_deliver = new Deliver_IMAP();
$imap_deliver->mail($composeMessage, $imapConnection);
- sqimap_append_done ($imapConnection);
+ sqimap_append_done ($imapConnection, $sent_folder);
unset ($imap_deliver);
}
}
if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
$messages = array();
}
-
+sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
+if (is_array($delayed_errors)) {
+ $oErrorHandler->AssignDelayedErrors($delayed_errors);
+ sqsession_unregister("delayed_errors");
+}
/** GET VARS */
sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET);
if (!sqgetGlobalVar('where', $where, SQ_GET) ) {
$message->is_seen = true;
$aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
}
-
if (isset($passed_ent_id) && $passed_ent_id) {
$message = $message->getEntity($passed_ent_id);
if ($message->type0 != 'message' && $message->type1 != 'rfc822') {
sqgetGlobalVar('onetimepad',$onetimepad, SQ_SESSION);
sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
sqgetGlobalVar('base_uri', $base_uri, SQ_SESSION);
-
+sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
+if (is_array($delayed_errors)) {
+ $oErrorHandler->AssignDelayedErrors($delayed_errors);
+ sqsession_unregister("delayed_errors");
+}
sqgetGlobalVar('mailbox', $mailbox);
sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
sqgetGlobalVar('targetMailbox', $lastTargetMailbox, SQ_POST);