From 63119c1631074d0207a985d84078ec83a753a9c8 Mon Sep 17 00:00:00 2001
From: Robert Kaiser <kairo@kairo.at>
Date: Fri, 28 Jun 2013 01:36:40 +0200
Subject: [PATCH] detect MSIE 11 on Win8 in both a 'leaked' UA string version
 and an actually seen one

---
 include/classes/useragent.php-class | 22 ++++++++++++++++++++--
 testbed/ua_list_raw.txt             |  2 ++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/include/classes/useragent.php-class b/include/classes/useragent.php-class
index 4afd3e8..5a4b358 100755
--- a/include/classes/useragent.php-class
+++ b/include/classes/useragent.php-class
@@ -965,6 +965,11 @@ class userAgent {
       $this->version = "10.0";
       $this->bot = false;
     }
+    elseif (preg_match('|Trident\/[0-9a-zA-Z\.+]+; ([^\)]+; )?rv:([0-9\.+]+)|', $this->uastring, $regs)) {
+      $this->brand = 'Microsoft Internet Explorer';
+      $this->version = $regs[2];
+      $this->bot = false;
+    }
     elseif (preg_match('|MSIE ([0-9a-zA-Z\.+]+)|', $this->uastring, $regs)) {
       $this->brand = 'Microsoft Internet Explorer';
       $this->version = $regs[1];
@@ -1210,7 +1215,17 @@ class userAgent {
           }
         }
         elseif ($this->hasEngine('trident') || $this->hasEngine('tasman')) {
-          if (preg_match('/Mozilla\/[^\(]+ \(compatible *; MSIE [^;]+[^\)]*; ?((?:Mac|Win)[^;]+); ?(Win64|WOW64)[^\)]*Trident\/([^;\)]+)[^\)]*\)/i', $this->uastring, $regs)) {
+          if (preg_match('/Mozilla\/[^\(]+ \((IE [^;]+[^\)]*; )?((?:Mac|Win)[^;]+); ?(Win64|WOW64); ?Trident\/([^;\)]+);/i', $this->uastring, $regs)) {
+            $this->uadata['eng_version'] = $regs[4];
+            $this->uadata['os'] = $regs[2].' ('.$regs[3].')';
+            $this->uadata['lang'] = null;
+          }
+          elseif (preg_match('/Mozilla\/[^\(]+ \((IE [^;]+[^\)]*; )?((?:Mac|Win)[^;]+); ?Trident\/([^;\)]+);/i', $this->uastring, $regs)) {
+            $this->uadata['eng_version'] = $regs[3];
+            $this->uadata['os'] = $regs[2];
+            $this->uadata['lang'] = null;
+          }
+          elseif (preg_match('/Mozilla\/[^\(]+ \(compatible *; MSIE [^;]+[^\)]*; ?((?:Mac|Win)[^;]+); ?(Win64|WOW64)[^\)]*Trident\/([^;\)]+)[^\)]*\)/i', $this->uastring, $regs)) {
             $this->uadata['eng_version'] = $regs[3];
             $this->uadata['os'] = $regs[1].' ('.$regs[2].')';
             $this->uadata['lang'] = null;
@@ -1462,6 +1477,9 @@ class userAgent {
         elseif ($this->uadata['os'] == 'Windows NT 6.2') { $this->uadata['os'] = 'Windows 8'; }
         elseif ($this->uadata['os'] == 'Windows NT 6.2 (Win64)') { $this->uadata['os'] = 'Windows 8 (64bit)'; }
         elseif ($this->uadata['os'] == 'Windows NT 6.2 (WOW64)') { $this->uadata['os'] = 'Windows 8 (64bit)'; }
+        elseif ($this->uadata['os'] == 'Windows NT 6.3') { $this->uadata['os'] = 'Windows 8.1'; }
+        elseif ($this->uadata['os'] == 'Windows NT 6.3 (Win64)') { $this->uadata['os'] = 'Windows 8.1 (64bit)'; }
+        elseif ($this->uadata['os'] == 'Windows NT 6.3 (WOW64)') { $this->uadata['os'] = 'Windows 8.1 (64bit)'; }
         elseif ($this->uadata['os'] == 'Win95') { $this->uadata['os'] = 'Windows 95'; }
         elseif ($this->uadata['os'] == 'Win98') { $this->uadata['os'] = 'Windows 98'; }
         elseif ($this->uadata['os'] == 'WinNT') { $this->uadata['os'] = 'Windows NT'; }
@@ -1516,7 +1534,7 @@ class userAgent {
         if (strpos($this->uadata['os'], 'Windows Phone OS') !== false) { $this->mobile = true; }
         elseif (strpos($this->uadata['os'], 'Gameboy') !== false) { $this->mobile = true; }
 
-        $this->uadata['lang'] = str_replace('_', '-', $this->uadata['lang']);
+        $this->uadata['lang'] = str_replace('_', '-', @$this->uadata['lang']);
       }
     }
   return $this->uadata['os'];
diff --git a/testbed/ua_list_raw.txt b/testbed/ua_list_raw.txt
index 431018a..c11001d 100755
--- a/testbed/ua_list_raw.txt
+++ b/testbed/ua_list_raw.txt
@@ -134,6 +134,8 @@ Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)
 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)
 Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; Touch)
+Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
+Mozilla/5.0 (IE 11.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko
 Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Smartphone; 176x220)
 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Hotbar 4.5.1.0; MSN 6.1; MSNbMSFT; MSNmen-au; MSNc00; v5m)
 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; MSN 9.0;MSN 9.1; MSNbVZ02; MSNmen-us; MSNcOTH; MPLUS)
-- 
2.43.0