Software: Apache. PHP/5.5.15 uname -a: Windows NT SVR-DMZ 6.1 build 7600 (Windows Server 2008 R2 Enterprise Edition) i586 SYSTEM Safe-mode: OFF (not secure) C:\Extranet\C\Archivos de programa\Mozilla Firefox\components\ drwxrwxrwx |
Viewing file: nsSafebrowsingApplication.js (24.59 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) | const Cc = Components.classes; const Ci = Components.interfaces; // This is copied from toolkit/components/content/js/lang.js. // It seems cleaner to copy this rather than #include from so far away. Function.prototype.inherits = function(parentCtor) { var tempCtor = function(){}; tempCtor.prototype = parentCtor.prototype; this.superClass_ = parentCtor.prototype; this.prototype = new tempCtor(); } //@line 36 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\content\application.js" // We instantiate this variable when we create the application. var gDataProvider = null; // An instance of our application is a PROT_Application object. It // basically just populates a few globals and instantiates wardens, // the listmanager, and the about:blocked error page. /** * An instance of our application. There should be exactly one of these. * * Note: This object should instantiated only at profile-after-change * or later because the listmanager and the cryptokeymanager need to * read and write data files. Additionally, NSS isn't loaded until * some time around then (Moz bug #321024). * * @constructor */ function PROT_Application() { this.debugZone= "application"; //@line 83 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\content\application.js" // expose some classes this.PROT_PhishingWarden = PROT_PhishingWarden; this.PROT_MalwareWarden = PROT_MalwareWarden; // Load data provider pref values gDataProvider = new PROT_DataProvider(); // expose the object this.wrappedJSObject = this; } var gInitialized = false; PROT_Application.prototype.initialize = function() { if (gInitialized) return; gInitialized = true; var obs = Cc["@mozilla.org/observer-service;1"]. getService(Ci.nsIObserverService); obs.addObserver(this, "xpcom-shutdown", true); // XXX: move table names to a pref that we originally will download // from the provider (need to workout protocol details) this.malwareWarden = new PROT_MalwareWarden(); this.malwareWarden.registerBlackTable("goog-malware-shavar"); this.malwareWarden.maybeToggleUpdateChecking(); this.phishWarden = new PROT_PhishingWarden(); this.phishWarden.registerBlackTable("goog-phish-shavar"); this.phishWarden.maybeToggleUpdateChecking(); } PROT_Application.prototype.observe = function(subject, topic, data) { switch (topic) { case "xpcom-shutdown": this.malwareWarden.shutdown(); this.phishWarden.shutdown(); break; } } /** * @param name String The type of url to get (either Phish or Error). * @return String the report phishing URL (localized). */ PROT_Application.prototype.getReportURL = function(name) { return gDataProvider["getReport" + name + "URL"](); } /** * about:blocked implementation */ PROT_Application.prototype.newChannel = function(uri) { var ioService = Cc["@mozilla.org/network/io-service;1"] .getService(Ci.nsIIOService); var secMan = Cc["@mozilla.org/scriptsecuritymanager;1"] .getService(Ci.nsIScriptSecurityManager); var childURI = ioService.newURI("chrome://browser/content/safebrowsing/blockedSite.xhtml", null, null); var channel = ioService.newChannelFromURI(childURI); channel.originalURI = uri; // Drop chrome privilege var principal = secMan.getCodebasePrincipal(uri); channel.owner = principal; return channel; } PROT_Application.prototype.getURIFlags = function(uri) { // We don't particularly *want* people linking to this from // untrusted content, but given that bad sites can cause this page // to appear (e.g. by having an iframe pointing to known malware), // we should code as though this is explicitly possible. return Ci.nsIAboutModule.ALLOW_SCRIPT | Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT; } PROT_Application.prototype.QueryInterface = function(iid) { if (iid.equals(Ci.nsISupports) || iid.equals(Ci.nsISupportsWeakReference) || iid.equals(Ci.nsIObserver) || iid.equals(Ci.nsIAboutModule)) return this; Components.returnCode = Components.results.NS_ERROR_NO_INTERFACE; return null; } //@line 37 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\content\globalstore.js" // A class that encapsulates data provider specific values. The // root of the provider pref tree is browser.safebrowsing.provider. // followed by a number, followed by specific properties. The properties // that a data provider can supply are: // // name: The name of the provider // lookupURL: The URL to send requests to in enhanced mode // keyURL: Before we send URLs in enhanced mode, we need to encrypt them // reportURL: When shown a warning bubble, we send back the user decision // (get me out of here/ignore warning) to this URL (strip cookies // first). This is optional. // gethashURL: Url for requesting complete hashes from the provider. // reportGenericURL: HTML page for general user feedback // reportPhishURL: HTML page for notifying the provider of a new phishing page // reportErrorURL: HTML page for notifying the provider of a false positive const kDataProviderIdPref = 'browser.safebrowsing.dataProvider'; const kProviderBasePref = 'browser.safebrowsing.provider.'; //@line 59 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\content\globalstore.js" const MOZ_OFFICIAL_BUILD = true; //@line 63 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\content\globalstore.js" const MOZ_PARAM_LOCALE = /\{moz:locale\}/g; const MOZ_PARAM_CLIENT = /\{moz:client\}/g; const MOZ_PARAM_BUILDID = /\{moz:buildid\}/g; const MOZ_PARAM_VERSION = /\{moz:version\}/g; /** * Information regarding the data provider. */ function PROT_DataProvider() { this.prefs_ = new G_Preferences(); this.loadDataProviderPrefs_(); // Watch for changes in the data provider and update accordingly. this.prefs_.addObserver(kDataProviderIdPref, BindToObject(this.loadDataProviderPrefs_, this)); // Watch for when anti-phishing is toggled on or off. this.prefs_.addObserver(kPhishWardenEnabledPref, BindToObject(this.loadDataProviderPrefs_, this)); } /** * Populate all the provider variables. We also call this when whenever * the provider id changes. */ PROT_DataProvider.prototype.loadDataProviderPrefs_ = function() { // Currently, there's no UI for changing local list provider so we // hard code the value for provider 0. this.updateURL_ = this.getUrlPref_( 'browser.safebrowsing.provider.0.updateURL'); var id = this.prefs_.getPref(kDataProviderIdPref, null); // default to 0 if (null == id) id = 0; var basePref = kProviderBasePref + id + '.'; this.name_ = this.prefs_.getPref(basePref + "name", ""); // Urls used to get data from a provider this.lookupURL_ = this.getUrlPref_(basePref + "lookupURL"); this.keyURL_ = this.getUrlPref_(basePref + "keyURL"); this.reportURL_ = this.getUrlPref_(basePref + "reportURL"); this.gethashURL_ = this.getUrlPref_(basePref + "gethashURL"); // Urls to HTML report pages this.reportGenericURL_ = this.getUrlPref_(basePref + "reportGenericURL"); this.reportErrorURL_ = this.getUrlPref_(basePref + "reportErrorURL"); this.reportPhishURL_ = this.getUrlPref_(basePref + "reportPhishURL"); // Propagate the changes to the list-manager. this.updateListManager_(); } /** * The list manager needs urls to operate. It needs a url to know where the * table updates are, and it needs a url for decrypting enchash style tables. */ PROT_DataProvider.prototype.updateListManager_ = function() { var listManager = Cc["@mozilla.org/url-classifier/listmanager;1"] .getService(Ci.nsIUrlListManager); // If we add support for changing local data providers, we need to add a // pref observer that sets the update url accordingly. listManager.setUpdateUrl(this.getUpdateURL()); // setKeyUrl has the side effect of fetching a key from the server. // This shouldn't happen if anti-phishing/anti-malware is disabled. var isEnabled = this.prefs_.getPref(kPhishWardenEnabledPref, false) || this.prefs_.getPref(kMalwareWardenEnabledPref, false); if (isEnabled) { listManager.setKeyUrl(this.keyURL_); } listManager.setGethashUrl(this.getGethashURL()); } /** * Lookup the value of a URL from prefs file and do parameter substitution. */ PROT_DataProvider.prototype.getUrlPref_ = function(prefName) { var url = this.prefs_.getPref(prefName); var appInfo = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo); var mozClientStr = this.prefs_.getPref("browser.safebrowsing.clientid", MOZ_OFFICIAL_BUILD ? 'navclient-auto-ffox' : appInfo.name); var versionStr = this.prefs_.getPref("browser.safebrowsing.clientver", appInfo.version); // Parameter substitution url = url.replace(MOZ_PARAM_LOCALE, this.getLocale_()); url = url.replace(MOZ_PARAM_CLIENT, mozClientStr); url = url.replace(MOZ_PARAM_BUILDID, appInfo.appBuildID); url = url.replace(MOZ_PARAM_VERSION, versionStr); return url; } /** * @return String the browser locale (similar code is in nsSearchService.js) */ PROT_DataProvider.prototype.getLocale_ = function() { const localePref = "general.useragent.locale"; var locale = this.getLocalizedPref_(localePref); if (locale) return locale; // Not localized var prefs = new G_Preferences(); return prefs.getPref(localePref, ""); } /** * @return String name of the localized pref, null if none exists. */ PROT_DataProvider.prototype.getLocalizedPref_ = function(aPrefName) { // G_Preferences doesn't know about complex values, so we use the // xpcom object directly. var prefs = Cc["@mozilla.org/preferences-service;1"] .getService(Ci.nsIPrefBranch); try { return prefs.getComplexValue(aPrefName, Ci.nsIPrefLocalizedString).data; } catch (ex) { } return ""; } ////////////////////////////////////////////////////////////////////////////// // Getters for the remote provider pref values mentioned above. PROT_DataProvider.prototype.getName = function() { return this.name_; } PROT_DataProvider.prototype.getUpdateURL = function() { return this.updateURL_; } PROT_DataProvider.prototype.getLookupURL = function() { return this.lookupURL_; } PROT_DataProvider.prototype.getGethashURL = function() { return this.gethashURL_; } PROT_DataProvider.prototype.getReportGenericURL = function() { return this.reportGenericURL_; } PROT_DataProvider.prototype.getReportErrorURL = function() { return this.reportErrorURL_; } PROT_DataProvider.prototype.getReportPhishURL = function() { return this.reportPhishURL_; } //@line 37 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\content\list-warden.js" // A warden that knows how to register lists with a listmanager and keep them // updated if necessary. The ListWarden also provides a simple interface to // check if a URL is evil or not. Specialized wardens like the PhishingWarden // inherit from it. // // Classes that inherit from ListWarden are responsible for calling // enableTableUpdates or disableTableUpdates. This usually entails // registering prefObservers and calling enable or disable in the base // class as appropriate. // /** * Abtracts the checking of user/browser actions for signs of * phishing. * * @constructor */ function PROT_ListWarden() { this.debugZone = "listwarden"; var listManager = Cc["@mozilla.org/url-classifier/listmanager;1"] .getService(Ci.nsIUrlListManager); this.listManager_ = listManager; // Once we register tables, their respective names will be listed here. this.blackTables_ = []; this.whiteTables_ = []; } PROT_ListWarden.IN_BLACKLIST = 0 PROT_ListWarden.IN_WHITELIST = 1 PROT_ListWarden.NOT_FOUND = 2 /** * Tell the ListManger to keep all of our tables updated */ PROT_ListWarden.prototype.enableBlacklistTableUpdates = function() { for (var i = 0; i < this.blackTables_.length; ++i) { this.listManager_.enableUpdate(this.blackTables_[i]); } } /** * Tell the ListManager to stop updating our tables */ PROT_ListWarden.prototype.disableBlacklistTableUpdates = function() { for (var i = 0; i < this.blackTables_.length; ++i) { this.listManager_.disableUpdate(this.blackTables_[i]); } } /** * Tell the ListManager to update whitelist tables. They may be enabled even * when other updates aren't, for performance reasons. */ PROT_ListWarden.prototype.enableWhitelistTableUpdates = function() { for (var i = 0; i < this.whiteTables_.length; ++i) { this.listManager_.enableUpdate(this.whiteTables_[i]); } } /** * Tell the ListManager to stop updating whitelist tables. */ PROT_ListWarden.prototype.disableWhitelistTableUpdates = function() { for (var i = 0; i < this.whiteTables_.length; ++i) { this.listManager_.disableUpdate(this.whiteTables_[i]); } } /** * Register a new black list table with the list manager * @param tableName - name of the table to register * @returns true if the table could be registered, false otherwise */ PROT_ListWarden.prototype.registerBlackTable = function(tableName) { var result = this.listManager_.registerTable(tableName, false); if (result) { this.blackTables_.push(tableName); } return result; } /** * Register a new white list table with the list manager * @param tableName - name of the table to register * @returns true if the table could be registered, false otherwise */ PROT_ListWarden.prototype.registerWhiteTable = function(tableName) { var result = this.listManager_.registerTable(tableName, false); if (result) { this.whiteTables_.push(tableName); } return result; } //@line 36 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\content\phishing-warden.js" // The warden checks request to see if they are for phishy pages. It // does so by querying our locally stored blacklists. // // When the warden notices a problem, it queries all browser views // (each of which corresopnds to an open browser window) to see // whether one of them can handle it. A browser view can handle a // problem if its browser window has an HTMLDocument loaded with the // given URL and that Document hasn't already been flagged as a // problem. For every problematic URL we notice loading, at most one // Document is flagged as problematic. Otherwise you can get into // trouble if multiple concurrent phishy pages load with the same URL. // // Since we check URLs very early in the request cycle (in a progress // listener), the URL might not yet be associated with a Document when // we determine that it is phishy. So the the warden retries finding // a browser view to handle the problem until one can, or until it // determines it should give up (see complicated logic below). // // The warden has displayers that the browser view uses to render // different kinds of warnings (e.g., one that's shown before a page // loads as opposed to one that's shown after the page has already // loaded). // // Note: There is a single warden for the whole application. // // TODO better way to expose displayers/views to browser view const kPhishWardenEnabledPref = "browser.safebrowsing.enabled"; /** * Abtracts the checking of user/browser actions for signs of * phishing. * * @param progressListener nsIDocNavStartProgressListener * @param tabbrowser XUL tabbrowser element * @constructor */ function PROT_PhishingWarden() { PROT_ListWarden.call(this); this.debugZone = "phishwarden"; // Use this to query preferences this.prefs_ = new G_Preferences(); // We need to know whether we're enabled and whether we're in advanced // mode, so reflect the appropriate preferences into our state. // Global preference to enable the phishing warden this.phishWardenEnabled_ = this.prefs_.getPref(kPhishWardenEnabledPref, null); // Get notifications when the phishing warden enabled pref changes var phishWardenPrefObserver = BindToObject(this.onPhishWardenEnabledPrefChanged, this); this.prefs_.addObserver(kPhishWardenEnabledPref, phishWardenPrefObserver); G_Debug(this, "phishWarden initialized"); } PROT_PhishingWarden.inherits(PROT_ListWarden); PROT_PhishingWarden.prototype.QueryInterface = function(iid) { if (iid.equals(Ci.nsISupports) || iid.equals(Ci.nsISupportsWeakReference)) return this; throw Components.results.NS_ERROR_NO_INTERFACE; } /** * Cleanup on shutdown. */ PROT_PhishingWarden.prototype.shutdown = function() { this.prefs_.removeAllObservers(); this.listManager_ = null; } /** * When a preference (either advanced features or the phishwarden * enabled) changes, we might have to start or stop asking for updates. * * This is a little tricky; we start or stop management only when we * have complete information we can use to determine whether we * should. It could be the case that one pref or the other isn't set * yet (e.g., they haven't opted in/out of advanced features). So do * nothing unless we have both pref values -- we get notifications for * both, so eventually we will start correctly. */ PROT_PhishingWarden.prototype.maybeToggleUpdateChecking = function() { var phishWardenEnabled = this.prefs_.getPref(kPhishWardenEnabledPref, null); G_Debug(this, "Maybe toggling update checking. " + "Warden enabled? " + phishWardenEnabled); // Do nothing unless both prefs are set. They can be null (unset), true, or // false. if (phishWardenEnabled === null) return; // We update and save to disk all tables if (phishWardenEnabled === true) { this.enableBlacklistTableUpdates(); this.enableWhitelistTableUpdates(); } else { // Anti-phishing is off, disable table updates this.disableBlacklistTableUpdates(); this.disableWhitelistTableUpdates(); } } /** * Deal with a user changing the pref that says whether we should * enable the phishing warden (i.e., that SafeBrowsing is active) * * @param prefName Name of the pref holding the value indicating whether * we should enable the phishing warden */ PROT_PhishingWarden.prototype.onPhishWardenEnabledPrefChanged = function( prefName) { // Just to be safe, ignore changes to sub prefs. if (prefName != "browser.safebrowsing.enabled") return; this.phishWardenEnabled_ = this.prefs_.getPref(prefName, this.phishWardenEnabled_); this.maybeToggleUpdateChecking(); } //@line 37 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\content\malware-warden.js" // This warden manages updates to the malware list const kMalwareWardenEnabledPref = "browser.safebrowsing.malware.enabled"; function PROT_MalwareWarden() { PROT_ListWarden.call(this); this.debugZone = "malwarewarden"; // Use this to query preferences this.prefs_ = new G_Preferences(); // Global preference to enable the malware warden this.malwareWardenEnabled_ = this.prefs_.getPref(kMalwareWardenEnabledPref, null); // Get notifications when the malware warden enabled pref changes var malwareWardenPrefObserver = BindToObject(this.onMalwareWardenEnabledPrefChanged, this); this.prefs_.addObserver(kMalwareWardenEnabledPref, malwareWardenPrefObserver); // Add a test chunk to the database var testData = "mozilla.com/firefox/its-an-attack.html"; var testUpdate = "n:1000\ni:test-malware-simple\nad:1\n" + "a:1:32:" + testData.length + "\n" + testData; testData = "mozilla.com/firefox/its-a-trap.html"; testUpdate += "n:1000\ni:test-phish-simple\nad:1\n" + "a:1:32:" + testData.length + "\n" + testData; var dbService_ = Cc["@mozilla.org/url-classifier/dbservice;1"] .getService(Ci.nsIUrlClassifierDBService); var listener = { QueryInterface: function(iid) { if (iid.equals(Ci.nsISupports) || iid.equals(Ci.nsIUrlClassifierUpdateObserver)) return this; throw Cr.NS_ERROR_NO_INTERFACE; }, updateUrlRequested: function(url) { }, streamFinished: function(status) { }, updateError: function(errorCode) { }, updateSuccess: function(requestedTimeout) { } }; try { dbService_.beginUpdate(listener, "test-malware-simple,test-phish-simple", ""); dbService_.beginStream("", ""); dbService_.updateStream(testUpdate); dbService_.finishStream(); dbService_.finishUpdate(); } catch(ex) { // beginUpdate will throw harmlessly if there's an existing update // in progress, ignore failures. } G_Debug(this, "malwareWarden initialized"); } PROT_MalwareWarden.inherits(PROT_ListWarden); /** * Cleanup on shutdown. */ PROT_MalwareWarden.prototype.shutdown = function() { this.prefs_.removeAllObservers(); this.listManager_ = null; } /** * When a preference changes, we might have to start or stop asking for * updates. */ PROT_MalwareWarden.prototype.maybeToggleUpdateChecking = function() { var malwareWardenEnabled = this.prefs_.getPref(kMalwareWardenEnabledPref, null); G_Debug(this, "Maybe toggling update checking. " + "Warden enabled? " + malwareWardenEnabled); // Do nothing unless thre pref is set if (malwareWardenEnabled === null) return; // We update and save to disk all tables if (malwareWardenEnabled === true) { this.enableBlacklistTableUpdates(); } else { // Anti-malware is off, disable table updates this.disableBlacklistTableUpdates(); } } /** * Deal with a user changing the pref that says whether we should * enable the malware warden. * * @param prefName Name of the pref holding the value indicating whether * we should enable the malware warden */ PROT_MalwareWarden.prototype.onMalwareWardenEnabledPrefChanged = function( prefName) { // Just to be safe, ignore changes to sub prefs. if (prefName != kMalwareWardenEnabledPref) return; this.malwareWardenEnabled_ = this.prefs_.getPref(prefName, this.malwareWardenEnabled_); this.maybeToggleUpdateChecking(); } //@line 18 "e:\fx19rel\WINNT_5.2_Depend\mozilla\browser\components\safebrowsing\src\nsSafebrowsingApplication.js" var modScope = this; function Init() { var jslib = Cc["@mozilla.org/url-classifier/jslib;1"] .getService().wrappedJSObject; modScope.G_Debug = jslib.G_Debug; modScope.G_Assert = jslib.G_Assert; modScope.G_Alarm = jslib.G_Alarm; modScope.G_ConditionalAlarm = jslib.G_ConditionalAlarm; modScope.G_ObserverWrapper = jslib.G_ObserverWrapper; modScope.G_Preferences = jslib.G_Preferences; modScope.PROT_XMLFetcher = jslib.PROT_XMLFetcher; modScope.BindToObject = jslib.BindToObject; modScope.G_Protocol4Parser = jslib.G_Protocol4Parser; modScope.PROT_UrlCrypto = jslib.PROT_UrlCrypto; modScope.RequestBackoff = jslib.RequestBackoff; // We only need to call Init once modScope.Init = function() {}; } // Module object function SafebrowsingApplicationMod() { this.firstTime = true; this.cid = Components.ID("{c64d0bcb-8270-4ca7-a0b3-3380c8ffecb5}"); this.progid = "@mozilla.org/safebrowsing/application;1"; } SafebrowsingApplicationMod.prototype.registerSelf = function(compMgr, fileSpec, loc, type) { if (this.firstTime) { this.firstTime = false; throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN; } compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar); compMgr.registerFactoryLocation(this.cid, "Safebrowsing Application Module", this.progid, fileSpec, loc, type); compMgr.registerFactoryLocation(this.cid, "UrlClassifier Blocked Error Page", "@mozilla.org/network/protocol/about;1?what=blocked", fileSpec, loc, type); }; SafebrowsingApplicationMod.prototype.getClassObject = function(compMgr, cid, iid) { if (!cid.equals(this.cid)) throw Components.results.NS_ERROR_NO_INTERFACE; if (!iid.equals(Ci.nsIFactory)) throw Components.results.NS_ERROR_NOT_IMPLEMENTED; return this.factory; } SafebrowsingApplicationMod.prototype.canUnload = function(compMgr) { return true; } SafebrowsingApplicationMod.prototype.factory = { createInstance: function(outer, iid) { if (outer != null) throw Components.results.NS_ERROR_NO_AGGREGATION; Init(); return new PROT_Application(); } }; var ApplicationModInst = new SafebrowsingApplicationMod(); function NSGetModule(compMgr, fileSpec) { return ApplicationModInst; } |
:: Command execute :: | |
--[ c99shell v. 1.0 pre-release build #13 powered by Captain Crunch Security Team | http://ccteam.ru | Generation time: 0.0468 ]-- |