Jump to content
Nytro

Metasploit browser detect

Recommended Posts

Bucata din Metasploit:

/**

* This can reliably detect browser versions for IE and Firefox even in the

* presence of a spoofed User-Agent. OS detection is more fragile and

* requires truthful navigator.appVersion and navigator.userAgent strings in

* order to be accurate for more than just IE on Windows.

**/

// Case matters, see lib/msf/core/constants.rb

// All of these should match up with constants in ::Msf::HttpClients

clients_opera = "Opera";

clients_ie = "MSIE";

clients_ff = "Firefox";

clients_chrome= "Chrome";

clients_safari= "Safari";

// All of these should match up with constants in ::Msf::OperatingSystems

oses_linux = "Linux";

oses_windows = "Microsoft Windows";

oses_mac_osx = "Mac OS X";

oses_freebsd = "FreeBSD";

oses_netbsd = "NetBSD";

oses_openbsd = "OpenBSD";

// All of these should match up with the ARCH_* constants

arch_armle = "armle";

arch_x86 = "x86";

arch_x86_64 = "x86_64";

arch_ppc = "ppc";

window.os_detect = {};

/**

* This can reliably detect browser versions for IE and Firefox even in the

* presence of a spoofed User-Agent. OS detection is more fragile and

* requires truthful navigator.appVersion and navigator.userAgent strings in

* order to be accurate for more than just IE on Windows.

**/

window.os_detect.getVersion = function(){

//Default values:

var os_name;

var os_flavor;

var os_sp;

var os_lang;

var ua_name;

var ua_version;

var arch = "";

var useragent = navigator.userAgent;

// Trust but verify...

var ua_is_lying = false;

var version = "";

var unknown_fingerprint = null;

var css_is_valid = function(prop, propCamelCase, css) {

if (!document.createElement) return false;

var d = document.createElement('div');

d.setAttribute('style', prop+": "+css+";")

return d.style[propCamelCase] === css;

}

var input_type_is_valid = function(input_type) {

if (!document.createElement) return false;

var input = document.createElement('input');

input.setAttribute('type', input_type);

return input.type == input_type;

}

//--

// Client

//--

if (window.opera) {

ua_name = clients_opera;

if (!navigator.userAgent.match(/Opera/)) {

ua_is_lying = true;

}

// This seems to be completely accurate, e.g. "9.21" is the return

// value of opera.version() when run on Opera 9.21

ua_version = opera.version();

if (!os_name) {

// The 'inconspicuous' argument is there to give us a real value on

// Opera 6 where, without it, the return value is supposedly

// 'Hm, were you only as smart as Bjorn Vermo...'

// though I have not verfied this claim.

switch (opera.buildNumber('inconspicuous')) {

case "344": // opera-9.0-20060616.1-static-qt.i386-en-344

case "1347": // Opera 9.80 / Ubuntu 10.10 (Karmic Koala)

case "2091": // opera-9.52-2091.gcc3-shared-qt3.i386.rpm

case "2444": // opera-9.60.gcc4-shared-qt3.i386.rpm

case "2474": // Opera 9.63 / Debian Testing (Lenny)

case "4102": // Opera 10.00 / Ubuntu 8.04 LTS (Hardy Heron)

case "6386": // 10.61

os_name = oses_linux;

break;

case "1074": // Opera 11.50 / Windows XP

case "1100": // Opera 11.52 / Windows XP

case "3445": // 10.61

case "3516": // Opera 10.63 / Windows XP

case "7730": // Opera 8.54 / Windows XP

case "8502": // "Opera 9 Eng Setup.exe"

case "8679": // "Opera_9.10_Eng_Setup.exe"

case "8771": // "Opera_9.20_Eng_Setup.exe"

case "8776": // "Opera_9.21_Eng_Setup.exe"

case "8801": // "Opera_9.22_Eng_Setup.exe"

case "10108": // "Opera_952_10108_en.exe"

case "10467": // "Opera_962_en_Setup.exe"

case "10476": // Opera 9.63 / Windows XP

case "WMD-50433": // Windows Mobile - "Mozilla/5.0 (Windows Mobile; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 10.00"

os_name = oses_windows;

break;

case "2480": // Opera 9.64 / FreeBSD 7.0

os_name = oses_freebsd;

break;

case "6386": // 10.61

os_name = oses_mac_osx;

break;

case "1407":

// In the case of mini versions, the UA is quite a bit

// harder to spoof, so it's correspondingly easier to

// trust. Unfortunately, despite being fairly truthful in

// what OS it's running on, Opera mini seems to lie like a

// rug in regards to the browser version.

//

// iPhone, iOS 5.0.1

// Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10.10

// Android 2.3.6, opera mini 7.1

// Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.101.10

if (navigator.userAgent.indexOf("Android")) {

os_name = oses_linux;

os_flavor = "Android";

} else if (navigator.userAgent.indexOf("iPhone")) {

os_name = oses_mac_osx;

os_flavor = "iPhone";

}

break;

// A few are ambiguous, record them here

case "1250":

// Opera 9.80 / Windows XP

// Opera 11.61 / Windows XP

// Opera 11.61 / Debian 4.0 (Etch)

break;

default:

unknown_fingerprint = opera.buildNumber('inconspicuous');

break;

}

}

} else if (typeof window.onmousewheel != 'undefined' && ! (typeof ScriptEngineMajorVersion == 'function') ) { // IE 10 now has onmousewheel

// Then this is webkit, could be Safari or Chrome.

// Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1

// Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.78 Safari/532.5

// Mozilla/5.0 (Linux; U; Android 2.2; en-au; GT-I9000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

// Mozilla/5.0 (iPod; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8C148

// Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405

// Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3

// Google Chrome has window.google (older versions), window.chromium (older versions), and window.window.chrome (3+)

if (window.chromium || window.google || window.chrome) {

ua_name = clients_chrome;

search = "Chrome";

} else {

ua_name = clients_safari;

search = "Version";

}

platform = navigator.platform.toLowerCase();

// Just to be a pain, iPod and iPad both leave off "Safari" and

// "Version" in the UA, see example above. Grab the webkit version

// instead. =/

if (platform.match(/ipod/)) {

os_name = oses_mac_osx;

os_flavor = "iPod";

arch = arch_armle;

search = "AppleWebKit";

} else if (platform.match(/ipad/)) {

os_name = oses_mac_osx;

os_flavor = "iPad";

arch = arch_armle;

search = "AppleWebKit";

} else if (platform.match(/iphone/)) {

os_name = oses_mac_osx;

os_flavor = "iPhone";

arch = arch_armle;

} else if (platform.match(/macintel/)) {

os_name = oses_mac_osx;

arch = arch_x86;

} else if (platform.match(/linux/)) {

os_name = oses_linux;

if (platform.match(/x86_64/)) {

arch = arch_x86_64;

} else if (platform.match(/arm/)) {

// Android and maemo

arch = arch_armle;

if (navigator.userAgent.match(/android/i)) {

os_flavor = 'Android';

}

}

} else if (platform.match(/windows/)) {

os_name = oses_windows;

}

ua_version = this.searchVersion(search, navigator.userAgent);

if (!ua_version || 0 == ua_version.length) {

ua_is_lying = true;

}

} else if (navigator.oscpu && !document.all && navigator.taintEnabled || 'MozBlobBuilder' in window) {

// Use taintEnabled to identify FF since other recent browsers

// implement window.getComputedStyle now. For some reason, checking for

// taintEnabled seems to cause IE 6 to stop parsing, so make sure this

// isn't IE first.

// Also check MozBlobBuilder because FF 9.0.1 does not support taintEnabled

// Then this is a Gecko derivative, assume Firefox since that's the

// only one we have sploits for. We may need to revisit this in the

// future. This works for multi/browser/mozilla_compareto against

// Firefox and Mozilla, so it's probably good enough for now.

ua_name = clients_ff;

// Thanks to developer.mozilla.org "Firefox for developers" series for most

// of these.

// Release changelogs: http://www.mozilla.org/en-US/firefox/releases/

if (css_is_valid('flex-wrap', 'flexWrap', 'nowrap')) {

ua_version = '28.0';

} else if (css_is_valid('cursor', 'cursor', 'grab')) {

ua_version = '27.0';

} else if (css_is_valid('image-orientation',

'imageOrientation',

'0deg')) {

ua_version = '26.0';

} else if (css_is_valid('background-attachment',

'backgroundAttachment',

'local')) {

ua_version = '25.0';

} else if ('DeviceStorage' in window && window.DeviceStorage &&

'default' in window.DeviceStorage.prototype) {

// https://bugzilla.mozilla.org/show_bug.cgi?id=874213

ua_version = '24.0';

} else if (input_type_is_valid('range')) {

ua_version = '23.0';

} else if ('HTMLTimeElement' in window) {

ua_version = '22.0';

} else if ('createElement' in document &&

document.createElement('main') &&

document.createElement('main').constructor === window['HTMLElement']) {

ua_version = '21.0';

} else if ('imul' in Math) {

ua_version = '20.0';

} else if (css_is_valid('font-size', 'fontSize', '23vmax')) {

ua_version = '19.0';

} else if ('devicePixelRatio' in window) {

ua_version = '18.0';

} else if ('createElement' in document &&

document.createElement('iframe') &&

'sandbox' in document.createElement('iframe')) {

ua_version = '17.0';

} else if ('mozApps' in navigator && 'install' in navigator.mozApps) {

ua_version = '16.0';

} else if ('HTMLSourceElement' in window &&

HTMLSourceElement.prototype &&

'media' in HTMLSourceElement.prototype) {

ua_version = '15.0';

} else if ('mozRequestPointerLock' in document.body) {

ua_version = '14.0';

} else if ('Map' in window) {

ua_version = "13.0";

} else if ('mozConnection' in navigator) {

ua_version = "12.0";

} else if ('mozVibrate' in navigator) {

ua_version = "11.0";

} else if (css_is_valid('-moz-backface-visibility', 'MozBackfaceVisibility', 'hidden')) {

ua_version = "10.0";

} else if ('doNotTrack' in navigator) {

ua_version = "9.0";

} else if ('insertAdjacentHTML' in document.body) {

ua_version = "8.0";

} else if ('ondeviceorientation' in window && !('createEntityReference' in document)) {

ua_version = "7.0";

} else if ('MozBlobBuilder' in window) {

ua_version = "6.0";

} else if ('isGenerator' in Function) {

ua_version = "5.0";

} else if ('isArray' in Array) {

ua_version = "4.0";

} else if (document.readyState) {

ua_version = "3.6";

} else if (String.trimRight) {

ua_version = "3.5";

} else if (document.getElementsByClassName) {

ua_version = "3";

} else if (window.Iterator) {

ua_version = "2";

} else if (Array.every) {

ua_version = "1.5";

} else {

ua_version = "1";

}

if (navigator.oscpu != navigator.platform) {

ua_is_lying = true;

}

// oscpu is unaffected by changes in the useragent and has values like:

// "Linux i686"

// "Windows NT 6.0"

// haven't tested on 64-bit Windows

version = navigator.oscpu;

if (version.match(/i.86/)) {

arch = arch_x86;

}

if (version.match(/x86_64/)) {

arch = arch_x86_64;

}

if (version.match(/Windows/)) {

os_name = oses_windows;

switch(version) {

case "Windows NT 5.0": os_flavor = "2000"; break;

case "Windows NT 5.1": os_flavor = "XP"; break;

case "Windows NT 5.2": os_flavor = "2003"; break;

case "Windows NT 6.0": os_flavor = "Vista"; break;

case "Windows NT 6.1": os_flavor = "7"; break;

case "Windows NT 6.2": os_flavor = "8"; break;

}

}

if (version.match(/Linux/)) {

os_name = oses_linux;

}

// end navigator.oscpu checks

// buildID is unaffected by changes in the useragent and typically has

// the compile date which in some cases can be used to map to specific

// Version & O/S (including Distro and even Arch). Depending upon the

// buildID, sometime navigator.productSub will be needed.

//

// This technique, and the laboriously compiled associated table,

// submitted by Mark Fioravanti.

var buildid = navigator.buildID;

switch(buildid) {

case "2008041514": ua_version = "3.0.0.b5"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2008041515": ua_version = "3.0.0.b5"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "2008052312": ua_version = "3.0.0"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2008052906": ua_version = "3.0.0"; os_name = oses_windows; break;

case "2008052909": ua_version = "3.0.0.rc1"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2008052912": ua_version = "3.0.0"; os_name = oses_linux; break;

case "2008060309": ua_version = "3.0.0"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "2008070205": ua_version = "2.0.0.16"; os_name = oses_windows; break;

case "2008070206": ua_version = "3.0.1"; os_name = oses_linux; break;

case "2008070208": ua_version = "3.0.1"; os_name = oses_windows; break;

case "2008071222": ua_version = "3.0.1"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2008072820":

switch (navigator.productSub) {

case "2008072820": ua_version = "3.0.1"; os_name = oses_linux; break;

case "2008092313": ua_version = "3.0.2"; os_name = oses_linux; break;

} break;

case "2008082909": ua_version = "2.0.0.17"; os_name = oses_windows; break;

case "2008091618": ua_version = "3.0.2"; os_name = oses_linux; break;

case "2008091620": ua_version = "3.0.2"; os_name = oses_windows; break;

case "2008092313": ua_version = "3.0.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2008092416": ua_version = "3.0.3"; os_name = oses_linux; break;

case "2008092417": ua_version = "3.0.3"; os_name = oses_windows; break;

case "2008092510": ua_version = "3.0.4"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2008101315":

switch (navigator.productSub) {

case "2008101315": ua_version = "3.0.3"; os_name = oses_linux; break;

case "2008111318": ua_version = "3.0.4"; os_name = oses_linux; arch = arch_x86; break;

} break;

case "2008102918": ua_version = "2.0.0.18"; os_name = oses_windows; break;

case "2008102920": ua_version = "3.0.4"; break;

case "2008112309": ua_version = "3.0.4"; os_name = oses_linux; os_flavor = "Debian"; break; // browsershots: Iceweasel 3.0.4 / Debian Testing (Lenny)

case "2008111317": ua_version = "3.0.5"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2008111318": ua_version = "3.0.5"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "2008120119": ua_version = "2.0.0.19"; os_name = oses_windows; break;

case "2008120121": ua_version = "3.0.5"; os_name = oses_linux; break;

case "2008120122": ua_version = "3.0.5"; os_name = oses_windows; break;

case "2008121623": ua_version = "2.0.0.19"; os_name = oses_linux; os_flavor = "Ubuntu"; break; // browsershots: Firefox 2.0.0.19 / Ubuntu 8.04 LTS (Hardy Heron)

case "2008121709": ua_version = "2.0.0.20"; os_name = oses_windows; break;

case "2009011912": ua_version = "3.0.6"; os_name = oses_linux; break;

case "2009011913": ua_version = "3.0.6"; os_name = oses_windows; break;

case "2009012615": ua_version = "3.0.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2009012616": ua_version = "3.0.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2009021906": ua_version = "3.0.7"; os_name = oses_linux; break;

case "2009021910": ua_version = "3.0.7"; os_name = oses_windows; break;

case "2009030422": ua_version = "3.0.8"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2009032608": ua_version = "3.0.8"; os_name = oses_linux; break;

case "2009032609": ua_version = "3.0.8"; os_name = oses_windows; break;

case "2009032711": ua_version = "3.0.9"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2009033100":

switch (navigator.productSub) {

case "2009033100": ua_version = "3.0.8"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "2009042113": ua_version = "3.0.9"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

} break;

case "2009040820": ua_version = "3.0.9"; os_name = oses_linux; break;

case "2009040821": ua_version = "3.0.9"; os_name = oses_windows; break;

case "2009042113": ua_version = "3.0.10"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2009042114": ua_version = "3.0.10"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "2009042315": ua_version = "3.0.10"; os_name = oses_linux; break;

case "2009042316": ua_version = "3.0.10"; os_name = oses_windows; break;

case "20090427153806": ua_version = "3.5.0.b4"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20090427153807": ua_version = "3.5.0.b4"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "2009060214": ua_version = "3.0.11"; os_name = oses_linux; break;

case "2009060215": ua_version = "3.0.11"; os_name = oses_windows; break;

case "2009060308":

switch (navigator.productSub) {

case "2009060308": ua_version = "3.0.11"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2009070811": ua_version = "3.0.12"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

} break;

case "2009060309":

switch (navigator.productSub) {

case "2009060309": ua_version = "3.0.11"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "2009070811": ua_version = "3.0.12"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

} break;

case "2009060310": ua_version = "3.0.11"; os_name = oses_linux; os_flavor = "BackTrack"; break;

case "2009062005": ua_version = "3.0.11"; os_name = oses_linux; os_flavor = "PCLunixOS"; break;

case "20090624012136": ua_version = "3.5.0"; os_name = oses_mac_osx; break;

case "20090624012820": ua_version = "3.5.0"; os_name = oses_linux; break;

case "20090701234143": ua_version = "3.5.0"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20090702060527": ua_version = "3.5.0"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86_64; break;

case "2009070610": ua_version = "3.0.12"; os_name = oses_linux; break;

case "2009070611": ua_version = "3.0.12"; os_name = oses_windows; break;

case "2009070811": ua_version = "3.0.13"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "20090715083437": ua_version = "3.5.1"; os_name = oses_mac_osx; break;

case "20090715083816": ua_version = "3.5.1"; os_name = oses_linux; break;

case "20090715094852": ua_version = "3.5.1"; os_name = oses_windows; break;

case "2009072202": ua_version = "3.0.12"; os_name = oses_linux; os_flavor = "Oracle"; break;

case "2009072711": ua_version = "3.0.12"; os_name = oses_linux; os_flavor = "CentOS"; break;

case "20090729211433": ua_version = "3.5.2"; os_name = oses_mac_osx; break;

case "20090729211829": ua_version = "3.5.2"; os_name = oses_linux; break;

case "20090729225027": ua_version = "3.5.2"; os_name = oses_windows; break;

case "2009073021": ua_version = "3.0.13"; os_name = oses_linux; break;

case "2009073022": ua_version = "3.0.13"; os_name = oses_windows; break;

case "20090824085414": ua_version = "3.5.3"; os_name = oses_mac_osx; break;

case "20090824085743": ua_version = "3.5.3"; os_name = oses_linux; break;

case "20090824101458": ua_version = "3.5.3"; os_name = oses_windows; break;

case "2009082707": ua_version = "3.0.14"; break;

case "2009090216": ua_version = "3.0.14"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20090914014745": ua_version = "3.5.3"; os_name = oses_linux; os_flavor = "Mandriva"; arch = arch_x86; break;

case "20090915065903": ua_version = "3.5.3"; os_name = oses_linux; os_flavor = "Sabayon"; arch = arch_x86_64; break;

case "20090915070141": ua_version = "3.5.3"; os_name = oses_linux; os_flavor = "Sabayon"; arch = arch_x86; break;

case "20091007090112": ua_version = "3.5.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break; // Could also be Mint x86

case "20091007095328": ua_version = "3.5.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break; // Could also be Mint x86-64

case "2009101600":

switch (navigator.productSub) {

case "2009101600": ua_version = "3.0.15"; break; // Can be either Mac or Linux

case "20091016": ua_version = "3.5.4"; os_name = oses_linux; os_flavor = "SUSE"; arch = arch_x86; break;

} break;

case "2009101601": ua_version = "3.0.15"; os_name = oses_windows; break;

case "20091016081620": ua_version = "3.5.4"; os_name = oses_mac_osx; break;

case "20091016081727": ua_version = "3.5.4"; os_name = oses_linux; break;

case "20091016092926": ua_version = "3.5.4"; os_name = oses_windows; break;

case "20091020122601": ua_version = "3.5.4"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break; // Could also be Mint x86-64

case "2009102814":

switch (navigator.productSub) {

case "2009121601": ua_version = "3.0.16"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "2009121602": ua_version = "3.0.16"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "2010010604": ua_version = "3.0.17"; os_name = oses_linux; os_flavor = "Mint"; break;

case "2010021501": ua_version = "3.0.17;xul1.9.0.18"; os_name = oses_linux; os_flavor = "Mint"; arch = arch_x86; break;

case "2010021502": ua_version = "3.0.17;xul1.9.0.18"; os_name = oses_linux; os_flavor = "Mint"; arch = arch_x86_64; break;

} break;

case "2009102815":

switch (navigator.productSub) {

case "2009102815": ua_version = "3.0.15"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2009121601": ua_version = "3.0.16"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

} break;

case "20091029152254": ua_version = "3.6.0.b1"; os_name = oses_linux; break;

case "20091029171059": ua_version = "3.6.0.b1"; os_name = oses_windows; break;

case "20091102134505": ua_version = "3.5.5"; os_name = oses_mac_osx; break;

case "20091102141836": ua_version = "3.5.5"; os_name = oses_linux; break;

case "20091102152451": ua_version = "3.5.5"; os_name = oses_windows; break;

case "2009110421": ua_version = "3.0.15"; os_name = oses_freebsd; arch = arch_x86; break;

case "20091106091959": ua_version = "3.5.5"; os_name = oses_linux; os_flavor = "Mandriva"; arch = arch_x86; break;

case "20091106140514": ua_version = "3.5.5"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20091106145609": ua_version = "3.5.5"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86_64; break;

case "20091108163911": ua_version = "3.6.0.b2"; os_name = oses_linux; break;

case "20091108181924": ua_version = "3.6.0.b2"; os_name = oses_windows; break;

case "20091109125225":

switch (navigator.productSub) {

case "20091109": ua_version = "3.5.5"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20091215": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

} break;

case "20091109134913": ua_version = "3.5.5"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20091115172547": ua_version = "3.6.0.b3"; os_name = oses_linux; break;

case "20091115182845": ua_version = "3.6.0.b3"; os_name = oses_windows; break;

case "20091124201530": ua_version = "3.6.0.b4"; os_name = oses_mac_osx; break;

case "20091124201751": ua_version = "3.6.0.b4"; os_name = oses_linux; break;

case "20091124213835": ua_version = "3.6.0.b4"; os_name = oses_windows; break;

case "2009120100": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "SUSE"; break;

case "20091201203240": ua_version = "3.5.6"; os_name = oses_mac_osx; break;

case "20091201204959": ua_version = "3.5.6"; os_name = oses_linux; break;

case "20091201220228": ua_version = "3.5.6"; os_name = oses_windows; break;

case "2009120206": ua_version = "3.0.16"; break; // Can be either Mac or Linux

case "2009120208": ua_version = "3.0.16"; os_name = oses_windows; break;

case "20091204132459": ua_version = "3.6.0.b5"; os_name = oses_linux; break;

case "20091204132509": ua_version = "3.6.0.b5"; os_name = oses_mac_osx; break;

case "20091204143806": ua_version = "3.6.0.b5"; os_name = oses_windows; break;

case "20091215230859": ua_version = "3.5.7"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20091215230946": ua_version = "3.5.7"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20091215231400": ua_version = "3.5.7"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break; // Could also be Mint x86

case "20091215231754":

switch (navigator.productSub) {

case "20091215": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100106": ua_version = "3.5.7"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break; // Could also be Mint x86-64

} break;

case "2009121601":

switch (navigator.productSub) {

case "2009121601": ua_version = "3.0.16"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "2010010604": ua_version = "3.0.17"; os_name = oses_linux; os_flavor = "Ubuntu"; break; // Could also be Mint x86-64

} break;

case "2009121602": ua_version = "3.0.17"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "20091216104148": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "Mandriva"; break;

case "20091216132458": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20091216132537": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20091216142458": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20091216142519": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "2009121708": ua_version = "3.0.16"; os_name = oses_linux; os_flavor = "CentOS"; arch = arch_x86; break;

case "20091221151141": ua_version = "3.5.7"; os_name = oses_mac_osx; break;

case "20091221152502": ua_version = "3.5.7"; os_name = oses_linux; break;

case "2009122115": ua_version = "3.0.17"; break; // Can be either Mac or Linux

case "20091221164558": ua_version = "3.5.7"; os_name = oses_windows; break;

case "2009122116": ua_version = "3.0.17"; os_name = oses_windows; break;

case "2009122200": ua_version = "3.5.7"; os_name = oses_linux; os_flavor = "SUSE"; break;

case "20091223231431": ua_version = "3.5.6"; os_name = oses_linux; os_flavor = "PCLunixOS"; arch = arch_x86; break;

case "20100105194006": ua_version = "3.6.0.rc1"; os_name = oses_mac_osx; break;

case "20100105194116": ua_version = "3.6.0.rc1"; os_name = oses_linux; break;

case "20100105212446": ua_version = "3.6.0.rc1"; os_name = oses_windows; break;

case "2010010604": ua_version = "3.0.18"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "20100106054534": ua_version = "3.5.8"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break; // Could also be Mint x86

case "20100106054634": ua_version = "3.5.8"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break; // Could also be Mint x86-64

case "2010010605": ua_version = "3.0.18"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100106211825": ua_version = "3.5.7"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20100106212742": ua_version = "3.5.7"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86_64; break;

case "20100106215614": ua_version = "3.5.7"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20100110112429": ua_version = "3.5.7"; os_name = oses_linux; os_flavor = "Mandriva"; break;

case "20100115132715": ua_version = "3.6.0"; os_name = oses_mac_osx; break;

case "20100115133306": ua_version = "3.6.0"; os_name = oses_linux; break;

case "20100115144158": ua_version = "3.6.0"; os_name = oses_windows; break;

case "20100125074043": ua_version = "3.6.0"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break; // Could also be Mint x86

case "20100125074127": ua_version = "3.6.0"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break; // Could also be Mint x86-64

case "20100125204847": ua_version = "3.6.0"; os_name = oses_linux; os_flavor = "Sabayon"; arch = arch_x86; break; // Could also be Mint x86

case "20100125204903": ua_version = "3.6.0"; os_name = oses_linux; os_flavor = "Sabayon"; arch = arch_x86_64; break; // Could also be Mint x86-64

case "20100202152834": ua_version = "3.5.8"; os_name = oses_mac_osx; break;

case "20100202153512": ua_version = "3.5.8"; os_name = oses_linux; break;

case "20100202165920": ua_version = "3.5.8"; os_name = oses_windows; break;

case "2010020219": ua_version = "3.0.18"; os_name = oses_mac_osx; break;

case "2010020220": ua_version = "3.0.18"; os_name = oses_windows; break;

case "2010020400": ua_version = "3.5.8"; os_name = oses_linux; os_flavor = "SUSE"; break;

case "20100212131909": ua_version = "3.6.0.2"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100212132013": ua_version = "3.6.0.2"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100216105329": ua_version = "3.5.8"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20100216105348": ua_version = "3.5.8"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20100216105410": ua_version = "3.5.8"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20100216110009": ua_version = "3.5.8"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "2010021718": ua_version = "3.0.18"; os_name = oses_linux; os_flavor = "CentOS"; arch = arch_x86; break;

case "20100218022359": ua_version = "3.6.0.4"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100218022705": ua_version = "3.6.0.4"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100218112915": ua_version = "3.5.8"; os_name = oses_linux; os_flavor = "Mandriva"; arch = arch_x86; break;

case "20100222120605": ua_version = "3.6.0.5"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100222120717": ua_version = "3.6.0.5"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100301015346": ua_version = "3.6.0"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20100305054927": ua_version = "3.6.0"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86_64; break;

case "20100307204001": ua_version = "3.6.0"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20100308142847": ua_version = "3.6.0.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100308151019": ua_version = "3.6.0.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "2010031218": ua_version = "3.0.19"; break; // Mac OS X or Linux

case "2010031422": ua_version = "3.0.19"; os_name = oses_windows; break;

case "20100315075757": ua_version = "3.5.9"; os_name = oses_linux; break;

case "20100315080228": ua_version = "3.5.9"; os_name = oses_mac_osx; break;

case "20100315083431": ua_version = "3.5.9"; os_name = oses_windows; break;

case "20100316055951": ua_version = "3.6.2"; os_name = oses_mac_osx; break;

case "20100316060223": ua_version = "3.6.2"; os_name = oses_linux; break;

case "20100316074819": ua_version = "3.6.2"; os_name = oses_windows; break;

case "2010031700": ua_version = "3.5.9"; os_name = oses_linux; os_flavor = "SUSE"; break;

case "20100323102218": ua_version = "3.6.2"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20100323102339": ua_version = "3.6.2"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20100323194640": ua_version = "3.6.2"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86_64; break;

case "20100324182054": ua_version = "3.6.2"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20100330071911": ua_version = "3.5.9"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20100330072017": ua_version = "3.5.9"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20100330072020": ua_version = "3.5.9"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20100330072034": ua_version = "3.5.9"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20100401064631": ua_version = "3.6.3"; os_name = oses_mac_osx; break;

case "20100401074458": ua_version = "3.6.3"; os_name = oses_linux; break;

case "20100401080539": ua_version = "3.6.3"; os_name = oses_windows; break;

case "20100401144201": ua_version = "3.6.2"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2010040116": ua_version = "3.0.19"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2010040118": ua_version = "3.0.19"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2010040119": ua_version = "3.0.19"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100401213457": ua_version = "3.5.9"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "2010040121": ua_version = "3.0.19"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "2010040123": ua_version = "3.0.19"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "2010040200": ua_version = "3.0.19"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100402010516": ua_version = "3.5.9"; os_name = oses_linux; os_flavor = "Mint"; arch = arch_x86_64; break;

case "20100402041908": ua_version = "3.6.2"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100403042003": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20100403082016": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20100404024515": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100404024646": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100404104043": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "PClinuxOS"; arch = arch_x86_64; break;

case "20100409151117": ua_version = "3.6.3.2"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100409170726": ua_version = "3.6.3.2"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100412125148": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "Mandriva"; arch = arch_x86; break;

case "20100413152922": ua_version = "3.6.4.b1"; os_name = oses_mac_osx; break;

case "20100413154310": ua_version = "3.6.4.b1"; os_name = oses_linux; break;

case "20100413172113": ua_version = "3.6.4.b1"; os_name = oses_windows; break;

case "20100415062243": ua_version = "3.6.3.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100415103754": ua_version = "3.6.3.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100416101101": ua_version = "3.6.3.2"; os_name = oses_linux; os_flavor = "Mandriva"; arch = arch_x86; break;

case "2010041700": ua_version = "3.6.4.1"; os_name = oses_linux; os_flavor = "SUSE"; break;

case "20100419015333": ua_version = "3.6.3"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86_64; break;

case "20100423043606": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "Sabayon"; arch = arch_x86_64; break;

case "20100423140709": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100423141150": ua_version = "3.6.3"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100423142835": ua_version = "3.6.3"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20100502202326": ua_version = "3.6.4.b2"; os_name = oses_linux; break;

case "20100502202401": ua_version = "3.6.4.b2"; os_name = oses_mac_osx; break;

case "20100502221517": ua_version = "3.6.4.b2"; os_name = oses_windows; break;

case "20100503113315": ua_version = "3.6.4.b3"; os_name = oses_mac_osx; break;

case "20100503113541": ua_version = "3.6.4.b3"; os_name = oses_linux; break;

case "20100503122926": ua_version = "3.6.4.b3"; os_name = oses_windows; break;

case "20100504085637": ua_version = "3.5.10"; os_name = oses_linux; break;

case "20100504085753": ua_version = "3.5.10"; os_name = oses_mac_osx; break;

case "20100504093643": ua_version = "3.5.10"; os_name = oses_windows; break;

case "2010050600": ua_version = "3.5.10"; os_name = oses_linux; os_flavor = "SUSE"; break;

case "2010051300": ua_version = "3.6.4.1"; os_name = oses_linux; os_flavor = "SUSE"; break;

case "20100513134853": ua_version = "3.6.4.b4"; os_name = oses_mac_osx; break;

case "20100513140540": ua_version = "3.6.4.b4"; os_name = oses_linux; break;

case "20100513144105": ua_version = "3.6.4.b4"; os_name = oses_windows; break;

case "20100513190740": ua_version = "3.6.3"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86_64; break;

case "20100523180910": ua_version = "3.6.4.b5"; os_name = oses_mac_osx; break;

case "20100523181754": ua_version = "3.6.4.b5"; os_name = oses_linux; break;

case "20100523185824": ua_version = "3.6.4.b5"; os_name = oses_windows; break;

case "20100527084110": ua_version = "3.6.4.b6"; os_name = oses_mac_osx; break;

case "20100527085242": ua_version = "3.6.4.b6"; os_name = oses_linux; break;

case "20100527093236": ua_version = "3.6.4.b6"; os_name = oses_windows; break;

case "2010061100": ua_version = "3.6.4"; os_name = oses_linux; os_flavor = "SUSE"; break;

case "20100611134546": ua_version = "3.6.4.b7"; os_name = oses_mac_osx; break;

case "20100611135942": ua_version = "3.6.4.b7"; os_name = oses_linux; break;

case "20100611143157": ua_version = "3.6.4.b7"; os_name = oses_windows; break;

case "20100622203044": ua_version = "3.6.4"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20100622203045": ua_version = "3.6.4"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20100622204750": ua_version = "3.5.10"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86_64; break;

case "20100622204830": ua_version = "3.5.10"; os_name = oses_linux; os_flavor = "Fedora"; arch = arch_x86; break;

case "20100622205038": ua_version = "3.6.4"; os_name = oses_linux; os_flavor = "PClinuxOS"; arch = arch_x86_64; break;

case "20100623081410": ua_version = "3.6.4"; os_name = oses_linux; os_flavor = "CentOS"; arch = arch_x86_64; break;

case "20100623081921": ua_version = "3.6.4"; os_name = oses_linux; os_flavor = "CentOS"; arch = arch_x86; break;

case "20100623155731": ua_version = "3.6.4.b7"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100623200132": ua_version = "3.6.4.b7"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100625222733": ua_version = "3.6.6"; os_name = oses_linux; break;

case "20100625223402": ua_version = "3.6.6"; os_name = oses_mac_osx; break;

case "20100625231939": ua_version = "3.6.6"; os_name = oses_windows; break;

case "20100626104508": ua_version = "3.6.4"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86; break;

case "20100627211341": ua_version = "3.6.4"; os_name = oses_freebsd; os_flavor = "PC-BSD"; arch = arch_x86_64; break;

case "20100628082832": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "PClinuxOS"; arch = arch_x86_64; break;

case "20100628124739": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100628143222": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100628232431": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100629034705": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100629105354": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "Mandriva"; arch = arch_x86; break;

case "20100630130433": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100630131607": ua_version = "4.0.0.b1"; os_name = oses_mac_osx; break;

case "20100630132217": ua_version = "4.0.0.b1"; os_name = oses_linux; break;

case "20100630141702": ua_version = "4.0.0.b1"; os_name = oses_windows; break;

case "20100630174226": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "Sabayon"; arch = arch_x86_64; break;

case "20100630180611": ua_version = "3.6.6"; os_name = oses_linux; os_flavor = "Sabayon"; arch = arch_x86; break;

case "20100709115208": ua_version = "3.6.7.b1"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86; break;

case "20100709183408": ua_version = "3.6.7.b1"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20100716093011": ua_version = "3.6.7.b2"; os_name = oses_linux; os_flavor = "Ubuntu"; arch = arch_x86_64; break;

case "20101203075014": ua_version = "3.6.13"; os_name = oses_windows; break;

case "20101206122825": ua_version = "3.6.13"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "20110318052756": ua_version = "4.0"; os_name = oses_windows; break; // browsershots: Firefox 4.0 / Windows XP

case "20110420144310": ua_version = "3.5.19"; os_name = oses_linux; os_flavor = "Debian"; break; // browsershots: Firefox 3.5.19 / Debian 4.0 (Etch)

case "20110615151330": ua_version = "5.0"; os_name = oses_windows; break; // browsershots: Firefox 5.0 / Windows XP

case "20110811165603": ua_version = "6.0"; os_name = oses_windows; break; // browsershots: Firefox 6.0 / Windows XP

case "20110830092941": ua_version = "6.0.1"; os_name = oses_linux; os_flavor = "Debian"; break; // browsershots: Firefox 6.0.1 / Debian 4.0 (Etch)

case "20110922153450": ua_version = "7.0"; os_name = oses_windows; break; // browsershots: Firefox 7.0 / Windows XP

case "20110928134238": ua_version = "7.0.1"; os_name = oses_linux; os_flavor = "Debian"; break; // browsershots: Firefox 7.0.1 / Debian 4.0 (Etch)

case "20111104165243": ua_version = "8.0"; os_name = oses_windows; break; // browsershots: Firefox 8.0 / Windows XP

case "20111115183813": ua_version = "8.0"; os_name = oses_linux; os_flavor = "Ubuntu"; break; // browsershots: Firefox 8.0 / Ubuntu 9.10 (Karmic Koala)

case "20111216140209": ua_version = "9.0"; os_name = oses_windows; break; // browsershots: Firefox 9.0 / Windows XP

case "20120129021758": ua_version = "10.0"; os_name = oses_windows; break; // browsershots: Firefox 10.0 / Windows 2000

case "20120201083324": ua_version = "3.5.16"; os_name = oses_linux; os_flavor = "Debian"; break; // browsershots: Iceweasel 3.5.16 / Debian 4.0 (Etch)

case "20120216013254": ua_version = "3.6.27"; os_name = oses_linux; os_flavor = "Debian"; break; // browsershots: Firefox 3.6.27 / Debian 4.0 (Etch)

case "20120216100510": ua_version = "10.0.2"; os_name = oses_linux; os_flavor = "Ubuntu"; break; // browsershots: Firefox 10.0.2 / Ubuntu 9.10 (Karmic Koala)

case "20120310010316": ua_version = "11.0"; os_name = oses_linux; os_flavor = "Ubuntu"; break; // browsershots: Firefox 11.0 / Ubuntu 9.10 (Karmic Koala)

case "20120310194926": ua_version = "11.0"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "20120312181643":

// It is disconcerting that a buildID is the same on Windows

// and Mac, need to examine more versions on Mac.

ua_version = "11.0";

if (/Mac/.test(navigator.oscpu)) {

os_name = oses_mac_osx;

} else {

os_name = oses_windows; // browsershots: Firefox 11.0 / Windows XP

}

break;

case "20120314195616": ua_version = "12.0"; os_name = oses_linux; os_flavor = "Debian"; break; // browsershots: Firefox 12.0 / Debian 4.0 (Etch)

case "20120423142301": ua_version = "12.0"; os_name = oses_linux; os_flavor = "Ubuntu"; break;

case "20120424151700": ua_version = "12.0"; os_name = oses_linux; os_flavor = "Fedora"; break;

default:

version = this.searchVersion("Firefox", navigator.userAgent);

// Verify whether the ua string is lying by checking if it contains

// the major version we detected using known objects above. If it

// appears to be truthful, then use its more precise version number.

if (version && version.split(".")[0] == ua_version.split(".")[0]) {

// The version number will sometimes end with a space or end of

// line, so strip off anything after a space if one exists

if (-1 != version.indexOf(" ")) {

version = version.substr(0,version.indexOf(" "));

}

ua_version = version;

} else {

ua_is_lying = true;

}

break;

}

//if (ua_is_lying) { alert("UA is lying"); }

//alert(ua_version + " vs " + navigator.userAgent);

// end navigator.buildID checks

} else if (typeof ScriptEngineMajorVersion == "function") {

// Then this is IE and we can very reliably detect the OS.

// Need to add detection for IE on Mac. Low priority, since we

// don't have any sploits for it yet and it's a very low market

// share.

os_name = oses_windows;

ua_name = clients_ie;

version = ScriptEngineMajorVersion().toString();

version += ScriptEngineMinorVersion().toString();

version += ScriptEngineBuildVersion().toString();

//document.write("ScriptEngine: "+version+"<br />");

switch (version){

case "514615":

// IE 5.00.2920.0000, 2000 Advanced Server SP0 English

ua_version = "5.0";

os_flavor = "2000";

os_sp = "SP0";

break;

case "515907":

os_flavor = "2000";

os_sp = "SP3"; //or SP2: oCC.getComponentVersion('{22d6f312-b0f6-11d0-94ab-0080c74c7e95}', 'componentid') => 6,4,9,1109

break;

case "518513":

os_flavor = "2000";

os_sp = "SP4";

break;

case "566626":

// IE 6.0.2600.0000, XP SP0 English

// IE 6.0.2800.1106, XP SP1 English

ua_version = "6.0";

os_flavor = "XP";

os_sp = "SP0";

break;

case "568515":

// IE 6.0.3790.0, 2003 Standard SP0 English

ua_version = "6.0";

os_flavor = "2003";

os_sp = "SP0";

break;

case "568820":

// IE 6.0.2900.2180, xp sp2 english

os_flavor = "XP";

os_sp = "SP2";

break;

case "568827":

os_flavor = "2003";

os_sp = "SP1";

break;

case "568831": //XP SP2 -OR- 2K SP4

if (os_flavor == "2000"){

os_sp = "SP4";

}

else{

os_flavor = "XP";

os_sp = "SP2";

}

break;

case "568832":

os_flavor = "2003";

os_sp = "SP2";

break;

case "568837":

// IE 6.0.2900.2180, XP Professional SP2 Korean

ua_version = "6.0";

os_flavor = "XP";

os_sp = "SP2";

break;

case "5716599":

// IE 7.0.5730.13, XP Professional SP3 English

// IE 6.0.2900.5512, XP Professional SP3 English

// IE 6.0.2900.5512, XP Professional SP3 Spanish

//

// Since this scriptengine applies to more than one major version of

// IE, rely on the object detection below to determine ua_version.

//ua_version = "6.0";

os_flavor = "XP";

os_sp = "SP3";

break;

case "575730":

// IE 7.0.5730.13, Server 2003 Standard SP2 English

// IE 7.0.5730.13, Server 2003 Standard SP1 English

// IE 7.0.5730.13, XP Professional SP2 English

// Rely on the user agent matching above to determine the OS.

// This will incorrectly identify 2k3 SP1 as SP2

ua_version = "7.0";

os_sp = "SP2";

break;

case "5718066":

// IE 7.0.5730.13, XP Professional SP3 English

ua_version = "7.0";

os_flavor = "XP";

os_sp = "SP3";

break;

case "5722589":

// IE 7.0.5730.13, XP Professional SP3 English

ua_version = "7.0";

os_flavor = "XP";

os_sp = "SP3";

break;

case "576000":

// IE 7.0.6000.16386, Vista Ultimate SP0 English

ua_version = "7.0";

os_flavor = "Vista";

os_sp = "SP0";

break;

case "580":

// IE 8.0.7100.0, Windows 7 English

// IE 8.0.7100.0, Windows 7 64-bit English

case "5816385":

// IE 8.0.7600.16385, Windows 7 English

case "5816475":

case "5816762":

// IE 8.0.7600.16385, Windows 7 English

ua_version = "8.0";

os_flavor = "7";

os_sp = "SP0";

break;

case "5817514":

// IE 8.0.7600.17514, Windows 7 SP1 English

ua_version = "8.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "5818702":

// IE 8.0.6001.18702, XP Professional SP3 English

case "5822960":

// IE 8.0.6001.18702, XP Professional SP3 Greek

ua_version = "8.0";

os_flavor = "XP";

os_sp = "SP3";

break;

case "9016406":

// IE 9.0.7930.16406, Windows 7 64-bit

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP0";

break;

case "9016441":

// IE 9.0.8112.16421, Windows 7 32-bit English

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016443":

// IE 9.0.8112.16421, Windows 7 Polish

// Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016446":

// IE 9.0.8112.16421, Windows 7 English (Update Versions: 9.0.7 (KB2699988)

// Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MASA; InfoPath.3; MS-RTC LM 8; BRI/2)Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MASA; InfoPath.3; MS-RTC LM 8; BRI/2)

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016464":

// browsershots.org, MSIE 7.0 / Windows 2008 R2

os_flavor = "2008R2";

ua_version = "9.0";

break;

case "9016470":

// IE 9.0.8112.16421 / Windows 7 SP1

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016502":

// IE 9.0.8112.16502 / Windows 7 SP1

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016506":

// IE 9.0.8112.16506 / Windows 7 SP1

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016514":

// IE 9.0.8112.16514 / Windows 7 SP1

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016520":

// IE 9.0.8112.16520 / Windows 7 SP1

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016526":

// IE 9.0.8112.16526 / Windows 7 SP1

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "9016533":

// IE 9.0.8112.16533 / Windows 7 SP1

ua_version = "9.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "10016720":

// IE 10.0.9200.16721 / Windows 7 SP1

ua_version = "10.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "11016428":

// IE 11.0.9600.16428 / Windows 7 SP1

ua_version = "11.0";

os_flavor = "7";

os_sp = "SP1";

break;

case "10016384":

// IE 10.0.9200.16384 / Windows 8 x86

ua_version = "10.0";

os_flavor = "8";

os_sp = "SP0";

break;

case "1000":

// IE 10.0.8400.0 (Pre-release + KB2702844), Windows 8 x86 English Pre-release

ua_version = "10.0";

os_flavor = "8";

os_sp = "SP0";

break;

default:

unknown_fingerprint = version;

break;

}

if (!ua_version) {

// The ScriptEngine functions failed us, try some object detection

if (document.documentElement && (typeof document.documentElement.style.maxHeight)!="undefined") {

// IE 11 detection, see: Compatibility changes in IE11 (Windows)

try {

if (document.__proto__ != undefined) { ua_version = "11.0"; }

} catch (e) {}

// IE 10 detection using nodeName

if (!ua_version) {

try {

var badNode = document.createElement && document.createElement("badname");

if (badNode && badNode.nodeName === "BADNAME") { ua_version = "10.0"; }

} catch(e) {}

}

// IE 9 detection based on a "Object doesn't support property or method" error

if (!ua_version) {

try {

document.BADNAME();

} catch(e) {

if (e.message.indexOf("BADNAME") > 0) {

ua_version = "9.0";

}

}

}

// IE8 detection straight from IEBlog. Thank you Microsoft.

if (!ua_version) {

try {

ua_version = "8.0";

document.documentElement.style.display = "table-cell";

} catch(e) {

// This executes in IE7,

// but not IE8, regardless of mode

ua_version = "7.0";

}

}

} else if (document.compatMode) {

ua_version = "6.0";

} else if (window.createPopup) {

ua_version = "5.5";

} else if (window.attachEvent) {

ua_version = "5.0";

} else {

ua_version = "4.0";

}

switch (navigator.appMinorVersion){

case ";SP2;":

ua_version += ";SP2";

break;

}

}

}

if (!os_name && navigator.platform == "Win32") { os_name = oses_windows; }

//--

// Flavor

//--

if (!ua_is_lying) {

version = useragent.toLowerCase();

} else if (navigator.oscpu) {

// Then this is Gecko and we can get at least os_name without the

// useragent

version = navigator.oscpu.toLowerCase();

} else {

// All we have left is the useragent and we know it's lying, so don't bother

version = " ";

}

if (!os_name || 0 == os_name.length) {

if (version.indexOf("windows") != -1) { os_name = oses_windows; }

else if (version.indexOf("mac") != -1) { os_name = oses_mac_osx; }

else if (version.indexOf("linux") != -1) { os_name = oses_linux; }

}

if (os_name == oses_windows && (!os_flavor || 0 == os_flavor.length)) {

if (version.indexOf("windows 95") != -1) { os_flavor = "95"; }

else if (version.indexOf("windows nt 4") != -1) { os_flavor = "NT"; }

else if (version.indexOf("win 9x 4.9") != -1) { os_flavor = "ME"; }

else if (version.indexOf("windows 98") != -1) { os_flavor = "98"; }

else if (version.indexOf("windows nt 5.0") != -1) { os_flavor = "2000"; }

else if (version.indexOf("windows nt 5.1") != -1) { os_flavor = "XP"; }

else if (version.indexOf("windows nt 5.2") != -1) { os_flavor = "2003"; }

else if (version.indexOf("windows nt 6.0") != -1) { os_flavor = "Vista"; }

else if (version.indexOf("windows nt 6.1") != -1) { os_flavor = "7"; }

else if (version.indexOf("windows nt 6.2") != -1) { os_flavor = "8"; }

}

if (os_name == oses_linux && (!os_flavor || 0 == os_flavor.length)) {

if (version.indexOf("gentoo") != -1) { os_flavor = "Gentoo"; }

else if (version.indexOf("ubuntu") != -1) { os_flavor = "Ubuntu"; }

else if (version.indexOf("debian") != -1) { os_flavor = "Debian"; }

else if (version.indexOf("rhel") != -1) { os_flavor = "RHEL"; }

else if (version.indexOf("red hat") != -1) { os_flavor = "RHEL"; }

else if (version.indexOf("centos") != -1) { os_flavor = "CentOS"; }

else if (version.indexOf("fedora") != -1) { os_flavor = "Fedora"; }

else if (version.indexOf("android") != -1) { os_flavor = "Android"; }

}

//--

// Language

//--

if (navigator.systemLanguage) {

// ie

os_lang = navigator.systemLanguage;

} else if (navigator.language) {

// gecko derivatives, safari, opera

os_lang = navigator.language;

} else {

// some other browser and we don't know how to get the language, so

// just guess english

os_lang = "en";

}

//--

// Architecture

//--

if (typeof(navigator.cpuClass) != 'undefined') {

// Then this is IE or Opera9+ and we can grab the arch directly

switch (navigator.cpuClass) {

case "x86":

arch = arch_x86;

break;

case "x64":

arch = arch_x86_64;

break;

}

}

if (!arch || 0 == arch.length) {

// We don't have the handy-dandy navagator.cpuClass, so infer from

// platform

version = navigator.platform;

//document.write(version + "\\n");

// IE 8 does a bit of wacky user-agent switching for "Compatibility View";

// 64-bit client on Windows 7, 64-bit:

// Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)

// 32-bit client on Windows 7, 64-bit:

// Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)

// 32-bit client on Vista, 32-bit, "Compatibility View":

// Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)

//

// Report 32-bit client on 64-bit OS as being 32 because exploits will

// need to know the bittedness of the process, not the OS.

if ( ("Win32" == version) || (version.match(/i.86/)) ) {

arch = arch_x86;

} else if (-1 != version.indexOf('x64') || (-1 != version.indexOf('x86_64'))) {

arch = arch_x86_64;

} else if (-1 != version.indexOf('PPC')) {

arch = arch_ppc;

}

}

this.ua_is_lying = ua_is_lying;

this.os_name = os_name;

this.os_flavor = os_flavor;

this.os_sp = os_sp;

this.os_lang = os_lang;

this.arch = arch;

this.ua_name = ua_name;

this.ua_version = ua_version;

this.ua_version = ua_version;

return { os_name:os_name, os_flavor:os_flavor, os_sp:os_sp, os_lang:os_lang, arch:arch, ua_name:ua_name, ua_version:ua_version };

}; // function getVersion

window.os_detect.searchVersion = function(needle, haystack) {

var index = haystack.indexOf(needle);

var found_version;

if (index == -1) { return; }

found_version = haystack.substring(index+needle.length+1);

if (found_version.indexOf(' ') != -1) {

// Strip off any junk at the end such as a CLR declaration

found_version = found_version.substring(0,found_version.indexOf(' '));

}

return found_version;

};

/*

* Return -1 if a < b, 0 if a == b, 1 if a > b

*/

window.ua_ver_cmp = function(ver_a, ver_B) {

// shortcut the easy case

if (ver_a == ver_B) {

return 0;

}

a = ver_a.split(".");

b = ver_b.split(".");

for (var i = 0; i < Math.max(a.length, b.length); i++) {

// 3.0 == 3

if (!b) { b = "0"; }

if (!a) { a = "0"; }

if (a == b) { continue; }

a_int = parseInt(a);

b_int = parseInt(b);

a_rest = a.substr(a_int.toString().length);

b_rest = b.substr(b_int.toString().length);

if (a_int < b_int) {

return -1;

} else if (a_int > b_int) {

return 1;

} else { // ==

// Then we need to deal with the stuff after the ints, e.g.:

// "b4pre"

if (a_rest == "b" && b_rest.length == 0) {

return -1;

}

if (b_rest == "b" && a_rest.length == 0) {

return 1;

}

// Just give up and try a lexicographical comparison

if (a_rest < b_rest) {

return -1;

} else if (a_rest > b_rest) {

return 1;

}

}

}

// If we get here, they must be equal

return 0;

};

window.ua_ver_lt = function(a, B) {

if (-1 == this.ua_ver_cmp(a,B)) { return true; }

return false;

};

window.ua_ver_gt = function(a, B) {

if (1 == this.ua_ver_cmp(a,B)) { return true; }

return false;

};

window.ua_ver_eq = function(a, B) {

if (0 == this.ua_ver_cmp(a,B)) { return true; }

return false;

};

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...