From: stekkel Date: Thu, 28 Jul 2005 21:03:00 +0000 (+0000) Subject: Introduce error handling X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=1455d7ecf10b340d84a04b189f2d90abf883ef30;p=squirrelmail.git Introduce error handling git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@9841 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- diff --git a/class/error.class.php b/class/error.class.php new file mode 100644 index 00000000..44b7b6df --- /dev/null +++ b/class/error.class.php @@ -0,0 +1,222 @@ +TemplateName = $sTemplateFile; + $this->Template =& $oTemplate; + $this->aErrors = array(); + } + + /** + * Sets the error template + * @since 1.5.1 + */ + function SetTemplateFile($sTemplateFile) { + $this->TemplateFile = $sTemplateFile; + } + + /** + * Custom Error handler (set with set_error_handler() ) + * @private + * @since 1.5.1 + */ + function SquirrelMailErrorhandler($iErrNo, $sErrStr, $sErrFile, $iErrLine, $aContext) { + $aError = array( + 'type' => SQM_NOTICE,// Error type, notice, warning or fatal error; + 'category' => NULL, // SquirrelMail error category; + 'message' => NULL, // Error display message; + 'extra' => NULL, // Key value based array with extra error info; + 'link' => NULL, // Link to help location; + 'tip' => NULL // User tip. + ); + $iType = NULL; + $aErrorCategory = array(); + /* + * The following errors cannot be handled by a user defined error handler: + * E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING + */ + switch ($iErrNo) { + case E_NOTICE: + $iType = (is_null($iType)) ? SQM_NOTICE : $iType; + case E_WARNING: + $iType = (is_null($iType)) ? SQM_WARNING : $iType; + $aErrorCategory[] = 'PHP'; + $aError['message'] = $sErrStr; + $aError['extra'] = array( + 'FILE' => $sErrFile, + 'LINE' => $iErrLine) ;; + // what todo with $aContext? + break; + case E_USER_ERROR: + $iType = (is_null($iType)) ? SQM_ERROR : $iType; + case E_USER_NOTICE: + $iType = (is_null($iType)) ? SQM_NOTICE : $iType; + case E_USER_WARNING: + $iType = (is_null($iType)) ? SQM_WARNING : $iType; + if ($sErrFile == __FILE__) { // Error is triggered in this file and probably by sqm_trigger_error + $aErrorTemp = @unserialize($sErrStr); + if (!is_array($aErrorTemp)) { + $aError['message'] = $sErrStr; + $aErrorCategory[] = 'UNDEFINED'; + } else { + $aError = array_merge($aError,$aErrorTemp); + // special error handling below + if ($aError['category'] & SQM_ERROR_IMAP) { + $aErrorCategory[] = 'IMAP'; + // imap related error handling inside + } + if ($aError['category'] & SQM_ERROR_FS) { + $aErrorCategory[] = 'FILESYSTEM'; + // filesystem related error handling inside + } + if ($aError['category'] & SQM_ERROR_SMTP) { + $aErrorCategory[] = 'SMTP'; + // smtp related error handling inside + } + if ($aError['category'] & SQM_ERROR_LDAP) { + $aErrorCategory[] = 'LDAP'; + // ldap related error handling inside + } + if ($aError['category'] & SQM_ERROR_DB) { + $aErrorCategory[] = 'DATABASE'; + // db related error handling inside + } + if ($aError['category'] & SQM_ERROR_PLUGIN) { + $aErrorCategory[] = 'PLUGIN'; + do_hook_function('error_handler_plugin',$aError); + // plugin related error handling inside + } + //if ($aError['category'] & SQM_ERROR_X) { + // $aErrorCategory[] = 'X'; + // place holder for a new category + //} + } + unset($aErrorTemp); + } else { + $aError['message'] = $sErrStr; + $aErrorCategory[] = 'SQM_NOTICE'; + } + break; + default: break; + } + $aErrorTpl = array( + 'type' => $iType, + 'category' => $aErrorCategory, + 'message' => $aError['message'], + 'link' => $aError['link'], + 'tip' => $aError['tip'], + 'extra' => $aError['extra']); + // Add the notice/warning/error to the existing list of notices/warnings + $this->aErrors[] = $aErrorTpl; + $this->Template->assign('aErrors',$this->aErrors); + // Show the error immediate in case of fatal errors + if ($iType == SQM_ERROR) { + $this->DisplayErrors(); + exit(_("Terminating SquirrelMail due to a fatal error")); + } + } + + /** + * Display the error array in the error template + * @return void + * @since 1.5.1 + */ + function DisplayErrors() { + if (count($this->aErrors)) { + $this->Template->display($this->TemplateName); + } + } +} + +/** + * Custom Error handler for PHP version < 4.3.0 (set with set_error_handler() ) + * @author Marc Groot Koerkamp + * @since 1.5.1 + */ +function SquirrelMailErrorhandler($iErrNo, $sErrStr, $sErrFile, $iErrLine, $aContext) { + global $oTemplate; + static $oErrorHandler; + if (!isset($oErrorHandler)) { + $oErrorHandler = new ErrorHandler($oTemplate,'error_message.tpl'); + } + $oErrorHandler->SquirrelMailErrorhandler($iErrNo, $sErrStr, $sErrFile, $iErrLine, $aContext); +} + +/** + * Triggers an imap error. Utility function for sqm_trigger_error() + * @param integer $iErrNo error number defined in errors.php + * @param string $sRequest imap request string + * @param string $sResponse tagged imap response + * @param string $sMessage tagged imap response message + * @param array $aExtra optional associative array with extra error info + * @return void + * @author Marc Groot Koerkamp + * @since 1.5.1 + */ +function sqm_trigger_imap_error($iErrNo,$sRequest,$sResponse, $sMessage, $aExtra=array()) { + $aError = array( + 'REQUEST' => $sRequest, + 'RESPONSE' => $sResponse, + 'MESSAGE' => $sMessage); + $aError = array_merge($aExtra,$aError); + sqm_trigger_error($iErrNo,$aError); +} + +/** + * Trigger an error. + * @param integer $iErrNo error number defined in errors.php + * @param array $aExtra optional associative array with extra error info + * @return void + * @author Marc Groot Koerkamp + * @since 1.5.1 + */ +function sqm_trigger_error($iErrNo,$aExtra=array()) { + // Include the error definition file. + include_once(SM_PATH.'include/errors.php'); + $iPhpErr = E_USER_NOTICE; + if (is_array($aErrors) && isset($aErrors[$iErrNo]['level'])) { + if (is_array($aExtra) && count($aExtra)) { + $aErrors[$iErrNo]['extra'] = $aExtra; + } + // because trigger_error can only handle a string argument for the error description + // we serialize the result. + $sErrString = serialize($aErrors[$iErrNo]); + $iPhpErr = $aErrors[$iErrNo]['level']; + } else { + $sErrString = "Error number <$iErrNo> does not exist, fix the code or update the errors.php file"; + $iPhpErr = E_USER_ERROR; + } + trigger_error($sErrString, $iPhpErr); +} +?> \ No newline at end of file diff --git a/include/errors.php b/include/errors.php new file mode 100644 index 00000000..476e8ac3 --- /dev/null +++ b/include/errors.php @@ -0,0 +1,42 @@ + E_USER_ERROR, + 'category' => SQM_ERROR_IMAP, + 'message' => _("Thread sorting is not supported by your IMAP server.") . "\n" . + _("Please contact your system administrator and report this error."), + 'link' => '', + 'tip' => _("Run \"configure\", choose option 4 (General options) and set option 10 (Allow server thread sort to false") +); + +$aErrors['SQM_IMAP_NO_SORT'] = array( + 'level' => E_USER_ERROR, + 'category' => SQM_ERROR_IMAP, + 'message' => _( "Server-side sorting is not supported by your IMAP server.") . "\n" . + _("Please contact your system administrator and report this error."), + 'link' => '', + 'tip' => _("Run \"configure\", choose option 4 (General options) and set option 11 (Allow server-side sorting to false") +); + + +//$aError['SQM_FS'] // Filesystem related errors