PageRenderTime 61ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/rex/exploitation/javascriptosdetect.rb

https://bitbucket.org/jrossi/metasploit
Ruby | 897 lines | 847 code | 30 blank | 20 comment | 200 complexity | 7d63883e17ba297d5aecb0d89a3ce749 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. require 'rex/text'
  2. require 'rex/exploitation/obfuscatejs'
  3. require 'msf/core/auxiliary'
  4. module Rex
  5. module Exploitation
  6. #
  7. # Provides several javascript functions for determining the OS and browser versions of a client.
  8. #
  9. # getVersion(): returns an object with the following properties
  10. # os_name - OS name, one of the Msf::OperatingSystems constants
  11. # os_flavor - OS flavor as a string (e.g.: "XP", "2000")
  12. # os_sp - OS service pack (e.g.: "SP2", will be empty on non-Windows)
  13. # os_lang - OS language (e.g.: "en-us")
  14. # ua_name - Client name, one of the Msf::HttpClients constants
  15. # ua_version - Client version as a string (e.g.: "3.5.1", "6.0;SP2")
  16. # arch - Architecture, one of the ARCH_* constants
  17. #
  18. # The following functions work on the version returned in obj.ua_version
  19. #
  20. # ua_ver_cmp(a, b): returns -1, 0, or 1 based on whether a < b, a == b, or a > b respectively
  21. # ua_ver_lt(a, b): returns true if a < b
  22. # ua_ver_gt(a, b): returns true if a > b
  23. # ua_ver_eq(a, b): returns true if a == b
  24. #
  25. class JavascriptOSDetect < ObfuscateJS
  26. def initialize(custom_js = '', opts = {})
  27. clients = ::Msf::HttpClients
  28. oses = ::Msf::OperatingSystems
  29. @js = custom_js
  30. @js = <<ENDJS + @js
  31. /**
  32. * This can reliably detect browser versions for IE and Firefox even in the
  33. * presence of a spoofed User-Agent. OS detection is more fragile and
  34. * requires truthful navigator.appVersion and navigator.userAgent strings in
  35. * order to be accurate for more than just IE on Windows.
  36. **/
  37. function getVersion(){
  38. //Default values:
  39. var os_name;
  40. var os_flavor;
  41. var os_sp;
  42. var os_lang;
  43. var ua_name;
  44. var ua_version;
  45. var arch = "";
  46. var useragent = navigator.userAgent;
  47. // Trust but verify...
  48. var ua_is_lying = false;
  49. var version = "";
  50. //--
  51. // Client
  52. //--
  53. if (window.opera) {
  54. ua_name = "#{clients::OPERA}";
  55. if (!navigator.userAgent.match(/Opera/)) {
  56. ua_is_lying = true;
  57. }
  58. // This seems to be completely accurate, e.g. "9.21" is the return
  59. // value of opera.version() when run on Opera 9.21
  60. ua_version = opera.version();
  61. if (!os_name) {
  62. // The 'inconspicuous' argument is there to give us a real value on
  63. // Opera 6 where, without it, the return value is supposedly
  64. // 'Hm, were you only as smart as Bjorn Vermo...'
  65. // though I have not verfied this claim.
  66. switch (opera.buildNumber('inconspicuous')) {
  67. case "344": // opera-9.0-20060616.1-static-qt.i386-en-344
  68. case "2091": // opera-9.52-2091.gcc3-shared-qt3.i386.rpm
  69. case "2444": // opera-9.60.gcc4-shared-qt3.i386.rpm
  70. os_name = "#{oses::LINUX}";
  71. break;
  72. case "8502": // "Opera 9 Eng Setup.exe"
  73. case "8679": // "Opera_9.10_Eng_Setup.exe"
  74. case "8771": // "Opera_9.20_Eng_Setup.exe"
  75. case "8776": // "Opera_9.21_Eng_Setup.exe"
  76. case "8801": // "Opera_9.22_Eng_Setup.exe"
  77. case "10108": // "Opera_952_10108_en.exe"
  78. case "10467": // "Opera_962_en_Setup.exe"
  79. os_name = "#{oses::WINDOWS}";
  80. break;
  81. //default:
  82. // document.write(opera.buildNumber('inconspicuous'));
  83. // break;
  84. }
  85. }
  86. } else if (typeof window.onmousewheel != 'undefined') {
  87. // Then this is webkit, could be Safari or Chrome.
  88. // 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
  89. // 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
  90. // 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
  91. // 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
  92. // 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
  93. // Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3
  94. // Google Chrome has window.google (older versions), window.chromium (older versions), and window.window.chrome (3+)
  95. if (window.chromium || window.google || window.chrome) {
  96. ua_name = "#{clients::CHROME}";
  97. search = "Chrome";
  98. } else {
  99. ua_name = "#{clients::SAFARI}";
  100. search = "Version";
  101. }
  102. platform = navigator.platform.toLowerCase();
  103. // Just to be a pain, iPod and iPad both leave off "Safari" and
  104. // "Version" in the UA, see example above. Grab the webkit version
  105. // instead. =/
  106. if (platform.match(/ipod/)) {
  107. os_name = "#{oses::MAC_OSX}";
  108. os_flavor = "iPod";
  109. arch = "#{ARCH_ARMLE}";
  110. search = "AppleWebKit";
  111. } else if (platform.match(/ipad/)) {
  112. os_name = "#{oses::MAC_OSX}";
  113. os_flavor = "iPad";
  114. arch = "#{ARCH_ARMLE}";
  115. search = "AppleWebKit";
  116. } else if (platform.match(/iphone/)) {
  117. os_name = "#{oses::MAC_OSX}";
  118. os_flavor = "iPhone";
  119. arch = "#{ARCH_ARMLE}";
  120. } else if (platform.match(/macintel/)) {
  121. os_name = "#{oses::MAC_OSX}";
  122. arch = "#{ARCH_X86}";
  123. } else if (platform.match(/linux/)) {
  124. os_name = "#{oses::LINUX}";
  125. if (platform.match(/x86_64/)) {
  126. arch = "#{ARCH_X86_64}";
  127. } else if (platform.match(/arm/)) {
  128. // Android
  129. arch = "#{ARCH_ARMLE}";
  130. }
  131. } else if (platform.match(/windows/)) {
  132. os_name = "#{oses::WINDOWS}";
  133. }
  134. ua_version = searchVersion(search, navigator.userAgent);
  135. if (!ua_version || 0 == ua_version.length) {
  136. ua_is_lying = true;
  137. }
  138. } else if (!document.all && navigator.taintEnabled) {
  139. // Use taintEnabled to identify FF since other recent browsers
  140. // implement window.getComputedStyle now. For some reason, checking for
  141. // taintEnabled seems to cause IE 6 to stop parsing, so make sure this
  142. // isn't IE first.
  143. //
  144. // Then this is a Gecko derivative, assume Firefox since that's the
  145. // only one we have sploits for. We may need to revisit this in the
  146. // future. This works for multi/browser/mozilla_compareto against
  147. // Firefox and Mozilla, so it's probably good enough for now.
  148. ua_name = "#{clients::FF}";
  149. if (document.readyState) {
  150. ua_version = "3.6";
  151. } else if (String.trimRight) {
  152. ua_version = "3.5";
  153. } else if (document.getElementsByClassName) {
  154. ua_version = "3";
  155. } else if (window.Iterator) {
  156. ua_version = "2";
  157. } else if (Array.every) {
  158. ua_version = "1.5";
  159. } else {
  160. ua_version = "1";
  161. }
  162. if (navigator.oscpu != navigator.platform) {
  163. ua_is_lying = true;
  164. }
  165. // oscpu is unaffected by changes in the useragent and has values like:
  166. // "Linux i686"
  167. // "Windows NT 6.0"
  168. // haven't tested on 64-bit Windows
  169. version = navigator.oscpu;
  170. if (version.match(/i.86/)) {
  171. arch = "#{ARCH_X86}";
  172. }
  173. if (version.match(/x86_64/)) {
  174. arch = "#{ARCH_X86_64}";
  175. }
  176. if (version.match(/Windows/)) {
  177. os_name = "#{oses::WINDOWS}";
  178. switch(version) {
  179. case "Windows NT 5.0": os_flavor = "2000"; break;
  180. case "Windows NT 5.1": os_flavor = "XP"; break;
  181. case "Windows NT 5.2": os_flavor = "2003"; break;
  182. case "Windows NT 6.0": os_flavor = "Vista"; break;
  183. case "Windows NT 6.1": os_flavor = "7"; break;
  184. }
  185. }
  186. if (version.match(/Linux/)) {
  187. os_name = "#{oses::LINUX}";
  188. }
  189. // end navigator.oscpu checks
  190. // buildID is unaffected by changes in the useragent and typically has
  191. // the compile date which in some cases can be used to map to specific
  192. // Version & O/S (including Distro and even Arch). Depending upon the
  193. // buildID, sometime navigator.productSub will be needed.
  194. //
  195. // This technique, and the laboriously compiled associated table,
  196. // submitted by Mark Fioravanti.
  197. var buildid = navigator.buildID;
  198. switch(buildid) {
  199. case "2008041514": ua_version = "3.0.0.b5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  200. case "2008041515": ua_version = "3.0.0.b5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  201. case "2008052312": ua_version = "3.0.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  202. case "2008052906": ua_version = "3.0.0"; os_name = "#{oses::WINDOWS}"; break;
  203. case "2008052909": ua_version = "3.0.0.rc1"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  204. case "2008052912": ua_version = "3.0.0"; os_name = "#{oses::LINUX}"; break;
  205. case "2008060309": ua_version = "3.0.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  206. case "2008070205": ua_version = "2.0.0.16"; os_name = "#{oses::WINDOWS}"; break;
  207. case "2008070206": ua_version = "3.0.1"; os_name = "#{oses::LINUX}"; break;
  208. case "2008070208": ua_version = "3.0.1"; os_name = "#{oses::WINDOWS}"; break;
  209. case "2008071222": ua_version = "3.0.1"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  210. case "2008072820":
  211. switch (navigator.productSub) {
  212. case "2008072820": ua_version = "3.0.1"; os_name = "#{oses::LINUX}"; break;
  213. case "2008092313": ua_version = "3.0.2"; os_name = "#{oses::LINUX}"; break;
  214. } break;
  215. case "2008082909": ua_version = "2.0.0.17"; os_name = "#{oses::WINDOWS}"; break;
  216. case "2008091618": ua_version = "3.0.2"; os_name = "#{oses::LINUX}"; break;
  217. case "2008091620": ua_version = "3.0.2"; os_name = "#{oses::WINDOWS}"; break;
  218. case "2008092313": ua_version = "3.0.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  219. case "2008092416": ua_version = "3.0.3"; os_name = "#{oses::LINUX}"; break;
  220. case "2008092417": ua_version = "3.0.3"; os_name = "#{oses::WINDOWS}"; break;
  221. case "2008092510": ua_version = "3.0.4"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  222. case "2008101315":
  223. switch (navigator.productSub) {
  224. case "2008101315": ua_version = "3.0.3"; os_name = "#{oses::LINUX}"; break;
  225. case "2008111318": ua_version = "3.0.4"; os_name = "#{oses::LINUX}"; arch = "#{ARCH_X86}"; break;
  226. } break;
  227. case "2008102918": ua_version = "2.0.0.18"; os_name = "#{oses::WINDOWS}"; break;
  228. case "2008102920": ua_version = "3.0.4"; break;
  229. case "2008111317": ua_version = "3.0.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  230. case "2008111318": ua_version = "3.0.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  231. case "2008120119": ua_version = "2.0.0.19"; os_name = "#{oses::WINDOWS}"; break;
  232. case "2008120121": ua_version = "3.0.5"; os_name = "#{oses::LINUX}"; break;
  233. case "2008120122": ua_version = "3.0.5"; os_name = "#{oses::WINDOWS}"; break;
  234. case "2008121709": ua_version = "2.0.0.20"; os_name = "#{oses::WINDOWS}"; break;
  235. case "2009011912": ua_version = "3.0.6"; os_name = "#{oses::LINUX}"; break;
  236. case "2009011913": ua_version = "3.0.6"; os_name = "#{oses::WINDOWS}"; break;
  237. case "2009012615": ua_version = "3.0.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  238. case "2009012616": ua_version = "3.0.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  239. case "2009021906": ua_version = "3.0.7"; os_name = "#{oses::LINUX}"; break;
  240. case "2009021910": ua_version = "3.0.7"; os_name = "#{oses::WINDOWS}"; break;
  241. case "2009030422": ua_version = "3.0.8"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  242. case "2009032608": ua_version = "3.0.8"; os_name = "#{oses::LINUX}"; break;
  243. case "2009032609": ua_version = "3.0.8"; os_name = "#{oses::WINDOWS}"; break;
  244. case "2009032711": ua_version = "3.0.9"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  245. case "2009033100":
  246. switch (navigator.productSub) {
  247. case "2009033100": ua_version = "3.0.8"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  248. case "2009042113": ua_version = "3.0.9"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  249. } break;
  250. case "2009040820": ua_version = "3.0.9"; os_name = "#{oses::LINUX}"; break;
  251. case "2009040821": ua_version = "3.0.9"; os_name = "#{oses::WINDOWS}"; break;
  252. case "2009042113": ua_version = "3.0.10"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  253. case "2009042114": ua_version = "3.0.10"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  254. case "2009042315": ua_version = "3.0.10"; os_name = "#{oses::LINUX}"; break;
  255. case "2009042316": ua_version = "3.0.10"; os_name = "#{oses::WINDOWS}"; break;
  256. case "20090427153806": ua_version = "3.5.0.b4"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  257. case "20090427153807": ua_version = "3.5.0.b4"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  258. case "2009060214": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; break;
  259. case "2009060215": ua_version = "3.0.11"; os_name = "#{oses::WINDOWS}"; break;
  260. case "2009060308":
  261. switch (navigator.productSub) {
  262. case "2009060308": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  263. case "2009070811": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  264. } break;
  265. case "2009060309":
  266. switch (navigator.productSub) {
  267. case "2009060309": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  268. case "2009070811": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  269. } break;
  270. case "2009060310": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; os_flavor = "BackTrack"; break;
  271. case "2009062005": ua_version = "3.0.11"; os_name = "#{oses::LINUX}"; os_flavor = "PCLunixOS"; break;
  272. case "20090624012136": ua_version = "3.5.0"; os_name = "#{oses::MAC_OSX}"; break;
  273. case "20090624012820": ua_version = "3.5.0"; os_name = "#{oses::LINUX}"; break;
  274. case "20090701234143": ua_version = "3.5.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  275. case "20090702060527": ua_version = "3.5.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
  276. case "2009070610": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; break;
  277. case "2009070611": ua_version = "3.0.12"; os_name = "#{oses::WINDOWS}"; break;
  278. case "2009070811": ua_version = "3.0.13"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  279. case "20090715083437": ua_version = "3.5.1"; os_name = "#{oses::MAC_OSX}"; break;
  280. case "20090715083816": ua_version = "3.5.1"; os_name = "#{oses::LINUX}"; break;
  281. case "20090715094852": ua_version = "3.5.1"; os_name = "#{oses::WINDOWS}"; break;
  282. case "2009072202": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; os_flavor = "Oracle"; break;
  283. case "2009072711": ua_version = "3.0.12"; os_name = "#{oses::LINUX}"; os_flavor = "CentOS"; break;
  284. case "20090729211433": ua_version = "3.5.2"; os_name = "#{oses::MAC_OSX}"; break;
  285. case "20090729211829": ua_version = "3.5.2"; os_name = "#{oses::LINUX}"; break;
  286. case "20090729225027": ua_version = "3.5.2"; os_name = "#{oses::WINDOWS}"; break;
  287. case "2009073021": ua_version = "3.0.13"; os_name = "#{oses::LINUX}"; break;
  288. case "2009073022": ua_version = "3.0.13"; os_name = "#{oses::WINDOWS}"; break;
  289. case "20090824085414": ua_version = "3.5.3"; os_name = "#{oses::MAC_OSX}"; break;
  290. case "20090824085743": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; break;
  291. case "20090824101458": ua_version = "3.5.3"; os_name = "#{oses::WINDOWS}"; break;
  292. case "2009082707": ua_version = "3.0.14"; break;
  293. case "2009090216": ua_version = "3.0.14"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  294. case "20090914014745": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; arch = "#{ARCH_X86}"; break;
  295. case "20090915065903": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86_64}"; break;
  296. case "20090915070141": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86}"; break;
  297. case "20091007090112": ua_version = "3.5.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
  298. 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
  299. case "2009101600":
  300. switch (navigator.productSub) {
  301. case "2009101600": ua_version = "3.0.15"; break; // Can be either Mac or Linux
  302. case "20091016": ua_version = "3.5.4"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; arch = "#{ARCH_X86}"; break;
  303. } break;
  304. case "2009101601": ua_version = "3.0.15"; os_name = "#{oses::WINDOWS}"; break;
  305. case "20091016081620": ua_version = "3.5.4"; os_name = "#{oses::MAC_OSX}"; break;
  306. case "20091016081727": ua_version = "3.5.4"; os_name = "#{oses::LINUX}"; break;
  307. case "20091016092926": ua_version = "3.5.4"; os_name = "#{oses::WINDOWS}"; break;
  308. 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
  309. case "2009102814":
  310. switch (navigator.productSub) {
  311. case "2009121601": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  312. case "2009121602": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  313. case "2010010604": ua_version = "3.0.17"; os_name = "#{oses::LINUX}"; os_flavor = "Mint"; break;
  314. case "2010021501": ua_version = "3.0.17;xul1.9.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "Mint"; arch = "#{ARCH_X86}"; break;
  315. case "2010021502": ua_version = "3.0.17;xul1.9.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "Mint"; arch = "#{ARCH_X86_64}"; break;
  316. } break;
  317. case "2009102815":
  318. switch (navigator.productSub) {
  319. case "2009102815": ua_version = "3.0.15"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  320. case "2009121601": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  321. } break;
  322. case "20091029152254": ua_version = "3.6.0.b1"; os_name = "#{oses::LINUX}"; break;
  323. case "20091029171059": ua_version = "3.6.0.b1"; os_name = "#{oses::WINDOWS}"; break;
  324. case "20091102134505": ua_version = "3.5.5"; os_name = "#{oses::MAC_OSX}"; break;
  325. case "20091102141836": ua_version = "3.5.5"; os_name = "#{oses::LINUX}"; break;
  326. case "20091102152451": ua_version = "3.5.5"; os_name = "#{oses::WINDOWS}"; break;
  327. case "2009110421": ua_version = "3.0.15"; os_name = "#{oses::FREEBSD}"; arch = "#{ARCH_X86}"; break;
  328. case "20091106091959": ua_version = "3.5.5"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; arch = "#{ARCH_X86}"; break;
  329. case "20091106140514": ua_version = "3.5.5"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  330. case "20091106145609": ua_version = "3.5.5"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
  331. case "20091108163911": ua_version = "3.6.0.b2"; os_name = "#{oses::LINUX}"; break;
  332. case "20091108181924": ua_version = "3.6.0.b2"; os_name = "#{oses::WINDOWS}"; break;
  333. case "20091109125225":
  334. switch (navigator.productSub) {
  335. case "20091109": ua_version = "3.5.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  336. case "20091215": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  337. } break;
  338. case "20091109134913": ua_version = "3.5.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  339. case "20091115172547": ua_version = "3.6.0.b3"; os_name = "#{oses::LINUX}"; break;
  340. case "20091115182845": ua_version = "3.6.0.b3"; os_name = "#{oses::WINDOWS}"; break;
  341. case "20091124201530": ua_version = "3.6.0.b4"; os_name = "#{oses::MAC_OSX}"; break;
  342. case "20091124201751": ua_version = "3.6.0.b4"; os_name = "#{oses::LINUX}"; break;
  343. case "20091124213835": ua_version = "3.6.0.b4"; os_name = "#{oses::WINDOWS}"; break;
  344. case "2009120100": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
  345. case "20091201203240": ua_version = "3.5.6"; os_name = "#{oses::MAC_OSX}"; break;
  346. case "20091201204959": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; break;
  347. case "20091201220228": ua_version = "3.5.6"; os_name = "#{oses::WINDOWS}"; break;
  348. case "2009120206": ua_version = "3.0.16"; break; // Can be either Mac or Linux
  349. case "2009120208": ua_version = "3.0.16"; os_name = "#{oses::WINDOWS}"; break;
  350. case "20091204132459": ua_version = "3.6.0.b5"; os_name = "#{oses::LINUX}"; break;
  351. case "20091204132509": ua_version = "3.6.0.b5"; os_name = "#{oses::MAC_OSX}"; break;
  352. case "20091204143806": ua_version = "3.6.0.b5"; os_name = "#{oses::WINDOWS}"; break;
  353. case "20091215230859": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  354. case "20091215230946": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  355. case "20091215231400": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
  356. case "20091215231754":
  357. switch (navigator.productSub) {
  358. case "20091215": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  359. 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
  360. } break;
  361. case "2009121601":
  362. switch (navigator.productSub) {
  363. case "2009121601": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  364. case "2010010604": ua_version = "3.0.17"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break; // Could also be Mint x86-64
  365. } break;
  366. case "2009121602": ua_version = "3.0.17"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  367. case "20091216104148": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; break;
  368. case "20091216132458": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  369. case "20091216132537": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  370. case "20091216142458": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  371. case "20091216142519": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  372. case "2009121708": ua_version = "3.0.16"; os_name = "#{oses::LINUX}"; os_flavor = "CentOS"; arch = "#{ARCH_X86}"; break;
  373. case "2009122115": ua_version = "3.0.17"; break; // Can be either Mac or Linux
  374. case "2009122116": ua_version = "3.0.17"; os_name = "#{oses::WINDOWS}"; break;
  375. case "20091221151141": ua_version = "3.5.7"; os_name = "#{oses::MAC_OSX}"; break;
  376. case "20091221152502": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; break;
  377. case "20091221164558": ua_version = "3.5.7"; os_name = "#{oses::WINDOWS}"; break;
  378. case "2009122200": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
  379. case "20091223231431": ua_version = "3.5.6"; os_name = "#{oses::LINUX}"; os_flavor = "PCLunixOS"; arch = "#{ARCH_X86}"; break;
  380. case "20100105194006": ua_version = "3.6.0.rc1"; os_name = "#{oses::MAC_OSX}"; break;
  381. case "20100105194116": ua_version = "3.6.0.rc1"; os_name = "#{oses::LINUX}"; break;
  382. case "20100105212446": ua_version = "3.6.0.rc1"; os_name = "#{oses::WINDOWS}"; break;
  383. case "2010010604": ua_version = "3.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  384. case "2010010605": ua_version = "3.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  385. case "20100106054534": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
  386. 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
  387. case "20100106211825": ua_version = "3.5.7"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  388. case "20100106212742": ua_version = "3.5.7"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
  389. case "20100106215614": ua_version = "3.5.7"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  390. case "20100110112429": ua_version = "3.5.7"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; break;
  391. case "20100115132715": ua_version = "3.6.0"; os_name = "#{oses::MAC_OSX}"; break;
  392. case "20100115133306": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; break;
  393. case "20100115144158": ua_version = "3.6.0"; os_name = "#{oses::WINDOWS}"; break;
  394. case "20100125074043": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
  395. 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
  396. case "20100125204847": ua_version = "3.6.0"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86}"; break; // Could also be Mint x86
  397. 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
  398. case "20100202152834": ua_version = "3.5.8"; os_name = "#{oses::MAC_OSX}"; break;
  399. case "20100202153512": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; break;
  400. case "20100202165920": ua_version = "3.5.8"; os_name = "#{oses::WINDOWS}"; break;
  401. case "2010020219": ua_version = "3.0.18"; os_name = "#{oses::MAC_OSX}"; break;
  402. case "2010020220": ua_version = "3.0.18"; os_name = "#{oses::WINDOWS}"; break;
  403. case "2010020400": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
  404. case "20100212131909": ua_version = "3.6.0.2"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  405. case "20100212132013": ua_version = "3.6.0.2"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  406. case "20100216105329": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  407. case "20100216105348": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  408. case "20100216105410": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  409. case "20100216110009": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  410. case "2010021718": ua_version = "3.0.18"; os_name = "#{oses::LINUX}"; os_flavor = "CentOS"; arch = "#{ARCH_X86}"; break;
  411. case "20100218022359": ua_version = "3.6.0.4"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  412. case "20100218022705": ua_version = "3.6.0.4"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  413. case "20100218112915": ua_version = "3.5.8"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; arch = "#{ARCH_X86}"; break;
  414. case "20100222120605": ua_version = "3.6.0.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  415. case "20100222120717": ua_version = "3.6.0.5"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  416. case "20100301015346": ua_version = "3.6.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  417. case "20100305054927": ua_version = "3.6.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
  418. case "20100307204001": ua_version = "3.6.0"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  419. case "20100308142847": ua_version = "3.6.0.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  420. case "20100308151019": ua_version = "3.6.0.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  421. case "2010031218": ua_version = "3.0.19"; break; // Mac OS X or Linux
  422. case "2010031422": ua_version = "3.0.19"; os_name = "#{oses::WINDOWS}"; break;
  423. case "20100315075757": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; break;
  424. case "20100315080228": ua_version = "3.5.9"; os_name = "#{oses::MAC_OSX}"; break;
  425. case "20100315083431": ua_version = "3.5.9"; os_name = "#{oses::WINDOWS}"; break;
  426. case "20100316055951": ua_version = "3.6.2"; os_name = "#{oses::MAC_OSX}"; break;
  427. case "20100316060223": ua_version = "3.6.2"; os_name = "#{oses::LINUX}"; break;
  428. case "20100316074819": ua_version = "3.6.2"; os_name = "#{oses::WINDOWS}"; break;
  429. case "2010031700": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
  430. case "20100323102218": ua_version = "3.6.2"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  431. case "20100323102339": ua_version = "3.6.2"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  432. case "20100323194640": ua_version = "3.6.2"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
  433. case "20100324182054": ua_version = "3.6.2"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  434. case "20100330071911": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  435. case "20100330072017": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  436. case "20100330072020": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  437. case "20100330072034": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  438. case "20100401064631": ua_version = "3.6.3"; os_name = "#{oses::MAC_OSX}"; break;
  439. case "20100401074458": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; break;
  440. case "20100401080539": ua_version = "3.6.3"; os_name = "#{oses::WINDOWS}"; break;
  441. case "20100401144201": ua_version = "3.6.2"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  442. case "2010040116": ua_version = "3.0.19"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  443. case "2010040118": ua_version = "3.0.19"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  444. case "2010040119": ua_version = "3.0.19"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  445. case "2010040121": ua_version = "3.0.19"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  446. case "20100401213457": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  447. case "2010040123": ua_version = "3.0.19"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  448. case "2010040200": ua_version = "3.0.19"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  449. case "20100402010516": ua_version = "3.5.9"; os_name = "#{oses::LINUX}"; os_flavor = "Mint"; arch = "#{ARCH_X86_64}"; break;
  450. case "20100402041908": ua_version = "3.6.2"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  451. case "20100403042003": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  452. case "20100403082016": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  453. case "20100404024515": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  454. case "20100404024646": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  455. case "20100404104043": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "PClinuxOS"; arch = "#{ARCH_X86_64}"; break;
  456. case "20100409151117": ua_version = "3.6.3.2"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  457. case "20100409170726": ua_version = "3.6.3.2"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  458. case "20100412125148": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; arch = "#{ARCH_X86}"; break;
  459. case "20100413152922": ua_version = "3.6.4.b1"; os_name = "#{oses::MAC_OSX}"; break;
  460. case "20100413154310": ua_version = "3.6.4.b1"; os_name = "#{oses::LINUX}"; break;
  461. case "20100413172113": ua_version = "3.6.4.b1"; os_name = "#{oses::WINDOWS}"; break;
  462. case "20100415062243": ua_version = "3.6.3.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  463. case "20100415103754": ua_version = "3.6.3.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  464. case "20100416101101": ua_version = "3.6.3.2"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; arch = "#{ARCH_X86}"; break;
  465. case "2010041700": ua_version = "3.6.4.1"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
  466. case "20100419015333": ua_version = "3.6.3"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
  467. case "20100423043606": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86_64}"; break;
  468. case "20100423140709": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  469. case "20100423141150": ua_version = "3.6.3"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  470. case "20100423142835": ua_version = "3.6.3"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  471. case "20100502202326": ua_version = "3.6.4.b2"; os_name = "#{oses::LINUX}"; break;
  472. case "20100502202401": ua_version = "3.6.4.b2"; os_name = "#{oses::MAC_OSX}"; break;
  473. case "20100502221517": ua_version = "3.6.4.b2"; os_name = "#{oses::WINDOWS}"; break;
  474. case "20100503113315": ua_version = "3.6.4.b3"; os_name = "#{oses::MAC_OSX}"; break;
  475. case "20100503113541": ua_version = "3.6.4.b3"; os_name = "#{oses::LINUX}"; break;
  476. case "20100503122926": ua_version = "3.6.4.b3"; os_name = "#{oses::WINDOWS}"; break;
  477. case "20100504085637": ua_version = "3.5.10"; os_name = "#{oses::LINUX}"; break;
  478. case "20100504085753": ua_version = "3.5.10"; os_name = "#{oses::MAC_OSX}"; break;
  479. case "20100504093643": ua_version = "3.5.10"; os_name = "#{oses::WINDOWS}"; break;
  480. case "2010050600": ua_version = "3.5.10"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
  481. case "2010051300": ua_version = "3.6.4.1"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
  482. case "20100513134853": ua_version = "3.6.4.b4"; os_name = "#{oses::MAC_OSX}"; break;
  483. case "20100513140540": ua_version = "3.6.4.b4"; os_name = "#{oses::LINUX}"; break;
  484. case "20100513144105": ua_version = "3.6.4.b4"; os_name = "#{oses::WINDOWS}"; break;
  485. case "20100513190740": ua_version = "3.6.3"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
  486. case "20100523180910": ua_version = "3.6.4.b5"; os_name = "#{oses::MAC_OSX}"; break;
  487. case "20100523181754": ua_version = "3.6.4.b5"; os_name = "#{oses::LINUX}"; break;
  488. case "20100523185824": ua_version = "3.6.4.b5"; os_name = "#{oses::WINDOWS}"; break;
  489. case "20100527084110": ua_version = "3.6.4.b6"; os_name = "#{oses::MAC_OSX}"; break;
  490. case "20100527085242": ua_version = "3.6.4.b6"; os_name = "#{oses::LINUX}"; break;
  491. case "20100527093236": ua_version = "3.6.4.b6"; os_name = "#{oses::WINDOWS}"; break;
  492. case "2010061100": ua_version = "3.6.4"; os_name = "#{oses::LINUX}"; os_flavor = "SUSE"; break;
  493. case "20100611134546": ua_version = "3.6.4.b7"; os_name = "#{oses::MAC_OSX}"; break;
  494. case "20100611135942": ua_version = "3.6.4.b7"; os_name = "#{oses::LINUX}"; break;
  495. case "20100611143157": ua_version = "3.6.4.b7"; os_name = "#{oses::WINDOWS}"; break;
  496. case "20100622203044": ua_version = "3.6.4"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  497. case "20100622203045": ua_version = "3.6.4"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  498. case "20100622204750": ua_version = "3.5.10"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86_64}"; break;
  499. case "20100622204830": ua_version = "3.5.10"; os_name = "#{oses::LINUX}"; os_flavor = "Fedora"; arch = "#{ARCH_X86}"; break;
  500. case "20100622205038": ua_version = "3.6.4"; os_name = "#{oses::LINUX}"; os_flavor = "PClinuxOS"; arch = "#{ARCH_X86_64}"; break;
  501. case "20100623081410": ua_version = "3.6.4"; os_name = "#{oses::LINUX}"; os_flavor = "CentOS"; arch = "#{ARCH_X86_64}"; break;
  502. case "20100623081921": ua_version = "3.6.4"; os_name = "#{oses::LINUX}"; os_flavor = "CentOS"; arch = "#{ARCH_X86}"; break;
  503. case "20100623155731": ua_version = "3.6.4.b7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  504. case "20100623200132": ua_version = "3.6.4.b7"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  505. case "20100625222733": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; break;
  506. case "20100625223402": ua_version = "3.6.6"; os_name = "#{oses::MAC_OSX}"; break;
  507. case "20100625231939": ua_version = "3.6.6"; os_name = "#{oses::WINDOWS}"; break;
  508. case "20100626104508": ua_version = "3.6.4"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86}"; break;
  509. case "20100627211341": ua_version = "3.6.4"; os_name = "#{oses::FREEBSD}"; os_flavor = "PC-BSD"; arch = "#{ARCH_X86_64}"; break;
  510. case "20100628082832": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "PClinuxOS"; arch = "#{ARCH_X86_64}"; break;
  511. case "20100628124739": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  512. case "20100628143222": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  513. case "20100628232431": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  514. case "20100629034705": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  515. case "20100629105354": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "Mandriva"; arch = "#{ARCH_X86}"; break;
  516. case "20100630130433": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  517. case "20100630131607": ua_version = "4.0.0.b1"; os_name = "#{oses::MAC_OSX}"; break;
  518. case "20100630132217": ua_version = "4.0.0.b1"; os_name = "#{oses::LINUX}"; break;
  519. case "20100630141702": ua_version = "4.0.0.b1"; os_name = "#{oses::WINDOWS}"; break;
  520. case "20100630174226": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86_64}"; break;
  521. case "20100630180611": ua_version = "3.6.6"; os_name = "#{oses::LINUX}"; os_flavor = "Sabayon"; arch = "#{ARCH_X86}"; break;
  522. case "20100709115208": ua_version = "3.6.7.b1"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86}"; break;
  523. case "20100709183408": ua_version = "3.6.7.b1"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  524. case "20100716093011": ua_version = "3.6.7.b2"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; arch = "#{ARCH_X86_64}"; break;
  525. case "20101203075014": ua_version = "3.6.13"; os_name = "#{oses::WINDOWS}"; break;
  526. case "20101206122825": ua_version = "3.6.13"; os_name = "#{oses::LINUX}"; os_flavor = "Ubuntu"; break;
  527. default:
  528. version = searchVersion("Firefox", navigator.userAgent);
  529. // Verify whether the ua string is lying by checking if it contains
  530. // the major version we detected using known objects above. If it
  531. // appears to be truthful, then use its more precise version number.
  532. if (version && version.split(".")[0] == ua_version.split(".")[0]) {
  533. // The version number will sometimes end with a space or end of
  534. // line, so strip off anything after a space if one exists
  535. if (-1 != version.indexOf(" ")) {
  536. version = version.substr(0,version.indexOf(" "));
  537. }
  538. ua_version = version;
  539. } else {
  540. ua_is_lying = true;
  541. }
  542. break;
  543. }
  544. //if (ua_is_lying) { alert("UA is lying"); }
  545. //alert(ua_version + " vs " + navigator.userAgent);
  546. // end navigator.buildID checks
  547. } else if (typeof ScriptEngineMajorVersion == "function") {
  548. // Then this is IE and we can very reliably detect the OS.
  549. // Need to add detection for IE on Mac. Low priority, since we
  550. // don't have any sploits for it yet and it's a very low market
  551. // share.
  552. os_name = "#{oses::WINDOWS}";
  553. ua_name = "#{clients::IE}";
  554. version = ScriptEngineMajorVersion().toString();
  555. version += ScriptEngineMinorVersion().toString();
  556. version += ScriptEngineBuildVersion().toString();
  557. //document.write("ScriptEngine: "+version+"<br />");
  558. switch (version){
  559. case "514615":
  560. // IE 5.00.2920.0000, 2000 Advanced Server SP0 English
  561. ua_version = "5.0";
  562. os_flavor = "2000";
  563. os_sp = "SP0";
  564. break;
  565. case "515907":
  566. os_flavor = "2000";
  567. os_sp = "SP3"; //or SP2: oCC.getComponentVersion('{22d6f312-b0f6-11d0-94ab-0080c74c7e95}', 'componentid') => 6,4,9,1109
  568. break;
  569. case "518513":
  570. os_flavor = "2000";
  571. os_sp = "SP4";
  572. break;
  573. case "566626":
  574. // IE 6.0.2600.0000, XP SP0 English
  575. // IE 6.0.2800.1106, XP SP1 English
  576. ua_version = "6.0";
  577. os_flavor = "XP";
  578. os_sp = "SP0";
  579. break;
  580. case "568515":
  581. // IE 6.0.3790.0, 2003 Standard SP0 English
  582. ua_version = "6.0";
  583. os_flavor = "2003";
  584. os_sp = "SP0";
  585. break;
  586. case "568820":
  587. // IE 6.0.2900.2180, xp sp2 english
  588. os_flavor = "XP";
  589. os_sp = "SP2";
  590. break;
  591. case "568827":
  592. os_flavor = "2003";
  593. os_sp = "SP1";
  594. break;
  595. case "568831": //XP SP2 -OR- 2K SP4
  596. if (os_flavor == "2000"){
  597. os_sp = "SP4";
  598. }
  599. else{
  600. os_flavor = "XP";
  601. os_sp = "SP2";
  602. }
  603. break;
  604. case "568832":
  605. os_flavor = "2003";
  606. os_sp = "SP2";
  607. break;
  608. case "575730":
  609. // IE 7.0.5730.13, Server 2003 Standard SP2 English
  610. // IE 7.0.5730.13, Server 2003 Standard SP1 English
  611. // IE 7.0.5730.13, XP Professional SP2 English
  612. // Rely on the user agent matching above to determine the OS.
  613. // This will incorrectly identify 2k3 SP1 as SP2
  614. ua_version = "7.0";
  615. os_sp = "SP2";
  616. break;
  617. case "5716599":
  618. // IE 7.0.5730.13, XP Professional SP3 English
  619. case "5718066":
  620. // IE 7.0.5730.13, XP Professional SP3 English
  621. ua_version = "7.0";
  622. os_flavor = "XP";
  623. os_sp = "SP3";
  624. break;
  625. case "5822960":
  626. // IE 8.0.6001.18702, XP Professional SP3 Greek
  627. case "5818702":
  628. // IE 8.0.6001.18702, XP Professional SP3 English
  629. ua_version = "8.0";
  630. os_flavor = "XP";
  631. os_sp = "SP3";
  632. break;
  633. case "580":
  634. // IE 8.0.7100.0, Windows 7 English
  635. // IE 8.0.7100.0, Windows 7 64-bit English
  636. case "5816385":
  637. // IE 8.0.7600.16385, Windows 7 English
  638. case "5816475":
  639. ua_version = "8.0";
  640. os_flavor = "7";
  641. os_sp = "SP0";
  642. break;
  643. case "9016406":
  644. // IE 9.0.7930.16406, Windows 7 64-bit
  645. ua_version = "9.0";
  646. os_flavor = "7";
  647. os_sp = "SP0";
  648. break;
  649. //default:
  650. // document.writeln(version);
  651. // break;
  652. }
  653. if (!ua_version) {
  654. // The ScriptEngine functions failed us, try some object detection
  655. if (document.documentElement && (typeof document.documentElement.style.maxHeight)!="undefined") {
  656. // IE8 detection straight from IEBlog. Thank you Microsoft.
  657. try {
  658. ua_version = "8.0";
  659. document.documentElement.style.display = "table-cell";
  660. } catch(e) {
  661. // This executes in IE7,
  662. // but not IE8, regardless of mode
  663. ua_version = "7.0";
  664. }
  665. } else if (document.compatMode) {
  666. ua_version = "6.0";
  667. } else if (window.createPopup) {
  668. ua_version = "5.5";
  669. } else if (window.attachEvent) {
  670. ua_version = "5.0";
  671. } else {
  672. ua_version = "4.0";
  673. }
  674. switch (navigator.appMinorVersion){
  675. case ";SP2;":
  676. ua_version += ";SP2";
  677. break;
  678. }
  679. }
  680. }
  681. if (!os_name && navigator.platform == "Win32") { os_name = "#{oses::WINDOWS}"; }
  682. //--
  683. // Flavor
  684. //--
  685. if (!ua_is_lying) {
  686. version = useragent.toLowerCase();
  687. } else if (navigator.oscpu) {
  688. // Then this is Gecko and we can get at least os_name without the
  689. // useragent
  690. version = navigator.oscpu.toLowerCase();
  691. } else {
  692. // All we have left is the useragent and we know it's lying, so don't bother
  693. version = " ";
  694. }
  695. if (!os_name || 0 == os_name.length) {
  696. if (version.indexOf("windows") != -1) { os_name = "#{oses::WINDOWS}"; }
  697. else if (version.indexOf("mac") != -1) { os_name = "#{oses::MAC_OSX}"; }
  698. else if (version.indexOf("linux") != -1) { os_name = "#{oses::LINUX}"; }
  699. }
  700. if (os_name == "#{oses::WINDOWS}" && (!os_flavor || 0 == os_flavor.length)) {
  701. if (version.indexOf("windows 95") != -1) { os_flavor = "95"; }
  702. else if (version.indexOf("windows nt 4") != -1) { os_flavor = "NT"; }
  703. else if (version.indexOf("win 9x 4.9") != -1) { os_flavor = "ME"; }
  704. else if (version.indexOf("windows 98") != -1) { os_flavor = "98"; }
  705. else if (version.indexOf("windows nt 5.0") != -1) { os_flavor = "2000"; }
  706. else if (version.indexOf("windows nt 5.1") != -1) { os_flavor = "XP"; }
  707. else if (version.indexOf("windows nt 5.2") != -1) { os_flavor = "2003"; }
  708. else if (version.indexOf("windows nt 6.0") != -1) { os_flavor = "Vista"; }
  709. else if (version.indexOf("windows nt 6.1") != -1) { os_flavor = "7"; }
  710. }
  711. if (os_name == "#{oses::LINUX}" && (!os_flavor || 0 == os_flavor.length)) {
  712. if (version.indexOf("gentoo") != -1) { os_flavor = "Gentoo"; }
  713. else if (version.indexOf("ubuntu") != -1) { os_flavor = "Ubuntu"; }
  714. else if (version.indexOf("debian") != -1) { os_flavor = "Debian"; }
  715. else if (version.indexOf("rhel") != -1) { os_flavor = "RHEL"; }
  716. else if (version.indexOf("red hat") != -1) { os_flavor = "RHEL"; }
  717. else if (version.indexOf("centos") != -1) { os_flavor = "CentOS"; }
  718. else if (version.indexOf("fedora") != -1) { os_flavor = "Fedora"; }
  719. else if (version.indexOf("android") != -1) { os_flavor = "Android"; }
  720. }
  721. //--
  722. // Language
  723. //--
  724. if (navigator.systemLanguage) {
  725. // ie
  726. os_lang = navigator.systemLanguage;
  727. } else if (navigator.language) {
  728. // gecko derivatives, safari, opera
  729. os_lang = navigator.language;
  730. } else {
  731. // some other browser and we don't know how to get the language, so
  732. // just guess english
  733. os_lang = "en";
  734. }
  735. //--
  736. // Architecture
  737. //--
  738. if (typeof(navigator.cpuClass) != 'undefined') {
  739. // Then this is IE or Opera9+ and we can grab the arch directly
  740. switch (navigator.cpuClass) {
  741. case "x86":
  742. arch = "#{ARCH_X86}";
  743. break;
  744. case "x64":
  745. arch = "#{ARCH_X86_64}";
  746. break;
  747. }
  748. }
  749. if (!arch || 0 == arch.length) {
  750. // We don't have the handy-dandy navagator.cpuClass, so infer from
  751. // platform
  752. version = navigator.platform;
  753. //document.write(version + "\\n");
  754. // IE 8 does a bit of wacky user-agent switching for "Compatibility View";
  755. // 64-bit client on Windows 7, 64-bit:
  756. // Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)
  757. // 32-bit client on Windows 7, 64-bit:
  758. // Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)
  759. // 32-bit client on Vista, 32-bit, "Compatibility View":
  760. // Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)
  761. //
  762. // Report 32-bit client on 64-bit OS as being 32 because exploits will
  763. // need to know the bittedness of the process, not the OS.
  764. if ( ("Win32" == version) || (version.match(/i.86/)) ) {
  765. arch = "#{ARCH_X86}";
  766. } else if (-1 != version.indexOf('x64') || (-1 != version.indexOf('x86_64'))) {
  767. arch = "#{ARCH_X86_64}";
  768. } else if (-1 != version.indexOf('PPC')) {
  769. arch = "#{ARCH_PPC}";
  770. }
  771. }
  772. 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 };
  773. } // function getVersion
  774. function searchVersion(needle, haystack) {
  775. var index = haystack.indexOf(needle);
  776. var found_version;
  777. if (index == -1) { return; }
  778. found_version = haystack.substring(index+needle.length+1);
  779. if (found_version.indexOf(' ') != -1) {
  780. // Strip off any junk at the end such as a CLR declaration
  781. found_version = found_version.substring(0,found_version.indexOf(' '));
  782. }
  783. return found_version;
  784. }
  785. /*
  786. * Return -1 if a < b, 0 if a == b, 1 if a > b
  787. */
  788. function ua_ver_cmp(ver_a, ver_b) {
  789. // shortcut the easy case
  790. if (ver_a == ver_b) {
  791. return 0;
  792. }
  793. a = ver_a.split(".");
  794. b = ver_b.split(".");
  795. for (i = 0; i < Math.max(a.length, b.length); i++) {
  796. // 3.0 == 3
  797. if (!b[i]) { b[i] = "0"; }
  798. if (!a[i]) { a[i] = "0"; }
  799. if (a[i] == b[i]) { continue; }
  800. a_int = parseInt(a[i]);
  801. b_int = parseInt(b[i]);
  802. a_rest = a[i].substr(a_int.toString().length);
  803. b_rest = b[i].substr(b_int.toString().length);
  804. if (a_int < b_int) {
  805. return -1;
  806. } else if (a_int > b_int) {
  807. return 1;
  808. } else { // ==
  809. // Then we need to deal with the stuff after the ints, e.g.:
  810. // "b4pre"
  811. if (a_rest == "b" && b_rest.length == 0) {
  812. return -1;
  813. }
  814. if (b_rest == "b" && a_rest.length == 0) {
  815. return 1;
  816. }
  817. // Just give up and try a lexicographical comparison
  818. if (a_rest < b_rest) {
  819. return -1;
  820. } else if (a_rest > b_rest) {
  821. retu

Large files files are truncated, but you can click here to view the full file