public function test_fetchRemoteFile() { Piwik::createConfigObject(); Piwik_Config::getInstance()->setTestEnvironment(); $methods = array('curl', 'fopen', 'socket'); $this->assertTrue(in_array(Piwik_Http::getTransportMethod(), $methods)); foreach ($methods as $method) { $version = ''; try { $version = Piwik_Http::sendHttpRequestBy($method, 'http://api.piwik.org/1.0/getLatestVersion/', 5); } catch (Exception $e) { var_dump($e->getMessage()); } $this->assertTrue(preg_match('/^([0-9.]+)$/', $version), $method); } $destinationPath = PIWIK_USER_PATH . '/tmp/latest/LATEST'; try { Piwik_Http::fetchRemoteFile('http://api.piwik.org/1.0/getLatestVersion/', $destinationPath, 3); } catch (Exception $e) { var_dump($e->getMessage()); } $this->assertTrue(filesize($destinationPath) > 0); $destinationPath = PIWIK_USER_PATH . '/tmp/latest/latest.zip'; try { Piwik_Http::fetchRemoteFile('http://piwik.org/latest.zip', $destinationPath, 3); } catch (Exception $e) { var_dump($e->getMessage()); } $this->assertTrue(filesize($destinationPath) > 0); }
/** * Check for a newer version * * @param bool $force Force check */ public static function check($force = false) { $lastTimeChecked = Piwik_GetOption(self::LAST_TIME_CHECKED); if($force || $lastTimeChecked === false || time() - self::CHECK_INTERVAL > $lastTimeChecked ) { // set the time checked first, so that parallel Piwik requests don't all trigger the http requests Piwik_SetOption(self::LAST_TIME_CHECKED, time(), $autoload = 1); $parameters = array( 'piwik_version' => Piwik_Version::VERSION, 'php_version' => PHP_VERSION, 'url' => Piwik_Url::getCurrentUrlWithoutQueryString(), 'trigger' => Piwik_Common::getRequestVar('module','','string'), 'timezone' => Piwik_SitesManager_API::getInstance()->getDefaultTimezone(), ); $url = Zend_Registry::get('config')->General->api_service_url; $url .= '/1.0/getLatestVersion/'; $url .= '?' . http_build_query($parameters, '', '&'); $timeout = self::SOCKET_TIMEOUT; try { $latestVersion = Piwik_Http::sendHttpRequest($url, $timeout); Piwik_SetOption(self::LATEST_VERSION, $latestVersion); } catch(Exception $e) { // e.g., disable_functions = fsockopen; allow_url_open = Off Piwik_SetOption(self::LATEST_VERSION, ''); } } }
/** * @group Core * @group Http */ public function testFetchLatestZip() { $destinationPath = PIWIK_USER_PATH . '/tmp/latest/latest.zip'; Piwik_Http::fetchRemoteFile('http://piwik.org/latest.zip', $destinationPath, 3); $this->assertFileExists($destinationPath); $this->assertGreaterThan(0, filesize($destinationPath)); }
/** * Web service proxy that retrieves the content at the specified URL * * @param string $url * @return string */ private function getPage($url) { try { return str_replace(' ', ' ', Piwik_Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT'])); } catch (Exception $e) { return ''; } }
private function oneClick_Download() { $this->pathPiwikZip = PIWIK_USER_PATH . self::PATH_TO_EXTRACT_LATEST_VERSION . 'latest.zip'; Piwik::checkDirectoriesWritableOrDie(array(self::PATH_TO_EXTRACT_LATEST_VERSION)); // we catch exceptions in the caller (i.e., oneClickUpdate) $url = Zend_Registry::get('config')->General->latest_version_url . '?cb=' . $this->newVersion; $fetched = Piwik_Http::fetchRemoteFile($url, $this->pathPiwikZip); }
private function issueApiCall($apiKey, $resource, $additionalParameters = array()) { $accountParameters = array('Key' => $apiKey); $parameters = array_merge($accountParameters, $additionalParameters); $url = self::BASE_API_URL . $resource . '?' . http_build_query($parameters, '', '&'); $timeout = self::SOCKET_TIMEOUT; $result = Piwik_Http::sendHttpRequestBy(Piwik_Http::getTransportMethod(), $url, $timeout, $userAgent = null, $destinationPath = null, $file = null, $followDepth = 0, $acceptLanguage = false, $acceptInvalidSslCertificate = true); if (strpos($result, self::ERROR_STRING) !== false) { throw new Piwik_MobileMessaging_APIException('Clockwork API returned the following error message : ' . $result); } return $result; }
protected static function trackVisits() { $dateTime = self::$dateTime; $idSite = self::$idSite; /* // Trigger invalid website $trackerInvalidWebsite = self::getTracker($idSiteFake = 0, $dateTime, $defaultInit = true); $response = Piwik_Http::fetchRemoteFile($trackerInvalidWebsite->getUrlTrackPageView()); self::assertTrue(strpos($response, 'Invalid idSite') !== false, 'invalid website ID'); // Trigger wrong website $trackerWrongWebsite = self::getTracker($idSiteFake = 33, $dateTime, $defaultInit = true); $response = Piwik_Http::fetchRemoteFile($trackerWrongWebsite->getUrlTrackPageView()); self::assertTrue(strpos($response, 'The requested website id = 33 couldn\'t be found') !== false, 'non-existent website ID'); */ // Trigger empty request $trackerUrl = self::getTrackerUrl(); $response = Piwik_Http::fetchRemoteFile($trackerUrl); self::assertTrue(strpos($response, 'is a free open source web') !== false, 'Piwik empty request response not correct: ' . $response); $t = self::getTracker($idSite, $dateTime, $defaultInit = true); // test GoogleBot UA visitor $t->setUserAgent('Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'); self::checkResponse($t->doTrackPageView('bot visit, please do not record')); // Test IP Exclusion works with or without IP exclusion foreach (array(false, true) as $enable) { // Enable IP Anonymization $t->DEBUG_APPEND_URL = '&forceIpAnonymization=' . (int) $enable; // test with excluded IP $t->setUserAgent('Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)'); // restore normal user agent $excludedIp = '154.1.12.34'; Piwik_SitesManager_API::getInstance()->updateSite($idSite, 'new site name', $url = array('http://site.com'), $ecommerce = 0, $excludedIp . ',1.2.3.4'); $t->setIp($excludedIp); self::checkResponse($t->doTrackPageView('visit from IP excluded')); // test with global list of excluded IPs $excludedIpBis = '145.5.3.4'; Piwik_SitesManager_API::getInstance()->setGlobalExcludedIps($excludedIpBis); $t->setIp($excludedIpBis); self::checkResponse($t->doTrackPageView('visit from IP globally excluded')); } try { @$t->setAttributionInfo(array()); self::fail(); } catch (Exception $e) { } try { $t->setAttributionInfo(json_encode('test')); self::fail(); } catch (Exception $e) { } $t->setAttributionInfo(json_encode(array())); }
function _retrieveCurrentValue() { $this->current_value = PHP_VERSION; $url = 'http://php.net/releases/?serialize=1&version=5'; $timeout = Piwik_UpdateCheck::SOCKET_TIMEOUT; try { $latestVersion = Piwik_Http::sendHttpRequest($url, $timeout); $versionInfo = safe_unserialize($latestVersion); $this->recommended_value = $versionInfo['version']; } catch(Exception $e) { $this->recommended_value = ''; } }
/** * Check for a newer version * * @param bool $force Force check */ public static function check($force = false) { $lastTimeChecked = Piwik_GetOption(self::LAST_TIME_CHECKED); if ($force || $lastTimeChecked === false || time() - self::CHECK_INTERVAL > $lastTimeChecked) { // set the time checked first, so that parallel Piwik requests don't all trigger the http requests Piwik_SetOption(self::LAST_TIME_CHECKED, time(), $autoload = 1); $parameters = array('piwik_version' => Piwik_Version::VERSION, 'php_version' => PHP_VERSION, 'url' => Piwik_Url::getCurrentUrlWithoutQueryString(), 'trigger' => Piwik_Common::getRequestVar('module', '', 'string'), 'timezone' => Piwik_SitesManager_API::getInstance()->getDefaultTimezone()); $url = Piwik_Config::getInstance()->General['api_service_url'] . '/1.0/getLatestVersion/' . '?' . http_build_query($parameters, '', '&'); $timeout = self::SOCKET_TIMEOUT; if (@Piwik_Config::getInstance()->Debug['allow_upgrades_to_beta']) { $url = 'http://builds.piwik.org/LATEST_BETA'; } try { $latestVersion = Piwik_Http::sendHttpRequest($url, $timeout); if (!preg_match('~^[0-9][0-9a-zA-Z_.-]*$~D', $latestVersion)) { $latestVersion = ''; } } catch (Exception $e) { // e.g., disable_functions = fsockopen; allow_url_open = Off $latestVersion = ''; } Piwik_SetOption(self::LATEST_VERSION, $latestVersion); } }
/** * Get system information */ public static function getSystemInformation() { global $piwik_minimumPHPVersion; $minimumMemoryLimit = Zend_Registry::get('config')->General->minimum_memory_limit; $infos = array(); $infos['general_infos'] = array(); $infos['directories'] = Piwik::checkDirectoriesWritable(); $infos['can_auto_update'] = Piwik::canAutoUpdate(); if(Piwik_Common::isIIS()) { Piwik::createWebConfigFiles(); } else { Piwik::createHtAccessFiles(); } Piwik::createWebRootFiles(); $infos['phpVersion_minimum'] = $piwik_minimumPHPVersion; $infos['phpVersion'] = PHP_VERSION; $infos['phpVersion_ok'] = version_compare( $piwik_minimumPHPVersion, $infos['phpVersion']) === -1; // critical errors $extensions = @get_loaded_extensions(); $needed_extensions = array( 'zlib', 'SPL', 'iconv', 'Reflection', ); $infos['needed_extensions'] = $needed_extensions; $infos['missing_extensions'] = array(); foreach($needed_extensions as $needed_extension) { if(!in_array($needed_extension, $extensions)) { $infos['missing_extensions'][] = $needed_extension; } } $infos['pdo_ok'] = false; if(in_array('PDO', $extensions)) { $infos['pdo_ok'] = true; } $infos['adapters'] = Piwik_Db_Adapter::getAdapters(); $needed_functions = array( 'debug_backtrace', 'create_function', 'eval', 'gzcompress', 'gzuncompress', 'pack', ); $infos['needed_functions'] = $needed_functions; $infos['missing_functions'] = array(); foreach($needed_functions as $needed_function) { if(!self::functionExists($needed_function)) { $infos['missing_functions'][] = $needed_function; } } // warnings $desired_extensions = array( 'json', 'libxml', 'dom', 'SimpleXML', ); $infos['desired_extensions'] = $desired_extensions; $infos['missing_desired_extensions'] = array(); foreach($desired_extensions as $desired_extension) { if(!in_array($desired_extension, $extensions)) { $infos['missing_desired_extensions'][] = $desired_extension; } } $desired_functions = array( 'set_time_limit', 'mail', 'parse_ini_file', 'glob', ); $infos['desired_functions'] = $desired_functions; $infos['missing_desired_functions'] = array(); foreach($desired_functions as $desired_function) { if(!self::functionExists($desired_function)) { $infos['missing_desired_functions'][] = $desired_function; } } $infos['openurl'] = Piwik_Http::getTransportMethod(); $infos['gd_ok'] = false; if (in_array('gd', $extensions)) { $gdInfo = gd_info(); $infos['gd_version'] = $gdInfo['GD Version']; preg_match('/([0-9]{1})/', $gdInfo['GD Version'], $gdVersion); if($gdVersion[0] >= 2) { $infos['gd_ok'] = true; } } $infos['hasMbstring'] = false; $infos['multibyte_ok'] = true; if(function_exists('mb_internal_encoding')) { $infos['hasMbstring'] = true; if (((int) ini_get('mbstring.func_overload')) != 0) { $infos['multibyte_ok'] = false; } } $serverSoftware = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : ''; $infos['serverVersion'] = addslashes($serverSoftware); $infos['serverOs'] = @php_uname(); $infos['serverTime'] = date('H:i:s'); $infos['registerGlobals_ok'] = ini_get('register_globals') == 0; $infos['memoryMinimum'] = $minimumMemoryLimit; $infos['memory_ok'] = true; $infos['memoryCurrent'] = ''; $raised = Piwik::raiseMemoryLimitIfNecessary(); if(($memoryValue = Piwik::getMemoryLimitValue()) > 0) { $infos['memoryCurrent'] = $memoryValue.'M'; $infos['memory_ok'] = $memoryValue >= $minimumMemoryLimit; } $infos['isWindows'] = Piwik_Common::isWindows(); $integrityInfo = Piwik::getFileIntegrityInformation(); $infos['integrity'] = $integrityInfo[0]; $infos['integrityErrorMessages'] = array(); if(isset($integrityInfo[1])) { if($infos['integrity'] == false) { $infos['integrityErrorMessages'][] = '<b>'.Piwik_Translate('General_FileIntegrityWarningExplanation').'</b>'; } $infos['integrityErrorMessages'] = array_merge($infos['integrityErrorMessages'], array_slice($integrityInfo, 1)); } $infos['timezone'] = Piwik::isTimezoneSupportEnabled(); $infos['tracker_status'] = Piwik_Common::getRequestVar('trackerStatus', 0, 'int'); $infos['protocol'] = Piwik_ProxyHeaders::getProtocolInformation(); if(Piwik_Url::getCurrentScheme() == 'http' && $infos['protocol'] !== null) { $infos['general_infos']['secure_protocol'] = '1'; } if(count($headers = Piwik_ProxyHeaders::getProxyClientHeaders()) > 0) { $infos['general_infos']['proxy_client_headers'] = $headers; } if(count($headers = Piwik_ProxyHeaders::getProxyHostHeaders()) > 0) { $infos['general_infos']['proxy_host_headers'] = $headers; } return $infos; }
/** * Issues a request to $url */ protected function request($url) { $url = $this->piwikUrl . $url . $this->requestPrepend; //$this->log($url); try { $response = Piwik_Http::sendHttpRequestBy('curl', $url, $timeout = 300, $userAgent = null, $destinationPath = null, $file = null, $followDepth = 0, $acceptLanguage = false, $acceptInvalidSSLCertificate = $this->acceptInvalidSSLCertificate); } catch (Exception $e) { return $this->logNetworkError($url, $e->getMessage()); } if ($this->checkResponse($response, $url)) { return $response; } return false; }
private function generateVisits($time = false, $idSite = 1) { $logs = $this->getAccessLog(); if (empty($time)) { $time = time(); } $date = date("Y-m-d", $time); $acceptLanguages = array("el,fi;q=0.5", "de-de,de;q=0.8,en-us", "pl,en-us;q=0.7,en;q=", "zh-cn", "fr-ca", "en-us", "en-gb", "fr-be", "fr,de-ch;q=0.5", "fr", "fr-ch", "fr"); $prefix = Piwik_Url::getCurrentUrlWithoutFileName() . "piwik.php"; $count = 0; foreach ($logs as $log) { if (!preg_match('/^(\\S+) \\S+ \\S+ \\[(.*?)\\] "GET (\\S+.*?)" \\d+ \\d+ "(.*?)" "(.*?)"/', $log, $m)) { continue; } $ip = $m[1]; $time = $m[2]; $url = $m[3]; $referrer = $m[4]; $ua = $m[5]; $start = strpos($url, 'piwik.php?') + strlen('piwik.php?'); $url = substr($url, $start, strrpos($url, " ") - $start); $datetime = $date . " " . Piwik_Date::factory($time)->toString("H:i:s"); $ip = strlen($ip) < 10 ? "13.5.111.3" : $ip; // Force date/ip & authenticate $url .= "&cdt=" . urlencode($datetime); if (strpos($url, 'cip') === false) { $url .= "&cip=" . $ip; } $url .= "&token_auth=" . Piwik::getCurrentUserTokenAuth(); $url = $prefix . "?" . $url; // Make order IDs unique per day $url = str_replace("ec_id=", "ec_id={$date}-", $url); // Disable provider plugin $url .= "&dp=1"; // Replace idsite $url = preg_replace("/idsite=[0-9]+/", "idsite={$idSite}", $url); $acceptLanguage = $acceptLanguages[$count % count($acceptLanguages)]; if ($output = Piwik_Http::sendHttpRequest($url, $timeout = 5, $ua, $path = null, $follow = 0, $acceptLanguage)) { // var_dump($output); $count++; } // echo "IP=". $ip; echo "<br>"; // echo "Date=". $datetime; echo "<br>"; // echo "URL=". $url; echo "<br>"; // echo "Referrer=". $referrer; echo "<br>"; // echo "UserAgent=". $ua; echo "<br>"; // echo "<hr>"; // var_dump($url); if ($count == 2) { // return $count; } } return $count; }
/** * Returns array of counts and images based on Feedburner URI * * @param string $uri * @return array() */ protected function getFeedData($uri) { // Awareness API only supports yesterday and back; // we get stats for previous two days; // @see http://code.google.com/apis/feedburner/awareness_api.html#dates $yesterday = Piwik_Date::factory('-1 day', 'America/Los_Angeles'); $beforeYesterday = Piwik_Date::factory('-2 day', 'America/Los_Angeles'); //create url to gather XML feed from $url = 'https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=' . $uri . '&dates=' . $beforeYesterday->toString() . ',' . $yesterday->toString(); $data = ''; try { $data = Piwik_Http::sendHttpRequest($url, 5); // Feedburner errors are malformed if (strpos($data, 'The server encountered a temporary error') !== false) { throw new Exception('Unexpected Feedburner response'); } $xml = new SimpleXMLElement($data); } catch (Exception $e) { return "Error parsing the data for feed <a href='http://feeds.feedburner.com/{$uri}' target='_blank'>{$uri}</a>. Fetched data was: \n'" . $data . "'"; } if (count($xml->feed->entry) != 2) { return "Feedburner stats didn't return as expected. \n" . strip_tags($data); } $data = array(); $i = 0; foreach ($xml->feed->entry as $feedDay) { $data[0][$i] = (int) $feedDay['circulation']; $data[1][$i] = (int) $feedDay['hits']; $data[2][$i] = (int) $feedDay['reach']; $i++; } foreach ($data as $key => $value) { if ($value[0] == $value[1]) { $img = 'stop.png'; } else { if ($value[0] < $value[1]) { $img = 'arrow_up.png'; } else { $img = 'arrow_down.png'; } } $prefixImage = '<img alt="" src="./plugins/MultiSites/images/'; $suffixImage = '" />'; $data[$key][2] = $prefixImage . $img . $suffixImage; } return $data; }
/** * "Application" tests should pretty much be always testable, so the default is just to return true * * @return boolean */ function isTestable() { return Piwik_Http::getTransportMethod() !== null; }
/** * Kollektionen werden an Kollektions-idSites weitergeleitet und f�llen ihre eigene Statistik. * @param unknown_type $notification */ public function redirectCollections($notification) { try { if ($tmp = Piwik_Common::getRequestVar("colacnt", "false", "string") == "true") { return; } $openedurl = Piwik_Common::getRequestVar("url"); $collections = $this->getCollectionsForURL($openedurl); if ($collections == null || count($collections) < 1) { return; } require_once PIWIK_INCLUDE_PATH . '/core/Loader.php'; $murl = $this->curPageURL(); $ua = $_SERVER["HTTP_USER_AGENT"]; $acceptLanguage = $_SERVER["HTTP_ACCEPT_LANGUAGE"]; foreach ($collections as $c) { $idSite = Piwik_FetchOne("SELECT idSite FROM " . Piwik_Common::prefixTable("site_collections") . " WHERE cID = ?", $c); $name = "(Kollektion) " . getCollectionNames($c); //Kollektion hat noch keine idSite! -> wird erstellt if (!is_numeric($idSite)) { Piwik_Query("INSERT INTO " . Piwik_Common::prefixTable("site") . " (idsite, name, main_url, ts_created, timezone, currency, excluded_ips, excluded_parameters, `group`) " . "VALUES('', ?, ?, NOW(), 'Europe/Berlin', 'EUR', '', '', 'Digitale Kollektionen')", array($name, "slub-dresden.de")); $idSite = Piwik_FetchOne("SELECT LAST_INSERT_ID() FROM " . Piwik_Common::prefixTable("site")); Piwik_Query("INSERT INTO " . Piwik_Common::prefixTable("site_collections") . " (ID, cID, idSite) VALUES ('', ?, ?)", array($c, $idSite)); } //idSite zur Kollektion wurde gel�scht! -> neu erstellen if (Piwik_FetchOne("SELECT COUNT(idsite) FROM " . Piwik_Common::prefixTable("site") . " WHERE idsite = ?", $idSite) == 0) { Piwik_Query("INSERT INTO " . Piwik_Common::prefixTable("site") . " (idsite, name, main_url, ts_created, timezone, currency, excluded_ips, excluded_parameters, `group`) " . "VALUES(?, ?, ?, NOW(), 'Europe/Berlin', 'EUR', '', '', 'Digitale Kollektionen')", array($idSite, $name, "slub-dresden.de")); } $url = preg_replace("/idsite=[0-9]+/", "idsite=" . $idSite, $murl); // Erneute Kollektionsweiterleitung verhindern $url .= "&colacnt=true"; // Disable provider plugin $url .= "&dp=1"; Piwik_Http::sendHttpRequest($url, 5, $ua, null, 0, $acceptLanguage); } } catch (Exception $e) { $this->clog("redirectCollections-Error: " . $e->getMessage()); } }