Browse Source

Bug 9263: Spoof referer when leaving a .onion domain

Yan Zhu 5 years ago
parent
commit
f98243cfed

+ 1 - 1
makexpi.sh

@@ -21,7 +21,7 @@ echo ---------- create $APP_NAME.xpi ----------
 mkdir -p pkg
 cd src
 echo zip -X -9r ../pkg/$XPI_NAME ./ -x "chrome/*" -x "*.diff" -x "*.svn/*"
-zip -X -9r ../pkg/$XPI_NAME ./ -x "*.svn/*" -x "*.diff" -x "components/torRefSpoofer.js" #-x "chrome/*"
+zip -X -9r ../pkg/$XPI_NAME ./ -x "*.svn/*" -x "*.diff" #-x "chrome/*"
 #mv ../$APP_NAME.jar ./chrome
 #zip -9m ../pkg/$XPI_NAME chrome/$APP_NAME.jar
 cd ..

+ 4 - 11
src/chrome.manifest

@@ -159,18 +159,11 @@ contract @torproject.org/torbutton-logger;1 {f36d72c9-9718-4134-b550-e109638331d
 component {e33fd6d4-270f-475f-a96f-ff3140279f68} components/domain-isolator.js
 contract @torproject.org/domain-isolator;1 {e33fd6d4-270f-475f-a96f-ff3140279f68}
 
-# component {b985e49c-12cb-4f29-9d14-b62603332ec4} components/window-mapper.js
-# contract @torproject.org/content-window-mapper;1 {b985e49c-12cb-4f29-9d14-b62603332ec4}
-
-# component {65be2be0-ceb4-44c2-91a5-9c75c53430bf} components/torRefSpoofer.js
-# contract @torproject.org/torRefSpoofer;1 {65be2be0-ceb4-44c2-91a5-9c75c53430bf}
-
-# component {52183e20-4d4b-11de-8a39-0800200c9a66} components/tor-protocol.js
-# contract @mozilla.org/network/protocol;1?name=tor {52183e20-4d4b-11de-8a39-0800200c9a66}
+category profile-after-change CookieJarSelector @torproject.org/cookie-jar-selector;1
 
-# component {a5a4bc50-5e8d-11de-8a39-0800200c9a66} components/tors-protocol.js
-# contract @mozilla.org/network/protocol;1?name=tors {a5a4bc50-5e8d-11de-8a39-0800200c9a66}
+component {65be2be0-ceb4-44c2-91a5-9c75c53430bf} components/torRefSpoofer.js
+contract @torproject.org/torRefSpoofer;1 {65be2be0-ceb4-44c2-91a5-9c75c53430bf}
 
-category profile-after-change CookieJarSelector @torproject.org/cookie-jar-selector;1
+category profile-after-change RefSpoofer @torproject.org/torRefSpoofer;1
 category profile-after-change StartupObserver @torproject.org/startup-observer;1
 category profile-after-change DomainIsolator @torproject.org/domain-isolator;1

+ 0 - 103
src/components/tor-protocol.js

@@ -1,103 +0,0 @@
-// Bug 1506 P0: This code is toggle-mode code and is unused. Kill it.
-
-// Test protocol related
-const kSCHEME = "tor";
-const kPROTOCOL_NAME = "tor";
-const kPROTOCOL_CONTRACTID = "@mozilla.org/network/protocol;1?name=" + kSCHEME;
-const kPROTOCOL_CID = Components.ID("52183e20-4d4b-11de-8a39-0800200c9a66");
-
-// Mozilla defined
-const kSIMPLEURI_CONTRACTID = "@mozilla.org/network/simple-uri;1";
-const kIOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1";
-const nsISupports = Components.interfaces.nsISupports;
-const nsIIOService = Components.interfaces.nsIIOService;
-const nsIProtocolHandler = Components.interfaces.nsIProtocolHandler;
-const nsIURI = Components.interfaces.nsIURI;
-
-function Protocol()
-{
-}
-
-Protocol.prototype =
-{
-  QueryInterface: function(iid)
-  {
-    if (!iid.equals(nsIProtocolHandler) &&
-        !iid.equals(nsISupports))
-      throw Components.results.NS_ERROR_NO_INTERFACE;
-    return this;
-  },
-
-  scheme: kSCHEME,
-  defaultPort: -1,
-  protocolFlags: nsIProtocolHandler.URI_NORELATIVE |
-                 nsIProtocolHandler.URI_NOAUTH,
-  
-  allowPort: function(port, scheme)
-  {
-    return false;
-  },
-
-  newURI: function(spec, charset, baseURI)
-  {
-    const nsIStandardURL = Components.interfaces.nsIStandardURL;
-    var uri = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(nsIStandardURL);
-    uri.init(nsIStandardURL.URLTYPE_STANDARD, 80, spec, charset, baseURI);
-
-    return uri.QueryInterface(Components.interfaces.nsIURI);
-
-  },
-
-  newChannel: function(aURI)
-  {
-    var prefs = Components.classes["@mozilla.org/preferences-service;1"]
-        .getService(Components.interfaces.nsIPrefBranch);
-    if (!prefs.getBoolPref("extensions.torbutton.tor_urls")) {
-      throw Components.results.NS_ERROR_UNKNOWN_PROTOCOL;
-    }
-
-    /*The protocol has been called, therefore we want to enable tor, wait for it to activate return the new channel with the scheme of http.*/
-    var ios = Components.classes[kIOSERVICE_CONTRACTID].getService(nsIIOService);
-    var prompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
-                        .getService(Components.interfaces.nsIPromptService);
-    var tor_enabled = prefs.getBoolPref("extensions.torbutton.tor_enabled");
-    var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
-                         .getService(Components.interfaces.nsIWindowMediator);
-    var chrome = wm.getMostRecentWindow("navigator:browser");
-    if (!ios.allowPort(aURI.port, aURI.scheme))
-      throw Components.results.NS_ERROR_FAILURE;
-    
-    if (!tor_enabled)
-    {
-      var result = prompt.confirm(null, "Allow Tor toggle?", "Do you want to enable Tor and navigate to " + aURI.spec + "?");   
-      if (!result)
-        throw Components.results.NS_ERROR_UNEXPECTED;        
-      chrome.torbutton_enable_tor(true);    
-    } 
-    
-    //if tor is turned on then, else we should throw exception of some sort.
-    tor_enabled = prefs.getBoolPref("extensions.torbutton.tor_enabled");
-    if (!tor_enabled)
-        throw Components.results.NS_ERROR_UNEXPECTED;
-    else
-    {
-        aURI.scheme = "http";    
-        return ios.newChannelFromURI(aURI);
-    }      
-  },
-
-  // method of nsIClassInfo
-  classDescription: "Tor protocol handler",
-  classID: kPROTOCOL_CID,
-  contractID: kPROTOCOL_CONTRACTID,
-}
-
-/**
-* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
-* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
-*/
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-if (XPCOMUtils.generateNSGetFactory)
-    var NSGetFactory = XPCOMUtils.generateNSGetFactory([Protocol]);
-else
-    var NSGetModule = XPCOMUtils.generateNSGetModule([Protocol]);

+ 34 - 69
src/components/torRefSpoofer.js

@@ -1,89 +1,60 @@
-// Bug 1506 P0: I don't really believe referers matter in the grand scheme.
-// Kill this code.
+// Clear referer on cross-domain requests to/from Tor Hidden Services: #9623
+// ("Smart referer" previously spoofed referer on all cross-domain requests.)
 
 const kMODULE_CID = Components.ID("65be2be0-ceb4-44c2-91a5-9c75c53430bf");
 const kMODULE_CONTRACTID = "@torproject.org/torRefSpoofer;1";
 
 function RefSpoofer() {
- this.logger = Components.classes["@torproject.org/torbutton-logger;1"].getService(Components.interfaces.nsISupports).wrappedJSObject;
- this.logger.log(3, "RefSpoof component created");
- this.specials = /[-[\]{}()*+?.,\\^$|#\s]/g;
+  this.logger = Components.classes["@torproject.org/torbutton-logger;1"].
+    getService(Components.interfaces.nsISupports).wrappedJSObject;
+  this.logger.log(3, "RefSpoof component created");
+  this.onionDomainRegex = new RegExp("\\.onion$", "i"); // THS hosts
+  this.thirdPartyUtil = Components.classes["@mozilla.org/thirdpartyutil;1"].
+    getService(Components.interfaces.mozIThirdPartyUtil);
+  this.ios = Components.classes["@mozilla.org/network/io-service;1"].
+    getService(Components.interfaces.nsIIOService);
 }
 
 
-RefSpoofer.prototype = {    
+RefSpoofer.prototype = {
   observe: function(subject, topic, data)
   {
     if (topic == "http-on-modify-request") {
-      var prefs = Components.classes["@mozilla.org/preferences-service;1"]
-      .getService(Components.interfaces.nsIPrefBranch);    
-      var tor_enabled = prefs.getBoolPref("extensions.torbutton.tor_enabled");
-      
-      if (!tor_enabled)
-        return;
-        
       subject.QueryInterface(Components.interfaces.nsIHttpChannel);
       this.onModifyRequest(subject);
       return;
     }
     if (topic == "profile-after-change") {
       this.logger.log(3, "RefSpoof got profile-after-change");
-      var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
+      var os = Components.classes["@mozilla.org/observer-service;1"].
+        getService(Components.interfaces.nsIObserverService);
       os.addObserver(this, "http-on-modify-request", false);
       return;
     }
   },
   onModifyRequest: function(oHttpChannel)
   {
-    var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
-    
-    var spoofmode = prefs.getIntPref("extensions.torbutton.refererspoof");
-    
-    var ios = Components.classes["@mozilla.org/network/io-service;1"]
-                    .getService(Components.interfaces.nsIIOService);
+    var referer;
 
-    if (spoofmode == 0)
     try {
       oHttpChannel.QueryInterface(Components.interfaces.nsIChannel);
-      var referer;
-      try{
+      try {
         referer = oHttpChannel.getRequestHeader("Referer");
-        referer = ios.newURI(referer,null,null);//make a nsIURI object for referer
-      }catch(referr) {
-        return;//no referer available or invalid uri
+        referer = this.ios.newURI(referer, null, null); //make a nsIURI object for referer
+      } catch (referr) {
+        return; //no referer available or invalid uri
       }
-      var requestURI = oHttpChannel.URI; //request nsIURI object
-      var destHost = referer.host; //referer host w/o scheme
-      var srcHost = oHttpChannel.URI.host;//request host without scheme
-
-      // match is not what we want, unless we escape dots:
-      var destHostMatch = destHost.replace(this.specials, "\\$&");
-      var srcHostMatch = srcHost.replace(this.specials, "\\$&");
-
-      // FIXME: This isn't exactly bulletproof security here, but it still
-      // may need to be more lenient not to break sites...
-      //
-      // If we suspect issues, we can try doing the following first:
-      // 1. Strip off all TLD suffixes, up to but not including '.'
-      // 2. If more than one domain part is till left, strip off prefix
-
-      //if they're in the same domain(if we can tell) or have the same host, keep the referer
-      if (srcHost.split(".").length >= destHost.split(".").length
-          && srcHost.match(destHostMatch)) // dest is a substring of src
-        return;
-      else if (destHost.split(".").length >= srcHost.split(".").length
-          && destHost.match(srcHostMatch)) // src is a substring of dest
-        return;
-      //if they do not have the same host
-      this.adjustRef(oHttpChannel, requestURI.scheme + "://" + requestURI.host);      
-      this.logger.safe_log(3, "Adjusting Referer, ",
-                          "from " + destHost + " to " + requestURI.host);
-    }
-     catch (ex) {
-      this.logger.log(5, "RefSpoof onModifyRequest: " +ex);
+      // Only spoof referer for cross-domain requests from .onions
+      if (this.onionDomainRegex.test(referer.host) &&
+          this.thirdPartyUtil.isThirdPartyURI(referer, oHttpChannel.URI)) {
+        // Set the referer to the domain being requested. This makes it harder
+        // to tell that we are referer-spoofing.
+        this.adjustRef(oHttpChannel,
+                       [oHttpChannel.URI.scheme, oHttpChannel.URI.host].join("://"));
+      }
+    } catch (ex) {
+      this.logger.log(5, "RefSpoof onModifyRequest: " + ex);
     }
-    else if (spoofmode == 2)
-      this.adjustRef(oHttpChannel, "");
   },
   adjustRef: function(oChannel, sRef)
   {
@@ -94,7 +65,7 @@ RefSpoofer.prototype = {
         oChannel.setRequestHeader("Referer", sRef, false);
       }
       return true;
-    } 
+    }
     catch (ex) {
       this.logger.log(5, "RefSpoof adjustRef: " +ex);
     }
@@ -103,9 +74,10 @@ RefSpoofer.prototype = {
   QueryInterface: function(iid)
   {
     if (!iid.equals(Components.interfaces.nsISupports) &&
-      !iid.equals(Components.interfaces.nsIObserver) &&
-      !iid.equals(Components.interfaces.nsISupportsWeakReference))
-      throw Components.results.NS_ERROR_NO_INTERFACE;    
+        !iid.equals(Components.interfaces.nsIObserver) &&
+        !iid.equals(Components.interfaces.nsISupportsWeakReference)) {
+      throw Components.results.NS_ERROR_NO_INTERFACE;
+    }
     return this;
   },
   _xpcom_categories: [{category:"profile-after-change"}],
@@ -114,12 +86,5 @@ RefSpoofer.prototype = {
   classDescription: "Tor Ref Spoofer"
 };
 
-/**
-* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
-* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
-*/
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-if (XPCOMUtils.generateNSGetFactory)
-    var NSGetFactory = XPCOMUtils.generateNSGetFactory([RefSpoofer]);
-else
-    var NSGetModule = XPCOMUtils.generateNSGetModule([RefSpoofer]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([RefSpoofer]);

+ 0 - 103
src/components/tors-protocol.js

@@ -1,103 +0,0 @@
-// Bug 1506 P0: This code is toggle-mode code and is unused. Kill it.
-
-// Test protocol related
-const kSCHEME = "tors";
-const kPROTOCOL_NAME = "tors";
-const kPROTOCOL_CONTRACTID = "@mozilla.org/network/protocol;1?name=" + kSCHEME;
-const kPROTOCOL_CID = Components.ID("a5a4bc50-5e8d-11de-8a39-0800200c9a66");
-
-// Mozilla defined
-const kSIMPLEURI_CONTRACTID = "@mozilla.org/network/simple-uri;1";
-const kIOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1";
-const nsISupports = Components.interfaces.nsISupports;
-const nsIIOService = Components.interfaces.nsIIOService;
-const nsIProtocolHandler = Components.interfaces.nsIProtocolHandler;
-const nsIURI = Components.interfaces.nsIURI;
-
-function Protocol()
-{
-}
-
-Protocol.prototype =
-{
-  QueryInterface: function(iid)
-  {
-    if (!iid.equals(nsIProtocolHandler) &&
-        !iid.equals(nsISupports))
-      throw Components.results.NS_ERROR_NO_INTERFACE;
-    return this;
-  },
-
-  scheme: kSCHEME,
-  defaultPort: -1,
-  protocolFlags: nsIProtocolHandler.URI_NORELATIVE |
-                 nsIProtocolHandler.URI_NOAUTH,
-  
-  allowPort: function(port, scheme)
-  {
-    return false;
-  },
-
-  newURI: function(spec, charset, baseURI)
-  {
-    const nsIStandardURL = Components.interfaces.nsIStandardURL;
-    var uri = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(nsIStandardURL);
-    uri.init(nsIStandardURL.URLTYPE_STANDARD, 433, spec, charset, baseURI);
-
-    return uri.QueryInterface(Components.interfaces.nsIURI);
-
-  },
-
-  newChannel: function(aURI)
-  {
-    var prefs = Components.classes["@mozilla.org/preferences-service;1"]
-        .getService(Components.interfaces.nsIPrefBranch);
-    if (!prefs.getBoolPref("extensions.torbutton.tor_urls")) {
-      throw Components.results.NS_ERROR_UNKNOWN_PROTOCOL;
-    }
-
-    /*The protocol has been called, therefore we want to enable tor, wait for it to activate return the new channel with the scheme of https.*/
-    var ios = Components.classes[kIOSERVICE_CONTRACTID].getService(nsIIOService);
-    var prompt = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
-                        .getService(Components.interfaces.nsIPromptService);
-    var tor_enabled = prefs.getBoolPref("extensions.torbutton.tor_enabled");
-    var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
-                         .getService(Components.interfaces.nsIWindowMediator);
-    var chrome = wm.getMostRecentWindow("navigator:browser");
-    if (!ios.allowPort(aURI.port, aURI.scheme))
-      throw Components.results.NS_ERROR_FAILURE;
-    
-    if (!tor_enabled)
-    {
-      var result = prompt.confirm(null, "Allow Tor toggle?", "Do you want to enable Tor and navigate to " + aURI.spec + "?");   
-      if (!result)
-        throw Components.results.NS_ERROR_UNEXPECTED;        
-      chrome.torbutton_enable_tor(true);    
-    } 
-    
-    //if tor is turned on then, else we should throw exception of some sort.
-    tor_enabled = prefs.getBoolPref("extensions.torbutton.tor_enabled");
-    if (!tor_enabled)
-        throw Components.results.NS_ERROR_UNEXPECTED;
-    else
-    {
-        aURI.scheme = "https";    
-        return ios.newChannelFromURI(aURI);
-    }      
-  },
-
-  // method of nsIClassInfo
-  classDescription: "Tor protocol handler",
-  classID: kPROTOCOL_CID,
-  contractID: kPROTOCOL_CONTRACTID
-}
-
-/**
-* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
-* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
-*/
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-if (XPCOMUtils.generateNSGetFactory)
-    var NSGetFactory = XPCOMUtils.generateNSGetFactory([Protocol]);
-else
-    var NSGetModule = XPCOMUtils.generateNSGetModule([Protocol]);

+ 0 - 180
src/components/window-mapper.js

@@ -1,180 +0,0 @@
-// Bug 1506 P0: This code is toggle-mode code and is unused. Kill it.
-
-/*************************************************************************
- * ContentWindowMapper (JavaScript XPCOM component)
- *
- * Allows you to find a tabbrowser tab for a top level content window.
- *
- *************************************************************************/
-
-// Module specific constants
-const kMODULE_NAME = "Content Window Mapper";
-const kMODULE_CONTRACTID = "@torproject.org/content-window-mapper;1";
-const kMODULE_CID = Components.ID("b985e49c-12cb-4f29-9d14-b62603332ec4");
-
-const Cr = Components.results;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const EXPIRATION_TIME = 60000; // 60 seconds
-
-const nsISupports = Components.interfaces.nsISupports;
-const nsIClassInfo = Components.interfaces.nsIClassInfo;
-const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar;
-const nsIObserverService = Components.interfaces.nsIObserverService;
-
-function ContentWindowMapper() {
-    this.cache = {};
-
-    this.logger = Components.classes["@torproject.org/torbutton-logger;1"]
-        .getService(Components.interfaces.nsISupports).wrappedJSObject;
-    this.logger.log(3, "Component Load 2: Content window mapper online: "+kMODULE_CONTRACTID);
-    this.last_expired = Date.now();
-    // This JSObject is exported directly to chrome
-    this.wrappedJSObject = this;
-}
-
-ContentWindowMapper.prototype =
-{
-  QueryInterface: function(iid)
-  {
-    if (!iid.equals(nsIClassInfo) &&
-        !iid.equals(nsISupports)) {
-      Components.returnCode = Cr.NS_ERROR_NO_INTERFACE;
-      return null;
-    }
-    return this;
-  },
-
-  wrappedJSObject: null,  // Initialized by constructor
-
-  // make this an nsIClassInfo object
-  flags: nsIClassInfo.DOM_OBJECT,
-
-  // method of nsIClassInfo
-  classDescription: kMODULE_NAME,
-  classID: kMODULE_CID,
-  contractID: kMODULE_CONTRACTID,
-
-  // method of nsIClassInfo
-  getInterfaces: function(count) {
-    var interfaceList = [nsIClassInfo];
-    count.value = interfaceList.length;
-    return interfaceList;
-  },
-
-  // method of nsIClassInfo
-  getHelperForLanguage: function(count) { return null; },
-
-  checkCache: function(topContentWindow) {
-      if(typeof(topContentWindow.ghetto_guid) != "undefined"
-         && typeof(this.cache[topContentWindow.ghetto_guid]) != "undefined") {
-          return this.cache[topContentWindow.ghetto_guid].browser;
-      }
-
-      return null;
-  },
-
-  addCache: function(topContentWindow, browser) {
-      var insertion = new Object();
-      insertion.browser = browser;
-      insertion.time = Date.now();
-      topContentWindow.ghetto_guid = Math.random().toString()+Math.random().toString();
-      this.cache[topContentWindow.ghetto_guid] = insertion; 
-  },
-
-  expireOldCache: function() {
-      var now = Date.now();
-
-      if((now - this.last_expired) < EXPIRATION_TIME) {
-          this.logger.log(3, "Early mapper check.");
-          return;
-      }
-
-      var delkeys = [];
-      for(var elem in this.cache) {
-          if((now - this.cache[elem].time) > EXPIRATION_TIME) {
-              this.logger.log(2, "Deleting cached element: "+elem.location);
-              delkeys.push(elem);
-          }
-      }
-
-      for(var k in delkeys) {
-        delete this.cache[k];
-      }
-
-      this.last_expired = now;
-  },
-
-  getBrowserForContentWindow: function(topContentWindow) {
-      if(topContentWindow instanceof Components.interfaces.nsIDOMChromeWindow) {
-          if(topContentWindow.browserDOMWindow) {
-              var browser = topContentWindow.getBrowser().selectedTab.linkedBrowser;
-              this.logger.log(3, "Chrome browser at "
-                      +browser.contentWindow.location+" found for: "
-                      +topContentWindow.location);
-              return browser;
-          }
-          // Allow strange chrome to go through..
-          this.logger.log(3, "Odd chome window"+topContentWindow.location);
-          return topContentWindow;
-      }
-
-      var cached = this.checkCache(topContentWindow);
-      if(cached != null) {
-          return cached;
-      }
-
-      try {
-          this.logger.log(3, "Cache failed for: "+topContentWindow.location);
-      } catch(e) {
-          this.logger.log(3, "Cache failed for unknown location?");
-      }
-
-      var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
-          .getService(Components.interfaces.nsIWindowMediator);
-      var enumerator = wm.getEnumerator("navigator:browser");
-      while(enumerator.hasMoreElements()) {
-          var win = enumerator.getNext();
-          var browser = win.getBrowser(); 
-          for (var i = 0; i < browser.browsers.length; ++i) {
-              var b = browser.browsers[i];
-              if (b && b.contentWindow == topContentWindow) {
-                  this.addCache(topContentWindow, b);
-                  return b;
-              }
-          }
-      }
-
-      // SpeedDial, google notebook and other extensions can create their 
-      // own "<browser>" tag elements. AFAICT, there is no way to enumerate
-      // these... Just punt and return the most recently used browser
-      try {
-          if(topContentWindow.name != "speedDialLoaderBrowser") {
-              if(topContentWindow && topContentWindow.location)
-                  this.logger.safe_log(4, "No browser found: ", topContentWindow.location);
-              else
-                  this.logger.safe_log(4, "No browser found: ", topContentWindow.name);
-          } else {
-              this.logger.log(3, "SpeedDial browser found: "+topContentWindow.name);
-          }
-      } catch(e) {
-          this.logger.log(4, "No browser found.");
-      }
-
-      // Punt..
-      var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].
-          getService(Components.interfaces.nsIWindowMediator);
-      var recentWindow = wm.getMostRecentWindow("navigator:browser");
-      return recentWindow ? recentWindow.getBrowser().selectedTab.linkedBrowser : null;
-  }
-}
-
-/**
-* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
-* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
-*/
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-if (XPCOMUtils.generateNSGetFactory)
-    var NSGetFactory = XPCOMUtils.generateNSGetFactory([ContentWindowMapper]);
-else
-    var NSGetModule = XPCOMUtils.generateNSGetModule([ContentWindowMapper]);

+ 0 - 1
src/defaults/preferences/preferences.js

@@ -165,7 +165,6 @@ pref("extensions.torbutton.tor_memory_jar",false);
 pref("extensions.torbutton.nontor_memory_jar",false);
 pref("extensions.torbutton.tz_string","");
 pref("extensions.torbutton.launch_warning",true);
-pref("extensions.torbutton.refererspoof", 0); //0=no spoof, 1=root spoof, 2=domain spoof, 3=blank spoof, 4=custom spoof
 pref("extensions.torbutton.fakerefresh", false);
 pref("extensions.torbutton.customeref","");
 pref("extensions.torbutton.disable_livemarks",true);