diff --git a/config/global.ini.php b/config/global.ini.php index 4e1466c780ac2e345adde575d00184355cb480b8..6fe392aa5f6ce03a41ae5d1f2433065b08055db8 100644 --- a/config/global.ini.php +++ b/config/global.ini.php @@ -339,12 +339,7 @@ campaign_keyword_var_name = "pk_kwd,piwik_kwd,utm_term" ; maximum length of a Page Title or a Page URL recorded in the log_action.name table page_maximum_length = 1024; -; Anonymize a visitor's IP address before any tracking heuristics or any plugins can access the visitor's IP address; -; This value is the number of octets in IP address to mask; if the AnonymizeIP plugin is deactivated, this value is ignored. -; For IPv4 addresses, valid values are 0..4; for IPv6 addresses, valid values are 0..16 -ip_address_pre_mask_length = 0 - -; Anonymize a visitor's IP address after tracking heuristics but before storing to DB; +; Anonymize a visitor's IP address after testing for "Ip exclude" ; This value is the number of octets in IP address to mask; if the AnonymizeIP plugin is deactivated, this value is ignored. ; For IPv4 addresses, valid values are 0..4; for IPv6 addresses, valid values are 0..16 ip_address_mask_length = 1 diff --git a/core/Tracker.php b/core/Tracker.php index 98f3555b78608be23bcd740e30dd72255f7f7c71..d09bee5af0342d5932bb0b22a4bdd4a1bf67ea0b 100644 --- a/core/Tracker.php +++ b/core/Tracker.php @@ -321,11 +321,13 @@ class Piwik_Tracker protected function loadTrackerPlugins() { + // Adding &dp=1 will disable the provider plugin, if token_auth is used (used to speed up bulk imports) if(isset($this->request['dp']) && $this->authenticated) { Piwik_Tracker::setPluginsNotToLoad(array('Provider')); } + try{ $pluginsTracker = Piwik_Tracker_Config::getInstance()->Plugins_Tracker; if(is_array($pluginsTracker) diff --git a/core/Tracker/Config.php b/core/Tracker/Config.php index bdd26d21bb6ad204847861e20cc40beb019d8fea..e66ec9fae72c8ccb1234fd1e6f3dc6082c383b20 100644 --- a/core/Tracker/Config.php +++ b/core/Tracker/Config.php @@ -151,8 +151,16 @@ class Piwik_Tracker_Config /** * Should only be used in tests/ */ - public function setTestValue($section, $name, $value) + public function setTestValue($section, $name, $value = false) { - $this->configUser[$section][$name] = $value; + // Case setting the whole section at once + if($value === false) + { + $this->configUser[$section] = $name; + } + else + { + $this->configUser[$section][$name] = $value; + } } } diff --git a/plugins/AnonymizeIP/AnonymizeIP.php b/plugins/AnonymizeIP/AnonymizeIP.php index cfee9f309dee2b9ba0365e7c3341a871a698a600..821c5efac2360a9f5578fc7af5bd23a42ef6e490 100644 --- a/plugins/AnonymizeIP/AnonymizeIP.php +++ b/plugins/AnonymizeIP/AnonymizeIP.php @@ -38,7 +38,6 @@ class Piwik_AnonymizeIP extends Piwik_Plugin { return array( 'Tracker.Visit.setVisitorIp' => 'setVisitorIpAddress', - 'Tracker.saveVisitorInformation' => 'anonymizeVisitorIpAddress', ); } @@ -70,15 +69,7 @@ class Piwik_AnonymizeIP extends Piwik_Plugin function setVisitorIpAddress($notification) { $ip =& $notification->getNotificationObject(); - $ip = self::applyIPMask($ip, Piwik_Tracker_Config::getInstance()->Tracker['ip_address_pre_mask_length']); + $ip = self::applyIPMask($ip, Piwik_Tracker_Config::getInstance()->Tracker['ip_address_mask_length']); } - /** - * Hook on Tracker.saveVisitorInformation to anonymize visitor IP addresses - */ - function anonymizeVisitorIpAddress($notification) - { - $visitorInfo =& $notification->getNotificationObject(); - $visitorInfo['location_ip'] = self::applyIPMask($visitorInfo['location_ip'], Piwik_Tracker_Config::getInstance()->Tracker['ip_address_mask_length']); - } } diff --git a/plugins/PrivacyManager/Controller.php b/plugins/PrivacyManager/Controller.php index 87a3effc3837882551e9eaf6546efe80e5b6298d..bdd9bc3e398b13f5c4c19a0a181932f588e71cd1 100644 --- a/plugins/PrivacyManager/Controller.php +++ b/plugins/PrivacyManager/Controller.php @@ -23,14 +23,17 @@ class Piwik_PrivacyManager_Controller extends Piwik_Controller_Admin public function index() { Piwik::checkUserIsSuperUser(); - if ($_SERVER["REQUEST_METHOD"] == "POST") { - switch (Piwik_Common::getRequestVar('form')) { + if ($_SERVER["REQUEST_METHOD"] == "POST") + { + switch (Piwik_Common::getRequestVar('form')) + { case("formMaskLength"): $this->handlePluginState(Piwik_Common::getRequestVar("anonymizeIPEnable", 0)); $maskLength = Zend_Registry::get('config')->Tracker; - $maskLength->ip_address_mask_length = $maskLength->ip_address_pre_mask_length = Piwik_Common::getRequestVar("maskLength", 1); + $maskLength->ip_address_mask_length = Piwik_Common::getRequestVar("maskLength", 1); Zend_Registry::get('config')->Tracker = $maskLength->toArray(); break; + case("formDeleteSettings"): $deleteLogs = Zend_Registry::get('config')->Deletelogs; $deleteLogs->delete_logs_enable = Piwik_Common::getRequestVar("deleteEnable", 0); @@ -41,6 +44,7 @@ class Piwik_PrivacyManager_Controller extends Piwik_Controller_Admin Zend_Registry::get('config')->Deletelogs = $deleteLogs->toArray(); break; + default: //do nothing break; } @@ -53,7 +57,8 @@ class Piwik_PrivacyManager_Controller extends Piwik_Controller_Admin Piwik::checkUserHasSomeAdminAccess(); $view = Piwik_View::factory('privacySettings'); - if (Piwik::isUserIsSuperUser()) { + if (Piwik::isUserIsSuperUser()) + { $deleteLogs = array(); $view->deleteLogs = $this->getDeleteLogsInfo(); @@ -61,7 +66,8 @@ class Piwik_PrivacyManager_Controller extends Piwik_Controller_Admin } $view->language = Piwik_LanguagesManager::getLanguageCodeForCurrentUser(); - if (!Zend_Registry::get('config')->isFileWritable()) { + if (!Zend_Registry::get('config')->isFileWritable()) + { $view->configFileNotWritable = true; } @@ -81,17 +87,6 @@ class Piwik_PrivacyManager_Controller extends Piwik_Controller_Admin $anonymizeIP["name"] = self::ANONYMIZE_IP_PLUGIN_NAME; $anonymizeIP["enabled"] = Piwik_PluginsManager::getInstance()->isPluginActivated(self::ANONYMIZE_IP_PLUGIN_NAME); $anonymizeIP["maskLength"] = Zend_Registry::get('config')->Tracker->ip_address_mask_length; - - /** - * synchronize ip_address_mask_length and ip_address_pre_mask_length (changed in Piwik 1.7) - */ - $maskLength = Zend_Registry::get('config')->Tracker; - if (($maskLength->ip_address_mask_length != $maskLength->ip_address_pre_mask_length) && - $anonymizeIP["enabled"] === true) { - $maskLength->ip_address_pre_mask_length = $maskLength->ip_address_mask_length; - Zend_Registry::get('config')->Tracker = $maskLength->toArray(); - } - $anonymizeIP["info"] = Piwik_PluginsManager::getInstance()->getLoadedPlugin(self::ANONYMIZE_IP_PLUGIN_NAME)->getInformation(); return $anonymizeIP; diff --git a/plugins/PrivacyManager/PrivacyManager.php b/plugins/PrivacyManager/PrivacyManager.php index dc9a8419fc50515ca254e853b7d708cef18d0527..73965cd6ed858c4a82a93fb716e9358bafe26ae1 100644 --- a/plugins/PrivacyManager/PrivacyManager.php +++ b/plugins/PrivacyManager/PrivacyManager.php @@ -151,7 +151,7 @@ class Piwik_PrivacyManager extends Piwik_Plugin $sql = 'DELETE LOW_PRIORITY QUICK IGNORE FROM ' . $table . ' WHERE `idvisit` <= ? '; - if(isset($maxRowsPerRun)&&$maxRowsPerRun>0) { + if(isset($maxRowsPerRun) && $maxRowsPerRun > 0) { $sql .= ' LIMIT ' . (int)$maxRowsPerRun; } diff --git a/tests/integration/NoVisit.test.php b/tests/integration/NoVisit.test.php index 4c6bb1093af4f8f7b0c972c84773dc5397b506ae..d5a2df6422a5f08a94a1de77a052bc4ae5c46ed2 100755 --- a/tests/integration/NoVisit.test.php +++ b/tests/integration/NoVisit.test.php @@ -71,19 +71,26 @@ class Test_Piwik_Integration_NoVisit extends Test_Integration_Facade $t->setUserAgent('Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'); $this->checkResponse($t->doTrackPageView('bot visit, please do not record')); - // 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); - $this->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); - $this->checkResponse($t->doTrackPageView('visit from IP globally excluded')); - + // 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); + $this->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); + $this->checkResponse($t->doTrackPageView('visit from IP globally excluded')); + } + try { @$t->setAttributionInfo(array()); $this->fail(); diff --git a/tests/integration/OneVisitor_NoKeywordSpecified.test.php b/tests/integration/OneVisitor_NoKeywordSpecified.test.php index bfe3d682f7f0f814f12d92b68c1a2118c49f452a..00925ee865ccd6c0d51f2ddcc1e627c4fbbdbcba 100755 --- a/tests/integration/OneVisitor_NoKeywordSpecified.test.php +++ b/tests/integration/OneVisitor_NoKeywordSpecified.test.php @@ -7,7 +7,8 @@ if(!defined('PIWIK_CONFIG_TEST_INCLUDED')) require_once PIWIK_INCLUDE_PATH . '/tests/integration/Integration.php'; /** - * Test empty google kwd works nicely in Live! output and Top keywords + * 1) Tests empty google kwd works nicely in Live! output and Top keywords + * 2) Tests IP anonymization * * Also test that Live! will link to the search result page URL rather than the exact referrer URL * when the referrer URL is google.XX/url.... which is a redirect to landing page rather than the search result URL @@ -50,6 +51,7 @@ class Test_Piwik_Integration_OneVisitor_NoKeywordSpecified extends Test_Integrat $idSite = $this->idSite; $t = $this->getTracker($idSite, $dateTime, $defaultInit = true, $useThirdPartyCookie = 1); + $t->DEBUG_APPEND_URL = '&forceIpAnonymization=1'; // VISIT 1 = Referrer is "Keyword not defined" // Alsotrigger goal to check that attribution goes to this keyword $t->setUrlReferrer( 'http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CC&url=http%3A%2F%2Fpiwik.org%2F&ei=&usg='); diff --git a/tests/integration/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml b/tests/integration/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml index 126bcb94c6a317d15b4d344493db56e584baefea..44b51c173d9a4ec38d1efe4cd7358ee0d10d0908 100644 --- a/tests/integration/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml +++ b/tests/integration/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml @@ -3,7 +3,7 @@ <row> <idSite>1</idSite> <idVisit>2</idVisit> - <visitIp>156.5.3.2</visitIp> + <visitIp>156.5.0.0</visitIp> <visitorType>returning</visitorType> <visitorTypeIcon>plugins/Live/templates/images/returningVisitor.gif</visitorTypeIcon> @@ -82,7 +82,7 @@ <row> <idSite>1</idSite> <idVisit>1</idVisit> - <visitIp>156.5.3.2</visitIp> + <visitIp>156.5.0.0</visitIp> <visitorType>new</visitorType> <visitorTypeIcon /> diff --git a/tests/integration/proxy-piwik.php b/tests/integration/proxy-piwik.php index da2fb845205c8c29155aaeccd5219a3f538f022b..63772c191ffdb48880fbd7f66ad3b1f2f2566a16 100644 --- a/tests/integration/proxy-piwik.php +++ b/tests/integration/proxy-piwik.php @@ -32,6 +32,15 @@ if(Piwik_Common::getRequestVar('forceUseThirdPartyCookie', false) == 1) { Piwik_Tracker_Config::getInstance()->setTestValue('Tracker', 'use_third_party_id_cookie', 1); } + +// Tests can force the enabling of IP anonymization +if(Piwik_Common::getRequestVar('forceIpAnonymization', false) == 1) +{ + Piwik_Tracker_Config::getInstance()->setTestValue('Tracker', 'ip_address_mask_length', 2); + $pluginsTracker = Piwik_Tracker_Config::getInstance()->Plugins_Tracker['Plugins_Tracker']; + $pluginsTracker[] = "AnonymizeIP"; + Piwik_Tracker_Config::getInstance()->setTestValue('Plugins_Tracker', array('Plugins_Tracker' => $pluginsTracker)); +} // Custom IP to use for this visitor $customIp = Piwik_Common::getRequestVar('cip', false); if(!empty($customIp))