Beispiel #1
0
 public function updateTracker()
 {
     try {
         $trackerUpdater = new TrackerUpdater();
         $trackerUpdater->update();
     } catch (\Exception $e) {
         Log::error('There was an error while updating the javascript tracker: ' . $e->getMessage());
     }
 }
Beispiel #2
0
 /**
  * @dataProvider getBackendsToTest
  */
 public function testTokenAuthIsRemoved($backend)
 {
     $this->recreateLogSingleton($backend);
     Log::error('token_auth=9b1cefc915ff6180071fb7dcd13ec5a4');
     $this->checkBackend($backend, 'token_auth=removed', $formatMessage = true, $tag = 'Monolog');
 }
Beispiel #3
0
 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;
 }
Beispiel #4
0
 public static function install()
 {
     foreach (self::getScopes() as $scope) {
         $model = new Model($scope);
         try {
             $maxCustomVars = self::DEFAULT_CUSTOM_VAR_COUNT;
             $customVarsToAdd = $maxCustomVars - $model->getCurrentNumCustomVars();
             for ($index = 0; $index < $customVarsToAdd; $index++) {
                 $model->addCustomVariable();
             }
         } catch (\Exception $e) {
             Log::error('Failed to add custom variable: ' . $e->getMessage());
         }
     }
 }
 /**
  * Attempts to download new location, ISP & organization GeoIP databases and
  * replace the existing ones w/ them.
  */
 public function update()
 {
     try {
         Option::set(self::LAST_RUN_TIME_OPTION_NAME, Date::factory('today')->getTimestamp());
         $locUrl = Option::get(self::LOC_URL_OPTION_NAME);
         if (!empty($locUrl)) {
             $this->downloadFile('loc', $locUrl);
         }
         $ispUrl = Option::get(self::ISP_URL_OPTION_NAME);
         if (!empty($ispUrl)) {
             $this->downloadFile('isp', $ispUrl);
         }
         $orgUrl = Option::get(self::ORG_URL_OPTION_NAME);
         if (!empty($orgUrl)) {
             $this->downloadFile('org', $orgUrl);
         }
     } catch (Exception $ex) {
         // message will already be prefixed w/ 'GeoIPAutoUpdater: '
         Log::error($ex);
         $this->performRedundantDbChecks();
         throw $ex;
     }
     $this->performRedundantDbChecks();
 }
Beispiel #6
0
function geoipUpdateError($message)
{
    Log::error($message);
    Common::sendHeader('HTTP/1.1 500 Internal Server Error', $replace = true, $responseCode = 500);
    exit;
}
 public static function logException(\Exception $exception)
 {
     Log::error($exception);
 }
Beispiel #8
0
 /**
  * Start the session
  *
  * @param array|bool $options An array of configuration options; the auto-start (bool) setting is ignored
  * @return void
  * @throws Exception if starting a session fails
  */
 public static function start($options = false)
 {
     if (headers_sent() || self::$sessionStarted || defined('PIWIK_ENABLE_SESSION_START') && !PIWIK_ENABLE_SESSION_START) {
         return;
     }
     self::$sessionStarted = true;
     // use cookies to store session id on the client side
     @ini_set('session.use_cookies', '1');
     // prevent attacks involving session ids passed in URLs
     @ini_set('session.use_only_cookies', '1');
     // advise browser that session cookie should only be sent over secure connection
     if (ProxyHttp::isHttps()) {
         @ini_set('session.cookie_secure', '1');
     }
     // advise browser that session cookie should only be accessible through the HTTP protocol (i.e., not JavaScript)
     @ini_set('session.cookie_httponly', '1');
     // don't use the default: PHPSESSID
     @ini_set('session.name', self::SESSION_NAME);
     // proxies may cause the referer check to fail and
     // incorrectly invalidate the session
     @ini_set('session.referer_check', '');
     $currentSaveHandler = ini_get('session.save_handler');
     $config = Config::getInstance();
     if (self::isFileBasedSessions()) {
         // Note: this handler doesn't work well in load-balanced environments and may have a concurrency issue with locked session files
         // for "files", use our own folder to prevent local session file hijacking
         $sessionPath = self::getSessionsDirectory();
         // We always call mkdir since it also chmods the directory which might help when permissions were reverted for some reasons
         Filesystem::mkdir($sessionPath);
         @ini_set('session.save_handler', 'files');
         @ini_set('session.save_path', $sessionPath);
     } elseif ($config->General['session_save_handler'] === 'dbtable' || in_array($currentSaveHandler, array('user', 'mm'))) {
         // We consider these to be misconfigurations, in that:
         // - user  - we can't verify that user-defined session handler functions have already been set via session_set_save_handler()
         // - mm    - this handler is not recommended, unsupported, not available for Windows, and has a potential concurrency issue
         $config = array('name' => Common::prefixTable('session'), 'primary' => 'id', 'modifiedColumn' => 'modified', 'dataColumn' => 'data', 'lifetimeColumn' => 'lifetime');
         $saveHandler = new DbTable($config);
         if ($saveHandler) {
             self::setSaveHandler($saveHandler);
         }
     }
     // garbage collection may disabled by default (e.g., Debian)
     if (ini_get('session.gc_probability') == 0) {
         @ini_set('session.gc_probability', 1);
     }
     try {
         parent::start();
         register_shutdown_function(array('Zend_Session', 'writeClose'), true);
     } catch (Exception $e) {
         Log::error('Unable to start session: ' . $e->getMessage());
         $enableDbSessions = '';
         if (DbHelper::isInstalled()) {
             $enableDbSessions = "<br/>If you still experience issues after trying these changes,\n\t\t\t            \t\t\twe recommend that you <a href='http://piwik.org/faq/how-to-install/#faq_133' rel='noreferrer' target='_blank'>enable database session storage</a>.";
         }
         $pathToSessions = Filechecks::getErrorMessageMissingPermissions(self::getSessionsDirectory());
         $message = sprintf("Error: %s %s %s\n<pre>Debug: the original error was \n%s</pre>", Piwik::translate('General_ExceptionUnableToStartSession'), $pathToSessions, $enableDbSessions, $e->getMessage());
         $ex = new MissingFilePermissionException($message, $e->getCode(), $e);
         $ex->setIsHtmlMessage();
         throw $ex;
     }
 }
Beispiel #9
0
 public function logError($m)
 {
     if (!defined('PIWIK_ARCHIVE_NO_TRUNCATE')) {
         $m = substr($m, 0, self::TRUNCATE_ERROR_MESSAGE_SUMMARY);
     }
     $m = str_replace(array("\n", "\t"), " ", $m);
     $this->errors[] = $m;
     Log::error($m);
 }
Beispiel #10
0
function geoipUpdateError($message)
{
    Log::error($message);
    if (!Common::isPhpCliMode()) {
        @header('HTTP/1.1 500 Internal Server Error', $replace = true, $responseCode = 500);
    }
    exit;
}
Beispiel #11
0
 /**
  * @dataProvider getBackendsToTest
  */
 public function testTokenAuthIsRemoved($backend)
 {
     Config::getInstance()->log['log_writers'] = array($backend);
     Log::error('token_auth=9b1cefc915ff6180071fb7dcd13ec5a4');
     $this->checkBackend($backend, 'token_auth=removed', $formatMessage = true, $tag = 'Monolog');
 }
Beispiel #12
0
 /**
  * @group Core
  * 
  * @dataProvider getBackendsToTest
  */
 public function testLoggingWorksWhenMessageIsException($backend)
 {
     Config::getInstance()->log['log_writers'] = array($backend);
     ob_start();
     $exception = new Exception("dummy error message");
     Log::error($exception);
     $this->screenOutput = ob_get_contents();
     ob_end_clean();
     $this->checkBackend($backend, self::$expectedExceptionOutput[$backend], $formatMessage = false, $tag = 'Core_LogTest');
     $this->checkBackend('screen', self::$expectedExceptionOutput['screen']);
     // errors should always written to the screen
 }
Beispiel #13
0
 /**
  * Called by event `Tracker.newVisitorInformation`
  *
  * @see getListHooksRegistered()
  */
 public function logIntranetSubNetworkInfo(&$visitorInfo)
 {
     if (!file_exists($this->getDataFilePath())) {
         Log::error('Plugin IntranetGeoIP does not work. File is missing: ' . $this->getDataFilePath());
         return;
     }
     $data = (include $this->getDataFilePath());
     if ($data === false) {
         // no data file found
         // @todo ...inform the user/ log something
         Log::error('Plugin IntranetGeoIP does not work. File is missing: ' . $this->getDataFilePath());
         return;
     }
     foreach ($data as $value) {
         $ip = Network\IP::fromBinaryIP($visitorInfo['location_ip']);
         if (isset($value['networks']) && $ip->isInRanges($value['networks']) === true) {
             // values with the same key are not overwritten by right!
             // http://www.php.net/manual/en/language.operators.array.php
             if (isset($value['visitorInfo'])) {
                 $visitorInfo = $value['visitorInfo'] + $visitorInfo;
             }
             return;
         }
     }
     // if nothing was matched, you can define default values if you want to
     if (isset($data['noMatch']) && isset($data['noMatch']['visitorInfo'])) {
         $visitorInfo = $data['noMatch']['visitorInfo'] + $visitorInfo;
         return;
     }
 }
 /**
  * Utility function that checks if geolocation works with each installed database,
  * and if one or more doesn't, they are renamed to make sure tracking will work.
  * This is a safety measure used to make sure tracking isn't affected if strange
  * update errors occur.
  *
  * Databases are renamed to ${original}.broken .
  *
  * Note: method is protected for testability.
  *
  * @param $logErrors - only used to hide error logs during tests
  */
 protected function performRedundantDbChecks($logErrors = true)
 {
     $databaseTypes = array_keys(GeoIp::$dbNames);
     foreach ($databaseTypes as $type) {
         $customNames = array('loc' => array(), 'isp' => array(), 'org' => array());
         $customNames[$type] = GeoIp::$dbNames[$type];
         // create provider that only uses the DB type we're testing
         $provider = new Php($customNames);
         // test the provider. on error, we rename the broken DB.
         self::getTestLocationCatchPhpErrors($provider);
         if (self::$unzipPhpError !== null) {
             list($errno, $errstr, $errfile, $errline) = self::$unzipPhpError;
             if ($logErrors) {
                 Log::error("GeoIPAutoUpdater: Encountered PHP error when performing redundant tests on GeoIP " . "%s database: %s: %s on line %s of %s.", $type, $errno, $errstr, $errline, $errfile);
             }
             // get the current filename for the DB and an available new one to rename it to
             list($oldPath, $newPath) = $this->getOldAndNewPathsForBrokenDb($customNames[$type]);
             // rename the DB so tracking will not fail
             if ($oldPath !== false && $newPath !== false) {
                 if (file_exists($newPath)) {
                     unlink($newPath);
                 }
                 rename($oldPath, $newPath);
             }
         }
     }
 }
Beispiel #15
0
 /**
  * Triggers an error if the development mode is enabled. Depending on the current environment / mode it will either
  * log the given message or throw an exception to make sure it will be displayed in the Piwik UI.
  *
  * @param  string $message
  * @throws Exception
  */
 public static function error($message)
 {
     if (!self::isEnabled()) {
         return;
     }
     $message .= ' (This error is only shown in development mode)';
     if (SettingsServer::isTrackerApiRequest() || Common::isPhpCliMode()) {
         Log::error($message);
     } else {
         throw new Exception($message);
     }
 }
Beispiel #16
0
 public static function errorHandler($errno, $errstr, $errfile, $errline)
 {
     // if the error has been suppressed by the @ we don't handle the error
     if (error_reporting() == 0) {
         return;
     }
     $backtrace = '';
     if (empty(self::$debugBacktraceForTests)) {
         $bt = @debug_backtrace();
         if ($bt !== null && isset($bt[0])) {
             foreach ($bt as $i => $debug) {
                 $backtrace .= "#{$i}  " . (isset($debug['class']) ? $debug['class'] : '') . (isset($debug['type']) ? $debug['type'] : '') . (isset($debug['function']) ? $debug['function'] : '') . '(...) called at [' . (isset($debug['file']) ? $debug['file'] : '') . ':' . (isset($debug['line']) ? $debug['line'] : '') . ']' . "\n";
             }
         }
     } else {
         $backtrace = self::$debugBacktraceForTests;
     }
     $error = new Error($errno, $errstr, $errfile, $errline, $backtrace);
     Log::error($error);
     switch ($errno) {
         case E_ERROR:
         case E_PARSE:
         case E_CORE_ERROR:
         case E_CORE_WARNING:
         case E_COMPILE_ERROR:
         case E_COMPILE_WARNING:
         case E_USER_ERROR:
             exit;
             break;
         case E_WARNING:
         case E_NOTICE:
         case E_USER_WARNING:
         case E_USER_NOTICE:
         case E_STRICT:
         case E_RECOVERABLE_ERROR:
         case E_DEPRECATED:
         case E_USER_DEPRECATED:
         default:
             // do not exit
             break;
     }
 }