diff options
-rw-r--r-- | core/API/Request.php | 4 | ||||
-rw-r--r-- | core/Access.php | 32 | ||||
-rw-r--r-- | core/Auth.php | 2 | ||||
-rw-r--r-- | core/CacheFile.php | 4 | ||||
-rw-r--r-- | core/Common.php | 53 | ||||
-rw-r--r-- | core/FrontController.php | 13 | ||||
-rw-r--r-- | core/Piwik.php | 6 | ||||
-rw-r--r-- | core/PluginsFunctions/WidgetsList.php | 5 | ||||
-rw-r--r-- | core/PluginsManager.php | 34 | ||||
-rw-r--r-- | core/Tracker/Db.php | 9 | ||||
-rw-r--r-- | core/Tracker/Visit.php | 49 | ||||
-rw-r--r-- | core/Updates/0.2.33.php | 5 | ||||
-rw-r--r-- | core/Url.php | 1 | ||||
-rwxr-xr-x | index.php | 1 | ||||
-rw-r--r-- | piwik.php | 1 | ||||
-rw-r--r-- | plugins/Goals/Goals.php | 1 | ||||
-rw-r--r-- | plugins/Installation/Controller.php | 2 | ||||
-rw-r--r-- | plugins/Login/Login.php | 5 | ||||
-rwxr-xr-x | plugins/SitesManager/API.php | 35 | ||||
-rw-r--r-- | plugins/SitesManager/SitesManager.php | 26 | ||||
-rwxr-xr-x | plugins/UsersManager/API.php | 4 | ||||
-rwxr-xr-x | tests/core/Database.test.php | 2 |
22 files changed, 209 insertions, 85 deletions
diff --git a/core/API/Request.php b/core/API/Request.php index e7d06c1e26..79993992ac 100644 --- a/core/API/Request.php +++ b/core/API/Request.php @@ -64,7 +64,7 @@ class Piwik_API_Request if(isset($requestArray['token_auth'])) { Piwik_PostEvent('API.Request.authenticate', $requestArray['token_auth']); - Zend_Registry::get('access')->loadAccess(); + Zend_Registry::get('access')->reloadAccess(); } $requestArray = array_merge($_REQUEST, $requestArray); @@ -75,7 +75,7 @@ class Piwik_API_Request if(!is_array($element)) { $element = trim($element); - } + } } $this->request = $requestArray; diff --git a/core/Access.php b/core/Access.php index c9c7bc98d0..5f7bb65249 100644 --- a/core/Access.php +++ b/core/Access.php @@ -81,7 +81,7 @@ class Piwik_Access * * @var Piwik_Auth */ - private $auth; + private $auth = null; /** * Returns the list of the existing Access level. @@ -93,14 +93,15 @@ class Piwik_Access return self::$availableAccess; } - /** - * @param Piwik_Auth The authentification object - */ - public function __construct( Piwik_Auth $auth ) + function __construct() { - $this->auth = $auth; + $this->idsitesByAccess = array( + 'view' => array(), + 'admin' => array(), + 'superuser' => array() + ); } - + /** * Loads the access levels for the current user. * @@ -110,10 +111,15 @@ class Piwik_Access * We load the access levels for this user for all the websites. * */ - public function loadAccess() + public function reloadAccess(Piwik_Auth $auth = null) { - $idsitesByAccess = array( 'view' => array(), 'admin' => array(), 'superuser' => array()); - + if(!is_null($auth)) { + $this->auth = $auth; + } + if(is_null($this->auth)) { + throw new Exception("You must pass a Piwik_Auth object in order to reload access information for this session."); + } + // access = array ( idsite => accessIdSite, idsite2 => accessIdSite2) $result = $this->auth->authenticate(); @@ -131,7 +137,7 @@ class Piwik_Access { throw new Exception("Piwik could not find any website in the database."); } - $idsitesByAccess['superuser'] = $allSitesId; + $this->idsitesByAccess['superuser'] = $allSitesId; } // valid authentification (normal user logged in) else @@ -146,12 +152,10 @@ class Piwik_Access " WHERE login = ?", $this->login); foreach($accessRaw as $access) { - $idsitesByAccess[$access['access']][] = $access['idsite']; + $this->idsitesByAccess[$access['access']][] = $access['idsite']; } } } - - $this->idsitesByAccess = $idsitesByAccess; } /** diff --git a/core/Auth.php b/core/Auth.php index b3d99d5d26..dc23bc6128 100644 --- a/core/Auth.php +++ b/core/Auth.php @@ -9,6 +9,8 @@ * @package Piwik */ +require_once "Zend/Auth/Result.php"; + interface Piwik_Auth { /** * @return Piwik_Auth_Result diff --git a/core/CacheFile.php b/core/CacheFile.php index a254788c52..3a7607223c 100644 --- a/core/CacheFile.php +++ b/core/CacheFile.php @@ -41,7 +41,7 @@ class Piwik_CacheFile $content = ''; // We are assuming that most of the time cache will exists - $ok = @include($this->cachePath . $id); + $ok = @include_once($this->cachePath . $id . ".php"); if ($ok && $cache_complete == true) { return $content; @@ -104,7 +104,7 @@ class Piwik_CacheFile */ function delete($id) { - $filename = $this->cachePath . $id; + $filename = $this->cachePath . $id . ".php"; if (file_exists($filename)) { @unlink ($filename); return true; diff --git a/core/Common.php b/core/Common.php index f3d1b5753d..343d509eec 100644 --- a/core/Common.php +++ b/core/Common.php @@ -83,26 +83,59 @@ class Piwik_Common return $cacheContent; } - if(!class_exists('Zend_Registry')) - { - require_once "Zend/Registry.php"; - } // if DB is not in the registry, we are in tracker mode, we add it in the registry - try { - Zend_Registry::get('db'); - } catch(Exception $e) { + if(defined('PIWIK_TRACKER_MODE') + && PIWIK_TRACKER_MODE) + { Zend_Registry::set('db', Piwik_Tracker::getDatabase()); + require_once "Zend/Exception.php"; + require_once "Zend/Loader.php"; + require_once "Zend/Auth.php"; + require_once "Timer.php"; + require_once "PluginsManager.php"; + require_once "core/Piwik.php"; + require_once "Access.php"; + require_once "Auth.php"; + require_once "API/Proxy.php"; + require_once "Archive.php"; + require_once "Site.php"; + require_once "Date.php"; + require_once "DataTable.php"; + require_once "Translate.php"; + require_once "Mail.php"; + require_once "Url.php"; + require_once "Controller.php"; + require_once "Option.php"; + require_once "View.php"; + require_once "UpdateCheck.php"; + Piwik::createAccessObject(); + Piwik::setUserIsSuperUser(); + $pluginsManager = Piwik_PluginsManager::getInstance(); + $pluginsManager->setPluginsToLoad( Zend_Registry::get('config')->Plugins->Plugins->toArray() ); } + $content = array(); Piwik_PostEvent('Common.fetchWebsiteAttributes', $content, $idSite); $cache->set($filename, $content); return $content; } - static public function regenerateCacheWebsiteAttributes($idSite) + /** + * Delete existing Tracker cache files and regenerate them + * + * @param array $idSites array of idSites to clear cache for + * @return void + */ + static public function regenerateCacheWebsiteAttributes($idSites = array()) { - self::deleteCacheWebsiteAttributes($idSite); - self::getCacheWebsiteAttributes($idSite); + if(!is_array($idSites)) + { + $idSites = array( $idSites ); + } + foreach($idSites as $idSite) { + self::deleteCacheWebsiteAttributes($idSite); + self::getCacheWebsiteAttributes($idSite); + } } static public function deleteCacheWebsiteAttributes( $idSite ) diff --git a/core/FrontController.php b/core/FrontController.php index e43a36edad..f0421baae0 100644 --- a/core/FrontController.php +++ b/core/FrontController.php @@ -16,12 +16,12 @@ require_once "Zend/Exception.php"; require_once "Zend/Loader.php"; require_once "Zend/Auth.php"; -require_once "Zend/Auth/Adapter/DbTable.php"; /** * Piwik classes */ require_once "Timer.php"; +require_once "PluginsManager.php"; require_once "core/Piwik.php"; require_once "Access.php"; require_once "Auth.php"; @@ -38,10 +38,6 @@ require_once "Option.php"; require_once "View.php"; require_once "UpdateCheck.php"; -require_once "PluginsFunctions/Menu.php"; -require_once "PluginsFunctions/AdminMenu.php"; -require_once "PluginsFunctions/WidgetsList.php"; -require_once "PluginsFunctions/Sql.php"; /** * Front controller. @@ -238,6 +234,9 @@ class Piwik_FrontController $pluginsManager->setLanguageToLoad( Piwik_Translate::getInstance()->getLanguageToLoad() ); $pluginsManager->postLoadPlugins(); + // creating the access object, so that core/Updates/* can enforce Super User and use some APIs + Piwik::createAccessObject(); + require_once "CoreUpdater/Controller.php"; $updaterController = new Piwik_CoreUpdater_Controller(); $updaterController->checkForCoreAndPluginsUpdates(); @@ -255,9 +254,7 @@ class Piwik_FrontController under the <code>[Plugins]</code> section in your config/config.inc.php"); } - $access = new Piwik_Access($authAdapter); - Zend_Registry::set('access', $access); - Zend_Registry::get('access')->loadAccess(); + Zend_Registry::get('access')->reloadAccess($authAdapter); Piwik::raiseMemoryLimitIfNecessary(); diff --git a/core/Piwik.php b/core/Piwik.php index 701698d074..d27ce8ccca 100644 --- a/core/Piwik.php +++ b/core/Piwik.php @@ -13,7 +13,6 @@ require_once "Config.php"; require_once "Zend/Db.php"; require_once "Zend/Db/Table.php"; require_once "Log.php"; -require_once "PluginsManager.php"; require_once "Translate.php"; /** @@ -1259,6 +1258,11 @@ class Piwik $config->init(); } + static public function createAccessObject() + { + Zend_Registry::set('access', new Piwik_Access()); + } + static public function dropTables( $doNotDelete = array() ) { $tablesAlreadyInstalled = self::getTablesInstalled(); diff --git a/core/PluginsFunctions/WidgetsList.php b/core/PluginsFunctions/WidgetsList.php index 197e2e4cd9..d06f8e8aef 100644 --- a/core/PluginsFunctions/WidgetsList.php +++ b/core/PluginsFunctions/WidgetsList.php @@ -15,10 +15,7 @@ class Piwik_WidgetsList static function get() { - if(is_null(self::$widgets)) { - self::$widgets = array(); - Piwik_PostEvent('WidgetsList.add'); - } + Piwik_PostEvent('WidgetsList.add'); return self::$widgets; } diff --git a/core/PluginsManager.php b/core/PluginsManager.php index b01ee2ab13..ffdb24e784 100644 --- a/core/PluginsManager.php +++ b/core/PluginsManager.php @@ -11,6 +11,15 @@ require_once "Plugin.php"; require_once "Event/Dispatcher.php"; +require_once "PluginsFunctions/Menu.php"; +require_once "PluginsFunctions/AdminMenu.php"; +require_once "PluginsFunctions/WidgetsList.php"; +require_once "PluginsFunctions/Sql.php"; + +require_once "Zend/Exception.php"; +require_once "Zend/Loader.php"; +require_once "Auth.php"; +require_once "Controller.php"; /** * @package Piwik @@ -23,9 +32,9 @@ class Piwik_PluginsManager public $dispatcher; protected $pluginsToLoad = array(); - protected $installPlugins = false; - protected $doLoadPlugins = true; protected $languageToLoad = null; + + protected $doLoadPlugins = true; protected $loadedPlugins = array(); protected $doLoadAlwaysActivatedPlugins = true; @@ -64,6 +73,11 @@ class Piwik_PluginsManager || $this->isPluginAlwaysActivated( $name ); } + public function isPluginLoaded( $name ) + { + return isset($this->loadedPlugins[$name]); + } + /** * Reads the directories inside the plugins/ directory and returns their names in an array * @@ -223,15 +237,15 @@ class Piwik_PluginsManager foreach($this->pluginsToLoad as $pluginName) { - $newPlugin = $this->loadPlugin($pluginName); - - // if we have to load the plugins - // and if this plugin is activated - if($this->doLoadPlugins - && $this->isPluginActivated($pluginName)) + if(!$this->isPluginLoaded($pluginName)) { - $this->addPluginObservers( $newPlugin ); - $this->addLoadedPlugin( $pluginName, $newPlugin); + $newPlugin = $this->loadPlugin($pluginName); + if($this->doLoadPlugins + && $this->isPluginActivated($pluginName)) + { + $this->addPluginObservers( $newPlugin ); + $this->addLoadedPlugin( $pluginName, $newPlugin); + } } } } diff --git a/core/Tracker/Db.php b/core/Tracker/Db.php index 1d57467c84..93ea1924ec 100644 --- a/core/Tracker/Db.php +++ b/core/Tracker/Db.php @@ -164,6 +164,15 @@ class Piwik_Tracker_Db } /** + * This function is a proxy to fetch(), used to maintain compatibility with Zend_Db interface + * @see fetch() + */ + public function fetchRow( $query, $parameters = array() ) + { + return $this->fetch($query, $parameters); + } + + /** * Executes a query, using optional bound parameters. * * @param string Query diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php index 6a63a29d65..f8c37a863e 100644 --- a/core/Tracker/Visit.php +++ b/core/Tracker/Visit.php @@ -46,7 +46,6 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface { throw new Exception("The 'idsite' in the request is invalid."); } - $this->idsite = $idsite; } @@ -236,6 +235,7 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface $fields = implode(", ", array_keys($this->visitorInfo)); $values = substr(str_repeat( "?,",count($this->visitorInfo)),0,-1); + printDebug($this->visitorInfo); Piwik_Tracker::getDatabase()->query( "INSERT INTO ".Piwik_Common::prefixTable('log_visit'). " ($fields) VALUES ($values)", array_values($this->visitorInfo)); @@ -641,19 +641,17 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface } $refererDetected = false; - if( !empty($this->currentUrlParse['host'])) + + if( !empty($this->currentUrlParse['host']) + && $this->detectRefererCampaign() ) { - if( $this->detectRefererCampaign() ) - { - $refererDetected = true; - } + $refererDetected = true; } - if(!$refererDetected - && !empty($this->refererUrlParse['host']) ) + if(!$refererDetected) { - if( $this->detectRefererSearchEngine() - || $this->detectRefererDirectEntry() ) + if( $this->detectRefererDirectEntry() + || $this->detectRefererSearchEngine() ) { $refererDetected = true; } @@ -691,7 +689,8 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface */ require_once "DataFiles/SearchEngines.php"; - if(array_key_exists($this->refererHost, $GLOBALS['Piwik_SearchEngines'])) + if(!empty($this->refererHost) + && array_key_exists($this->refererHost, $GLOBALS['Piwik_SearchEngines'])) { $searchEngineName = $GLOBALS['Piwik_SearchEngines'][$this->refererHost][0]; $variableName = $GLOBALS['Piwik_SearchEngines'][$this->refererHost][1]; @@ -767,23 +766,35 @@ class Piwik_Tracker_Visit implements Piwik_Tracker_Visit_Interface /* - * Direct entry (referer host is similar to current host) - * And we have previously tried to detect the campaign variables in the URL - * so it can only be a direct access + * We have previously tried to detect the campaign variables in the URL + * so at this stage, if the referer host is the current host, + * or if the referer host is any of the registered URL for this website, + * it is considered a direct entry */ protected function detectRefererDirectEntry() { - if(isset($this->currentUrlParse['host'])) + if(!empty($this->refererHost)) { - $currentHost = $this->currentUrlParse['host']; - - if($currentHost == $this->refererHost) + // is the referer host the current host? + if(isset($this->currentUrlParse['host'])) + { + $currentHost = $this->currentUrlParse['host']; + if($currentHost == $this->refererHost) + { + $this->typeRefererAnalyzed = Piwik_Common::REFERER_TYPE_DIRECT_ENTRY; + return true; + } + } + // is the referer host any of the registered URLs for this website? + $websiteData = Piwik_Common::getCacheWebsiteAttributes($this->idsite); + if(isset($websiteData['hosts']) + && in_array($this->refererHost, $websiteData['hosts'])) { $this->typeRefererAnalyzed = Piwik_Common::REFERER_TYPE_DIRECT_ENTRY; return true; } } - + } /** diff --git a/core/Updates/0.2.33.php b/core/Updates/0.2.33.php new file mode 100644 index 0000000000..b3df11c51e --- /dev/null +++ b/core/Updates/0.2.33.php @@ -0,0 +1,5 @@ +<?php +require_once "SitesManager/API.php"; +Piwik::setUserIsSuperUser(); +$allSiteIds = Piwik_SitesManager_API::getAllSitesId(); +Piwik_Common::regenerateCacheWebsiteAttributes($allSiteIds); diff --git a/core/Url.php b/core/Url.php index f4add00d5d..811e2a8579 100644 --- a/core/Url.php +++ b/core/Url.php @@ -35,7 +35,6 @@ class Piwik_Url */ static public function getCurrentUrlWithoutQueryString() { - return self::getCurrentHost() . self::getCurrentScriptName() ; } @@ -17,7 +17,6 @@ if(!defined('PIWIK_INCLUDE_PATH')) define('PIWIK_INCLUDE_PATH', dirname(__FILE__)); } - set_include_path(PIWIK_INCLUDE_PATH . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/libs/' . PATH_SEPARATOR . PIWIK_INCLUDE_PATH . '/plugins/' @@ -13,6 +13,7 @@ if(defined('ENABLE_PIWIK_TRACKER') && !ENABLE_PIWIK_TRACKER) return; } +define('PIWIK_TRACKER_MODE', true); error_reporting(E_ALL|E_NOTICE); define('PIWIK_INCLUDE_PATH', dirname(__FILE__)); @ignore_user_abort(true); diff --git a/plugins/Goals/Goals.php b/plugins/Goals/Goals.php index a031db5120..c672658bfb 100644 --- a/plugins/Goals/Goals.php +++ b/plugins/Goals/Goals.php @@ -30,7 +30,6 @@ class Piwik_Goals extends Piwik_Plugin 'author' => 'Piwik', 'homepage' => 'http://piwik.org/', 'version' => '0.1', - 'TrackerPlugin' => true ); return $info; diff --git a/plugins/Installation/Controller.php b/plugins/Installation/Controller.php index f36643669e..4a03494684 100644 --- a/plugins/Installation/Controller.php +++ b/plugins/Installation/Controller.php @@ -524,5 +524,5 @@ class Piwik_FakeAccess_SetSuperUser { { return true; } - function loadAccess() {} + function reloadAccess() {} } diff --git a/plugins/Login/Login.php b/plugins/Login/Login.php index 9d5db0154e..9b1cc774df 100644 --- a/plugins/Login/Login.php +++ b/plugins/Login/Login.php @@ -8,8 +8,9 @@ * * @package Piwik_Login */ -require "Login/Auth.php"; -require "Cookie.php"; + +require_once "Cookie.php"; +require_once "Login/Auth.php"; /** * diff --git a/plugins/SitesManager/API.php b/plugins/SitesManager/API.php index 24a33d17b2..07d413a861 100755 --- a/plugins/SitesManager/API.php +++ b/plugins/SitesManager/API.php @@ -71,9 +71,14 @@ class Piwik_SitesManager_API static private function getAliasSiteUrlsFromId( $idsite ) { $db = Zend_Registry::get('db'); - $urls = $db->fetchCol("SELECT url + $result = $db->fetchAll("SELECT url FROM ".Piwik::prefixTable("site_url"). " WHERE idsite = ?", $idsite); + $urls = array(); + foreach($result as $url) + { + $urls[] = $url['url']; + } return $urls; } @@ -99,7 +104,13 @@ class Piwik_SitesManager_API static public function getAllSitesId() { Piwik::checkUserIsSuperUser(); - return Zend_Registry::get('db')->fetchCol("SELECT idsite FROM ".Piwik::prefixTable('site')); + $result = Zend_Registry::get('db')->fetchAll("SELECT idsite FROM ".Piwik::prefixTable('site')); + $idSites = array(); + foreach($result as $idSite) + { + $idSites[] = $idSite['idsite']; + } + return $idSites; } @@ -231,11 +242,17 @@ class Piwik_SitesManager_API self::insertSiteUrls($idSite, $urls); // we reload the access list which doesn't yet take in consideration this new website - Zend_Registry::get('access')->loadAccess(); + Zend_Registry::get('access')->reloadAccess(); + self::postUpdateWebsite($idSite); return (int)$idSite; } + private static function postUpdateWebsite($idSite) + { + Piwik_Common::regenerateCacheWebsiteAttributes($idSite); + } + /** * Delete a website from the database, given its Id. * @@ -247,8 +264,12 @@ class Piwik_SitesManager_API { Piwik::checkUserIsSuperUser(); - $nbSites = count(Piwik_SitesManager_API::getAllSitesId()); - + $idSites = Piwik_SitesManager_API::getAllSitesId(); + if(!in_array($idSite, $idSites)) + { + throw new Exception("website id = $idSite not found"); + } + $nbSites = count($idSites); if($nbSites == 1) { throw new Exception(Piwik_TranslateException("SitesManager_ExceptionDeleteSite")); @@ -264,6 +285,8 @@ class Piwik_SitesManager_API $db->query("DELETE FROM ".Piwik::prefixTable("access")." WHERE idsite = ?", $idSite); + + Piwik_Common::deleteCacheWebsiteAttributes($idSite); } @@ -299,6 +322,7 @@ class Piwik_SitesManager_API $urlsInit = self::getSiteUrlsFromId($idSite); $toInsert = array_diff($urls, $urlsInit); self::insertSiteUrls($idSite, $toInsert); + self::postUpdateWebsite($idSite); return count($toInsert); } @@ -349,6 +373,7 @@ class Piwik_SitesManager_API { $insertedUrls = self::addSiteAliasUrls($idSite, array_slice($urls,1)); } + self::postUpdateWebsite($idSite); } /** diff --git a/plugins/SitesManager/SitesManager.php b/plugins/SitesManager/SitesManager.php index fe09980913..1fcd1364ce 100644 --- a/plugins/SitesManager/SitesManager.php +++ b/plugins/SitesManager/SitesManager.php @@ -29,7 +29,31 @@ class Piwik_SitesManager extends Piwik_Plugin function getListHooksRegistered() { - return array('AdminMenu.add' => 'addMenu'); + return array( + 'AdminMenu.add' => 'addMenu', + 'Common.fetchWebsiteAttributes' => 'recordWebsiteHostsInCache', + ); + } + + function recordWebsiteHostsInCache($notification) + { + require_once "SitesManager/API.php"; + $info = $notification->getNotificationInfo(); + $idsite = $info['idsite']; + + // add the 'hosts' entry in the website array + $array =& $notification->getNotificationObject(); + $urls = Piwik_SitesManager_API::getSiteUrlsFromId($idsite); + $hosts = array(); + foreach($urls as $url) + { + $url = parse_url($url); + if(isset($url['host'])) + { + $hosts[] = $url['host']; + } + } + $array['hosts'] = $hosts; } function addMenu() diff --git a/plugins/UsersManager/API.php b/plugins/UsersManager/API.php index a28dea82b1..7b808c1eaa 100755 --- a/plugins/UsersManager/API.php +++ b/plugins/UsersManager/API.php @@ -292,7 +292,7 @@ class Piwik_UsersManager_API ); // we reload the access list which doesn't yet take in consideration this new user - Zend_Registry::get('access')->loadAccess(); + Zend_Registry::get('access')->reloadAccess(); } @@ -476,7 +476,7 @@ class Piwik_UsersManager_API } // we reload the access list which doesn't yet take in consideration this new user access - Zend_Registry::get('access')->loadAccess(); + Zend_Registry::get('access')->reloadAccess(); } /** diff --git a/tests/core/Database.test.php b/tests/core/Database.test.php index 0261f508c3..ef2726a1cf 100755 --- a/tests/core/Database.test.php +++ b/tests/core/Database.test.php @@ -75,7 +75,7 @@ class FakeAccess } } - static public function loadAccess() + static public function reloadAccess() {} static public function checkUserHasAdminAccess( $idSites ) |