/** * Displays info/warning/error message in a friendly UI and exits. * * @param string $message Main message, must be html encoded before calling * @param bool|string $optionalTrace Backtrace; will be displayed in lighter color * @param bool $optionalLinks If true, will show links to the Piwik website for help * @param bool $optionalLinkBack If true, displays a link to go back */ function Piwik_ExitWithMessage($message, $optionalTrace = false, $optionalLinks = false, $optionalLinkBack = false) { @header('Content-Type: text/html; charset=utf-8'); @header('HTTP/1.1 500 Internal Server Error'); if ($optionalTrace) { $optionalTrace = '<span class="exception-backtrace">Backtrace:<br /><pre>' . $optionalTrace . '</pre></span>'; } $isCli = PHP_SAPI == 'cli'; if ($optionalLinks) { $optionalLinks = '<ul> <li><a target="_blank" href="http://piwik.org">Piwik.org homepage</a></li> <li><a target="_blank" href="http://piwik.org/faq/">Piwik Frequently Asked Questions</a></li> <li><a target="_blank" href="http://piwik.org/docs/">Piwik Documentation</a></li> <li><a target="_blank" href="http://forum.piwik.org/">Piwik Forums</a></li> <li><a target="_blank" href="http://demo.piwik.org">Piwik Online Demo</a></li> </ul>'; } if ($optionalLinkBack) { $optionalLinkBack = '<a href="javascript:window.history.back();">Go Back</a><br/>'; } $headerPage = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/simpleLayoutHeader.tpl'); $footerPage = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/simpleLayoutFooter.tpl'); $headerPage = str_replace('{$HTML_TITLE}', PAGE_TITLE_WHEN_ERROR, $headerPage); $content = '<p>' . $message . '</p> <p>' . $optionalLinkBack . '<a href="index.php">Go to Piwik</a><br/> <a href="index.php?module=Login">Login</a>' . '</p>' . ' ' . (Piwik_ShouldPrintBackTraceWithMessage() ? $optionalTrace : '') . ' ' . $optionalLinks; $message = str_replace(array("<br />", "<br>", "<br/>", "</p>"), "\n", $message); $message = str_replace("\t", "", $message); $message = strip_tags($message); if ($isCli) { echo $message; } else { echo $headerPage . $content . $footerPage; } echo "\n"; error_log(sprintf("Error in Piwik: %s", str_replace("\n", " ", $message))); exit(1); }
private function formatExceptionMessage(Exception $exception) { $message = $exception->getMessage(); if (\Piwik_ShouldPrintBackTraceWithMessage()) { $message .= "\n" . $exception->getTraceAsString(); } return Renderer::formatValueXml($message); }
protected function buildView() { $this->overrideSomeConfigPropertiesIfNeeded(); try { $this->beforeLoadDataTable(); $this->loadDataTableFromAPI(); $this->postDataTableLoadedFromAPI(); $requestPropertiesAfterLoadDataTable = $this->requestConfig->getProperties(); $this->applyFilters(); $this->addVisualizationInfoFromMetricMetadata(); $this->afterAllFiltersAreApplied(); $this->beforeRender(); $this->logMessageIfRequestPropertiesHaveChanged($requestPropertiesAfterLoadDataTable); } catch (NoAccessException $e) { throw $e; } catch (\Exception $e) { Log::error("Failed to get data from API: " . $e->getMessage() . "\n" . $e->getTraceAsString()); $message = $e->getMessage(); if (\Piwik_ShouldPrintBackTraceWithMessage()) { $message .= "\n" . $e->getTraceAsString(); } $loadingError = array('message' => $message); } $view = new View("@CoreHome/_dataTable"); if (!empty($loadingError)) { $view->error = $loadingError; } $view->assign($this->templateVars); $view->visualization = $this; $view->visualizationTemplate = static::TEMPLATE_FILE; $view->visualizationCssClass = $this->getDefaultDataTableCssClass(); $view->reportMetdadata = $this->getReportMetadata(); if (null === $this->dataTable) { $view->dataTable = null; } else { $view->dataTableHasNoData = !$this->isThereDataToDisplay(); $view->dataTable = $this->dataTable; // if it's likely that the report data for this data table has been purged, // set whether we should display a message to that effect. $view->showReportDataWasPurgedMessage = $this->hasReportBeenPurged(); $view->deleteReportsOlderThan = Option::get('delete_reports_older_than'); } $view->idSubtable = $this->requestConfig->idSubtable; $view->clientSideParameters = $this->getClientSideParametersToSet(); $view->clientSideProperties = $this->getClientSidePropertiesToSet(); $view->properties = array_merge($this->requestConfig->getProperties(), $this->config->getProperties()); $view->reportLastUpdatedMessage = $this->reportLastUpdatedMessage; $view->footerIcons = $this->config->footer_icons; $view->isWidget = Common::getRequestVar('widget', 0, 'int'); return $view; }
/** * @param Exception $e * @return Exception */ protected function decorateExceptionWithDebugTrace(Exception $e) { // If we are in tests, show full backtrace if (defined('PIWIK_PATH_TEST_TO_ROOT')) { if (\Piwik_ShouldPrintBackTraceWithMessage()) { $message = $e->getMessage() . " in \n " . $e->getFile() . ":" . $e->getLine() . " \n " . $e->getTraceAsString(); } else { $message = $e->getMessage() . "\n \n --> To temporarily debug this error further, set const PIWIK_PRINT_ERROR_BACKTRACE=true; in index.php"; } return new Exception($message); } return $e; }
/** * Displays info/warning/error message in a friendly UI and exits. * * Note: this method should not be called by anyone other than FrontController. * * @param string $message Main message, must be html encoded before calling * @param bool|string $optionalTrace Backtrace; will be displayed in lighter color * @param bool $optionalLinks If true, will show links to the Piwik website for help * @param bool $optionalLinkBack If true, displays a link to go back * @param bool|string $logoUrl The URL to the logo to use. * @param bool|string $faviconUrl The URL to the favicon to use. * @return string */ function Piwik_GetErrorMessagePage($message, $optionalTrace = false, $optionalLinks = false, $optionalLinkBack = false, $logoUrl = false, $faviconUrl = false, $isCli = null) { if (!headers_sent()) { header('Content-Type: text/html; charset=utf-8'); $isInternalServerError = preg_match('/(sql|database|mysql)/i', $message); if ($isInternalServerError) { header('HTTP/1.1 500 Internal Server Error'); } } if (empty($logoUrl)) { $logoUrl = "plugins/Morpheus/images/logo-header.png"; } if (empty($faviconUrl)) { $faviconUrl = "plugins/CoreHome/images/favicon.ico"; } if ($optionalTrace) { $optionalTrace = '<h2>Stack trace</h2><pre>' . htmlentities($optionalTrace) . '</pre>'; } if ($isCli === null) { $isCli = PHP_SAPI == 'cli'; } if ($optionalLinks) { $optionalLinks = '<ul> <li><a rel="noreferrer" target="_blank" href="http://piwik.org">Piwik.org homepage</a></li> <li><a rel="noreferrer" target="_blank" href="http://piwik.org/faq/">Piwik Frequently Asked Questions</a></li> <li><a rel="noreferrer" target="_blank" href="http://piwik.org/docs/">Piwik Documentation</a></li> <li><a rel="noreferrer" target="_blank" href="http://forum.piwik.org/">Piwik Forums</a></li> <li><a rel="noreferrer" target="_blank" href="http://demo.piwik.org">Piwik Online Demo</a></li> </ul>'; } if ($optionalLinkBack) { $optionalLinkBack = '<a href="javascript:window.history.back();">Go Back</a>'; } $headerPage = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/simpleLayoutHeader.tpl'); $headerPage = str_replace('%logoUrl%', $logoUrl, $headerPage); $headerPage = str_replace('%faviconUrl%', $faviconUrl, $headerPage); $footerPage = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/simpleLayoutFooter.tpl'); $headerPage = str_replace('{$HTML_TITLE}', PAGE_TITLE_WHEN_ERROR, $headerPage); $content = '<h2>' . $message . '</h2> <p>' . $optionalLinkBack . ' | <a href="index.php">Go to Piwik</a> | <a href="index.php?module=Login">Login</a>' . '</p>' . ' ' . (Piwik_ShouldPrintBackTraceWithMessage() ? $optionalTrace : '') . ' ' . $optionalLinks; $message = str_replace(array("<br />", "<br>", "<br/>", "</p>"), "\n", $message); $message = str_replace("\t", "", $message); $message = strip_tags($message); if (!$isCli) { $message = $headerPage . $content . $footerPage; } $message .= "\n"; error_log(sprintf("Error in Piwik: %s", str_replace("\n", " ", $message))); return $message; }
protected function getExceptionMessage() { $message = $this->exception->getMessage(); if (\Piwik_ShouldPrintBackTraceWithMessage()) { $message .= "\n" . $this->exception->getTraceAsString(); } return self::renderHtmlEntities($message); }
/** * @param Exception $e * @return Exception */ protected function decorateExceptionWithDebugTrace(Exception $e) { // If we are in tests, show full backtrace if (defined('PIWIK_PATH_TEST_TO_ROOT')) { if (self::DISPLAY_BACKTRACE_DEBUG || \Piwik_ShouldPrintBackTraceWithMessage()) { $message = $e->getMessage() . " in \n " . $e->getFile() . ":" . $e->getLine() . " \n " . $e->getTraceAsString(); } else { $message = $e->getMessage() . "\n \n --> To temporarily debug this error further, set const DISPLAY_BACKTRACE_DEBUG=true; in " . basename(__FILE__); } return new Exception($message); } return $e; }
/** * Displays info/warning/error message in a friendly UI and exits. * * Note: this method should not be called by anyone other than FrontController. * * @param string $message Main message, must be html encoded before calling * @param bool|string $optionalTrace Backtrace; will be displayed in lighter color * @param bool $optionalLinks If true, will show links to the Piwik website for help * @param bool $optionalLinkBack If true, displays a link to go back * @param bool|string $logoUrl The URL to the logo to use. * @param bool|string $faviconUrl The URL to the favicon to use. * @return string */ function Piwik_GetErrorMessagePage($message, $optionalTrace = false, $optionalLinks = false, $optionalLinkBack = false, $logoUrl = false, $faviconUrl = false, $isCli = null) { error_log(sprintf("Error in Piwik: %s", str_replace("\n", " ", strip_tags($message)))); if (!headers_sent()) { header('Content-Type: text/html; charset=utf-8'); $isInternalServerError = preg_match('/(sql|database|mysql)/i', $message); if ($isInternalServerError) { header('HTTP/1.1 500 Internal Server Error'); } } // We return only an HTML fragment for AJAX requests if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') { return "<div class='alert alert-danger'><strong>Error:</strong> {$message}</div>"; } if (empty($logoUrl)) { $logoUrl = "plugins/Morpheus/images/logo-header.png"; } if (empty($faviconUrl)) { $faviconUrl = "plugins/CoreHome/images/favicon.png"; } if ($optionalTrace) { $optionalTrace = '<h2>Stack trace</h2><pre>' . htmlentities($optionalTrace) . '</pre>'; } if ($isCli === null) { $isCli = PHP_SAPI == 'cli'; } if ($optionalLinks) { $optionalLinks = '<ul> <li><a rel="noreferrer" target="_blank" href="http://piwik.org">Piwik.org homepage</a></li> <li><a rel="noreferrer" target="_blank" href="http://piwik.org/faq/">Piwik Frequently Asked Questions</a></li> <li><a rel="noreferrer" target="_blank" href="http://piwik.org/docs/">Piwik Documentation</a></li> <li><a rel="noreferrer" target="_blank" href="http://forum.piwik.org/">Piwik Forums</a></li> <li><a rel="noreferrer" target="_blank" href="https://piwik.pro/contact/?pk_campaign=App_AnErrorOccured&pk_source=Piwik_App&pk_medium=ProfessionalServicesLink#contact-form">Professional help (Piwik PRO)</a></li> </ul>'; } if ($optionalLinkBack) { $optionalLinkBack = '<a href="javascript:window.history.back();">Go Back</a>'; } $headerPage = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/simpleLayoutHeader.tpl'); $headerPage = str_replace('%logoUrl%', $logoUrl, $headerPage); $headerPage = str_replace('%faviconUrl%', $faviconUrl, $headerPage); $footerPage = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/simpleLayoutFooter.tpl'); $headerPage = str_replace('{$HTML_TITLE}', PAGE_TITLE_WHEN_ERROR, $headerPage); $content = '<h2>' . $message . '</h2> <p>' . $optionalLinkBack . ' | <a href="index.php">Go to Piwik</a>' . '</p>' . ' ' . (Piwik_ShouldPrintBackTraceWithMessage() ? $optionalTrace : '') . ' ' . $optionalLinks; $message = str_replace(array("<br />", "<br>", "<br/>", "</p>"), "\n", $message); $message = str_replace("\t", "", $message); $message = strip_tags($message); if (!$isCli) { $message = $headerPage . $content . $footerPage; } $message .= "\n"; return $message; }