diff options
Diffstat (limited to 'srcs/phpmyadmin/error_report.php')
| -rw-r--r-- | srcs/phpmyadmin/error_report.php | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/error_report.php b/srcs/phpmyadmin/error_report.php new file mode 100644 index 0000000..9882569 --- /dev/null +++ b/srcs/phpmyadmin/error_report.php @@ -0,0 +1,140 @@ +<?php +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * Handle error report submission + * + * @package PhpMyAdmin + */ +declare(strict_types=1); + +use PhpMyAdmin\ErrorReport; +use PhpMyAdmin\Message; +use PhpMyAdmin\Response; +use PhpMyAdmin\UserPreferences; +use PhpMyAdmin\Utils\HttpRequest; + +if (! defined('ROOT_PATH')) { + define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR); +} + +require_once ROOT_PATH . 'libraries/common.inc.php'; + +if (! isset($_POST['exception_type']) + || ! in_array($_POST['exception_type'], ['js', 'php']) +) { + die('Oops, something went wrong!!'); +} + +$response = Response::getInstance(); + +/** @var ErrorReport $errorReport */ +$errorReport = $containerBuilder->get('error_report'); + +if (isset($_POST['send_error_report']) + && ($_POST['send_error_report'] == true + || $_POST['send_error_report'] == '1') +) { + if ($_POST['exception_type'] == 'php') { + /** + * Prevent infinite error submission. + * Happens in case error submissions fails. + * If reporting is done in some time interval, + * just clear them & clear json data too. + */ + if (isset($_SESSION['prev_error_subm_time']) + && isset($_SESSION['error_subm_count']) + && $_SESSION['error_subm_count'] >= 3 + && ($_SESSION['prev_error_subm_time'] - time()) <= 3000 + ) { + $_SESSION['error_subm_count'] = 0; + $_SESSION['prev_errors'] = ''; + $response->addJSON('stopErrorReportLoop', '1'); + } else { + $_SESSION['prev_error_subm_time'] = time(); + $_SESSION['error_subm_count'] = ( + isset($_SESSION['error_subm_count']) + ? ($_SESSION['error_subm_count'] + 1) + : 0 + ); + } + } + $reportData = $errorReport->getData($_POST['exception_type']); + // report if and only if there were 'actual' errors. + if (count($reportData) > 0) { + $server_response = $errorReport->send($reportData); + if (! is_string($server_response)) { + $success = false; + } else { + $decoded_response = json_decode($server_response, true); + $success = ! empty($decoded_response) ? + $decoded_response["success"] : false; + } + + /* Message to show to the user */ + if ($success) { + if ((isset($_POST['automatic']) + && $_POST['automatic'] === "true") + || $GLOBALS['cfg']['SendErrorReports'] == 'always' + ) { + $msg = __( + 'An error has been detected and an error report has been ' + . 'automatically submitted based on your settings.' + ); + } else { + $msg = __('Thank you for submitting this report.'); + } + } else { + $msg = __( + 'An error has been detected and an error report has been ' + . 'generated but failed to be sent.' + ) + . ' ' + . __( + 'If you experience any ' + . 'problems please submit a bug report manually.' + ); + } + $msg .= ' ' . __('You may want to refresh the page.'); + + /* Create message object */ + if ($success) { + $msg = Message::notice($msg); + } else { + $msg = Message::error($msg); + } + + /* Add message to response */ + if ($response->isAjax()) { + if ($_POST['exception_type'] == 'js') { + $response->addJSON('message', $msg); + } else { + $response->addJSON('errSubmitMsg', $msg); + } + } elseif ($_POST['exception_type'] == 'php') { + $jsCode = 'Functions.ajaxShowMessage("<div class=\"error\">' + . $msg + . '</div>", false);'; + $response->getFooter()->getScripts()->addCode($jsCode); + } + + if ($_POST['exception_type'] == 'php') { + // clear previous errors & save new ones. + $GLOBALS['error_handler']->savePreviousErrors(); + } + + /* Persist always send settings */ + if (isset($_POST['always_send']) + && $_POST['always_send'] === "true" + ) { + $userPreferences = new UserPreferences(); + $userPreferences->persistOption("SendErrorReports", "always", "ask"); + } + } +} elseif (! empty($_POST['get_settings'])) { + $response->addJSON('report_setting', $GLOBALS['cfg']['SendErrorReports']); +} elseif ($_POST['exception_type'] == 'js') { + $response->addHTML($errorReport->getForm()); +} else { + // clear previous errors & save new ones. + $GLOBALS['error_handler']->savePreviousErrors(); +} |
