home *** CD-ROM | disk | FTP | other *** search
/ Minami 83 / MINAMI83.iso / Extra / DivXInstaller.exe / $PLUGINSDIR / GoogleToolbarFirefox.msi / xpi / amulet-jslib / listmanager.js < prev    next >
Text File  |  2006-08-07  |  12KB  |  347 lines

  1. function PROT_ListManager(opt_testing) {
  2. this.debugZone = "listmanager";
  3. if (opt_testing)
  4. this.debugZone += "testing";
  5. G_debugService.enableZone(this.debugZone);
  6. this.testing_ = !!opt_testing;
  7. this.currentUpdateChecker_ = null;   // set when we toggle updates
  8. var self = this;
  9. this.updateserverURL_ = PROT_globalStore.getUpdateserverURL();
  10. this.tablesKnown_ = {};
  11. if (this.testing_) {
  12. this.tablesKnown_ = {
  13. "test1-foo-domain": new PROT_VersionParser("test1-foo-domain", 0, -1),
  14. "test2-foo-domain": new PROT_VersionParser("test2-foo-domain", 0, -1),
  15. "test-white-domain": new PROT_VersionParser("test-white-domain", 0, -1,
  16. true /* require mac*/),
  17. "test-mac-domain": new PROT_VersionParser("test-mac-domain", 0, -1,
  18. true /* require mac */)
  19. };
  20. }
  21. this.tablesData_ = {};
  22. this.registrar_ = new EventRegistrar({});
  23. this.observerServiceObserver_ = new G_ObserverServiceObserver(
  24. 'xpcom-shutdown',
  25. BindToObject(this.shutdown_, this),
  26. true /*only once*/);
  27. this.urlCrypto_ = null;
  28. this.prefs_ = new G_Preferences();
  29. }
  30. PROT_ListManager.prototype.shutdown_ = function() {
  31. for (var name in this.tablesData) {
  32. delete this.tablesData[name];
  33. }
  34. }
  35. PROT_ListManager.prototype.registerTable = function(tableName,
  36. opt_requireMac,
  37. opt_callback) {
  38. var table = new PROT_VersionParser(tableName, 1, -1, opt_requireMac);
  39. this.tablesKnown_[tableName] = table;
  40. this.tablesData_[tableName] = new PROT_TRTable(tableName);
  41. if (opt_callback) {
  42. if (!this.registrar_.isKnownEventType(tableName))
  43. this.registrar_.addEventType(tableName);
  44. this.registrar_.registerListener(tableName, opt_callback);
  45. G_Debug(this, "registering callback for " + tableName);
  46. }
  47. return true;
  48. }
  49. PROT_ListManager.prototype.enableUpdateTables = function(tables) {
  50. var changed = false;
  51. for (var i = 0; i < tables.length; ++i) {
  52. var table = this.tablesKnown_[tables[i]];
  53. if (table) {
  54. G_Debug(this, "Enabling table updates for " + tables[i]);
  55. table.needsUpdate = true;
  56. changed = true;
  57. }
  58. }
  59. if (changed === true)
  60. this.maybeToggleUpdateChecking();
  61. }
  62. PROT_ListManager.prototype.disableUpdateTables = function(tables) {
  63. var changed = false;
  64. for (var i = 0; i < tables.length; ++i) {
  65. var table = this.tablesKnown_[tables[i]];
  66. if (table) {
  67. G_Debug(this, "Disabling table updates for " + tables[i]);
  68. table.needsUpdate = false;
  69. changed = true;
  70. }
  71. }
  72. if (changed === true)
  73. this.maybeToggleUpdateChecking();
  74. }
  75. PROT_ListManager.prototype.requireTableUpdates = function() {
  76. for (var type in this.tablesKnown_) {
  77. if (this.tablesKnown_[type].major == 0)
  78. continue;
  79. if (this.tablesKnown_[type].needsUpdate)
  80. return true;
  81. }
  82. return false;
  83. }
  84. PROT_ListManager.prototype.maybeStartManagingUpdates = function() {
  85. if (this.testing_)
  86. return;
  87. this.maybeToggleUpdateChecking();
  88. }
  89. PROT_ListManager.prototype.maybeToggleUpdateChecking = function() {
  90. if (this.testing_)
  91. return;
  92. if (this.requireTableUpdates() === true) {
  93. G_Debug(this, "Starting managing lists");
  94. if (!this.currentUpdateChecker_)
  95. this.currentUpdateChecker_ =
  96. new G_Alarm(BindToObject(this.checkForUpdates, this), 3000);
  97. this.startUpdateChecker();
  98. } else {
  99. G_Debug(this, "Stopping managing lists (if currently active)");
  100. this.stopUpdateChecker();                    // Cancel pending updates
  101. }
  102. }
  103. PROT_ListManager.prototype.startUpdateChecker = function() {
  104. this.stopUpdateChecker();
  105. var thirtyMinutes = 30 * 60 * 1000;
  106. this.updateChecker_ = new G_Alarm(BindToObject(this.checkForUpdates, this),
  107. thirtyMinutes, true /* repeat */);
  108. }
  109. PROT_ListManager.prototype.stopUpdateChecker = function() {
  110. if (this.updateChecker_) {
  111. this.updateChecker_.cancel();
  112. this.updateChecker_ = null;
  113. }
  114. }
  115. PROT_ListManager.prototype.safeExists = function(table, key, callback) {
  116. try {
  117. var map = this.tablesData_[table];
  118. map.find(key, callback);
  119. } catch(e) {
  120. G_Debug(this, "safeExists masked failure for " + table + ", key " + key + ": " + e);
  121. callback(false);
  122. }
  123. }
  124. PROT_ListManager.prototype.loadTableVersions_ = function() {
  125. var prefBase = PROT_globalStore.getTableVersionPrefPrefix();
  126. for (var table in this.tablesKnown_) {
  127. var version = this.prefs_.getPref(prefBase + table, "1.-1");
  128. G_Debug(this, "loadTableVersion " + table + ": " + version);
  129. var tokens = version.split(".");
  130. G_Assert(this, tokens.length == 2, "invalid version number");
  131. this.tablesKnown_[table].major = tokens[0];
  132. this.tablesKnown_[table].minor = tokens[1];
  133. }
  134. }
  135. PROT_ListManager.prototype.setTableVersion_ = function(versionString) {
  136. var prefBase = PROT_globalStore.getTableVersionPrefPrefix();
  137. G_Debug(this, "Got version string: " + versionString);
  138. var versionParser = new PROT_VersionParser("");
  139. if (versionParser.fromString(versionString)) {
  140. var tableName = versionParser.type;
  141. var versionNumber = versionParser.versionString();
  142. this.prefs_.setPref(prefBase + tableName, versionNumber);
  143. if (!this.tablesKnown_[tableName]) {
  144. this.tablesKnown_[tableName] = versionParser;
  145. } else {
  146. this.tablesKnown_[tableName].ImportVersion(versionParser);
  147. }
  148. if (!this.tablesData_[tableName])
  149. this.tablesData_[tableName] = new PROT_TRTable(tableName);
  150. if (this.registrar_.isKnownEventType(tableName)) {
  151. this.registrar_.fire(tableName, { table: this.tablesData_[tableName] });
  152. }
  153. }
  154. }
  155. PROT_ListManager.prototype.getRequestURL_ = function(url) {
  156. url += "version=";
  157. var firstElement = true;
  158. var requestMac = false;
  159. for (var type in this.tablesKnown_) {
  160. if (this.tablesKnown_[type].major == 0)
  161. continue;
  162. if (this.tablesKnown_[type].needsUpdate == false)
  163. continue;
  164. if (!firstElement) {
  165. url += ","
  166. } else {
  167. firstElement = false;
  168. }
  169. url += type + ":" + this.tablesKnown_[type].toUrl();
  170. if (this.tablesKnown_[type].requireMac)
  171. requestMac = true;
  172. }
  173. if (requestMac) {
  174. if (!this.urlCrypto_)
  175. this.urlCrypto_ = new PROT_UrlCrypto();
  176. url += "&wrkey=" +
  177. encodeURIComponent(this.urlCrypto_.getManager().getWrappedKey());
  178. }
  179. G_Debug(this, "getRequestURL returning: " + url);
  180. return url;
  181. }
  182. PROT_ListManager.prototype.checkForUpdates = function() {
  183. this.currentUpdateChecker_ = null;
  184. this.loadTableVersions_();
  185. G_Debug(this, 'checkForUpdates: scheduling request..');
  186. var streamer = Cc["@google.com/streamupdater;1"]
  187. .getService(Ci.GTBIStreamUpdater);
  188. streamer.updateUrl = this.getRequestURL_(this.updateserverURL_);
  189. if (!streamer.downloadUpdates(BindToObject(this.setTableVersion_, this))) {
  190. G_Debug(this, "Streamer is busy, no updates now");
  191. }
  192. return true;
  193. }
  194. function TEST_PROT_ListManager() {
  195. if (G_GDEBUG) {
  196. var z = "listmanager UNITTEST";
  197. G_debugService.enableZone(z);
  198. G_Debug(z, "Starting");
  199. var listManager = new PROT_ListManager(true /*testing*/);
  200. var prefBase = PROT_globalStore.getTableVersionPrefPrefix();
  201. var vp;
  202. function createTrueCallback(msg) {
  203. return function(s) {
  204. if (!s) {
  205. G_Error(z, msg + " (" + s + ")");
  206. }
  207. }
  208. }
  209. function createFalseCallback(msg) {
  210. return function(s) {
  211. if (s) {
  212. G_Error(z, msg + " (" + s + ")");
  213. }
  214. }
  215. }
  216. function checkTables2() {
  217. for (var i = 0; i < 10; ++i) {
  218. var prop = "http://" + i + ".com";
  219. listManager.safeExists("test1-foo-domain", prop,
  220. createTrueCallback("Couldn't find member " + prop + " of set1"));
  221. }
  222. vp = listManager.tablesKnown_["test1-foo-domain"];
  223. G_Assert(z, "2" == vp.minor, "set1 table version mismatch");
  224. G_Assert(z, "1.2" == listManager.prefs_.getPref(prefBase + vp.type),
  225. "set1 table version mismatch (pref)");
  226. for (var i = 0; i < 5; ++i) {
  227. var prop = "http://" + i + ".com";
  228. listManager.safeExists("test2-foo-domain", prop,
  229. createTrueCallback("Couldn't find member " + prop + " of set2"));
  230. }
  231. vp = listManager.tablesKnown_["test2-foo-domain"];
  232. G_Assert(z, "7" == vp.minor, "set2 table version mismatch");
  233. G_Assert(z, "1.7" == listManager.prefs_.getPref(prefBase + vp.type),
  234. "set2 table version mismatch (pref)");
  235. listManager.safeExists("test1-black-url", "foo2",
  236. createFalseCallback("test1: found malformed key/value pair foo2"));
  237. for (i = 1; i <= 4; ++i) {
  238. listManager.safeExists("test2-black-url", "foo" + i,
  239. createTrueCallback("test2: missing key foo" + i));
  240. }
  241. listManager.safeExists("test3-black-url", "foo4",
  242. createFalseCallback("test3: found malformed key/value pair foo4"));
  243. for (i = 1; i <= 4; ++i) {
  244. listManager.safeExists("test4-black-url", "foo" + i,
  245. createTrueCallback("test4: missing key foo" + i));
  246. }
  247. G_Debug(z, "checkTables2 PASSED");
  248. var file = G_File.getProfileFile();
  249. file.append("google_safebrowsing");
  250. file.append("kf.txt");
  251. var data = "clientkey:24:ViEejQLgBqYFAEABj/d8TA==\n"
  252. + "wrappedkey:24:MTpv5__687Yk_CmU0wZZizE_\n";
  253. G_FileWriter.writeAll(file, data);
  254. var mgr = PROT_UrlCrypto.prototype.manager_;
  255. mgr.maybeLoadOldKey();
  256. mgr.replaceKeyOrig_ = mgr.replaceKey_;
  257. mgr.replaceKey_ = function() {};
  258. streamUpdater.updateUrl =
  259. "http://firetools-win/unittests/streamupdate-test3.txt";
  260. streamUpdater.downloadUpdates(checkTablesStreaming3);
  261. }
  262. function checkTables3() {
  263. var vp = listManager.tablesKnown_['test-sandbox-text'];
  264. G_Assert(z, "4" == vp.minor, "test-sandbox-text table version mismatch " + vp.minor);
  265. G_Assert(z, "1.4" == listManager.prefs_.getPref(prefBase + vp.type),
  266. "test-sandbox-text table version mismatch (pref)");
  267. listManager.safeExists('test-sandbox-text', 'sandbox',
  268. checkSandboxText);
  269. listManager.safeExists("test1-foo-domain", "http://1.com",
  270. createFalseCallback("failed to remove 1.com"));
  271. listManager.safeExists("test1-foo-domain", "http://3.com",
  272. createFalseCallback("failed to remove 3.com"));
  273. listManager.safeExists("test1-foo-domain", "http://2.com",
  274. createTrueCallback("2.com missing"));
  275. listManager.safeExists("test1-foo-domain", "http://10.com",
  276. createTrueCallback("failed to add 10.com"));
  277. var mgr = PROT_UrlCrypto.prototype.manager_;
  278. mgr.replaceKey_ = mgr.replaceKeyOrig_;
  279. G_Debug(z, "PASSED ALL");
  280. }
  281. function checkSandboxText(text) {
  282. G_Assert(z, "function%20getHandlers%28%29%7Breturn%5B%5D%7D%0A%3B%0A%0A"
  283. == text, "sandbox text mismatch: " + text);
  284. }
  285. var streamUpdater = Components.classes["@google.com/streamupdater;1"]
  286. .createInstance(Components.interfaces.GTBIStreamUpdater);
  287. function checkTablesStreaming(versionString) {
  288. if ('[streamtest-black-url 1.1]' == versionString) {
  289. G_Debug(z, "Got streaming table callback");
  290. listManager.registerTable('streamtest-black-url');
  291. listManager.registerTable('streamtest2-white-url');
  292. } else if ('[streamtest2-white-url 1.2]' == versionString) {
  293. listManager.safeExists("streamtest-black-url", "foo1",
  294. createTrueCallback("streamtest: failed to add foo1"));
  295. listManager.safeExists("streamtest-black-url", "foo2",
  296. createFalseCallback("streamtest: shouldn't find foo2 " +
  297. " (malformed)"));
  298. listManager.safeExists("streamtest-black-url", "foo3",
  299. createTrueCallback("streamtest: failed to add foo3"));
  300. listManager.safeExists("streamtest-black-url", "foo4",
  301. createTrueCallback("streamtest: failed to add foo4"));
  302. listManager.safeExists("streamtest2-white-url", "test",
  303. createTrueCallback("streamtest2: failed to add test"));
  304. streamUpdater.updateUrl =
  305. "http://firetools-win/unittests/streamupdate-test2.txt";
  306. streamUpdater.downloadUpdates(checkTablesStreaming2);
  307. G_Debug(z, "STREAM TESTS PASSED");
  308. } else {
  309. G_Error(z, "(checkTablesStreaming) unexpected update line from "
  310. + "streaming update:" + versionString);
  311. }
  312. }
  313. function checkTablesStreaming2(versionString) {
  314. listManager.setTableVersion_(versionString);
  315. if (versionString == "[test1-foo-domain 1.2]" ||
  316. versionString == "[test2-foo-domain 1.7]" ||
  317. versionString == "[test1-black-url 1.1]" ||
  318. versionString == "[test2-black-url 1.2]" ||
  319. versionString == "[test3-black-url 1.3]") {
  320. G_Debug(z, "Got valid table callbacks");
  321. } else if (versionString == "[test4-black-url 1.4]") {
  322. G_Debug(z, "Got last valid table callback, starting checks");
  323. checkTables2();
  324. } else {
  325. G_Error(z, "(checkTablesStreaming2) unexpected update line from "
  326. + "streaming update:" + versionString);
  327. }
  328. }
  329. function checkTablesStreaming3(versionString) {
  330. listManager.setTableVersion_(versionString);
  331. if (versionString.startsWith("[test-sandbox-text 1.4]")) {
  332. G_Debug(z, "Got valid table callbacks");
  333. } else if (versionString == "[test1-foo-domain 1.3]") {
  334. G_Debug(z, "Got last valid table callback, starting checks");
  335. checkTables3();
  336. } else {
  337. G_Error(z, "(checkTablesStreaming3) unexpected update line from "
  338. + "streaming update:" + versionString);
  339. }
  340. }
  341. streamUpdater.updateUrl =
  342. "http://firetools-win/unittests/streamupdate-test1.txt";
  343. G_Debug(z, "Testing Stream Updater");
  344. streamUpdater.downloadUpdates(checkTablesStreaming);
  345. }
  346. }
  347.