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
diff options
context:
space:
mode:
authormattab <matthieu.aubry@gmail.com>2014-11-25 03:54:59 +0300
committermattab <matthieu.aubry@gmail.com>2014-11-25 03:54:59 +0300
commit14e557bfb9cd2d117443d0da414a099c477b60a1 (patch)
tree650a413d6ada8ccdbadd7d8a9eb7bbb3083eaad6 /plugins
parenta8917239df8ef46312c5295f8a92070f87125f86 (diff)
refs #6697 start refactoring the DoNotTrack code to allow for adding tests
Diffstat (limited to 'plugins')
-rw-r--r--plugins/CoreAdminHome/Controller.php4
-rw-r--r--plugins/PrivacyManager/Controller.php9
-rw-r--r--plugins/PrivacyManager/DoNotTrackHeaderChecker.php107
-rw-r--r--plugins/PrivacyManager/PrivacyManager.php7
4 files changed, 92 insertions, 35 deletions
diff --git a/plugins/CoreAdminHome/Controller.php b/plugins/CoreAdminHome/Controller.php
index af45ccc327..55452ad5db 100644
--- a/plugins/CoreAdminHome/Controller.php
+++ b/plugins/CoreAdminHome/Controller.php
@@ -22,6 +22,7 @@ use Piwik\Plugins\CorePluginsAdmin\UpdateCommunication;
use Piwik\Plugins\CustomVariables\CustomVariables;
use Piwik\Plugins\LanguagesManager\API as APILanguagesManager;
use Piwik\Plugins\LanguagesManager\LanguagesManager;
+use Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker;
use Piwik\Plugins\SitesManager\API as APISitesManager;
use Piwik\Settings\Manager as SettingsManager;
use Piwik\Site;
@@ -235,7 +236,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
// get currencies for each viewable site
$view->currencySymbols = APISitesManager::getInstance()->getCurrencySymbols();
- $view->serverSideDoNotTrackEnabled = \Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker::isActive();
+ $dntChecker = new DoNotTrackHeaderChecker();
+ $view->serverSideDoNotTrackEnabled = $dntChecker->isActive();
return $view->render();
}
diff --git a/plugins/PrivacyManager/Controller.php b/plugins/PrivacyManager/Controller.php
index c950d789ed..1a50d7ac63 100644
--- a/plugins/PrivacyManager/Controller.php
+++ b/plugins/PrivacyManager/Controller.php
@@ -133,7 +133,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
if (Piwik::hasUserSuperUserAccess()) {
$view->deleteData = $this->getDeleteDataInfo();
$view->anonymizeIP = $this->getAnonymizeIPInfo();
- $view->dntSupport = DoNotTrackHeaderChecker::isActive();
+ $dntChecker = new DoNotTrackHeaderChecker();
+ $view->dntSupport = $dntChecker->isActive();
$view->canDeleteLogActions = Db::isLockPrivilegeGranted();
$view->dbUser = PiwikConfig::getInstance()->database['username'];
$view->deactivateNonce = Nonce::getNonce(self::DEACTIVATE_DNT_NONCE);
@@ -297,7 +298,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
Piwik::checkUserHasSuperUserAccess();
Nonce::checkNonce(self::DEACTIVATE_DNT_NONCE);
- DoNotTrackHeaderChecker::deactivate();
+ $dntChecker = new DoNotTrackHeaderChecker();
+ $dntChecker->deactivate();
$this->redirectToIndex('PrivacyManager', 'privacySettings');
}
@@ -307,7 +309,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
Piwik::checkUserHasSuperUserAccess();
Nonce::checkNonce(self::ACTIVATE_DNT_NONCE);
- DoNotTrackHeaderChecker::activate();
+ $dntChecker = new DoNotTrackHeaderChecker();
+ $dntChecker->activate();
$this->redirectToIndex('PrivacyManager', 'privacySettings');
}
diff --git a/plugins/PrivacyManager/DoNotTrackHeaderChecker.php b/plugins/PrivacyManager/DoNotTrackHeaderChecker.php
index 14938f426e..d5dd296583 100644
--- a/plugins/PrivacyManager/DoNotTrackHeaderChecker.php
+++ b/plugins/PrivacyManager/DoNotTrackHeaderChecker.php
@@ -18,9 +18,15 @@ use Piwik\Tracker\Request;
* - X-Do-Not-Track header (used by AdBlockPlus and NoScript)
* - DNT header (used by Mozilla)
*
+ * Note: visits from Internet Explorer and other browsers that have DoNoTrack enabled by default will be tracked anyway.
*/
class DoNotTrackHeaderChecker
{
+ public function __construct(Config $config = null)
+ {
+ $this->config = $config ?: new Config();
+ }
+
/**
* Checks for DoNotTrack headers and if found, sets `$exclude` to `true`.
*/
@@ -31,25 +37,9 @@ class DoNotTrackHeaderChecker
return;
}
- if (!$this->isActive()) {
- Common::printDebug("DoNotTrack support is not enabled, skip check");
- return;
- }
-
- if ((isset($_SERVER['HTTP_X_DO_NOT_TRACK']) && $_SERVER['HTTP_X_DO_NOT_TRACK'] === '1')
- || (isset($_SERVER['HTTP_DNT']) && substr($_SERVER['HTTP_DNT'], 0, 1) === '1')
- ) {
- $request = new Request($_REQUEST);
- $ua = $request->getUserAgent();
- if (strpos($ua, 'MSIE') !== false
- || strpos($ua, 'Trident') !== false) {
- Common::printDebug("INTERNET EXPLORER enable DoNotTrack by default; so Piwik ignores DNT IE browsers...");
- return;
- }
-
- Common::printDebug("DoNotTrack header found!");
+ $exclude = $this->isDoNotTrackFound();
- $exclude = true;
+ if($exclude) {
$trackingCookie = IgnoreCookie::getTrackingCookie();
$trackingCookie->delete();
@@ -58,27 +48,50 @@ class DoNotTrackHeaderChecker
// /.well-known/dnt
// per Tracking Preference Expression (draft)
header('Tk: 1');
- } else {
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ public function isDoNotTrackFound()
+ {
+ if (!$this->isActive()) {
+ Common::printDebug("DoNotTrack support is not enabled, skip check");
+ return false;
+ }
+
+ if (!$this->isHeaderDntFound()) {
Common::printDebug("DoNotTrack header not found");
+ return false;
+ }
+
+ $request = new Request($_REQUEST);
+ $userAgent = $request->getUserAgent();
+
+ if ($this->isUserAgentExcludedFromDNT($userAgent)) {
+ Common::printDebug("INTERNET EXPLORER enable DoNotTrack by default; so Piwik ignores DNT IE browsers...");
+ return false;
}
+
+ Common::printDebug("DoNotTrack header found!");
+ return true;
}
/**
* Deactivates DoNotTrack header checking. This function will not be called by the Tracker.
*/
- public static function deactivate()
+ public function deactivate()
{
- $config = new Config();
- $config->doNotTrackEnabled = false;
+ $this->config->doNotTrackEnabled = false;
}
/**
* Activates DoNotTrack header checking. This function will not be called by the Tracker.
*/
- public static function activate()
+ public function activate()
{
- $config = new Config();
- $config->doNotTrackEnabled = true;
+ $this->config->doNotTrackEnabled = true;
}
/**
@@ -86,9 +99,47 @@ class DoNotTrackHeaderChecker
*
* @return bool
*/
- public static function isActive()
+ public function isActive()
+ {
+ return $this->config->doNotTrackEnabled;
+ }
+
+ /**
+ * @return bool
+ */
+ protected function isHeaderDntFound()
+ {
+ return (isset($_SERVER['HTTP_X_DO_NOT_TRACK']) && $_SERVER['HTTP_X_DO_NOT_TRACK'] === '1')
+ || (isset($_SERVER['HTTP_DNT']) && substr($_SERVER['HTTP_DNT'], 0, 1) === '1');
+ }
+
+ /**
+ *
+ * @param $userAgent
+ * @return bool
+ */
+ protected function isUserAgentExcludedFromDNT($userAgent)
+ {
+ $browsersWithDnt = $this->getBrowsersWithDNTAlwaysEnabled();
+ foreach($browsersWithDnt as $userAgentBrowserFragment) {
+ if (strpos($userAgent, $userAgentBrowserFragment) !== false) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Some browsers have DNT enabled by default. For those we will ignore DNT and always track those users.
+ *
+ * @return array
+ */
+ protected function getBrowsersWithDNTAlwaysEnabled()
{
- $config = new Config();
- return $config->doNotTrackEnabled;
+ return array(
+ //
+ 'MSIE',
+ 'Trident',
+ );
}
}
diff --git a/plugins/PrivacyManager/PrivacyManager.php b/plugins/PrivacyManager/PrivacyManager.php
index ddce27fa3c..c803638a04 100644
--- a/plugins/PrivacyManager/PrivacyManager.php
+++ b/plugins/PrivacyManager/PrivacyManager.php
@@ -177,7 +177,7 @@ class PrivacyManager extends Plugin
// default values
$form->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
- 'do_not_track' => DoNotTrackHeaderChecker::isActive(),
+ 'do_not_track' => $this->dntChecker->isActive(),
'anonymise_ip' => IPAnonymizer::isActive(),
)));
}
@@ -190,10 +190,11 @@ class PrivacyManager extends Plugin
public function installationFormSubmit(FormDefaultSettings $form)
{
$doNotTrack = (bool) $form->getSubmitValue('do_not_track');
+ $dntChecker = new DoNotTrackHeaderChecker();
if ($doNotTrack) {
- DoNotTrackHeaderChecker::activate();
+ $dntChecker->activate();
} else {
- DoNotTrackHeaderChecker::deactivate();
+ $dntChecker->deactivate();
}
$anonymiseIp = (bool) $form->getSubmitValue('anonymise_ip');