/** * Halts execution of the entire system and displays an error message * * @param string Text of the error message. Leave blank to use $this->sql as error text. * * @return integer */ function halt($errortext = '') { global $vbulletin; if ($this->connection_recent) { $this->error = $this->error($this->connection_recent); $this->errno = $this->errno($this->connection_recent); } if ($this->reporterror) { if ($errortext == '') { $this->sql = "Invalid SQL:\r\n" . chop($this->sql) . ';'; $errortext =& $this->sql; } // Try and stop e-mail flooding. if (!$vbulletin->options['disableerroremail']) { if (!$vbulletin->options['safeupload']) { $tempdir = ini_get('upload_tmp_dir'); } else { $tempdir = $vbulletin->options['tmppath'] . '/'; } $unique = md5(COOKIE_SALT); $tempfile = $tempdir . "zdberr{$unique}.dat"; /* If its less than a minute since the last e-mail and the error code is the same as last time, disable e-mail */ if ($data = @file_get_contents($tempfile)) { $errc = intval(substr($data, 10)); $time = intval(substr($data, 0, 10)); if ($time and TIMENOW - $time < 60 and intval($this->errno) == $errc) { $vbulletin->options['disableerroremail'] = true; } else { $data = TIMENOW . intval($this->errno); @file_put_contents($tempfile, $data); } } else { $data = TIMENOW . intval($this->errno); @file_put_contents($tempfile, $data); } } $vboptions =& $vbulletin->options; $technicalemail =& $vbulletin->config['Database']['technicalemail']; $bbuserinfo =& $vbulletin->userinfo; $requestdate = date('l, F jS Y @ h:i:s A', TIMENOW); $date = date('l, F jS Y @ h:i:s A'); $scriptpath = str_replace('&', '&', $vbulletin->scriptpath); $referer = REFERRER; $ipaddress = IPADDRESS; $classname = get_class($this); if ($this->connection_recent) { $this->hide_errors(); list($mysqlversion) = $this->query_first("SELECT VERSION() AS version", DBARRAY_NUM); $this->show_errors(); } $display_db_error = (VB_AREA == 'Upgrade' or VB_AREA == 'Install' or $vbulletin->userinfo['permissions']['adminpermissions'] & $vbulletin->bf_ugp_adminpermissions['cancontrolpanel']); // Hide the MySQL Version if its going in the source if (!$display_db_error) { $mysqlversion = ''; } eval('$message = "' . str_replace('"', '\\"', file_get_contents(DIR . '/includes/database_error_message.html')) . '";'); // add a backtrace to the message if ($vbulletin->debug) { $trace = debug_backtrace(); $trace_output = "\n"; foreach ($trace as $index => $trace_item) { $param = in_array($trace_item['function'], array('require', 'require_once', 'include', 'include_once')) ? $trace_item['args'][0] : ''; // remove path $param = str_replace(DIR, '[path]', $param); $trace_item['file'] = str_replace(DIR, '[path]', $trace_item['file']); $trace_output .= "#{$index} {$trace_item['class']}{$trace_item['type']}{$trace_item['function']}({$param}) called in {$trace_item['file']} on line {$trace_item['line']}\n"; } $message .= "\n\nStack Trace:\n{$trace_output}\n"; } require_once DIR . '/includes/functions_log_error.php'; if (function_exists('log_vbulletin_error')) { log_vbulletin_error($message, 'database'); } if ($technicalemail != '' and !$vbulletin->options['disableerroremail'] and verify_email_vbulletin_error($this->errno, 'database')) { // If vBulletinHook is defined then we know that options are loaded, so we can then use vbmail if (class_exists('vBulletinHook', false)) { @vbmail($technicalemail, $this->appshortname . ' Database Error!', $message, true, $technicalemail); } else { @mail($technicalemail, $this->appshortname . ' Database Error!', preg_replace("#(\r\n|\r|\n)#s", @ini_get('sendmail_path') === '' ? "\r\n" : "\n", $message), "From: {$technicalemail}"); } } if (defined('STDIN')) { echo $message; exit; } // send ajax reponse after sending error email if ($vbulletin->GPC['ajax']) { require_once DIR . '/includes/class_xml.php'; $xml = new vB_AJAX_XML_Builder($vbulletin, 'text/xml'); $error = '<p>Database Error</p>'; if ($vbulletin->debug or VB_AREA == 'Upgrade') { $error .= "\r\n\r\n{$errortext}"; $error .= "\r\n\r\n{$this->error}"; } eval('$ajaxmessage = "' . str_replace('"', '\\"', file_get_contents(DIR . '/includes/database_error_message_ajax.html')) . '";'); $xml->add_group('errors'); $xml->add_tag('error', $error); $xml->add_tag('error_html', $ajaxmessage); $xml->close_group('errors'); $xml->print_xml(); } if (!headers_sent()) { if (SAPI_NAME == 'cgi' or SAPI_NAME == 'cgi-fcgi') { header('Status: 503 Service Unavailable'); } else { header($_SERVER['SERVER_PROTOCOL'] . ' 503 Service Unavailable'); } } if ($display_db_error) { // display error message on screen $message = '<form><textarea rows="15" cols="70" wrap="off" id="message">' . htmlspecialchars_uni($message) . '</textarea></form>'; } else { if ($vbulletin->debug) { // display hidden error message $message = "\r\n<!--\r\n" . htmlspecialchars_uni($message) . "\r\n-->\r\n"; } else { $message = ''; } } if ($vbulletin->options['bburl']) { $imagepath = $vbulletin->options['bburl']; } else { // this might not work with too many slashes in the archive $imagepath = VB_AREA == 'Forum' ? '.' : '..'; } eval('$message = "' . str_replace('"', '\\"', file_get_contents(DIR . '/includes/database_error_page.html')) . '";'); // This is needed so IE doesn't show the pretty error messages $message .= str_repeat(' ', 512); die($message); } else { if (!empty($errortext)) { $this->error = $errortext; } } }
/** * Halts execution of the entire system and displays an error message * * @param string Text of the error message. Leave blank to use $this->sql as error text. * * @return integer */ function halt($errortext = '') { global $vbulletin; if ($this->connection_recent) { $this->error = $this->error($this->connection_recent); $this->errno = $this->errno($this->connection_recent); } if ($this->reporterror) { if ($errortext == '') { $this->sql = "Invalid SQL:\r\n" . chop($this->sql) . ';'; $errortext =& $this->sql; } if (!headers_sent()) { if (SAPI_NAME == 'cgi' or SAPI_NAME == 'cgi-fcgi') { header('Status: 503 Service Unavailable'); } else { header('HTTP/1.1 503 Service Unavailable'); } } $vboptions =& $vbulletin->options; $technicalemail =& $vbulletin->config['Database']['technicalemail']; $bbuserinfo =& $vbulletin->userinfo; $requestdate = date('l, F jS Y @ h:i:s A', TIMENOW); $date = date('l, F jS Y @ h:i:s A'); $scriptpath = str_replace('&', '&', $vbulletin->scriptpath); $referer = REFERRER; $ipaddress = IPADDRESS; $classname = get_class($this); if ($this->connection_recent) { $this->hide_errors(); list($mysqlversion) = $this->query_first("SELECT VERSION() AS version", DBARRAY_NUM); $this->show_errors(); } $display_db_error = (VB_AREA == 'Upgrade' or VB_AREA == 'Install' or $vbulletin->userinfo['usergroupid'] == 6 or $vbulletin->userinfo['permissions']['adminpermissions'] & $vbulletin->bf_ugp_adminpermissions); // Hide the MySQL Version if its going in the source if (!$display_db_error) { $mysqlversion = ''; } eval('$message = "' . str_replace('"', '\\"', file_get_contents(DIR . '/includes/database_error_message.html')) . '";'); require_once DIR . '/includes/functions_log_error.php'; if (function_exists('log_vbulletin_error')) { log_vbulletin_error($message, 'database'); } if ($technicalemail != '' and !$vbulletin->options['disableerroremail'] and verify_email_vbulletin_error($this->errno, 'database')) { // If vBulletinHook is defined then we know that options are loaded, so we can then use vbmail if (class_exists('vBulletinHook')) { @vbmail($technicalemail, $this->appshortname . ' Database Error!', $message, true, $technicalemail); } else { @mail($technicalemail, $this->appshortname . ' Database Error!', preg_replace("#(\r\n|\r|\n)#s", @ini_get('sendmail_path') === '' ? "\r\n" : "\n", $message), "From: {$technicalemail}"); } } if ($display_db_error) { // display error message on screen $message = '<form><textarea rows="15" cols="70" wrap="off" id="message">' . htmlspecialchars_uni($message) . '</textarea></form>'; } else { // display hidden error message $message = "\r\n<!--\r\n" . htmlspecialchars_uni($message) . "\r\n-->\r\n"; } if ($vbulletin->options['bburl']) { $imagepath = $vbulletin->options['bburl']; } else { // this might not work with too many slashes in the archive $imagepath = VB_AREA == 'Forum' ? '.' : '..'; } eval('$message = "' . str_replace('"', '\\"', file_get_contents(DIR . '/includes/database_error_page.html')) . '";'); // This is needed so IE doesn't show the pretty error messages $message .= str_repeat(' ', 512); die($message); } else { if (!empty($errortext)) { $this->error = $errortext; } } }
/** * Halts execution of the entire system and displays an error message * * @param string Text of the error message. Leave blank to use $this->sql as error text. * * @return integer */ function halt($errortext = '') { global $vbulletin; if ($this->connection_recent) { $this->error = $this->error($this->connection_recent); $this->errno = $this->errno($this->connection_recent); } if ($this->reporterror) { if ($errortext == '') { $this->sql = "Invalid SQL:\r\n" . chop($this->sql) . ';'; $errortext =& $this->sql; } $vboptions =& $vbulletin->options; $technicalemail =& $vbulletin->config['Database']['technicalemail']; $bbuserinfo =& $vbulletin->userinfo; $requestdate = date('l, F jS Y @ h:i:s A', TIMENOW); $date = date('l, F jS Y @ h:i:s A'); $scriptpath = str_replace('&', '&', $vbulletin->scriptpath); $referer = REFERRER; $ipaddress = IPADDRESS; $classname = get_class($this); if ($this->connection_recent) { $this->hide_errors(); list($mysqlversion) = $this->query_first("SELECT VERSION() AS version", DBARRAY_NUM); $this->show_errors(); } $display_db_error = (VB_AREA == 'Upgrade' OR VB_AREA == 'Install' OR $vbulletin->userinfo['usergroupid'] == 6 OR ($vbulletin->userinfo['permissions']['adminpermissions'] & $vbulletin->bf_ugp_adminpermissions)); // Hide the MySQL Version if its going in the source if (!$display_db_error) { $mysqlversion = ''; } eval('$message = "' . str_replace('"', '\"', file_get_contents(DIR . '/includes/database_error_message.html')) . '";'); // add a backtrace to the message if ($vbulletin->debug) { $trace = debug_backtrace(); $trace_output = "\n"; foreach ($trace AS $index => $trace_item) { $param = (in_array($trace_item['function'], array('require', 'require_once', 'include', 'include_once')) ? $trace_item['args'][0] : ''); // remove path $param = str_replace(DIR, '[path]', $param); $trace_item['file'] = str_replace(DIR, '[path]', $trace_item['file']); $trace_output .= "#$index $trace_item[class]$trace_item[type]$trace_item[function]($param) called in $trace_item[file] on line $trace_item[line]\n"; } $message .= "\n\nStack Trace:\n$trace_output\n"; } require_once(DIR . '/includes/functions_log_error.php'); if (function_exists('log_vbulletin_error')) { log_vbulletin_error($message, 'database'); } if ($technicalemail != '' AND !$vbulletin->options['disableerroremail'] AND verify_email_vbulletin_error($this->errno, 'database')) { // If vBulletinHook is defined then we know that options are loaded, so we can then use vbmail if (class_exists('vBulletinHook', false)) { @vbmail($technicalemail, $this->appshortname . ' Database Error!', $message, true, $technicalemail); } else { @mail($technicalemail, $this->appshortname . ' Database Error!', preg_replace("#(\r\n|\r|\n)#s", (@ini_get('sendmail_path') === '') ? "\r\n" : "\n", $message), "From: $technicalemail"); } } // send ajax reponse after sending error email if ($vbulletin->GPC['ajax']) { require_once(DIR . '/includes/class_xml.php'); $xml = new vB_AJAX_XML_Builder($vbulletin, 'text/xml'); $error = 'Database Error'; if ($vbulletin->debug) { $error .= "\n"; $error .= $this->sql; $error .= "\n"; $error .= $error_text; } $xml->add_tag('error', $error); $xml->print_xml(); } if (!headers_sent()) { if (SAPI_NAME == 'cgi' OR SAPI_NAME == 'cgi-fcgi') { header('Status: 503 Service Unavailable'); } else { header('HTTP/1.1 503 Service Unavailable'); } } if ($display_db_error) { // display error message on screen $message = '<form><textarea rows="15" cols="70" wrap="off" id="message">' . htmlspecialchars_uni($message) . '</textarea></form>'; } else { // display hidden error message $message = "\r\n<!--\r\n" . htmlspecialchars_uni($message) . "\r\n-->\r\n"; } if ($vbulletin->options['bburl']) { $imagepath = $vbulletin->options['bburl']; } else { // this might not work with too many slashes in the archive $imagepath = (VB_AREA == 'Forum' ? '.' : '..'); } eval('$message = "' . str_replace('"', '\"', file_get_contents(DIR . '/includes/database_error_page.html')) . '";'); // This is needed so IE doesn't show the pretty error messages $message .= str_repeat(' ', 512); die($message); } else if (!empty($errortext)) { $this->error = $errortext; } }