diff --git a/components/do.js b/components/do.js index a7bbf54..1bc0d53 100644 --- a/components/do.js +++ b/components/do.js @@ -10,129 +10,121 @@ * 0. You just DO WHAT THE FUCK YOU WANT TO. *********************************************************************/ - function SmartRefererSpoofer () { } SmartRefererSpoofer.prototype = (function () { - var Observer = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); - var NetworkIO = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); - var ScriptSecurityManager = Components.classes["@mozilla.org/scriptsecuritymanager;1"].getService(Components.interfaces.nsIScriptSecurityManager); - var EffectiveTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"].getService(Components.interfaces.nsIEffectiveTLDService); - - var Interfaces = { - Channel: Components.interfaces.nsIChannel, - HTTPChannel: Components.interfaces.nsIHttpChannel, - Supports: Components.interfaces.nsISupports, - Observer: Components.interfaces.nsIObserver, - SupportsWeakReference: Components.interfaces.nsISupportsWeakReference - }; - - function log (what) { - what = what.toString(); - - dump(what); - dump("\n"); - } - - function modify (http) { - try { - http.QueryInterface(Interfaces.Channel); - - var referer = NetworkIO.newURI(http.getRequestHeader("Referer"), null, null); - } - catch (e) { - return false; - } - - try { - var [fromURI, toURI] = [http.URI.clone(), referer.clone()]; - - try { - var isIP = false; - - EffectiveTLDService.getPublicSuffix(fromURI); - EffectiveTLDService.getPublicSuffix(toURI); - } - catch (e) { - if (e == NS_ERROR_HOST_IS_IP_ADDRESS) { - isIP = true; - } - } - - if (!isIP) { - let [from, to] = [fromURI, toURI].map(function (x) x.host.split('.').reverse()); - let index = 0; - - while (from[index] || to[index]) { - if (from[index] == to[index]) { - index++; - } - else { - from.splice(index); - to.splice(index); - } - } - - if (from.length == 0) { - throw Components.results.NS_ERROR_DOM_BAD_URI; - } - - fromURI.host = from.reverse().join('.'); - toURI.host = to.reverse().join('.'); - - try { - if (EffectiveTLDService.getPublicSuffix(fromURI) == fromURI.host) { - throw Components.results.NS_ERROR_DOM_BAD_URI; - } - } - catch (e) { - if (e == Components.results.NS_ERROR_DOM_BAD_URI) { - throw e; - } - } - } - - ScriptSecurityManager.checkSameOriginURI(fromURI, toURI, false); - - return false; - } - catch (e) { - http.referrer = null; - http.setRequestHeader("Referer", null, false); - - return true; - } - } - - function observe (subject, topic, data) { - switch (topic) { - case "http-on-modify-request": - modify(subject.QueryInterface(Interfaces.HTTPChannel)); - break; - - case "profile-after-change": - Observer.addObserver(this, "http-on-modify-request", false); - break; - } - } - - return { - observe: observe, - - QueryInterface: function (id) { - if (!id.equals(Interfaces.Supports) && !id.equals(Interfaces.Observer) && !id.equals(Interfaces.SupportsWeakReference)) { - throw Components.results.NS_ERROR_NO_INTERFACE; - } - - return this; - }, - - classID: Components.ID("55fbf7cd-18ab-4f94-a9ff-4cf21192bcd8"), - contractID: "smart-referer@meh.paranoid.pk/do;1", - classDescription: "Smart Referer Spoofer", - - _xpcom_categories: [{ category: "profile-after-change" }] - }; + var Observer = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); + var NetworkIO = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); + var ScriptSecurityManager = Components.classes["@mozilla.org/scriptsecuritymanager;1"].getService(Components.interfaces.nsIScriptSecurityManager); + var EffectiveTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"].getService(Components.interfaces.nsIEffectiveTLDService); + + var Interfaces = { + Channel: Components.interfaces.nsIChannel, + HTTPChannel: Components.interfaces.nsIHttpChannel, + Supports: Components.interfaces.nsISupports, + Observer: Components.interfaces.nsIObserver, + SupportsWeakReference: Components.interfaces.nsISupportsWeakReference + }; + + function modify (http) { + try { + http.QueryInterface(Interfaces.Channel); + + var referer = NetworkIO.newURI(http.getRequestHeader("Referer"), null, null); + } + catch (e) { + return false; + } + + try { + var [fromURI, toURI] = [http.URI.clone(), referer.clone()]; + + try { + var isIP = false; + + EffectiveTLDService.getPublicSuffix(fromURI); + EffectiveTLDService.getPublicSuffix(toURI); + } + catch (e) { + if (e == NS_ERROR_HOST_IS_IP_ADDRESS) { + isIP = true; + } + } + + if (!isIP) { + let [from, to] = [fromURI, toURI].map(function (x) x.host.split('.').reverse()); + let index = 0; + + while (from[index] || to[index]) { + if (from[index] == to[index]) { + index++; + } + else { + from.splice(index); + to.splice(index); + } + } + + if (from.length == 0) { + throw Components.results.NS_ERROR_DOM_BAD_URI; + } + + fromURI.host = from.reverse().join('.'); + toURI.host = to.reverse().join('.'); + + try { + if (EffectiveTLDService.getPublicSuffix(fromURI) == fromURI.host) { + throw Components.results.NS_ERROR_DOM_BAD_URI; + } + } + catch (e) { + if (e == Components.results.NS_ERROR_DOM_BAD_URI) { + throw e; + } + } + } + + ScriptSecurityManager.checkSameOriginURI(fromURI, toURI, false); + + return false; + } + catch (e) { + http.referrer = null; + http.setRequestHeader("Referer", null, false); + + return true; + } + } + + function observe (subject, topic, data) { + switch (topic) { + case "http-on-modify-request": + modify(subject.QueryInterface(Interfaces.HTTPChannel)); + break; + + case "profile-after-change": + Observer.addObserver(this, "http-on-modify-request", false); + break; + } + } + + return { + observe: observe, + + QueryInterface: function (id) { + if (!id.equals(Interfaces.Supports) && !id.equals(Interfaces.Observer) && !id.equals(Interfaces.SupportsWeakReference)) { + throw Components.results.NS_ERROR_NO_INTERFACE; + } + + return this; + }, + + classID: Components.ID("55fbf7cd-18ab-4f94-a9ff-4cf21192bcd8"), + contractID: "smart-referer@meh.paranoid.pk/do;1", + classDescription: "Smart Referer Spoofer", + + _xpcom_categories: [{ category: "profile-after-change" }] + }; })(); /** @@ -142,8 +134,8 @@ SmartRefererSpoofer.prototype = (function () { Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); if (XPCOMUtils.generateNSGetFactory) { - var NSGetFactory = XPCOMUtils.generateNSGetFactory([SmartRefererSpoofer]); + var NSGetFactory = XPCOMUtils.generateNSGetFactory([SmartRefererSpoofer]); } else { - var NSGetModule = XPCOMUtils.generateNSGetModule([SmartRefererSpoofer]); + var NSGetModule = XPCOMUtils.generateNSGetModule([SmartRefererSpoofer]); } diff --git a/install.rdf b/install.rdf index b69464b..11d859a 100644 --- a/install.rdf +++ b/install.rdf @@ -7,21 +7,21 @@ smart-referer@meh.paranoid.pk 0.0.3.1 2 - + {ec8030f7-c20a-464f-9b0e-13a3a9e97384} 3.0 - 8.0 + 10.0 - + Smart Referer Enable smart referers everywhere (send referer only on same domain) meh. http://github.com/meh/smart-referer - +