[or-cvs] r10648: Add nsIContentPolicy to block cross tor-state CSS popups and (in torbutton/trunk/src: . chrome/content chrome/locale/en-US components defaults/preferences)

mikeperry at seul.org mikeperry at seul.org
Mon Jun 18 06:01:35 UTC 2007


Author: mikeperry
Date: 2007-06-18 02:01:34 -0400 (Mon, 18 Jun 2007)
New Revision: 10648

Added:
   torbutton/trunk/src/components/cssblocker.js
Modified:
   torbutton/trunk/src/chrome/content/jshooks.js
   torbutton/trunk/src/chrome/content/preferences.js
   torbutton/trunk/src/chrome/content/preferences.xul
   torbutton/trunk/src/chrome/content/torbutton.js
   torbutton/trunk/src/chrome/locale/en-US/torbutton.dtd
   torbutton/trunk/src/components/ignore-history.js
   torbutton/trunk/src/defaults/preferences/preferences.js
   torbutton/trunk/src/install.rdf
Log:

Add nsIContentPolicy to block cross tor-state CSS popups and
to act as safety net for all cross-state content other
mechanisms do not catch. Also added code to set a windows
firefox useragent during Tor usage, so everyone's browser
appears uniform. We are now feature-complete, AFAIK.

Also Change versioning to reject tbird and old FF versions. 



Modified: torbutton/trunk/src/chrome/content/jshooks.js
===================================================================
--- torbutton/trunk/src/chrome/content/jshooks.js	2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/content/jshooks.js	2007-06-18 06:01:34 UTC (rev 10648)
@@ -4,16 +4,17 @@
       alert("Error, double jshook!");
       return;
   }
-  
+ 
   /* TODO: It might be a good idea to hook window sizes also..
      But that will almost certainly fuck with rendering.. Maybe set
      user's window to a fixed size? */
 
   /* Hrmm.. Is it possible this breaks plugin install or other weird shit
      for non-windows OS's? */
-  /* XXX: navigator.userAgent? navigator.plugins? */
-  navigator.__defineGetter__("platform", function() { return "Windows";});
-  navigator.__defineGetter__("oscpu", function() { return "Win32 i686";});
+  if(__tb_set_uagent) {
+      var tmp_oscpu = __tb_oscpu;
+      navigator.__defineGetter__("oscpu", function() { return tmp_oscpu;});
+  }
 
   /* Timezone fix for http://gemal.dk/browserspy/css.html */
   var reparseDate = function(d, str) {
@@ -154,6 +155,8 @@
 if (__HookObjects) {
     __HookObjects();
     __HookObjects = undefined;
+    __tb_set_uagent = undefined;
+    __tb_oscpu = undefined;
     /* XXX: Removeme */
     window.__tb_hooks_ran = true;
 }

Modified: torbutton/trunk/src/chrome/content/preferences.js
===================================================================
--- torbutton/trunk/src/chrome/content/preferences.js	2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/content/preferences.js	2007-06-18 06:01:34 UTC (rev 10648)
@@ -166,8 +166,10 @@
     doc.getElementById('torbutton_blockTorHWrite').checked = o_torprefs.getBoolPref('block_thwrite');
     doc.getElementById('torbutton_blockNonTorHRead').checked = o_torprefs.getBoolPref('block_nthread');
     doc.getElementById('torbutton_blockNonTorHWrite').checked = o_torprefs.getBoolPref('block_nthwrite');
+    doc.getElementById('torbutton_isolateContent').checked = o_torprefs.getBoolPref('isolate_content');
     doc.getElementById('torbutton_noSearch').checked = o_torprefs.getBoolPref('no_search');
     doc.getElementById('torbutton_noUpdates').checked = o_torprefs.getBoolPref('no_updates');
+    doc.getElementById('torbutton_setUagent').checked = o_torprefs.getBoolPref('set_uagent');
 
     torbutton_prefs_set_field_attributes(doc);
 }
@@ -210,6 +212,7 @@
     o_torprefs.setBoolPref('no_tor_plugins', doc.getElementById('torbutton_disablePlugins').checked);
     o_torprefs.setBoolPref('clear_history', doc.getElementById('torbutton_clearHistory').checked);
     o_torprefs.setBoolPref('kill_bad_js', doc.getElementById('torbutton_killBadJS').checked);
+    o_torprefs.setBoolPref('isolate_content', doc.getElementById('torbutton_isolateContent').checked);
 
     o_torprefs.setBoolPref('clear_cache', doc.getElementById('torbutton_clearCache').selected);
     o_torprefs.setBoolPref('block_cache', doc.getElementById('torbutton_blockCache').selected);
@@ -222,6 +225,8 @@
     o_torprefs.setBoolPref('block_nthwrite', doc.getElementById('torbutton_blockNonTorHWrite').checked);
     o_torprefs.setBoolPref('no_search', doc.getElementById('torbutton_noSearch').checked);
     o_torprefs.setBoolPref('no_updates', doc.getElementById('torbutton_noUpdates').checked);
+    
+    o_torprefs.setBoolPref('set_uagent', doc.getElementById('torbutton_setUagent').checked);
 
     // if tor settings were initially active, update the active settings to reflect any changes
     if (tor_enabled) torbutton_activate_tor_settings();

Modified: torbutton/trunk/src/chrome/content/preferences.xul
===================================================================
--- torbutton/trunk/src/chrome/content/preferences.xul	2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/content/preferences.xul	2007-06-18 06:01:34 UTC (rev 10648)
@@ -114,16 +114,19 @@
         <caption label="&torbutton.prefs.sec_settings;"/>
         <tabbox>
          <tabs>
-          <tab label="&torbutton.prefs.js_plugins;"/>
+          <tab label="&torbutton.prefs.dynamic;"/>
           <tab label="&torbutton.prefs.cookies;"/>
           <tab label="&torbutton.prefs.cache;"/>
           <tab label="&torbutton.prefs.history;"/>
+          <tab label="&torbutton.prefs.uagent;"/>
          </tabs>
          <tabpanels>
           <tabpanel id="plugins">
            <vbox>
         <checkbox id="torbutton_disablePlugins" label="&torbutton.prefs.disable_plugins;" 
                   oncommand="torbutton_prefs_set_field_attributes(document)"/>
+        <checkbox id="torbutton_isolateContent" label="&torbutton.prefs.isolate_content;" 
+                  oncommand="torbutton_prefs_set_field_attributes(document)"/>
         <checkbox id="torbutton_killBadJS" label="&torbutton.prefs.kill_bad_js;" 
                   oncommand="torbutton_prefs_set_field_attributes(document)"/>
         <checkbox id="torbutton_noUpdates" label="&torbutton.prefs.no_updates;" 
@@ -169,6 +172,13 @@
                   oncommand="torbutton_prefs_set_field_attributes(document)"/>
            </vbox>
           </tabpanel>
+          <tabpanel id="uagent">
+           <vbox>
+          <checkbox id="torbutton_setUagent" label="&torbutton.prefs.set_uagent;" 
+                  oncommand="torbutton_prefs_set_field_attributes(document)"/>
+           </vbox>
+          </tabpanel>
+
          </tabpanels>
         </tabbox>
     </groupbox>

Modified: torbutton/trunk/src/chrome/content/torbutton.js
===================================================================
--- torbutton/trunk/src/chrome/content/torbutton.js	2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/content/torbutton.js	2007-06-18 06:01:34 UTC (rev 10648)
@@ -1,17 +1,4 @@
-// XXX unresolved security issues:
-//  - http://www.w3.org/TR/REC-CSS2/selector.html#dynamic-pseudo-classes
-//    - Create an nsIContentPolicy based on tor tag state.
-//      - can CSS create popups? a cached fetch may not go through content
-//        policy, open an (untagged/safe tagged) window, and fetch some urls
-//        - Clearing cache on tor state change blocks this, but worth 
-//          investigating
-//          - http://meyerweb.com/eric/css/edge/popups/demo.html
-//          - http://meyerweb.com/eric/css/edge/popups/demo2.html
-//          - http://www.tjkdesign.com/articles/css%20pop%20ups/default.asp
-//          - http://www.brunildo.org/test/CPop.html
-//          - http://www.brunildo.org/test/cssPopMenus.html
-//          - http://bucarotechelp.com/design/csseasy/97112700.asp
-//
+// TODO: check for leaks: http://www.mozilla.org/scriptable/avoiding-leaks.html
 
 // status
 var m_wasinited = false;
@@ -175,7 +162,7 @@
     if (!m_wasinited) { 
         // Runs every time a new window is opened
         m_prefs =  Components.classes["@mozilla.org/preferences-service;1"]
-                        .getService(Components.interfaces.nsIPrefService);
+                        .getService(Components.interfaces.nsIPrefBranch);
 
         torbutton_init_jshooks();
 
@@ -415,10 +402,39 @@
     var changed = (torprefs.getBoolPref('tor_enabled') != mode);
     torprefs.setBoolPref('tor_enabled', mode);
 
-    torbutton_log(2, 'called update_status('+mode+')');
+    torbutton_log(2, 'called update_status: '+mode);
     torbutton_update_toolbutton(mode);
     torbutton_update_statusbar(mode);
 
+    if(torprefs.getBoolPref("set_uagent")) {
+        if(mode) {
+            m_prefs.setCharPref("general.appname.override", 
+                torprefs.getCharPref("appname_override"));
+
+            m_prefs.setCharPref("general.appversion.override",
+                torprefs.getCharPref("appversion_override"));
+
+            m_prefs.setCharPref("general.platform.override",
+                torprefs.getCharPref("platform_override"));
+
+            m_prefs.setCharPref("general.useragent.override",
+                torprefs.getCharPref("useragent_override"));
+
+            m_prefs.setCharPref("general.useragent.vendor",
+                torprefs.getCharPref("useragent_vendor"));
+
+            m_prefs.setCharPref("general.useragent.vendorSub",
+                torprefs.getCharPref("useragent_vendorSub"));
+        } else {
+            m_prefs.clearUserPref("general.appname.override");
+            m_prefs.clearUserPref("general.appversion.override");
+            m_prefs.clearUserPref("general.platform.override");
+            m_prefs.clearUserPref("general.useragent.override");
+            m_prefs.clearUserPref("general.useragent.vendor");
+            m_prefs.clearUserPref("general.useragent.vendorSub");
+        }
+    }
+
     // this function is called every time there is a new window! Alot of this
     // stuff expects to be called on toggle only.. like the cookie jars and
     // history/cookie clearing
@@ -435,10 +451,16 @@
 
     if (torprefs.getBoolPref('block_cache')) {
         m_prefs.setBoolPref("browser.cache.memory.enable", !mode);
-        m_prefs.setBoolPref("browser.cache.disk.enable", !mode);
         m_prefs.setBoolPref("network.http.use-cache", !mode);
     }
 
+    // Always block disk cache during Tor. We clear it on toggle, 
+    // so no need to keep it around for someone to rifle through.
+    m_prefs.setBoolPref("browser.cache.disk.enable", !mode);
+
+    // Always, always disable remote "safe browsing" lookups.
+    m_prefs.setBoolPref("browser.safebrowsing.remoteLookups", false);
+
     if (torprefs.getBoolPref("no_search")) {
         m_prefs.setBoolPref("browser.search.suggest.enabled", !mode);
     }
@@ -448,7 +470,7 @@
     }
 
     torbutton_toggle_jsplugins(!mode, 
-            torprefs.getBoolPref("kill_bad_js"),
+            torprefs.getBoolPref("isolate_content"),
             torprefs.getBoolPref("no_tor_plugins"));
 
     // TODO: Investigate Firefox privacy clear-data settings.. 
@@ -631,11 +653,11 @@
     }
 }
 
-function torbutton_toggle_win_jsplugins(win, allowed, js_enabled, kill_js, 
+function torbutton_toggle_win_jsplugins(win, allowed, js_enabled, isolate_js, 
                                         kill_plugins) {
     var browser = win.getBrowser();
 
-    if(kill_js) CheckDocshellTagForJS(browser, allowed, js_enabled);
+    if(isolate_js) CheckDocshellTagForJS(browser, allowed, js_enabled);
     if(kill_plugins) browser.docShell.allowPlugins = allowed;
 
     var browsers = browser.browsers;
@@ -644,7 +666,7 @@
         var b = browser.browsers[i];
         if (b) {
             if(kill_plugins) b.docShell.allowPlugins = allowed;
-            if(kill_js) CheckDocshellTagForJS(b, allowed, js_enabled);
+            if(isolate_js) CheckDocshellTagForJS(b, allowed, js_enabled);
             // kill meta-refresh and existing page loading 
             b.webNavigation.stop(b.webNavigation.STOP_ALL);
         }
@@ -653,16 +675,15 @@
 
 // This is an ugly beast.. But unfortunately it has to be so..
 // Looping over all tabs twice is not somethign we wanna do..
-function torbutton_toggle_jsplugins(allowed, kill_js, kill_plugins) {
+function torbutton_toggle_jsplugins(allowed, isolate_js, kill_plugins) {
     torbutton_log(1, "Plugins: "+allowed);
     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                        .getService(Components.interfaces.nsIWindowMediator);
+    var enumerator = wm.getEnumerator("navigator:browser");
     var js_enabled = m_prefs.getBoolPref("javascript.enabled");
-
-    var enumerator = wm.getEnumerator("navigator:browser");
     while(enumerator.hasMoreElements()) {
         var win = enumerator.getNext();
-        torbutton_toggle_win_jsplugins(win, allowed, js_enabled, kill_js, 
+        torbutton_toggle_win_jsplugins(win, allowed, js_enabled, isolate_js, 
                                        kill_plugins);   
     }
 }
@@ -689,7 +710,7 @@
     var browser = event.currentTarget;
 
     TagNewBrowser(browser, tor_tag, no_plugins);
-    
+
     // Fucking garbage.. event is delivered to the current tab, not the 
     // newly created one. Need to traverse the current window for it.
     for (var i = 0; i < browser.browsers.length; ++i) {
@@ -761,6 +782,7 @@
     var tor_tag = !m_prefs.getBoolPref("extensions.torbutton.tor_enabled");
     var js_enabled = m_prefs.getBoolPref("javascript.enabled");
 
+    // TODO: try nsIWindowWatcher.getChromeForWindow()
     if (browser.contentDocument == doc) {
         browser.__tb_js_state = tor_tag;
         browser.docShell.allowJavascript = js_enabled;
@@ -777,7 +799,7 @@
 
     torbutton_log(1, "JS set to: " 
         + m_prefs.getBoolPref("javascript.enabled"));
-
+    
     // No need to hook js if tor is off, right?
     if(!m_prefs.getBoolPref("extensions.torbutton.tor_enabled") 
             || !m_prefs.getBoolPref('extensions.torbutton.kill_bad_js'))
@@ -790,7 +812,9 @@
      * A: Negatory.. Date() is not an XPCOM component :(
      */
 
-    var str = "<"+"script>";
+    var str = "<"+"script>\r\n";
+    str += "var __tb_set_uagent="+m_prefs.getBoolPref('extensions.torbutton.set_uagent')+";\r\n";
+    str += "var __tb_oscpu=\""+m_prefs.getCharPref('extensions.torbutton.oscpu_override')+"\";\r\n";
     str += m_jshooks; 
     str += "</"+"script>";
     var d = doc.createElement("div");

Modified: torbutton/trunk/src/chrome/locale/en-US/torbutton.dtd
===================================================================
--- torbutton/trunk/src/chrome/locale/en-US/torbutton.dtd	2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/locale/en-US/torbutton.dtd	2007-06-18 06:01:34 UTC (rev 10648)
@@ -20,17 +20,20 @@
 <!ENTITY torbutton.prefs.block_nthread       "Block history read during Non-Tor (optional)">
 <!ENTITY torbutton.prefs.block_nthwrite      "Block history write during Non-Tor (optional)">
 <!ENTITY torbutton.prefs.clear_history       "Clear history on Tor toggle (optional)">
-<!ENTITY torbutton.prefs.clear_cache        "Clear cache on Tor toggle">
-<!ENTITY torbutton.prefs.block_cache        "Block cache during Tor">
+<!ENTITY torbutton.prefs.clear_cache        "Block Tor disk cache and clear all cache on Tor toggle">
+<!ENTITY torbutton.prefs.block_cache        "Block all cache during Tor">
 <!ENTITY torbutton.prefs.cookie_jars        "Store Non-Tor cookies in a protected jar">
 <!ENTITY torbutton.prefs.clear_cookies      "Clear cookies on Tor toggle">
 <!ENTITY torbutton.prefs.disable_plugins    "Disable plugins during Tor usage (recommended)">
 <!ENTITY torbutton.prefs.kill_bad_js        "Block dangerous javascript (recommended)">
+<!ENTITY torbutton.prefs.isolate_content    "Isolate dynamic content to Tor state (recommended)">
 <!ENTITY torbutton.prefs.no_updates         "Disable updates during Tor usage (recommended)">
-<!ENTITY torbutton.prefs.js_plugins         "Plugins+javascript">
+<!ENTITY torbutton.prefs.set_uagent         "Set user agent for Tor usage (recommended)">
+<!ENTITY torbutton.prefs.dynamic              "Dynamic Content">
 <!ENTITY torbutton.prefs.cookies              "Cookies">
 <!ENTITY torbutton.prefs.cache                "Cache">
 <!ENTITY torbutton.prefs.history             "History">
+<!ENTITY torbutton.prefs.uagent              "User Agent">
 <!ENTITY torbutton.prefs.no_search           "Disable search suggestions (optional)">
 <!ENTITY torbutton.about.title                          "About Torbutton">
 <!ENTITY torbutton.pref_connection.notice               "Disable Torbutton to change these settings.">

Added: torbutton/trunk/src/components/cssblocker.js
===================================================================
--- torbutton/trunk/src/components/cssblocker.js	                        (rev 0)
+++ torbutton/trunk/src/components/cssblocker.js	2007-06-18 06:01:34 UTC (rev 10648)
@@ -0,0 +1,266 @@
+/*************************************************************************
+ * Content policy to block stuff not handled by other components
+ * (such as CSS)
+ *   - http://www.w3.org/TR/REC-CSS2/selector.html#dynamic-pseudo-classes
+ * 
+ * Also serves as a safety net to catch content the other
+ * mechaanisms somehow fail to block.
+ *
+ * Based on examples from:
+ * - http://adblockplus.org/en/faq_internal
+ *   - http://developer.mozilla.org/en/docs/How_to_Build_an_XPCOM_Component_in_Javascript
+ *   - http://www.xulplanet.com/references/xpcomref/ifaces/nsICategoryManager.html
+ *   - http://www.xulplanet.com/references/xpcomref/ifaces/nsIContentPolicy.html
+ * - http://greasemonkey.devjavu.com/projects/greasemonkey/browser/trunk/src/components/greasemonkey.js
+ *
+ * Test cases:
+ *   - http://www.tjkdesign.com/articles/css%20pop%20ups/default.asp
+ *
+ *************************************************************************/
+
+const CSSB_CONTRACTID = "@freehaven.net/cssblocker;1";
+const CSSB_CID = Components.ID("{23f4d9ba-023a-94ab-eb75-67aed7562a18}");
+
+const DNode = Components.interfaces.nsIDOMNode;
+const DWindow = Components.interfaces.nsIDOMWindow;
+const ok = Components.interfaces.nsIContentPolicy.ACCEPT;
+const block = Components.interfaces.nsIContentPolicy.REJECT_REQUEST;
+const CPolicy = Components.interfaces.nsIContentPolicy;
+
+// Retrieves the window object for a node or returns null if it isn't possible
+function getWindow(node) {
+    if (node && node.nodeType != DNode.DOCUMENT_NODE)
+        node = node.ownerDocument;
+
+    if (!node || node.nodeType != DNode.DOCUMENT_NODE)
+        return null;
+
+    return node.defaultView;
+}
+
+//HACKHACK: need a way to get an implicit wrapper for nodes because of bug 337095 (fixed in Gecko 1.8.0.5)
+var fakeFactory = {
+	createInstance: function(outer, iid) {
+		return outer;
+	},
+
+	QueryInterface: function(iid) {
+		if (iid.equals(Components.interfaces.nsISupports) ||
+				iid.equals(Components.interfaces.nsIFactory))
+			return this;
+
+		throw Components.results.NS_ERROR_NO_INTERFACE;
+	}
+};
+var array = Components.classes['@mozilla.org/supports-array;1'].createInstance(Components.interfaces.nsISupportsArray);
+array.AppendElement(fakeFactory);
+fakeFactory = array.GetElementAt(0).QueryInterface(Components.interfaces.nsIFactory);
+array = null;
+
+function wrapNode(insecNode) {
+	return fakeFactory.createInstance(insecNode, Components.interfaces.nsISupports);
+}
+
+// Unwraps jar:, view-source: and wyciwyg: URLs, returns the contained URL
+function unwrapURL(url) {
+	if (!url)
+		return url;
+
+	var ret = url.replace(/^view-source:/).replace(/^wyciwyg:\/\/\d+\//);
+	if (/^jar:(.*?)!/.test(ret))
+		ret = RegExp.$1;
+
+	if (ret == url)
+		return url;
+	else
+		return unwrapURL(ret);
+}
+
+var localSchemes = {"about" : true, "chrome" : true, "file" : true, 
+    "resource" : true, "x-jsd" : true, "addbook" : true, "cid" : true, 
+    "mailbox" : true, "data" : true, "javascript" : true};
+
+var policy = {
+	allowOnce: null,
+
+	init: function() {
+        dump("init\n");
+        this._prefs = Components.classes["@mozilla.org/preferences-service;1"]
+            .getService(Components.interfaces.nsIPrefBranch);
+
+        return;
+    },
+
+    isLocalScheme: function(loc) {
+        if (loc.indexOf(":") < 0)
+            return false;
+
+        var scheme = loc.replace(/:.*/, "").toLowerCase();
+        return (scheme in localSchemes) || loc == "about:blank";
+    },
+
+
+    // TODO: Optimize this with a pref observer so it doesn't
+    // have to continually query prefs
+	// nsIContentPolicy interface implementation
+	shouldLoad: function(contentType, contentLocation, requestOrigin, insecNode, mimeTypeGuess, extra) {
+        dump("ContentLocation: "+contentLocation.spec + " request "+requestOrigin.spec+"\n");
+       
+        /*. Debugging hack. DO NOT UNCOMMENT IN PRODUCTION ENVIRONMENTS
+        if(contentLocation.spec.search("venkman") != -1) {
+            dump("chrome-venk\n");
+            return ok;
+        }*/
+
+        if(!insecNode) {
+            // Happens on startup
+            return ok;
+        }
+
+        if(!this._prefs.getBoolPref("extensions.torbutton.isolate_content")) {
+            dump("disabled\n");
+            return ok;
+        }
+        
+        var node = wrapNode(insecNode);
+        var wind = getWindow(wrapNode(insecNode));
+
+		if (!wind || !wind.top.location || !wind.top.location.href) {
+            dump("Location\n");
+			return ok;
+        }
+
+		if (this.isLocalScheme(unwrapURL(contentLocation.spec))) {
+			return ok;
+        } 
+
+		// For frame elements go to their window
+		if (contentType == CPolicy.TYPE_SUBDOCUMENT && node.contentWindow) {
+			node = node.contentWindow;
+			wind = node;
+		}
+
+        var doc = wind.top.document;
+        if(!doc) {
+            // 1st load of a page in a new location
+            return ok;
+        }
+
+        // FIXME: Ugly.. But seems to be no better option..
+        var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+                     .getService(Components.interfaces.nsIWindowMediator);
+        var mainWindow = wm.getMostRecentWindow("navigator:browser");
+        var browser = mainWindow.getBrowser(); 
+        var torTag = !this._prefs.getBoolPref("extensions.torbutton.tor_enabled");
+       
+        // Find proper browser for this document.. ugh. this
+        // is gonna be SO fucking slow :(
+        // TODO: try nsIWindowWatcher.getChromeForWindow()
+        if (browser.contentDocument == doc) {
+            if(browser.__tb_js_state == torTag) {
+                return ok;
+            } else {
+                dump("block1\n");
+                return block;
+            }
+        }
+
+        for (var i = 0; i < browser.browsers.length; ++i) {
+            var b = browser.browsers[i];
+            if (b && b.contentDocument == doc) {
+                if(b.__tb_js_state == torTag) {
+                    return ok;
+                } else {
+                    dump("block2\n");
+                    return block;
+                }
+            }
+        }
+
+        // Favicons hit this.. They have no DOM document.
+        return ok;
+	},
+
+	shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra) {
+		return ok;
+	}
+};
+
+/*
+ * Factory object
+ */
+
+const factory = {
+	// nsIFactory interface implementation
+	createInstance: function(outer, iid) {
+		if (outer != null)
+			throw Components.results.NS_ERROR_NO_AGGREGATION;
+
+        if (!iid.equals(Components.interfaces.nsIContentPolicy) &&
+                !iid.equals(Components.interfaces.nsISupports))
+            throw Components.results.NS_ERROR_NO_INTERFACE;
+
+        policy.init();
+		return policy;
+	},
+
+	// nsISupports interface implementation
+	QueryInterface: function(iid) {
+		if (iid.equals(Components.interfaces.nsISupports) ||
+				iid.equals(Components.interfaces.nsIFactory))
+			return this;
+
+		if (!iid.equals(Components.interfaces.nsIClassInfo))
+			dump("CSS Blocker: factory.QI to an unknown interface: " + iid + "\n");
+
+		throw Components.results.NS_ERROR_NO_INTERFACE;
+	}
+};
+
+
+/*
+ * Module object
+ */
+const module = {
+	registerSelf: function(compMgr, fileSpec, location, type) {
+		compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
+		compMgr.registerFactoryLocation(CSSB_CID, 
+										"Adblock content policy",
+										CSSB_CONTRACTID,
+										fileSpec, location, type);
+
+		var catman = Components.classes["@mozilla.org/categorymanager;1"]
+					 .getService(Components.interfaces.nsICategoryManager);
+		catman.addCategoryEntry("content-policy", CSSB_CONTRACTID,
+							CSSB_CONTRACTID, true, true);
+	},
+
+	unregisterSelf: function(compMgr, fileSpec, location) {
+		compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
+
+		compMgr.unregisterFactoryLocation(CSSB_CID, fileSpec);
+		var catman = Components.classes["@mozilla.org/categorymanager;1"]
+					   .getService(Components.interfaces.nsICategoryManager);
+		catman.deleteCategoryEntry("content-policy", CSSB_CONTRACTID, true);
+	},
+
+	getClassObject: function(compMgr, cid, iid) {
+		if (!cid.equals(CSSB_CID))
+			throw Components.results.NS_ERROR_NO_INTERFACE;
+
+		if (!iid.equals(Components.interfaces.nsIFactory))
+			throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+
+		return factory;
+	},
+
+	canUnload: function(compMgr) {
+		return true;
+	}
+};
+
+function NSGetModule(comMgr, fileSpec) {
+	return module;
+}
+
+

Modified: torbutton/trunk/src/components/ignore-history.js
===================================================================
--- torbutton/trunk/src/components/ignore-history.js	2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/components/ignore-history.js	2007-06-18 06:01:34 UTC (rev 10648)
@@ -24,7 +24,7 @@
 
 function HistoryWrapper() {
   this._prefs = Components.classes["@mozilla.org/preferences-service;1"]
-      .getService(Components.interfaces.nsIPrefService);
+      .getService(Components.interfaces.nsIPrefBranch);
 
   this._history = function() {
     var history = kREAL_HISTORY.getService();

Modified: torbutton/trunk/src/defaults/preferences/preferences.js
===================================================================
--- torbutton/trunk/src/defaults/preferences/preferences.js	2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/defaults/preferences/preferences.js	2007-06-18 06:01:34 UTC (rev 10648)
@@ -51,4 +51,15 @@
 pref("extensions.torbutton.block_nthread",true);
 pref("extensions.torbutton.block_nthwrite",false);
 pref("extensions.torbutton.no_updates",true);
+pref("extensions.torbutton.isolate_content",true);
 pref("extensions.torbutton.no_search",true);
+pref("extensions.torbutton.set_uagent",true);
+
+// Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
+pref("extensions.torbutton.appname_override","Netscape");
+pref("extensions.torbutton.appversion_override","5.0 (Windows; en-US)");
+pref("extensions.torbutton.platform_override","Win32");
+pref("extensions.torbutton.oscpu_override", "Windows NT 5.1");
+pref("extensions.torbutton.useragent_override","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4");
+pref("extensions.torbutton.useragent_vendor", "");
+pref("extensions.torbutton.useragent_vendorSub","");

Modified: torbutton/trunk/src/install.rdf
===================================================================
--- torbutton/trunk/src/install.rdf	2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/install.rdf	2007-06-18 06:01:34 UTC (rev 10648)
@@ -16,12 +16,12 @@
         <em:targetApplication>
             <Description>
                 <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-                <em:minVersion>0.9</em:minVersion>
+                <em:minVersion>2.0</em:minVersion>
                 <em:maxVersion>2.0.0.*</em:maxVersion>
             </Description>
         </em:targetApplication>
 
-        <!-- thunderbird -->
+        <!-- FIXME: 
         <em:targetApplication>
             <Description>
                 <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
@@ -29,7 +29,11 @@
                 <em:maxVersion>1.5.0.*</em:maxVersion>
             </Description>
         </em:targetApplication>
+         
+        thunderbird -->
 
+        <!-- TODO: seamonkey -->
+
         <!-- firefox 1.5 uses the chrome.manifest file  -->
         <!-- firefox 1.0 uses the RDF information below -->
         <em:file>



More information about the tor-commits mailing list