Пример #1
0
 /**
  * display a nice error if it occurs and log everything
  *
  * @param PDOException $error
  * @param bool $showerror if set to false, the error will be logged but we go on
  */
 private static function _showerror($error, $showerror = true)
 {
     global $userinfo, $theme, $linker;
     /**
      * log to a file, so we can actually ask people for the error
      * (no one seems to find the stuff in the syslog)
      */
     $sl_dir = makeCorrectDir(FROXLOR_INSTALL_DIR . "/logs/");
     if (!file_exists($sl_dir)) {
         @mkdir($sl_dir, 0755);
     }
     $sl_file = makeCorrectFile($sl_dir . "/sql-error.log");
     $sqllog = @fopen($sl_file, 'a');
     @fwrite($sqllog, date('d.m.Y H:i', time()) . " --- " . str_replace("\n", " ", $error->getMessage()) . "\n");
     @fwrite($sqllog, date('d.m.Y H:i', time()) . " --- DEBUG: \n" . $error->getTraceAsString() . "\n");
     @fclose($sqllog);
     /**
      * log error for reporting
      */
     $errid = substr(md5(microtime()), 5, 5);
     $err_file = makeCorrectFile($sl_dir . "/" . $errid . "_sql-error.log");
     $errlog = @fopen($err_file, 'w');
     @fwrite($errlog, "|CODE " . $error->getCode() . "\n");
     @fwrite($errlog, "|MSG " . $error->getMessage() . "\n");
     @fwrite($errlog, "|FILE " . $error->getFile() . "\n");
     @fwrite($errlog, "|LINE " . $error->getLine() . "\n");
     @fwrite($errlog, "|TRACE\n" . $error->getTraceAsString() . "\n");
     @fclose($errlog);
     if ($showerror) {
         // include userdata.inc.php
         require FROXLOR_INSTALL_DIR . "/lib/userdata.inc.php";
         // fallback
         $theme = 'Sparkle';
         // le format
         if (isset($sql['root_user']) && isset($sql['root_password']) && (!isset($sql_root) || !is_array($sql_root))) {
             $sql_root = array(0 => array('caption' => 'Default', 'host' => $sql['host'], 'socket' => isset($sql['socket']) ? $sql['socket'] : null, 'user' => $sql['root_user'], 'password' => $sql['root_password']));
         }
         // hide username/password in messages
         $error_message = $error->getMessage();
         $error_trace = $error->getTraceAsString();
         // error-message
         $error_message = str_replace($sql['password'], 'DB_UNPRIV_PWD', $error_message);
         $error_message = str_replace($sql_root[0]['password'], 'DB_ROOT_PWD', $error_message);
         // error-trace
         $error_trace = str_replace($sql['password'], 'DB_UNPRIV_PWD', $error_trace);
         $error_trace = str_replace($sql_root[0]['password'], 'DB_ROOT_PWD', $error_trace);
         if ($error->getCode() == 2003) {
             $error_message = "Unable to connect to database. Either the mysql-server is not running or your user/password is wrong.";
             $error_trace = "";
         }
         // clean up sensitive data
         unset($sql);
         unset($sql_root);
         if (isset($theme) && $theme != '' && !isset($_SERVER['SHELL']) || isset($_SERVER['SHELL']) && $_SERVER['SHELL'] == '') {
             // if we're not on the shell, output a nice error
             $_errtpl = dirname($sl_dir) . '/templates/' . $theme . '/misc/dberrornice.tpl';
             if (file_exists($_errtpl)) {
                 $err_hint = file_get_contents($_errtpl);
                 // replace values
                 $err_hint = str_replace("<TEXT>", $error_message, $err_hint);
                 $err_hint = str_replace("<DEBUG>", $error_trace, $err_hint);
                 $err_hint = str_replace("<CURRENT_YEAR>", date('Y', time()), $err_hint);
                 $err_report_html = '';
                 if (is_array($userinfo) && ($userinfo['adminsession'] == '1' && Settings::Get('system.allow_error_report_admin') == '1' || $userinfo['adminsession'] == '0' && Settings::Get('system.allow_error_report_customer') == '1')) {
                     $err_report_html = '<a href="<LINK>" title="Click here to report error">Report error</a>';
                     $err_report_html = str_replace("<LINK>", $linker->getLink(array('section' => 'index', 'page' => 'send_error_report', 'errorid' => $errid)), $err_report_html);
                 }
                 $err_hint = str_replace("<REPORT>", $err_report_html, $err_hint);
                 // show
                 die($err_hint);
             }
         }
         die("We are sorry, but a MySQL - error occurred. The administrator may find more information in in the sql-error.log in the logs/ directory");
     }
 }