Example #1
0
 /**
  * Detect the user agent and prepare flags, features and quirks
  * based on what is found
  *
  * This is the core of the Net_UserAgent_Detect class.  It moves its
  * way through the user agent string setting up the flags based on
  * the vendors and versions of the browsers, determining the OS and
  * setting up the features and quirks owned by each of the relevant
  * clients.  Note that if you are going to be calling methods of
  * this class statically then set all the parameters using th
  * setOption()
  *
  * @param  string $in_userAgent (optional) User agent override.  
  * @param  mixed $in_detect (optional) The level of checking to do. 
  *
  * @access public
  * @return void
  */
 function detect($in_userAgent = null, $in_detect = null)
 {
     static $hasRun;
     $options =& Net_UserAgent_Detect::_getStaticProperty('options');
     if (!empty($hasRun) && empty($options['re-evaluate'])) {
         return;
     }
     $hasRun = true;
     // {{{ set up static properties
     $in_userAgent = isset($options['userAgent']) && is_null($in_userAgent) ? $options['userAgent'] : null;
     $in_detect = isset($options['detectOptions']) && is_null($in_detect) ? $options['detectOptions'] : null;
     // User agent string that is being analyzed
     $userAgent =& Net_UserAgent_Detect::_getStaticProperty('userAgent');
     // Array that stores all of the flags for the vendor and version
     // of the different browsers
     $browser =& Net_UserAgent_Detect::_getStaticProperty('browser');
     $browser = array_flip(array('ns', 'ns2', 'ns3', 'ns4', 'ns4up', 'nav', 'ns6', 'belowns6', 'ns6up', 'firefox', 'firefox0.x', 'firefox1.x', 'gecko', 'ie', 'ie3', 'ie4', 'ie4up', 'ie5', 'ie5_5', 'ie5up', 'ie6', 'belowie6', 'ie6up', 'ie7', 'ie7up', 'opera', 'opera2', 'opera3', 'opera4', 'opera5', 'opera6', 'opera7', 'opera8', 'opera5up', 'opera6up', 'opera7up', 'belowopera8', 'opera8up', 'aol', 'aol3', 'aol4', 'aol5', 'aol6', 'aol7', 'aol8', 'webtv', 'aoltv', 'tvnavigator', 'hotjava', 'hotjava3', 'hotjava3up', 'konq', 'safari', 'netgem', 'webdav', 'icab'));
     // Array that stores all of the flags for the operating systems,
     // and in some cases the versions of those operating systems (windows)
     $os =& Net_UserAgent_Detect::_getStaticProperty('os');
     $os = array_flip(array('win', 'win95', 'win16', 'win31', 'win9x', 'win98', 'winme', 'win2k', 'winxp', 'winnt', 'win2003', 'os2', 'mac', 'mac68k', 'macppc', 'linux', 'unix', 'vms', 'sun', 'sun4', 'sun5', 'suni86', 'irix', 'irix5', 'irix6', 'hpux', 'hpux9', 'hpux10', 'aix', 'aix1', 'aix2', 'aix3', 'aix4', 'sco', 'unixware', 'mpras', 'reliant', 'dec', 'sinix', 'freebsd', 'bsd'));
     // Array which stores known issues with the given client that can
     // be used for on the fly tweaking so that the client may recieve
     // the proper handling of this quirk.
     $quirks =& Net_UserAgent_Detect::_getStaticProperty('quirks');
     $quirks = array('must_cache_forms' => false, 'popups_disabled' => false, 'empty_file_input_value' => false, 'cache_ssl_downloads' => false, 'scrollbar_in_way' => false, 'break_disposition_header' => false, 'nested_table_render_bug' => false);
     // Array that stores credentials for each of the browser/os
     // combinations.  These allow quick access to determine if the
     // current client has a feature that is going to be implemented
     // in the script.
     $features =& Net_UserAgent_Detect::_getStaticProperty('features');
     $features = array('javascript' => false, 'dhtml' => false, 'dom' => false, 'sidebar' => false, 'gecko' => false, 'ajax' => false);
     // The leading identifier is the very first term in the user
     // agent string, which is used to identify clients which are not
     // Mosaic-based browsers.
     $leadingIdentifier =& Net_UserAgent_Detect::_getStaticProperty('leadingIdentifier');
     // The full version of the client as supplied by the very first
     // numbers in the user agent
     $version =& Net_UserAgent_Detect::_getStaticProperty('version');
     $version = 0;
     // The major part of the client version, which is the integer
     // value of the version.
     $majorVersion =& Net_UserAgent_Detect::_getStaticProperty('majorVersion');
     $majorVersion = 0;
     // The minor part of the client version, which is the decimal
     // parts of the version
     $subVersion =& Net_UserAgent_Detect::_getStaticProperty('subVersion');
     $subVersion = 0;
     // }}}
     // detemine what user agent we are using
     if (is_null($in_userAgent)) {
         if (isset($_SERVER['HTTP_USER_AGENT'])) {
             $userAgent = $_SERVER['HTTP_USER_AGENT'];
         } elseif (isset($GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT'])) {
             $userAgent = $GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT'];
         } else {
             $userAgent = '';
         }
     } else {
         $userAgent = $in_userAgent;
     }
     // get the lowercase version for case-insensitive searching
     $agt = strtolower($userAgent);
     // figure out what we need to look for
     $detectOptions = array(NET_USERAGENT_DETECT_BROWSER, NET_USERAGENT_DETECT_OS, NET_USERAGENT_DETECT_FEATURES, NET_USERAGENT_DETECT_QUIRKS, NET_USERAGENT_DETECT_ACCEPT, NET_USERAGENT_DETECT_ALL);
     $detect = is_null($in_detect) ? NET_USERAGENT_DETECT_ALL : $in_detect;
     settype($detect, 'array');
     foreach ($detectOptions as $option) {
         if (in_array($option, $detect)) {
             $detectFlags[$option] = true;
         } else {
             $detectFlags[$option] = false;
         }
     }
     // initialize the arrays of browsers and operating systems
     // Get the type and version of the client
     if (preg_match(";^([[:alnum:]]+)[ /\\(]*[[:alpha:]]*([\\d]*)(\\.[\\d\\.]*);", $agt, $matches)) {
         list(, $leadingIdentifier, $majorVersion, $subVersion) = $matches;
     }
     if (empty($leadingIdentifier)) {
         $leadingIdentifier = 'Unknown';
     }
     $version = $majorVersion . $subVersion;
     // Browser type
     if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_BROWSER]) {
         $browser['webdav'] = $agt == 'microsoft data access internet publishing provider dav' || $agt == 'microsoft data access internet publishing provider protocol discovery';
         $browser['konq'] = $browser['safari'] = strpos($agt, 'konqueror') !== false || strpos($agt, 'safari') !== false;
         $browser['text'] = strpos($agt, 'links') !== false || strpos($agt, 'lynx') !== false || strpos($agt, 'w3m') !== false;
         $browser['ns'] = strpos($agt, 'mozilla') !== false && !(strpos($agt, 'spoofer') !== false) && !(strpos($agt, 'compatible') !== false) && !(strpos($agt, 'hotjava') !== false) && !(strpos($agt, 'opera') !== false) && !(strpos($agt, 'webtv') !== false) ? 1 : 0;
         $browser['netgem'] = strpos($agt, 'netgem') !== false;
         $browser['icab'] = strpos($agt, 'icab') !== false;
         $browser['ns2'] = $browser['ns'] && $majorVersion == 2;
         $browser['ns3'] = $browser['ns'] && $majorVersion == 3;
         $browser['ns4'] = $browser['ns'] && $majorVersion == 4;
         $browser['ns4up'] = $browser['ns'] && $majorVersion >= 4;
         // determine if this is a Netscape Navigator
         $browser['nav'] = $browser['belowns6'] = $browser['ns'] && $majorVersion < 5;
         $browser['ns6'] = !$browser['konq'] && $browser['ns'] && $majorVersion == 5;
         $browser['ns6up'] = $browser['ns6'] && $majorVersion >= 5;
         $browser['gecko'] = strpos($agt, 'gecko') !== false && !$browser['konq'];
         $browser['firefox'] = $browser['gecko'] && strpos($agt, 'firefox') !== false;
         $browser['firefox0.x'] = $browser['firefox'] && strpos($agt, 'firefox/0.') !== false;
         $browser['firefox1.x'] = $browser['firefox'] && strpos($agt, 'firefox/1.') !== false;
         $browser['ie'] = strpos($agt, 'msie') !== false && !(strpos($agt, 'opera') !== false);
         $browser['ie3'] = $browser['ie'] && $majorVersion < 4;
         $browser['ie4'] = $browser['ie'] && $majorVersion == 4 && strpos($agt, 'msie 4') !== false;
         $browser['ie4up'] = $browser['ie'] && !$browser['ie3'];
         $browser['ie5'] = $browser['ie4up'] && strpos($agt, 'msie 5') !== false;
         $browser['ie5_5'] = $browser['ie4up'] && strpos($agt, 'msie 5.5') !== false;
         $browser['ie5up'] = $browser['ie4up'] && !$browser['ie3'] && !$browser['ie4'];
         $browser['ie5_5up'] = $browser['ie5up'] && !$browser['ie5'];
         $browser['ie6'] = strpos($agt, 'msie 6') !== false;
         $browser['ie6up'] = $browser['ie5up'] && !$browser['ie5'] && !$browser['ie5_5'];
         $browser['ie7'] = strpos($agt, 'msie 7') !== false;
         $browser['ie7up'] = $browser['ie6up'] && !$browser['ie6'];
         $browser['belowie6'] = $browser['ie'] && !$browser['ie6up'];
         $browser['opera'] = strpos($agt, 'opera') !== false;
         $browser['opera2'] = strpos($agt, 'opera 2') !== false || strpos($agt, 'opera/2') !== false;
         $browser['opera3'] = strpos($agt, 'opera 3') !== false || strpos($agt, 'opera/3') !== false;
         $browser['opera4'] = strpos($agt, 'opera 4') !== false || strpos($agt, 'opera/4') !== false;
         $browser['opera5'] = strpos($agt, 'opera 5') !== false || strpos($agt, 'opera/5') !== false;
         $browser['opera6'] = strpos($agt, 'opera 6') !== false || strpos($agt, 'opera/6') !== false;
         $browser['opera7'] = strpos($agt, 'opera 7') !== false || strpos($agt, 'opera/7') !== false;
         $browser['opera8'] = strpos($agt, 'opera 8') !== false || strpos($agt, 'opera/8') !== false;
         $browser['opera5up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4'];
         $browser['opera6up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4'] && !$browser['opera5'];
         $browser['opera7up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4'] && !$browser['opera5'] && !$browser['opera6'];
         $browser['opera8up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4'] && !$browser['opera5'] && !$browser['opera6'] && !$browser['opera7'];
         $browser['belowopera8'] = $browser['opera'] && !$browser['opera8up'];
         $browser['aol'] = strpos($agt, 'aol') !== false;
         $browser['aol3'] = $browser['aol'] && $browser['ie3'];
         $browser['aol4'] = $browser['aol'] && $browser['ie4'];
         $browser['aol5'] = strpos($agt, 'aol 5') !== false;
         $browser['aol6'] = strpos($agt, 'aol 6') !== false;
         $browser['aol7'] = strpos($agt, 'aol 7') !== false || strpos($agt, 'aol7') !== false;
         $browser['aol8'] = strpos($agt, 'aol 8') !== false || strpos($agt, 'aol8') !== false;
         $browser['webtv'] = strpos($agt, 'webtv') !== false;
         $browser['aoltv'] = $browser['tvnavigator'] = strpos($agt, 'navio') !== false || strpos($agt, 'navio_aoltv') !== false;
         $browser['hotjava'] = strpos($agt, 'hotjava') !== false;
         $browser['hotjava3'] = $browser['hotjava'] && $majorVersion == 3;
         $browser['hotjava3up'] = $browser['hotjava'] && $majorVersion >= 3;
     }
     if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_BROWSER] && $detectFlags[NET_USERAGENT_DETECT_FEATURES]) {
         // Javascript Check
         if ($browser['ns2'] || $browser['ie3']) {
             Net_UserAgent_Detect::setFeature('javascript', 1.0);
         } elseif ($browser['opera5up']) {
             Net_UserAgent_Detect::setFeature('javascript', 1.3);
         } elseif ($browser['opera'] || $browser['ns3']) {
             Net_UserAgent_Detect::setFeature('javascript', 1.1);
         } elseif ($browser['ns4'] && $version <= 4.05 || $browser['ie4']) {
             Net_UserAgent_Detect::setFeature('javascript', 1.2);
         } elseif ($browser['ie5up'] && strpos($agt, 'mac') !== false || $browser['konq']) {
             Net_UserAgent_Detect::setFeature('javascript', 1.4);
         } elseif ($browser['ns4'] && $version > 4.05 || $browser['ie5up'] || $browser['hotjava3up']) {
             Net_UserAgent_Detect::setFeature('javascript', 1.3);
         } elseif ($browser['ns6up'] || $browser['gecko'] || $browser['netgem']) {
             Net_UserAgent_Detect::setFeature('javascript', 1.5);
         }
     }
     /** OS Check **/
     if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_OS]) {
         $os['win'] = strpos($agt, 'win') !== false || strpos($agt, '16bit') !== false;
         $os['win95'] = strpos($agt, 'win95') !== false || strpos($agt, 'windows 95') !== false;
         $os['win16'] = strpos($agt, 'win16') !== false || strpos($agt, '16bit') !== false || strpos($agt, 'windows 3.1') !== false || strpos($agt, 'windows 16-bit') !== false;
         $os['win31'] = strpos($agt, 'windows 3.1') !== false || strpos($agt, 'win16') !== false || strpos($agt, 'windows 16-bit') !== false;
         $os['winme'] = strpos($agt, 'win 9x 4.90') !== false;
         $os['win2k'] = strpos($agt, 'windows nt 5.0') !== false;
         $os['winxp'] = strpos($agt, 'windows nt 5.1') !== false;
         $os['win2003'] = strpos($agt, 'windows nt 5.2') !== false;
         $os['win98'] = strpos($agt, 'win98') !== false || strpos($agt, 'windows 98') !== false;
         $os['win9x'] = $os['win95'] || $os['win98'];
         $os['winnt'] = (strpos($agt, 'winnt') !== false || strpos($agt, 'windows nt') !== false) && strpos($agt, 'windows nt 5') === false;
         $os['win32'] = $os['win95'] || $os['winnt'] || $os['win98'] || $majorVersion >= 4 && strpos($agt, 'win32') !== false || strpos($agt, '32bit') !== false;
         $os['os2'] = strpos($agt, 'os/2') !== false || strpos($agt, 'ibm-webexplorer') !== false;
         $os['mac'] = strpos($agt, 'mac') !== false;
         $os['mac68k'] = $os['mac'] && (strpos($agt, '68k') !== false || strpos($agt, '68000') !== false);
         $os['macppc'] = $os['mac'] && (strpos($agt, 'ppc') !== false || strpos($agt, 'powerpc') !== false);
         $os['sun'] = strpos($agt, 'sunos') !== false;
         $os['sun4'] = strpos($agt, 'sunos 4') !== false;
         $os['sun5'] = strpos($agt, 'sunos 5') !== false;
         $os['suni86'] = $os['sun'] && strpos($agt, 'i86') !== false;
         $os['irix'] = strpos($agt, 'irix') !== false;
         $os['irix5'] = strpos($agt, 'irix 5') !== false;
         $os['irix6'] = strpos($agt, 'irix 6') !== false || strpos($agt, 'irix6') !== false;
         $os['hpux'] = strpos($agt, 'hp-ux') !== false;
         $os['hpux9'] = $os['hpux'] && strpos($agt, '09.') !== false;
         $os['hpux10'] = $os['hpux'] && strpos($agt, '10.') !== false;
         $os['aix'] = strpos($agt, 'aix') !== false;
         $os['aix1'] = strpos($agt, 'aix 1') !== false;
         $os['aix2'] = strpos($agt, 'aix 2') !== false;
         $os['aix3'] = strpos($agt, 'aix 3') !== false;
         $os['aix4'] = strpos($agt, 'aix 4') !== false;
         $os['linux'] = strpos($agt, 'inux') !== false;
         $os['sco'] = strpos($agt, 'sco') !== false || strpos($agt, 'unix_sv') !== false;
         $os['unixware'] = strpos($agt, 'unix_system_v') !== false;
         $os['mpras'] = strpos($agt, 'ncr') !== false;
         $os['reliant'] = strpos($agt, 'reliant') !== false;
         $os['dec'] = strpos($agt, 'dec') !== false || strpos($agt, 'osf1') !== false || strpos($agt, 'dec_alpha') !== false || strpos($agt, 'alphaserver') !== false || strpos($agt, 'ultrix') !== false || strpos($agt, 'alphastation') !== false;
         $os['sinix'] = strpos($agt, 'sinix') !== false;
         $os['freebsd'] = strpos($agt, 'freebsd') !== false;
         $os['bsd'] = strpos($agt, 'bsd') !== false;
         $os['unix'] = strpos($agt, 'x11') !== false || strpos($agt, 'unix') !== false || $os['sun'] || $os['irix'] || $os['hpux'] || $os['sco'] || $os['unixware'] || $os['mpras'] || $os['reliant'] || $os['dec'] || $os['sinix'] || $os['aix'] || $os['linux'] || $os['bsd'] || $os['freebsd'];
         $os['vms'] = strpos($agt, 'vax') !== false || strpos($agt, 'openvms') !== false;
     }
     // Setup the quirks
     if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_BROWSER] && $detectFlags[NET_USERAGENT_DETECT_QUIRKS]) {
         if ($browser['konq']) {
             Net_UserAgent_Detect::setQuirk('empty_file_input_value');
         }
         if ($browser['ie']) {
             Net_UserAgent_Detect::setQuirk('cache_ssl_downloads');
         }
         if ($browser['ie6']) {
             Net_UserAgent_Detect::setQuirk('scrollbar_in_way');
         }
         if ($browser['ie5']) {
             Net_UserAgent_Detect::setQuirk('break_disposition_header');
         }
         if ($browser['ns6']) {
             Net_UserAgent_Detect::setQuirk('popups_disabled');
             Net_UserAgent_Detect::setQuirk('must_cache_forms');
         }
         if ($browser['nav'] && $subVersion < 0.79) {
             Net_UserAgent_Detect::setQuirk('nested_table_render_bug');
         }
     }
     // Set features
     if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_BROWSER] && $detectFlags[NET_USERAGENT_DETECT_FEATURES]) {
         if ($browser['gecko']) {
             preg_match(';gecko/([\\d]+)\\b;i', $agt, $matches);
             Net_UserAgent_Detect::setFeature('gecko', $matches[1]);
         }
         if ($browser['gecko'] || $browser['ie5up'] || $browser['konq'] || $browser['opera8up']) {
             Net_UserAgent_Detect::setFeature('ajax');
         }
         if ($browser['ns6up'] || $browser['opera5up'] || $browser['konq'] || $browser['netgem']) {
             Net_UserAgent_Detect::setFeature('dom');
         }
         if ($browser['ie4up'] || $browser['ns4up'] || $browser['opera5up'] || $browser['konq'] || $browser['netgem']) {
             Net_UserAgent_Detect::setFeature('dhtml');
         }
     }
     if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_ACCEPT]) {
         $mimetypes = preg_split(';[\\s,]+;', substr(getenv('HTTP_ACCEPT'), 0, strpos(getenv('HTTP_ACCEPT') . ';', ';')), -1, PREG_SPLIT_NO_EMPTY);
         Net_UserAgent_Detect::setAcceptType((array) $mimetypes, 'mimetype');
         $languages = preg_split(';[\\s,]+;', substr(getenv('HTTP_ACCEPT_LANGUAGE'), 0, strpos(getenv('HTTP_ACCEPT_LANGUAGE') . ';', ';')), -1, PREG_SPLIT_NO_EMPTY);
         if (empty($languages)) {
             $languages = 'en';
         }
         Net_UserAgent_Detect::setAcceptType((array) $languages, 'language');
         $encodings = preg_split(';[\\s,]+;', substr(getenv('HTTP_ACCEPT_ENCODING'), 0, strpos(getenv('HTTP_ACCEPT_ENCODING') . ';', ';')), -1, PREG_SPLIT_NO_EMPTY);
         Net_UserAgent_Detect::setAcceptType((array) $encodings, 'encoding');
         $charsets = preg_split(';[\\s,]+;', substr(getenv('HTTP_ACCEPT_CHARSET'), 0, strpos(getenv('HTTP_ACCEPT_CHARSET') . ';', ';')), -1, PREG_SPLIT_NO_EMPTY);
         Net_UserAgent_Detect::setAcceptType((array) $charsets, 'charset');
     }
 }