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

  1. function PROT_PhishingWarden(listManager, opt_testing) {
  2. PROT_ListWarden.call(this, listManager);
  3. this.debugZone = "phishwarden";
  4. this.testing_ = !!opt_testing;
  5. this.browserViews_ = [];
  6. this.prefs_ = new G_Preferences();
  7. this.displayers_ = {
  8. "afterload": PROT_PhishMsgDisplayer,
  9. };
  10. this.fetcher_ = new PROT_TRFetcher();
  11. if (!this.testing_) {
  12. this.navWatcher_ = new G_NavWatcher(true /* filter spurious navs */);
  13. this.navWatcher_.registerListener("docnavstart",
  14. BindToObject(this.onDocNavStart,
  15. this));
  16. }
  17. var checkRemotePrefName = PROT_globalStore.getServerCheckEnabledPrefName();
  18. this.checkRemote_ = this.prefs_.getPref(checkRemotePrefName, null);
  19. var checkRemotePrefObserver = BindToObject(this.onCheckRemotePrefChanged,
  20. this);
  21. this.prefs_.addObserver(checkRemotePrefName, checkRemotePrefObserver);
  22. var phishWardenPrefName = PROT_globalStore.getPhishWardenEnabledPrefName();
  23. this.phishWardenEnabled_ = this.prefs_.getPref(phishWardenPrefName, null);
  24. var phishWardenPrefObserver =
  25. BindToObject(this.onPhishWardenEnabledPrefChanged, this);
  26. this.prefs_.addObserver(phishWardenPrefName, phishWardenPrefObserver);
  27. this.testURLs_ = PROT_globalStore.getTestURLs();
  28. this.registerWhiteTable("goog-white-domain");
  29. this.registerWhiteTable("goog-white-url");
  30. this.registerBlackTable("goog-black-url");
  31. this.registerBlackTable("goog-black-enchash");
  32. this.maybeToggleUpdateChecking();
  33. }
  34. PROT_PhishingWarden.inherits(PROT_ListWarden);
  35. PROT_PhishingWarden.prototype.maybeToggleUpdateChecking = function() {
  36. if (this.testing_)
  37. return;
  38. var checkRemotePrefName = PROT_globalStore.getServerCheckEnabledPrefName();
  39. this.checkRemote_ = this.prefs_.getPref(checkRemotePrefName, null);
  40. var phishWardenPrefName = PROT_globalStore.getPhishWardenEnabledPrefName();
  41. var phishWardenEnabled = this.prefs_.getPref(phishWardenPrefName, null);
  42. G_Debug(this, "Maybe toggling update checking. " +
  43. "Check remote? " + this.checkRemote_ + " " +
  44. "Warden enabled? " + phishWardenEnabled);
  45. if (phishWardenEnabled === null || this.checkRemote_ === null)
  46. return;
  47. if (phishWardenEnabled === true) {
  48. this.enableWhitelistTableUpdates();
  49. if (this.checkRemote_ === true) {
  50. this.disableBlacklistTableUpdates();
  51. } else if (this.checkRemote_ === false) {
  52. this.enableBlacklistTableUpdates();
  53. }
  54. } else if (phishWardenEnabled === false) {
  55. this.disableBlacklistTableUpdates();
  56. this.disableWhitelistTableUpdates();
  57. }
  58. }
  59. PROT_PhishingWarden.prototype.addBrowserView = function(view) {
  60. G_Debug(this, "New browser view registered.");
  61. this.browserViews_.push(view);
  62. }
  63. PROT_PhishingWarden.prototype.removeBrowserView = function(view) {
  64. for (var i = 0; i < this.browserViews_.length; i++)
  65. if (this.browserViews_[i] === view) {
  66. G_Debug(this, "Browser view unregistered.");
  67. this.browserViews_.splice(i, 1);
  68. return;
  69. }
  70. G_Assert(this, false, "Tried to unregister non-existent browser view!");
  71. }
  72. PROT_PhishingWarden.prototype.onCheckRemotePrefChanged = function(prefName) {
  73. this.checkRemote_ = this.prefs_.getBoolPrefOrDefault(prefName,
  74. this.checkRemote_);
  75. this.maybeToggleUpdateChecking();
  76. }
  77. PROT_PhishingWarden.prototype.onPhishWardenEnabledPrefChanged = function(
  78. prefName) {
  79. this.phishWardenEnabled_ =
  80. this.prefs_.getBoolPrefOrDefault(prefName, this.phishWardenEnabled_);
  81. this.maybeToggleUpdateChecking();
  82. }
  83. PROT_PhishingWarden.prototype.onDocNavStart = function(e) {
  84. var url = e.url;
  85. var request = e.request;
  86. G_Debug(this, "phishWarden: " +
  87. (this.phishWardenEnabled_ ? "enabled" : "disabled"));
  88. G_Debug(this, "checkRemote: " +
  89. (this.checkRemote_ ? "yes" : "no"));
  90. if (this.phishWardenEnabled_ === false)
  91. return;
  92. if (this.isBlacklistTestURL(url)) {
  93. this.houstonWeHaveAProblem_(request);
  94. }
  95. if (this.phishWardenEnabled_ === null)
  96. return;
  97. if (this.checkRemote_) {
  98. var maybeRemoteCheck = BindToObject(this.maybeMakeRemoteCheck_,
  99. this,
  100. url,
  101. request);
  102. this.isWhiteURL(url, maybeRemoteCheck);
  103. } else {
  104. var maybeEvilCallback = BindToObject(this.localBlacklistMatch_,
  105. this,
  106. url,
  107. request);
  108. this.isEvilURL(url, maybeEvilCallback);
  109. }
  110. }
  111. PROT_PhishingWarden.prototype.maybeMakeRemoteCheck_ = function(url, request, status) {
  112. if (PROT_ListWarden.IN_WHITELIST == status)
  113. return;
  114. G_Debug(this, "Local whitelist lookup failed");
  115. this.fetcher_.get(url,
  116. BindToObject(this.onTRFetchComplete,
  117. this,
  118. request));
  119. }
  120. PROT_PhishingWarden.prototype.onTRFetchComplete = function(request,
  121. trValues) {
  122. var callback = BindToObject(this.houstonWeHaveAProblem_, this, request);
  123. this.checkRemoteData(callback, trValues);
  124. }
  125. PROT_PhishingWarden.prototype.houstonWeHaveAProblem_ = function(request) {
  126. if (this.maybeLocateProblem_(request))       // Cases 1 and 2 (see below)
  127. return;
  128. if (request.isPending()) {        // Case 3
  129. G_Debug(this, "Can't find problem Doc; Req pending. Retrying.");
  130. new G_Alarm(BindToObject(this.houstonWeHaveAProblem_,
  131. this,
  132. request),
  133. 200 /*ms*/);
  134. } else {                          // Case 4
  135. G_Debug(this,
  136. "Can't find problem Doc; Req completed. Retrying at most twice.");
  137. new G_ConditionalAlarm(BindToObject(this.maybeLocateProblem_,
  138. this,
  139. request),
  140. 0 /* next event loop */,
  141. true /* repeat */,
  142. 2 /* at most twice */);
  143. }
  144. }
  145. PROT_PhishingWarden.prototype.maybeLocateProblem_ = function(request) {
  146. G_Debug(this, "Trying to find the problem.");
  147. for (var i = 0; i < this.browserViews_.length; i++)
  148. if (this.browserViews_[i].tryToHandleProblemRequest(this, request)) {
  149. G_Debug(this, "Found browser view willing to handle problem!");
  150. return true;
  151. }
  152. return false;
  153. }
  154. PROT_PhishingWarden.prototype.isBlacklistTestURL = function(url) {
  155. for (var i = 0, testURL = null; testURL = this.testURLs_[i]; ++i) {
  156. if (testURL === url) {
  157. return true;
  158. }
  159. }
  160. return false;
  161. }
  162. PROT_PhishingWarden.prototype.localBlacklistMatch_ = function(url, request, status) {
  163. if (PROT_ListWarden.IN_BLACKLIST != status)
  164. return;
  165. G_Debug(this, "Local blacklist hit");
  166. (new PROT_Reporter).report("phishblhit", url);
  167. this.houstonWeHaveAProblem_(request);
  168. }
  169. PROT_PhishingWarden.prototype.checkRemoteData = function(callback,
  170. trValues) {
  171. if (!trValues) {
  172. G_Debug(this, "Didn't get TR values from the server.");
  173. return;
  174. }
  175. G_Debug(this, "Page has phishiness " + trValues["phishy"]);
  176. if (trValues["phishy"] == 1) {     // It's on our blacklist
  177. G_Debug(this, "Remote blacklist hit");
  178. callback(this);
  179. } else {
  180. G_Debug(this, "Remote blacklist miss");
  181. }
  182. }
  183. function TEST_PROT_PhishingWarden() {
  184. if (G_GDEBUG) {
  185. var z = "phishwarden UNITTEST";
  186. G_debugService.enableZone(z);
  187. G_Debug(z, "Starting");
  188. var listManager = new PROT_ListManager(true /* testing */);
  189. var warden = new PROT_PhishingWarden(listManager, true /* testing */);
  190. warden.registerBlackTable("test-black-url");
  191. var dbservice = Cc["@google.com/dbupdateservice;1"]
  192. .getService(Ci.GTBIDbUpdateService);
  193. var blackURLs = [
  194. "http://foo.com/1",
  195. "http://foo.com/2",
  196. "http://foo.com/3",
  197. "http://foo.com/4",
  198. ];
  199. var data = "[test-black-url 1.1]\n";
  200. for (var i = 0; i < blackURLs.length; i++)
  201. data += "+" + blackURLs[i] + "\t1\n";
  202. function checkTables(tableVersion) {
  203. if (tableVersion != "[test-black-url 1.1]")
  204. G_Error(z, "incorrect table version");
  205. G_Debug(z, "checking tables");
  206. function isNotEvil(status) {
  207. G_Assert(z, PROT_ListWarden.IN_BLACKLIST != status,
  208. "should not be in black list");
  209. }
  210. var count = 0;
  211. function isEvil(status) {
  212. G_Assert(z, PROT_ListWarden.IN_BLACKLIST == status,
  213. "should be in black list");
  214. }
  215. warden.isEvilURL("http://bar.com/", isNotEvil);
  216. for (var i = 0; i < blackURLs.length; i++) {
  217. warden.isEvilURL(blackURLs[i], isEvil);
  218. }
  219. }
  220. dbservice.updateTables(data, checkTables);
  221. }
  222. }
  223.