Skip to content

Commit

Permalink
Closes #201 Merge branch 'issue-201'
Browse files Browse the repository at this point in the history
  • Loading branch information
erikvold committed Mar 16, 2011
2 parents 6986dc4 + 8c3d263 commit 7fccc4c
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 11 deletions.
5 changes: 4 additions & 1 deletion extension/components/scriptish.js
Expand Up @@ -211,7 +211,10 @@ ScriptishService.prototype = {

if (ct == CP.TYPE_DOCUMENT && cl.spec.match(/\.user\.js$/)
&& !this.ignoreNextScript_ && !this.isTempScript(cl)) {
tools.Scriptish_installUri(cl, ctx.contentWindow);
if (!Scriptish.config.isBlocked(cl))
tools.Scriptish_installUri(cl, ctx.contentWindow);
else
timeout(function() Scriptish_alert("This script is blocked.")); // TODO: l10n
ret = CP.REJECT_REQUEST;
}

Expand Down
90 changes: 81 additions & 9 deletions extension/modules/config/config.js
@@ -1,6 +1,7 @@
var EXPORTED_SYMBOLS = ["Config"];

const SCRIPTISH_CONFIG = "scriptish-config.xml";
const SCRIPTISH_BLOCKLIST = "scriptish-blocklist.json";

(function(inc) {
inc("resource://scriptish/constants.js");
Expand All @@ -13,6 +14,7 @@ inc("resource://scriptish/utils/Scriptish_notification.js");
inc("resource://scriptish/utils/Scriptish_stringBundle.js");
inc("resource://scriptish/utils/Scriptish_openManager.js");
inc("resource://scriptish/utils/Scriptish_convert2RegExp.js");
inc("resource://scriptish/utils/Scriptish_cryptoHash.js");
inc("resource://scriptish/third-party/Timer.js");
inc("resource://scriptish/script/script.js");
})(Components.utils.import);
Expand All @@ -36,6 +38,10 @@ function Config(aBaseDir) {

this._configFile = configFile;

this._blocklist = {};
this._blocklistHash = "";
(this._blocklistFile = this._scriptDir).append(SCRIPTISH_BLOCKLIST);

this._initScriptDir();
this._load();
(this._configFile = this._scriptDir).append(SCRIPTISH_CONFIG);
Expand Down Expand Up @@ -80,7 +86,18 @@ Config.prototype = {
},
getScriptById: function(aID) this._find(aID, "script"),
isBlocked: function(uri) {
var usos = this._blocklist.uso;
if (!usos) return false;
if ("userscripts.org" == uri.host)
for (var i = 0, uso; uso = usos[i++];)
if (uri.spec.match(new RegExp("(?:\/" + uso + "\/?$|\/" + uso + "\.user\.js)")))
return true;
return false;
},
_load: function() {
// load config
var configContents = Scriptish_getContents(this._configFile);
var doc = Instances.dp.parseFromString(configContents, "text/xml");
var nodes = doc.evaluate("/UserScriptConfig/Script | /UserScriptConfig/Exclude", doc, null, 0, null);
Expand All @@ -99,6 +116,29 @@ Config.prototype = {
}
this.addExclude(excludes);
// load blocklist
if (this._blocklistFile.exists()) {
let blockListContents = Scriptish_getContents(this._blocklistFile);
let blocklist = Instances.json.decode(blockListContents);
this._blocklist = blocklist;
this._blocklistHash = Scriptish_cryptoHash(blockListContents);
}
// remove blocked scripts
var scripts = this._scripts;
for (var i = scripts.length - 1; ~i; i--) {
let uri = null, script = scripts[i];
try {
uri = NetUtil.newURI(script.homepageURL);
} catch (e) {}
if (!uri) continue;
if (this.isBlocked(uri)) {
this._scripts.splice(i, 1);
script.uninstallProcess();
Scriptish_log("Removing blocked userscript '" + script.name + "' from Scriptish", true); // TODO: l10n
}
}

// the delay b4 save here is very important now that config.xml is used when
// scriptish-config.xml DNE
if (fileModified) this._save();
Expand Down Expand Up @@ -176,17 +216,49 @@ Config.prototype = {

get _scriptDir() Scriptish_getProfileFile(this._scriptFoldername),

// Creates an empty configuration if none exist.
_initScriptDir: function() {
var self = this;

// create an empty configuration if none exist.
var dir = this._scriptDir;
if (dir.exists()) return;
// create script folder
dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);
// create config.xml file
var configStream = Scriptish_getWriteStream(this._configFile);
var xml = "<UserScriptConfig/>";
configStream.write(xml, xml.length);
configStream.close();
if (!dir.exists()) {
// create script folder
dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);

// create config.xml file
var configStream = Scriptish_getWriteStream(this._configFile);
var xml = "<UserScriptConfig/>";
configStream.write(xml, xml.length);
configStream.close();
}

// check for blocklist update
var req = Instances.xhr;
req.onload = function() {
var json = req.responseText;
try {
var blocklist = Instances.json.decode(json);
} catch (e) {
return;
}
if (!blocklist.uso) return;

var hash = Scriptish_cryptoHash(json);
if (self._blocklistHash == hash) return;

let file = self._blocklistFile;

// write blocklist
var BLStream = Scriptish_getWriteStream(file);
BLStream.write(json, json.length);
BLStream.close();
Scriptish_log("Updated Scriptish blocklist");

self._blocklist = blocklist;
self._blocklistHash = hash;
}; // if there is an error then just try again next time for now..
req.open("GET", "https://github.com/erikvold/scriptish/raw/master/blocklist.json", true);
req.send(null);
},

get excludes() this._excludes.concat(),
Expand Down
3 changes: 2 additions & 1 deletion extension/modules/constants.js
Expand Up @@ -26,6 +26,7 @@ var Instances = {
get fos() Cc["@mozilla.org/network/file-output-stream;1"]
.createInstance(Ci.nsIFileOutputStream),
get fp() Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker),
get json() Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON),
get lf() Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile),
get process() Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess),
get se() Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError),
Expand Down Expand Up @@ -81,5 +82,5 @@ XPCOMUtils.defineLazyServiceGetter(

function timeout(cb, delay) {
Instances.timer.initWithCallback(
{ notify: function(){ cb.call(null) } }, delay, ONE_SHOT);
{ notify: function(){ cb.call(null) } }, delay || 0, ONE_SHOT);
}

0 comments on commit 7fccc4c

Please sign in to comment.