PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/Applet/src/edu/internet2/ndt/UserAgentTools.java

http://ndt.googlecode.com/
Java | 451 lines | 412 code | 9 blank | 30 comment | 220 complexity | 388daab299a2ee7a74386596fdc8078a MD5 | raw file
Possible License(s): Apache-2.0
  1. package edu.internet2.ndt;
  2. /* This class has code taken from
  3. * http://nerds.palmdrive.net/useragent/code.html
  4. *
  5. * Class used to obtain information about who is accessing a web-server.
  6. *
  7. * When a web browser accesses a web-server, it usually transmits a "User-Agent" string.
  8. * This is expected to include the name and versions of the browser and
  9. * the underlying Operating System. Though the information inside a user-agent string is not restricted to
  10. * these alone, currently, NDT uses this to get Browser OS only.
  11. *
  12. */
  13. public class UserAgentTools {
  14. public static String getFirstVersionNumber(String a_userAgent,
  15. int a_position, int numDigits) {
  16. String ver = getVersionNumber(a_userAgent, a_position);
  17. if (ver == null)
  18. return "";
  19. int i = 0;
  20. String res = "";
  21. while (i < ver.length() && i < numDigits) {
  22. res += String.valueOf(ver.charAt(i));
  23. i++;
  24. }
  25. return res;
  26. }
  27. public static String getVersionNumber(String a_userAgent, int a_position) {
  28. if (a_position < 0)
  29. return "";
  30. StringBuffer res = new StringBuffer();
  31. int status = 0;
  32. while (a_position < a_userAgent.length()) {
  33. char c = a_userAgent.charAt(a_position);
  34. switch (status) {
  35. case 0: // <SPAN class="codecomment"> No valid digits encountered
  36. // yet</span>
  37. if (c == ' ' || c == '/')
  38. break;
  39. if (c == ';' || c == ')')
  40. return "";
  41. status = 1;
  42. case 1: // <SPAN class="codecomment"> Version number in
  43. // progress</span>
  44. if (c == ';' || c == '/' || c == ')' || c == '(' || c == '[')
  45. return res.toString().trim();
  46. if (c == ' ')
  47. status = 2;
  48. res.append(c);
  49. break;
  50. case 2: // <SPAN class="codecomment"> Space encountered - Might need
  51. // to end the parsing</span>
  52. if ((Character.isLetter(c) && Character.isLowerCase(c))
  53. || Character.isDigit(c)) {
  54. res.append(c);
  55. status = 1;
  56. } else
  57. return res.toString().trim();
  58. break;
  59. }
  60. a_position++;
  61. }
  62. return res.toString().trim();
  63. }
  64. public static String[] getArray(String a, String b, String c) {
  65. String[] res = new String[3];
  66. res[0] = a;
  67. res[1] = b;
  68. res[2] = c;
  69. return res;
  70. }
  71. public static String[] getBotName(String userAgent) {
  72. userAgent = userAgent.toLowerCase();
  73. int pos = 0;
  74. String res = null;
  75. if ((pos = userAgent.indexOf("help.yahoo.com/")) > -1) {
  76. res = "Yahoo";
  77. pos += 7;
  78. } else if ((pos = userAgent.indexOf("google/")) > -1) {
  79. res = "Google";
  80. pos += 7;
  81. } else if ((pos = userAgent.indexOf("msnbot/")) > -1) {
  82. res = "MSNBot";
  83. pos += 7;
  84. } else if ((pos = userAgent.indexOf("googlebot/")) > -1) {
  85. res = "Google";
  86. pos += 10;
  87. } else if ((pos = userAgent.indexOf("webcrawler/")) > -1) {
  88. res = "WebCrawler";
  89. pos += 11;
  90. } else if ((pos = userAgent.indexOf("inktomi")) > -1) {
  91. // <SPAN class="codecomment"> The following two bots don't have any
  92. // version number in their User-Agent strings.</span>
  93. res = "Inktomi";
  94. pos = -1;
  95. } else if ((pos = userAgent.indexOf("teoma")) > -1) {
  96. res = "Teoma";
  97. pos = -1;
  98. }
  99. if (res == null)
  100. return null;
  101. return getArray(res, res, res + getVersionNumber(userAgent, pos));
  102. }
  103. public static String[] getOS(String userAgent) {
  104. if (getBotName(userAgent) != null)
  105. return getArray("Bot", "Bot", "Bot");
  106. String[] res = null;
  107. int pos;
  108. if ((pos = userAgent.indexOf("Windows-NT")) > -1) {
  109. res = getArray("Win", "WinNT",
  110. "Win" + getVersionNumber(userAgent, pos + 8));
  111. } else if (userAgent.indexOf("Windows NT") > -1) {
  112. // <SPAN class="codecomment"> The different versions of Windows NT
  113. // are decoded in the verbosity level 2</span>
  114. // <SPAN class="codecomment"> ie: Windows NT 5.1 = Windows XP</span>
  115. if ((pos = userAgent.indexOf("Windows NT 5.1")) > -1) {
  116. res = getArray("Win", "WinXP",
  117. "Win" + getVersionNumber(userAgent, pos + 7));
  118. } else if ((pos = userAgent.indexOf("Windows NT 6.0")) > -1) {
  119. res = getArray("Win", "Vista",
  120. "Vista" + getVersionNumber(userAgent, pos + 7));
  121. } else if ((pos = userAgent.indexOf("Windows NT 6.1")) > -1) {
  122. res = getArray("Win", "Seven",
  123. "Seven " + getVersionNumber(userAgent, pos + 7));
  124. } else if ((pos = userAgent.indexOf("Windows NT 5.0")) > -1) {
  125. res = getArray("Win", "Win2000",
  126. "Win" + getVersionNumber(userAgent, pos + 7));
  127. } else if ((pos = userAgent.indexOf("Windows NT 5.2")) > -1) {
  128. res = getArray("Win", "Win2003",
  129. "Win" + getVersionNumber(userAgent, pos + 7));
  130. } else if ((pos = userAgent.indexOf("Windows NT 4.0")) > -1) {
  131. res = getArray("Win", "WinNT4",
  132. "Win" + getVersionNumber(userAgent, pos + 7));
  133. } else if ((pos = userAgent.indexOf("Windows NT)")) > -1) {
  134. res = getArray("Win", "WinNT", "WinNT");
  135. } else if ((pos = userAgent.indexOf("Windows NT;")) > -1) {
  136. res = getArray("Win", "WinNT", "WinNT");
  137. } else {
  138. res = getArray("Win", "WinNT?", "WinNT?");
  139. }
  140. } else if (userAgent.indexOf("Win") > -1) {
  141. if (userAgent.indexOf("Windows") > -1) {
  142. if ((pos = userAgent.indexOf("Windows 98")) > -1) {
  143. res = getArray("Win", "Win98",
  144. "Win" + getVersionNumber(userAgent, pos + 7));
  145. } else if ((pos = userAgent.indexOf("Windows_98")) > -1) {
  146. res = getArray("Win", "Win98",
  147. "Win" + getVersionNumber(userAgent, pos + 8));
  148. } else if ((pos = userAgent.indexOf("Windows 2000")) > -1) {
  149. res = getArray("Win", "Win2000",
  150. "Win" + getVersionNumber(userAgent, pos + 7));
  151. } else if ((pos = userAgent.indexOf("Windows 95")) > -1) {
  152. res = getArray("Win", "Win95",
  153. "Win" + getVersionNumber(userAgent, pos + 7));
  154. } else if ((pos = userAgent.indexOf("Windows 9x")) > -1) {
  155. res = getArray("Win", "Win9x",
  156. "Win" + getVersionNumber(userAgent, pos + 7));
  157. } else if ((pos = userAgent.indexOf("Windows ME")) > -1) {
  158. res = getArray("Win", "WinME",
  159. "Win" + getVersionNumber(userAgent, pos + 7));
  160. } else if ((pos = userAgent.indexOf("Windows CE;")) > -1) {
  161. res = getArray("Win", "WinCE", "WinCE");
  162. } else if ((pos = userAgent.indexOf("Windows 3.1")) > -1) {
  163. res = getArray("Win", "Win31",
  164. "Win" + getVersionNumber(userAgent, pos + 7));
  165. }
  166. // <SPAN class="codecomment"> If no version was found, rely on
  167. // the following code to detect "WinXX"</span>
  168. // <SPAN class="codecomment"> As some User-Agents include two
  169. // references to Windows</span>
  170. // <SPAN class="codecomment"> Ex: Mozilla/5.0 (Windows; U;
  171. // Win98; en-US; rv:1.5)</span>
  172. }
  173. if (res == null) {
  174. if ((pos = userAgent.indexOf("Win98")) > -1) {
  175. res = getArray("Win", "Win98",
  176. "Win" + getVersionNumber(userAgent, pos + 3));
  177. } else if ((pos = userAgent.indexOf("Win31")) > -1) {
  178. res = getArray("Win", "Win31",
  179. "Win" + getVersionNumber(userAgent, pos + 3));
  180. } else if ((pos = userAgent.indexOf("Win95")) > -1) {
  181. res = getArray("Win", "Win95",
  182. "Win" + getVersionNumber(userAgent, pos + 3));
  183. } else if ((pos = userAgent.indexOf("Win 9x")) > -1) {
  184. res = getArray("Win", "Win9x",
  185. "Win" + getVersionNumber(userAgent, pos + 3));
  186. } else if ((pos = userAgent.indexOf("WinNT4.0")) > -1) {
  187. res = getArray("Win", "WinNT4",
  188. "Win" + getVersionNumber(userAgent, pos + 3));
  189. } else if ((pos = userAgent.indexOf("WinNT")) > -1) {
  190. res = getArray("Win", "WinNT",
  191. "Win" + getVersionNumber(userAgent, pos + 3));
  192. }
  193. }
  194. if (res == null) {
  195. if ((pos = userAgent.indexOf("Windows")) > -1) {
  196. res = getArray("Win", "Win?",
  197. "Win?" + getVersionNumber(userAgent, pos + 7));
  198. } else if ((pos = userAgent.indexOf("Win")) > -1) {
  199. res = getArray("Win", "Win?",
  200. "Win?" + getVersionNumber(userAgent, pos + 3));
  201. } else
  202. // <SPAN class="codecomment"> Should not happen at this
  203. // point</span>
  204. res = getArray("Win", "Win?", "Win?");
  205. }
  206. } else if ((pos = userAgent.indexOf("Mac OS X")) > -1) {
  207. if ((userAgent.indexOf("iPhone")) > -1) {
  208. pos = userAgent.indexOf("iPhone OS");
  209. if ((userAgent.indexOf("iPod")) > -1) {
  210. res = getArray(
  211. "iOS",
  212. "iOS-iPod",
  213. "iOS-iPod "
  214. + ((pos < 0) ? "" : getVersionNumber(
  215. userAgent, pos + 9)));
  216. } else {
  217. res = getArray(
  218. "iOS",
  219. "iOS-iPhone",
  220. "iOS-iPhone "
  221. + ((pos < 0) ? "" : getVersionNumber(
  222. userAgent, pos + 9)));
  223. }
  224. } else if ((userAgent.indexOf("iPad")) > -1) {
  225. pos = userAgent.indexOf("CPU OS");
  226. res = getArray("iOS", "iOS-iPad", "iOS-iPad "
  227. + ((pos < 0) ? ""
  228. : getVersionNumber(userAgent, pos + 6)));
  229. } else
  230. res = getArray("Mac", "MacOSX",
  231. "MacOS " + getVersionNumber(userAgent, pos + 8));
  232. } else if ((pos = userAgent.indexOf("Android")) > -1) {
  233. res = getArray("Linux", "Android",
  234. "Android " + getVersionNumber(userAgent, pos + 8));
  235. } else if ((pos = userAgent.indexOf("Mac_PowerPC")) > -1) {
  236. res = getArray("Mac", "MacPPC",
  237. "MacOS " + getVersionNumber(userAgent, pos + 3));
  238. } else if ((pos = userAgent.indexOf("Macintosh")) > -1) {
  239. if (userAgent.indexOf("PPC") > -1)
  240. res = getArray("Mac", "MacPPC", "Mac PPC");
  241. else
  242. res = getArray("Mac?", "Mac?", "MacOS?");
  243. } else if ((pos = userAgent.indexOf("FreeBSD")) > -1) {
  244. res = getArray("*BSD", "*BSD FreeBSD", "FreeBSD "
  245. + getVersionNumber(userAgent, pos + 7));
  246. } else if ((pos = userAgent.indexOf("OpenBSD")) > -1) {
  247. res = getArray("*BSD", "*BSD OpenBSD", "OpenBSD "
  248. + getVersionNumber(userAgent, pos + 7));
  249. } else if ((pos = userAgent.indexOf("Linux")) > -1) {
  250. String detail = "Linux " + getVersionNumber(userAgent, pos + 5);
  251. String med = "Linux";
  252. if ((pos = userAgent.indexOf("Ubuntu/")) > -1) {
  253. detail = "Ubuntu " + getVersionNumber(userAgent, pos + 7);
  254. med += " Ubuntu";
  255. }
  256. res = getArray("Linux", med, detail);
  257. } else if ((pos = userAgent.indexOf("CentOS")) > -1) {
  258. res = getArray("Linux", "Linux CentOS", "CentOS");
  259. } else if ((pos = userAgent.indexOf("NetBSD")) > -1) {
  260. res = getArray("*BSD", "*BSD NetBSD",
  261. "NetBSD " + getVersionNumber(userAgent, pos + 6));
  262. } else if ((pos = userAgent.indexOf("Unix")) > -1) {
  263. res = getArray("Linux", "Linux",
  264. "Linux " + getVersionNumber(userAgent, pos + 4));
  265. } else if ((pos = userAgent.indexOf("SunOS")) > -1) {
  266. res = getArray("Unix", "SunOS",
  267. "SunOS" + getVersionNumber(userAgent, pos + 5));
  268. } else if ((pos = userAgent.indexOf("IRIX")) > -1) {
  269. res = getArray("Unix", "IRIX",
  270. "IRIX" + getVersionNumber(userAgent, pos + 4));
  271. } else if ((pos = userAgent.indexOf("SonyEricsson")) > -1) {
  272. res = getArray("SonyEricsson", "SonyEricsson", "SonyEricsson"
  273. + getVersionNumber(userAgent, pos + 12));
  274. } else if ((pos = userAgent.indexOf("Nokia")) > -1) {
  275. res = getArray("Nokia", "Nokia",
  276. "Nokia" + getVersionNumber(userAgent, pos + 5));
  277. } else if ((pos = userAgent.indexOf("BlackBerry")) > -1) {
  278. res = getArray("BlackBerry", "BlackBerry", "BlackBerry"
  279. + getVersionNumber(userAgent, pos + 10));
  280. } else if ((pos = userAgent.indexOf("SymbianOS")) > -1) {
  281. res = getArray("SymbianOS", "SymbianOS", "SymbianOS"
  282. + getVersionNumber(userAgent, pos + 10));
  283. } else if ((pos = userAgent.indexOf("BeOS")) > -1) {
  284. res = getArray("BeOS", "BeOS", "BeOS");
  285. } else if ((pos = userAgent.indexOf("Nintendo Wii")) > -1) {
  286. res = getArray("Nintendo Wii", "Nintendo Wii", "Nintendo Wii"
  287. + getVersionNumber(userAgent, pos + 10));
  288. } else if ((pos = userAgent.indexOf("J2ME/MIDP")) > -1) {
  289. res = getArray("Java", "J2ME", "J2ME/MIDP");
  290. } else
  291. res = getArray("?", "?", "?");
  292. return res;
  293. }
  294. public static String[] getBrowser(String userAgent) {
  295. if (userAgent == null) {
  296. return getArray("?", "?", "?");
  297. }
  298. String[] botName;
  299. if ((botName = getBotName(userAgent)) != null)
  300. return botName;
  301. String[] res = null;
  302. int pos;
  303. if ((pos = userAgent.indexOf("Lotus-Notes/")) > -1) {
  304. res = getArray("LotusNotes", "LotusNotes", "LotusNotes"
  305. + getVersionNumber(userAgent, pos + 12));
  306. } else if ((pos = userAgent.indexOf("Opera")) > -1) {
  307. String ver = getVersionNumber(userAgent, pos + 5);
  308. res = getArray("Opera",
  309. "Opera" + getFirstVersionNumber(userAgent, pos + 5, 1),
  310. "Opera" + ver);
  311. if ((pos = userAgent.indexOf("Opera Mini/")) > -1) {
  312. String ver2 = getVersionNumber(userAgent, pos + 11);
  313. res = getArray("Opera", "Opera Mini", "Opera Mini " + ver2);
  314. } else if ((pos = userAgent.indexOf("Opera Mobi/")) > -1) {
  315. String ver2 = getVersionNumber(userAgent, pos + 11);
  316. res = getArray("Opera", "Opera Mobi", "Opera Mobi " + ver2);
  317. }
  318. } else if (userAgent.indexOf("MSIE") > -1) {
  319. if ((pos = userAgent.indexOf("MSIE 6.0")) > -1) {
  320. res = getArray("MSIE", "MSIE6",
  321. "MSIE" + getVersionNumber(userAgent, pos + 4));
  322. } else if ((pos = userAgent.indexOf("MSIE 5.0")) > -1) {
  323. res = getArray("MSIE", "MSIE5",
  324. "MSIE" + getVersionNumber(userAgent, pos + 4));
  325. } else if ((pos = userAgent.indexOf("MSIE 5.5")) > -1) {
  326. res = getArray("MSIE", "MSIE5.5",
  327. "MSIE" + getVersionNumber(userAgent, pos + 4));
  328. } else if ((pos = userAgent.indexOf("MSIE 5.")) > -1) {
  329. res = getArray("MSIE", "MSIE5.x",
  330. "MSIE" + getVersionNumber(userAgent, pos + 4));
  331. } else if ((pos = userAgent.indexOf("MSIE 4")) > -1) {
  332. res = getArray("MSIE", "MSIE4",
  333. "MSIE" + getVersionNumber(userAgent, pos + 4));
  334. } else if ((pos = userAgent.indexOf("MSIE 7")) > -1
  335. && userAgent.indexOf("Trident/4.0") < 0) {
  336. res = getArray("MSIE", "MSIE7",
  337. "MSIE" + getVersionNumber(userAgent, pos + 4));
  338. } else if ((pos = userAgent.indexOf("MSIE 8")) > -1
  339. || userAgent.indexOf("Trident/4.0") > -1) {
  340. res = getArray("MSIE", "MSIE8",
  341. "MSIE" + getVersionNumber(userAgent, pos + 4));
  342. } else if ((pos = userAgent.indexOf("MSIE 9")) > -1
  343. || userAgent.indexOf("Trident/4.0") > -1) {
  344. res = getArray("MSIE", "MSIE9",
  345. "MSIE" + getVersionNumber(userAgent, pos + 4));
  346. } else
  347. res = getArray(
  348. "MSIE",
  349. "MSIE?",
  350. "MSIE?"
  351. + getVersionNumber(userAgent,
  352. userAgent.indexOf("MSIE") + 4));
  353. } else if ((pos = userAgent.indexOf("Gecko/")) > -1) {
  354. res = getArray("Gecko", "Gecko",
  355. "Gecko" + getFirstVersionNumber(userAgent, pos + 5, 4));
  356. if ((pos = userAgent.indexOf("Camino/")) > -1) {
  357. res[1] += "(Camino)";
  358. res[2] += "(Camino" + getVersionNumber(userAgent, pos + 7)
  359. + ")";
  360. } else if ((pos = userAgent.indexOf("Chimera/")) > -1) {
  361. res[1] += "(Chimera)";
  362. res[2] += "(Chimera" + getVersionNumber(userAgent, pos + 8)
  363. + ")";
  364. } else if ((pos = userAgent.indexOf("Firebird/")) > -1) {
  365. res[1] += "(Firebird)";
  366. res[2] += "(Firebird" + getVersionNumber(userAgent, pos + 9)
  367. + ")";
  368. } else if ((pos = userAgent.indexOf("Phoenix/")) > -1) {
  369. res[1] += "(Phoenix)";
  370. res[2] += "(Phoenix" + getVersionNumber(userAgent, pos + 8)
  371. + ")";
  372. } else if ((pos = userAgent.indexOf("Galeon/")) > -1) {
  373. res[1] += "(Galeon)";
  374. res[2] += "(Galeon" + getVersionNumber(userAgent, pos + 7)
  375. + ")";
  376. } else if ((pos = userAgent.indexOf("Firefox/")) > -1) {
  377. res[1] += "(Firefox)";
  378. res[2] += "(Firefox" + getVersionNumber(userAgent, pos + 8)
  379. + ")";
  380. } else if ((pos = userAgent.indexOf("Netscape/")) > -1) {
  381. if ((pos = userAgent.indexOf("Netscape/6")) > -1) {
  382. res[1] += "(NS6)";
  383. res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
  384. + ")";
  385. } else if ((pos = userAgent.indexOf("Netscape/7")) > -1) {
  386. res[1] += "(NS7)";
  387. res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
  388. + ")";
  389. } else if ((pos = userAgent.indexOf("Netscape/8")) > -1) {
  390. res[1] += "(NS8)";
  391. res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
  392. + ")";
  393. } else if ((pos = userAgent.indexOf("Netscape/9")) > -1) {
  394. res[1] += "(NS9)";
  395. res[2] += "(NS" + getVersionNumber(userAgent, pos + 9)
  396. + ")";
  397. } else {
  398. res[1] += "(NS?)";
  399. res[2] += "(NS?"
  400. + getVersionNumber(userAgent,
  401. userAgent.indexOf("Netscape/") + 9) + ")";
  402. }
  403. }
  404. } else if ((pos = userAgent.indexOf("Netscape/")) > -1) {
  405. if ((pos = userAgent.indexOf("Netscape/4")) > -1) {
  406. res = getArray("NS", "NS4",
  407. "NS" + getVersionNumber(userAgent, pos + 9));
  408. } else
  409. res = getArray("NS", "NS?",
  410. "NS?" + getVersionNumber(userAgent, pos + 9));
  411. } else if ((pos = userAgent.indexOf("Chrome/")) > -1) {
  412. res = getArray("KHTML", "KHTML(Chrome)", "KHTML(Chrome"
  413. + getVersionNumber(userAgent, pos + 6) + ")");
  414. } else if ((pos = userAgent.indexOf("Safari/")) > -1) {
  415. res = getArray("KHTML", "KHTML(Safari)", "KHTML(Safari"
  416. + getVersionNumber(userAgent, pos + 6) + ")");
  417. } else if ((pos = userAgent.indexOf("Konqueror/")) > -1) {
  418. res = getArray("KHTML", "KHTML(Konqueror)", "KHTML(Konqueror"
  419. + getVersionNumber(userAgent, pos + 9) + ")");
  420. } else if ((pos = userAgent.indexOf("KHTML")) > -1) {
  421. res = getArray("KHTML", "KHTML?",
  422. "KHTML?(" + getVersionNumber(userAgent, pos + 5) + ")");
  423. } else if ((pos = userAgent.indexOf("NetFront")) > -1) {
  424. res = getArray("NetFront", "NetFront", "NetFront "
  425. + getVersionNumber(userAgent, pos + 8));
  426. } else if ((pos = userAgent.indexOf("BlackBerry")) > -1) {
  427. pos = userAgent.indexOf("/", pos + 2);
  428. res = getArray("BlackBerry", "BlackBerry", "BlackBerry"
  429. + getVersionNumber(userAgent, pos + 1));
  430. } else if (userAgent.indexOf("Mozilla/4.") == 0
  431. && userAgent.indexOf("Mozilla/4.0") < 0
  432. && userAgent.indexOf("Mozilla/4.5 ") < 0) {
  433. // <SPAN class="codecomment"> We will interpret Mozilla/4.x as
  434. // Netscape Communicator is and only if x</span>
  435. // <SPAN class="codecomment"> is not 0 or 5</span>
  436. res = getArray("Communicator", "Communicator", "Communicator"
  437. + getVersionNumber(userAgent, pos + 8));
  438. } else
  439. return getArray("?", "?", "?");
  440. return res;
  441. }
  442. }