Skip to content
Snippets Groups Projects
Commit d0277c03 authored by Thomas Rientjes's avatar Thomas Rientjes
Browse files

Partial fix for bug #16

parent 7a76fec2
No related branches found
No related tags found
No related merge requests found
......@@ -3,3 +3,4 @@ pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.blockMissing', false);
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.domainWhitelist', '');
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.amountInjected', 0);
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.showReleaseNotes', true);
pref('extensions.jid1-BoFifL9Vbdl2zQ@jetpack.taintedDomainList', '');
......@@ -21,15 +21,44 @@ var { Class } = require('sdk/core/heritage');
var { Unknown } = require('sdk/platform/xpcom');
var { Cc, Ci, Cr } = require('chrome');
/**
* Gets and sets add-on specific preferences.
* @var {object} simplePreferences
*/
var simplePreferences = require('sdk/simple-prefs');
//noinspection JSUnresolvedFunction
var observerService = Cc['@mozilla.org/observer-service;1']
.getService(Ci.nsIObserverService);
var preferences = require('sdk/simple-prefs').prefs;
var requestAnalyzer = require('./request-analyzer');
var dataHandler = require('./data-handler');
/**
* Constants
*/
const VALUE_SEPARATOR = ';';
/**
* Variables
*/
var preferences = require('sdk/simple-prefs').prefs;
var taintedDomains = {};
/**
* Initializations
*/
_applyTaintPreference();
/**
* Event Handlers
*/
simplePreferences.on('taintedDomainList', _applyTaintPreference);
/**
* Interceptor Class
*/
......@@ -69,16 +98,6 @@ var Interceptor = new Class({
// Remove referer header from request.
httpChannel.setRequestHeader('Referer', null, false);
// Temporary fixes for reported edge-case issues with specific websites.
var initiatorDomain =
httpChannel.loadInfo && httpChannel.loadInfo.loadingDocument && httpChannel.loadInfo.loadingDocument.domain ||
httpChannel.referrer && httpChannel.referrer.host;
if (initiatorDomain === 'play.google.com' || initiatorDomain === 'passport.twitch.tv' || initiatorDomain === 'report-uri.io'
|| initiatorDomain === 'minigames.mail.ru' || initiatorDomain === 'stefansundin.github.io') {
return this.handleMissingCandidate(httpChannel);
}
// Convert the original request URI to a local target.
target = requestAnalyzer.getLocalTarget(httpChannel.URI.host, httpChannel.URI.path);
......@@ -95,6 +114,16 @@ var Interceptor = new Class({
return this.handleMissingCandidate(httpChannel);
}
// Fix for reported edge-case issues with specific websites.
var initiatorDomain =
httpChannel.loadInfo && httpChannel.loadInfo.loadingDocument && httpChannel.loadInfo.loadingDocument.domain ||
httpChannel.referrer && httpChannel.referrer.host;
if (taintedDomains[initiatorDomain] === true) {
return this.handleMissingCandidate(httpChannel);
}
// Redirect the HTTP channel to the the local destination.
httpChannel.redirectTo(redirectionURI);
//noinspection JSUnresolvedVariable
......@@ -114,6 +143,20 @@ var Interceptor = new Class({
}
});
/**
* Private Methods
*/
function _applyTaintPreference() {
taintedDomains = {};
//noinspection JSUnresolvedVariable
preferences.taintedDomainList.split(VALUE_SEPARATOR).forEach(function (domain) {
taintedDomains[domain] = true;
});
}
/**
* Exports
*/
......
/**
* Load Watcher
* Belongs to Decentraleyes.
*
* @author Thomas Rientjes
* @since 2016-02-04
* @license MPL 2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
'use strict';
/**
* Imports
*/
var { Class } = require('sdk/core/heritage');
var { Unknown, Factory } = require('sdk/platform/xpcom');
var { Cc, Ci, Cu } = require('chrome');
var xpcom = require('sdk/platform/xpcom');
/**
* Resource version mappings.
* @var {object} mappings
*/
var mappings = require('./mappings');
/**
* Gets and sets add-on specific preferences.
* @var {object} simplePreferences
*/
var simplePreferences = require('sdk/simple-prefs');
//noinspection JSUnresolvedFunction
var categoryManager = Cc['@mozilla.org/categorymanager;1']
.getService(Ci.nsICategoryManager);
/**
* Constants
*/
const CONTRACT_ID = '@decentraleyes.org/load-watcher;1';
const SCRIPT_CONTENT_TYPE = Ci.nsIContentPolicy.TYPE_SCRIPT;
const SCRIPT_ELEMENT = Ci.nsIDOMHTMLScriptElement;
const HTML_DOCUMENT = Ci.nsIDOMHTMLDocument;
const VALUE_SEPARATOR = ';';
/**
* Variables
*/
var preferences = simplePreferences.prefs;
var taintedDomains = {};
/**
* Initializations
*/
_applyTaintPreference();
/**
* Load Watcher Class
*/
var LoadWatcher = new Class({
extends: Unknown,
interfaces: ['nsIContentPolicy'],
get wrappedJSObject() { return this },
register: function () {
categoryManager.deleteCategoryEntry('content-policy', '@decentraleyes.org/load-watcher;1', false);
categoryManager.addCategoryEntry('content-policy', CONTRACT_ID, CONTRACT_ID, false, true);
},
shouldLoad: function (contentType, contentLocation, requestOrigin, node) {
if (contentType == SCRIPT_CONTENT_TYPE && mappings[contentLocation.host]) {
if (node instanceof SCRIPT_ELEMENT) {
if (node.hasAttribute('crossorigin') || node.hasAttribute('integrity')) {
// Add corresponding origin domain to the list of tainted domains.
this.saveTaintedDomain(requestOrigin.host);
}
} else if (node instanceof HTML_DOCUMENT) {
if (node.defaultView && node.defaultView.frameElement && node.defaultView.frameElement.tagName === 'IFRAME') {
// Add corresponding origin domain to the list of tainted domains.
this.saveTaintedDomain(requestOrigin.host);
}
}
}
// Accept the resource load request.
return Ci.nsIContentPolicy.ACCEPT;
},
saveTaintedDomain: function (taintedDomain) {
if (taintedDomains[taintedDomain] !== true) {
taintedDomains[taintedDomain] = true;
preferences.taintedDomainList = Object.keys(taintedDomains).join(VALUE_SEPARATOR);
}
}
});
/**
* Load Watcher Factory
*/
var factory = Factory({
contract: CONTRACT_ID,
Component: LoadWatcher,
unregister: false
});
/**
* Unregister
*/
var unload = require('sdk/system/unload');
unload.when(function () {
function trueUnregister() {
categoryManager.deleteCategoryEntry('content-policy', CONTRACT_ID, false);
try {
xpcom.unregister(factory);
} catch (exception) {
Cu.reportError(exception);
}
}
if ('dispatch' in Cu) {
Cu.dispatch(trueUnregister, trueUnregister);
} else {
Cu.import('resource://gre/modules/Services.jsm');
Services.tm.mainThread.dispatch(trueUnregister, 0);
}
});
/**
* Private Methods
*/
function _applyTaintPreference() {
taintedDomains = {};
//noinspection JSUnresolvedVariable
preferences.taintedDomainList.split(VALUE_SEPARATOR).forEach(function (domain) {
taintedDomains[domain] = true;
});
}
/**
* Exports
*/
module.exports = LoadWatcher;
......@@ -18,6 +18,8 @@
*/
var Interceptor = require('./interceptor');
var LoadWatcher = require('./load-watcher');
var preferences = require('sdk/simple-prefs').prefs;
var tabs = require("sdk/tabs");
......@@ -26,12 +28,14 @@ var tabs = require("sdk/tabs");
*/
var interceptor = new Interceptor();
var loadWatcher = new LoadWatcher();
// Executed as soon as the add-on is loaded.
exports.main = function (options) {
// Initialize add-on state.
interceptor.register();
loadWatcher.register();
if (preferences.showReleaseNotes && (options.loadReason === 'install' || options.loadReason === 'upgrade')) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment