Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authormattpiwik <matthieu.aubry@gmail.com>2009-03-20 10:39:09 +0300
committermattpiwik <matthieu.aubry@gmail.com>2009-03-20 10:39:09 +0300
commit0bcc6f8d5e27db477ee7e34b1bed6150671d4ce3 (patch)
tree95df9f49750fadf00f67b995c7ed240acebdab43 /core
parent7c0a514ea0ed897e3f3a386c169c527c12758da2 (diff)
- fixed #9 referer URLs with host registered as main_url or alias_url should NOT be counted as referer
now if a visitor comes to piwik.org/ with a piwik.org/xx/y/z referer, it will be considered a direct entry rather than a referer visit. makes use of the new caching mechanism introduced with the Goal Tracking plugin, to cache website-related data for super fast access at Tracker time. - Goals is not a tracker plugin anymore (improving performance of Tracker) - fixed bug that the cache file wasn't read properly and goal queries were done at each piwik.php request git-svn-id: http://dev.piwik.org/svn/trunk@994 59fd770c-687e-43c8-a1e3-f5a4ff64c105
Diffstat (limited to 'core')
-rw-r--r--core/API/Request.php4
-rw-r--r--core/Access.php32
-rw-r--r--core/Auth.php2
-rw-r--r--core/CacheFile.php4
-rw-r--r--core/Common.php53
-rw-r--r--core/FrontController.php13
-rw-r--r--core/Piwik.php6
-rw-r--r--core/PluginsFunctions/WidgetsList.php5
-rw-r--r--core/PluginsManager.php34
-rw-r--r--core/Tracker/Db.php9
-rw-r--r--core/Tracker/Visit.php49
-rw-r--r--core/Updates/0.2.33.php5
-rw-r--r--core/Url.php1
13 files changed, 146 insertions, 71 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() ;
}