From f85f7d61d9a398b812920c6121461d518349e21a Mon Sep 17 00:00:00 2001
From: sgiehl <stefan@piwik.org>
Date: Thu, 29 May 2014 23:48:56 +0200
Subject: [PATCH] reimplemented caching; fixed detection of BOT 'os'

---
 composer.lock                                 |  8 ++++----
 core/CacheFile.php                            |  2 +-
 core/Tracker/Settings.php                     | 12 ++++++++---
 libs/UserAgentParser/UserAgentParser.php      |  3 +++
 piwik.php                                     | 20 +++++++++----------
 plugins/DevicesDetection/DevicesDetection.php |  2 +-
 plugins/DevicesDetection/functions.php        |  6 ++++++
 tests/PHPUnit/bootstrap.php                   |  6 +++---
 tests/PHPUnit/proxy/includes.php              |  4 ++++
 9 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/composer.lock b/composer.lock
index a9822dc62a..a440208ae1 100644
--- a/composer.lock
+++ b/composer.lock
@@ -100,12 +100,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/piwik/device-detector.git",
-                "reference": "d3ccb7938fa272a857c279850ffbb3d8fe04c0b7"
+                "reference": "863ae43f5c68c15ce110516a0f7b11477e2a01c0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/piwik/device-detector/zipball/d3ccb7938fa272a857c279850ffbb3d8fe04c0b7",
-                "reference": "d3ccb7938fa272a857c279850ffbb3d8fe04c0b7",
+                "url": "https://api.github.com/repos/piwik/device-detector/zipball/863ae43f5c68c15ce110516a0f7b11477e2a01c0",
+                "reference": "863ae43f5c68c15ce110516a0f7b11477e2a01c0",
                 "shasum": ""
             },
             "require": {
@@ -139,7 +139,7 @@
                 "parser",
                 "useragent"
             ],
-            "time": "2014-05-25 17:45:14"
+            "time": "2014-05-29 20:51:28"
         },
         {
             "name": "symfony/console",
diff --git a/core/CacheFile.php b/core/CacheFile.php
index 5d9000332f..f75657f176 100644
--- a/core/CacheFile.php
+++ b/core/CacheFile.php
@@ -16,7 +16,7 @@ use Exception;
  * It is for example used by the Tracker process to cache various settings and websites attributes in tmp/cache/tracker/*
  *
  */
-class CacheFile
+class CacheFile implements \DeviceDetector\Cache\CacheInterface
 {
     // for testing purposes since tests run on both CLI/FPM (changes in CLI can't invalidate
     // opcache in FPM, so we have to invalidate before reading)
diff --git a/core/Tracker/Settings.php b/core/Tracker/Settings.php
index 3eed338f3b..251046ca29 100644
--- a/core/Tracker/Settings.php
+++ b/core/Tracker/Settings.php
@@ -38,8 +38,10 @@ class Settings
         $userAgent = $this->request->getUserAgent();
 
         $deviceDetector = new DeviceDetector($userAgent);
-        #$deviceDetector->setCache(new CacheFile('tracker', 86400));
+        $deviceDetector->discardBotInformation();
+        $deviceDetector->setCache(new CacheFile('tracker', 86400));
         $deviceDetector->parse();
+
         $aBrowserInfo = $deviceDetector->getClient();
         if ($aBrowserInfo['type'] != 'browser') {
             // for now only track browsers
@@ -49,8 +51,12 @@ class Settings
         $browserName = !empty($aBrowserInfo['short_name']) ? $aBrowserInfo['short_name'] : 'UNK';
         $browserVersion = !empty($aBrowserInfo['version']) ? $aBrowserInfo['version'] : '';
 
-        $os = $deviceDetector->getOS();
-        $os = empty($os['short_name']) ? 'UNK' : $os['short_name'];
+        if ($deviceDetector->isBot()) {
+            $os = 'BOT';
+        } else {
+            $os = $deviceDetector->getOS();
+            $os = empty($os['short_name']) ? 'UNK' : $os['short_name'];
+        }
 
         $browserLang = substr($this->request->getBrowserLanguage(), 0, 20); // limit the length of this string to match db
         $configurationHash = $this->getConfigHash(
diff --git a/libs/UserAgentParser/UserAgentParser.php b/libs/UserAgentParser/UserAgentParser.php
index c0c8fea1ce..009bc5a785 100644
--- a/libs/UserAgentParser/UserAgentParser.php
+++ b/libs/UserAgentParser/UserAgentParser.php
@@ -694,6 +694,9 @@ class UserAgentParser
         }
 
         if(class_exists('DeviceDetector\\Parser\\OperatingSystem')) {
+            if ($osId == 'BOT') {
+                return 'Bot';
+            }
             return DeviceDetector\Parser\OperatingSystem::getNameFromId($osId);
         }
         return false;
diff --git a/piwik.php b/piwik.php
index 00c2041a52..03e405cdd9 100644
--- a/piwik.php
+++ b/piwik.php
@@ -40,6 +40,16 @@ if (!defined('PIWIK_INCLUDE_PATH')) {
 
 @ignore_user_abort(true);
 
+/*
+ * Manually require needed vendor libraries, as composers autorequire would do too much
+ */
+if (file_exists(PIWIK_INCLUDE_PATH . '/vendor/autoload.php')) {
+    $vendorDirectory = PIWIK_INCLUDE_PATH . '/vendor';
+} else {
+    $vendorDirectory = PIWIK_INCLUDE_PATH . '/../..';
+}
+require_once $vendorDirectory . '/autoload.php';
+
 require_once PIWIK_INCLUDE_PATH . '/core/Plugin/Controller.php';
 require_once PIWIK_INCLUDE_PATH . '/core/Plugin/ControllerAdmin.php';
 
@@ -82,16 +92,6 @@ require_once PIWIK_INCLUDE_PATH . '/core/Filesystem.php';
 require_once PIWIK_INCLUDE_PATH . '/core/Cookie.php';
 require_once PIWIK_INCLUDE_PATH . '/core/Loader.php';
 
-/*
- * Manually require needed vendor libraries, as composers autorequire would do too much
- */
-if (file_exists(PIWIK_INCLUDE_PATH . '/vendor/autoload.php')) {
-    $vendorDirectory = PIWIK_INCLUDE_PATH . '/vendor';
-} else {
-    $vendorDirectory = PIWIK_INCLUDE_PATH . '/../..';
-}
-require_once $vendorDirectory . '/autoload.php';
-
 session_cache_limiter('nocache');
 @date_default_timezone_set('UTC');
 
diff --git a/plugins/DevicesDetection/DevicesDetection.php b/plugins/DevicesDetection/DevicesDetection.php
index 5d6312e8f0..9b8cf601d1 100644
--- a/plugins/DevicesDetection/DevicesDetection.php
+++ b/plugins/DevicesDetection/DevicesDetection.php
@@ -244,7 +244,7 @@ class DevicesDetection extends \Piwik\Plugin
         $userAgent = $request->getUserAgent();
 
         $UAParser = new DeviceDetector($userAgent);
-        #$UAParser->setCache(new CacheFile('tracker', 86400));
+        $UAParser->setCache(new CacheFile('tracker', 86400));
         $UAParser->parse();
         $deviceInfo['config_browser_name'] = $UAParser->getClient("type") == 'browser' ? $UAParser->getClient("short_name") : 'UNK';
         $deviceInfo['config_browser_version'] = $UAParser->getClient("type") == 'browser' ?  $UAParser->getClient("version") : 'UNK';
diff --git a/plugins/DevicesDetection/functions.php b/plugins/DevicesDetection/functions.php
index b8ff3a8854..085a35814c 100644
--- a/plugins/DevicesDetection/functions.php
+++ b/plugins/DevicesDetection/functions.php
@@ -165,6 +165,9 @@ function getModelName($label)
 
 function getOSFamilyFullNameExtended($label)
 {
+    if ($label == 'BOT') {
+        return 'Bot';
+    }
     $label = OperatingSystemParser::getOsFamily($label);
     if($label !== false) {
         return $label;
@@ -183,6 +186,9 @@ function getOsFamilyLogoExtended($label)
 
 function getOsFullNameExtended($label)
 {
+    if ($label == 'BOT') {
+        return 'Bot';
+    }
     if (!empty($label) && $label != ";") {
         $os = substr($label, 0, 3);
         $ver = substr($label, 4, 15);
diff --git a/tests/PHPUnit/bootstrap.php b/tests/PHPUnit/bootstrap.php
index 1dcb995b0e..c951e4a3c6 100644
--- a/tests/PHPUnit/bootstrap.php
+++ b/tests/PHPUnit/bootstrap.php
@@ -27,6 +27,9 @@ if (!defined('PIWIK_INCLUDE_SEARCH_PATH')) {
 error_reporting(E_ALL | E_NOTICE);
 @date_default_timezone_set('UTC');
 
+require_once file_exists(PIWIK_INCLUDE_PATH . '/vendor/autoload.php')
+    ? PIWIK_INCLUDE_PATH . '/vendor/autoload.php' // Piwik is the main project
+    : PIWIK_INCLUDE_PATH . '/../../autoload.php'; // Piwik is installed as a dependency
 
 require_once PIWIK_INCLUDE_PATH . '/libs/upgradephp/upgrade.php';
 require_once PIWIK_INCLUDE_PATH . '/core/testMinimumPhpVersion.php';
@@ -37,9 +40,6 @@ require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/IntegrationTestCase.php';
 require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/FakeAccess.php';
 require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/MockPiwikOption.php';
 require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/TestingEnvironment.php';
-require_once file_exists(PIWIK_INCLUDE_PATH . '/vendor/autoload.php')
-    ? PIWIK_INCLUDE_PATH . '/vendor/autoload.php' // Piwik is the main project
-    : PIWIK_INCLUDE_PATH . '/../../autoload.php'; // Piwik is installed as a dependency
 
 \Piwik\Profiler::setupProfilerXHProf( $mainRun = true );
 
diff --git a/tests/PHPUnit/proxy/includes.php b/tests/PHPUnit/proxy/includes.php
index 0ffce4642b..2ecb204244 100644
--- a/tests/PHPUnit/proxy/includes.php
+++ b/tests/PHPUnit/proxy/includes.php
@@ -9,6 +9,10 @@ if (!defined('PIWIK_USER_PATH')) {
     define('PIWIK_USER_PATH', PIWIK_INCLUDE_PATH);
 }
 
+require_once file_exists(PIWIK_INCLUDE_PATH . '/vendor/autoload.php')
+    ? PIWIK_INCLUDE_PATH . '/vendor/autoload.php' // Piwik is the main project
+    : PIWIK_INCLUDE_PATH . '/../../autoload.php'; // Piwik is installed as a dependency
+
 require_once PIWIK_INCLUDE_PATH . '/core/Loader.php';
 require_once PIWIK_INCLUDE_PATH . '/core/EventDispatcher.php';
 require_once PIWIK_INCLUDE_PATH . '/core/Piwik.php';
-- 
GitLab