Skip to content

Commit 47d4885

Browse files
committed
Better support for service workers in unrestricted modes (thanks Mark McVeigh for reporting).
1 parent 7e4c2ed commit 47d4885

2 files changed

Lines changed: 28 additions & 14 deletions

File tree

src/bg/RequestGuard.js

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* NoScript - a Firefox extension for whitelist driven safe JavaScript execution
33
*
4-
* Copyright (C) 2005-2021 Giorgio Maone <https://maone.net>
4+
* Copyright (C) 2005-2022 Giorgio Maone <https://maone.net>
55
*
66
* SPDX-License-Identifier: GPL-3.0-or-later
77
*
@@ -54,10 +54,21 @@ var RequestGuard = (() => {
5454
origins: new Set(),
5555
}
5656
},
57-
hasOrigin(tabId, origin) {
57+
hasOrigin(tabId, url) {
5858
let records = this.map.get(tabId);
59-
return records && records.origins.has(origin);
59+
return records && records.origins.has(Sites.origin(url));
6060
},
61+
addOrigin(tabId, url) {
62+
if (tabId < 0) return;
63+
let origin = Sites.origin(url);
64+
if (!origin) return;
65+
let {origins} = this.map.get(tabId) || this.initTab(tabId);
66+
if (!origins.has(origin)) {
67+
origins.add(origin);
68+
this._originsCache.clear();
69+
}
70+
},
71+
6172
findTabsByOrigin(origin) {
6273
let tabIds = this._originsCache.get(origin);
6374
if (!tabIds) {
@@ -78,7 +89,7 @@ var RequestGuard = (() => {
7889
let {tabId, frameId, type, url, documentUrl} = request;
7990
let policyType = policyTypesMap[type] || type;
8091
let requestKey = Policy.requestKey(url, policyType, documentUrl);
81-
let map = this.map;
92+
let {map} = this;
8293
let records = map.has(tabId) ? map.get(tabId) : this.initTab(tabId);
8394
if (what === "noscriptFrame" && type !== "object") {
8495
let nsf = records.noscriptFrames;
@@ -90,8 +101,9 @@ var RequestGuard = (() => {
90101
}
91102
}
92103
if (type.endsWith("frame")) {
93-
records.origins.add(Sites.origin(url));
94-
TabStatus._originsCache.clear();
104+
this.addOrigin(tabId, url);
105+
} else if (documentUrl) {
106+
this.addOrigin(tabId, documentUrl);
95107
}
96108
let collection = records[what];
97109
if (collection) {
@@ -412,12 +424,17 @@ var RequestGuard = (() => {
412424

413425
let policyType = policyTypesMap[type];
414426
let {url, originUrl, documentUrl, tabId} = request;
427+
428+
if (ns.unrestrictedTabs.has(tabId) && type.endsWith("frame") && url.startsWith("https:")) {
429+
TabStatus.addOrigin(tabId, url);
430+
}
431+
415432
let isFetch = "fetch" === policyType;
416433

417434
if ((isFetch || "frame" === policyType) &&
418435
(((isFetch && (!originUrl ||
419436
browser.runtime.onSyncMessage &&
420-
url.includes(browser.runtime.onSyncMessage.ENDPOINT_PREFIX)
437+
url.startsWith(browser.runtime.onSyncMessage.ENDPOINT_PREFIX)
421438
) || url === originUrl) && originUrl === documentUrl
422439
// some extensions make them both undefined,
423440
// see https://github.com/eight04/image-picka/issues/150
@@ -433,14 +450,11 @@ var RequestGuard = (() => {
433450
request.url = url = documentUrl || originUrl;
434451
}
435452

436-
let allowed = Sites.isInternal(url);
453+
let allowed = Sites.isInternal(url) || !ns.isEnforced(tabId);
437454
if (!allowed) {
438-
if (tabId < 0 && documentUrl && documentUrl.startsWith("https://")) {
439-
let origin = Sites.origin(documentUrl);
455+
if (tabId < 0 && documentUrl && documentUrl.startsWith("https:")) {
440456
allowed = [...ns.unrestrictedTabs]
441-
.some(tabId => TabStatus.hasOrigin(tabId, origin));
442-
} else {
443-
allowed = !ns.isEnforced(tabId);
457+
.some(tabId => TabStatus.hasOrigin(tabId, documentUrl));
444458
}
445459
if (!allowed) {
446460
let capabilities = intersectCapabilities(

src/nscl

0 commit comments

Comments
 (0)