Preventing double interception

This commit is contained in:
kkapsner 2019-05-17 00:36:34 +02:00
parent 95bb415f86
commit 79a9034051
2 changed files with 50 additions and 3 deletions

View File

@ -7,7 +7,7 @@
const settings = require("./settings");
const {preIntercept: intercept} = require("./intercept");
const {ask} = require("./askForPermission");
const lists = require("./lists");
const {sha256String: hashing} = require("./hash");
const {check: originalCheck, checkStack: originalCheckStack} = require("./check");
const {getWrapped} = require("./modifiedAPIFunctions");
const extension = require("./extension");
@ -44,6 +44,33 @@
});
}
let extensionSecret;
function computeExtensionSecret(){
function hashString(string){
return hashing(new Uint16Array(
string.split("").map(function(c){
return c.charCodeAt(0);
})
));
}
const now = new Date();
const lastTenMinutes = Math.floor(now.getMinutes() / 10) * 10;
const nextRun = new Date(
now.getFullYear(), now.getMonth(), now.getDate(),
now.getHours(), lastTenMinutes + 10, 0, 0
);
window.setTimeout(
computeExtensionSecret,
nextRun .getTime() - now.getTime()
);
let string =
extension.extensionID +
`${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()} ${now.getHours()}:${lastTenMinutes}`;
extensionSecret = [hashString("input" + string), hashString(string + "output")];
}
computeExtensionSecret();
message("open port to background script");
var port = browser.runtime.connect();
if (window === window.top){
@ -106,8 +133,13 @@
warning("NOT intercepting window due to SOP", window);
return false;
}
const wrappedWindow = getWrapped(window);
if (!enabled || interceptedWindows.get(getWrapped(window))){
if (!enabled || interceptedWindows.get(wrappedWindow)){
return false;
}
if (wrappedWindow.matchMedia(extensionSecret[0]) === extensionSecret[1]){
interceptedWindows.set(wrappedWindow, true);
return false;
}
@ -153,7 +185,21 @@
);
});
interceptedWindows.set(getWrapped(window), true);
const matchMediaDescriptor = Object.getOwnPropertyDescriptor(wrappedWindow, "matchMedia");
const originalMatchMedia = matchMediaDescriptor.value;
matchMediaDescriptor.value = exportFunction(function matchMedia(query){
if (query === extensionSecret[0]){
return extensionSecret[1];
}
else {
return arguments.length > 1?
originalMatchMedia.apply(this, wrappedWindow.Array.from(arguments)):
originalMatchMedia.call(this, query);
}
}, window);
Object.defineProperty(wrappedWindow, "matchMedia", matchMediaDescriptor);
interceptedWindows.set(wrappedWindow, true);
return true;
}

View File

@ -23,6 +23,7 @@ Version 0.5.9:
- fixed description for "show notifications"
- improved DOMRect performance
- improved general performance when stack list is disabled
- preventing double interception (increased performance and reduced detectability)
known issues:
- if a data URL is blocked the page action button does not appear