Skip to content

Commit 1754429

Browse files
committed
Prevent URL leaks from media placeholders (thanks NDevTK for report).
1 parent 137dd85 commit 1754429

File tree

5 files changed

+63
-27
lines changed

5 files changed

+63
-27
lines changed

src/bg/main.js

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
XSS.stop();
9696
}
9797

98-
Messages.addHandler(messageHandler);
98+
9999

100100
try {
101101
await Messages.send("started");
@@ -229,23 +229,20 @@
229229
type: "panel"
230230
});
231231
},
232-
async getTheme() {
232+
async getTheme(msg, {tab, frameId}) {
233+
try {
234+
browser.tabs.insertCSS(tab.id, {
235+
code: await Themes.getContentCSS(),
236+
frameId,
237+
runAt: "document_start",
238+
matchAboutBlank: true,
239+
cssOrigin: "user",
240+
});
241+
} catch (e) {
242+
console.error(e);
243+
}
233244
return (await Themes.isVintage()) ? "vintage" : "";
234245
},
235-
async fetchResource({url}) {
236-
url = browser.runtime.getURL(url);
237-
const blob = await (await fetch(url)).blob();
238-
return new Promise((resolve, reject) => {
239-
const reader = new FileReader();
240-
reader.onload = e => {
241-
resolve(reader.result);
242-
};
243-
reader.onerror = e => {
244-
reject(reader.error);
245-
};
246-
reader.readAsDataURL(blob);
247-
});
248-
},
249246

250247
async promptHook(msg, {tabId}) {
251248
await browser.tabs.executeScript(tabId, {
@@ -262,6 +259,7 @@
262259
await TabGuard.reloadNormally(tabId);
263260
}
264261
};
262+
Messages.addHandler(messageHandler);
265263

266264
function onSyncMessage(msg, sender) {
267265
switch(msg.id) {

src/common/themes.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
addEventListener("load", onload, true);
6363
}
6464

65+
let contentCSS;
6566

6667
let root = document.documentElement;
6768
root.classList.add(PARENT_CLASS);
@@ -141,6 +142,43 @@
141142
return b;
142143
},
143144

145+
async getContentCSS() {
146+
contentCSS = contentCSS || (async () => {
147+
const replaceAsync = async (string, regexp, replacerFunction) => {
148+
const replacements = await Promise.all(
149+
Array.from(string.matchAll(regexp),
150+
match => replacerFunction(...match)));
151+
let i = 0;
152+
return string.replace(regexp, () => replacements[i++]);
153+
}
154+
const fetchAsDataURL = async (url) => {
155+
const blob = await (await fetch(browser.runtime.getURL(url))).blob();
156+
return new Promise((resolve, reject) => {
157+
const reader = new FileReader();
158+
reader.onload = e => {
159+
resolve(reader.result);
160+
};
161+
reader.onerror = e => {
162+
reject(reader.error);
163+
};
164+
reader.readAsDataURL(blob);
165+
});
166+
}
167+
const fetchAsText = async (url) => await (await fetch(browser.runtime.getURL(url))).text();
168+
169+
const themesCSS = (await replaceAsync(await fetchAsText("/common/themes.css"),
170+
/(--img-logo:.*url\("?)(.*\.svg)"?/g,
171+
async (s, prop, url) => `${prop}"${await fetchAsDataURL(url)}"`
172+
))
173+
.replace(/.*\burl\(\.*\/.*\n/g, '')
174+
.replace(/\/\*[^]*?\*\//g, '')
175+
.replace(/\n+/g, "\n");
176+
return (await fetchAsText("/content/content.css"))
177+
.replace(/\b(THEMES_START\b.*\n)[^]*(\n.*\bTHEMES_END)\b/g,
178+
`$1${themesCSS}$2`);
179+
})();
180+
return await contentCSS;
181+
}
144182
};
145183

146184
(async () => {

src/content/content.css

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@
44
* SPDX-License-Identifier: GPL-3.0-or-later
55
*/
66

7+
/* THEMES_START */
8+
9+
/*
10+
This section gets replaced at runtime with an extract of /themes/themes.css
11+
stripped of all the references to extension URLs.
12+
*/
13+
14+
/* THEMES_END */
15+
716
a.__NoScript_PlaceHolder__ {
817
outline: 2px solid --var(--accent-color);
918
color: var(--text-color) !important;
@@ -15,7 +24,7 @@ a.__NoScript_PlaceHolder__ {
1524
cursor: pointer;
1625
opacity: 0.8;
1726
z-index: 2147483647 !important;
18-
background-image: none;
27+
background-image: var(--img-logo);
1928
}
2029

2130
a.__NoScript_PlaceHolder__.mozilla {

src/manifest.json

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,6 @@
7373
},
7474

7575
"content_scripts": [
76-
{
77-
"matches": ["<all_urls>"],
78-
"match_about_blank": true,
79-
"all_frames": true,
80-
"css": [
81-
"/common/themes.css",
82-
"/content/content.css"
83-
]
84-
},
8576
{
8677
"run_at": "document_start",
8778
"matches": ["<all_urls>"],

src/nscl

0 commit comments

Comments
 (0)