Skip to content

Commit a223031

Browse files
committed
Work around Firefox's data: favIconUrl leak
Related issue: - https://bugzilla.mozilla.org/show_bug.cgi?id=1652925
1 parent 8aa7617 commit a223031

File tree

3 files changed

+37
-45
lines changed

3 files changed

+37
-45
lines changed

platform/chromium/vapi-background.js

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -907,10 +907,20 @@ vAPI.messaging = {
907907
port.onMessage.addListener(
908908
(request, port) => this.onPortMessage(request, port)
909909
);
910-
this.ports.set(port.name, {
911-
port,
912-
privileged: port.sender.url.startsWith(this.PRIVILEGED_URL)
913-
});
910+
const portDetails = { port };
911+
const sender = port.sender;
912+
if ( sender ) {
913+
portDetails.frameId = sender.frameId;
914+
const { tab, url } = sender;
915+
if ( tab ) {
916+
portDetails.tabId = tab.id;
917+
}
918+
portDetails.url = url;
919+
portDetails.privileged = url.startsWith(this.PRIVILEGED_URL);
920+
}
921+
this.ports.set(port.name, portDetails);
922+
// https://bugzilla.mozilla.org/show_bug.cgi?id=1652925#c24
923+
port.sender = undefined;
914924
},
915925

916926
setup: function(defaultHandler) {
@@ -957,10 +967,8 @@ vAPI.messaging = {
957967
},
958968

959969
onFrameworkMessage: function(request, port, callback) {
960-
const sender = port && port.sender;
961-
if ( !sender ) { return; }
962-
const fromDetails = this.ports.get(port.name) || {};
963-
const tabId = sender.tab && sender.tab.id || undefined;
970+
const portDetails = this.ports.get(port.name) || {};
971+
const tabId = portDetails.tabId;
964972
const msg = request.msg;
965973
switch ( msg.what ) {
966974
case 'connectionAccepted':
@@ -1005,7 +1013,7 @@ vAPI.messaging = {
10051013
});
10061014
break;
10071015
case 'localStorage': {
1008-
if ( fromDetails.privileged !== true ) { break; }
1016+
if ( portDetails.privileged !== true ) { break; }
10091017
const args = msg.args || [];
10101018
vAPI.localStorage[msg.fn](...args).then(result => {
10111019
callback(result);
@@ -1016,7 +1024,7 @@ vAPI.messaging = {
10161024
if ( tabId === undefined ) { break; }
10171025
const details = {
10181026
code: undefined,
1019-
frameId: sender.frameId,
1027+
frameId: portDetails.frameId,
10201028
matchAboutBlank: true
10211029
};
10221030
if ( msg.add ) {
@@ -1086,23 +1094,23 @@ vAPI.messaging = {
10861094
}
10871095

10881096
// Auxiliary process to main process: specific handler
1089-
const fromDetails = this.ports.get(port.name);
1090-
if ( fromDetails === undefined ) { return; }
1097+
const portDetails = this.ports.get(port.name);
1098+
if ( portDetails === undefined ) { return; }
10911099

10921100
const listenerDetails = this.listeners.get(request.channel);
10931101
let r = this.UNHANDLED;
10941102
if (
10951103
(listenerDetails !== undefined) &&
1096-
(listenerDetails.privileged === false || fromDetails.privileged)
1104+
(listenerDetails.privileged === false || portDetails.privileged)
10971105

10981106
) {
1099-
r = listenerDetails.fn(request.msg, port.sender, callback);
1107+
r = listenerDetails.fn(request.msg, portDetails, callback);
11001108
}
11011109
if ( r !== this.UNHANDLED ) { return; }
11021110

11031111
// Auxiliary process to main process: default handler
1104-
if ( fromDetails.privileged ) {
1105-
r = this.defaultHandler(request.msg, port.sender, callback);
1112+
if ( portDetails.privileged ) {
1113+
r = this.defaultHandler(request.msg, portDetails, callback);
11061114
if ( r !== this.UNHANDLED ) { return; }
11071115
}
11081116

src/js/messaging.js

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
const µb = µBlock;
4343

4444
const clickToLoad = function(request, sender) {
45-
const { tabId, frameId } = µb.getMessageSenderDetails(sender);
45+
const { tabId, frameId } = sender;
4646
if ( tabId === undefined || frameId === undefined ) { return false; }
4747
const pageStore = µb.pageStoreFromTabId(tabId);
4848
if ( pageStore === null ) { return false; }
@@ -545,9 +545,9 @@ vAPI.messaging.listen({
545545

546546
const µb = µBlock;
547547

548-
const retrieveContentScriptParameters = function(senderDetails, request) {
548+
const retrieveContentScriptParameters = function(sender, request) {
549549
if ( µb.readyToFilter !== true ) { return; }
550-
const { url: senderURL, tabId, frameId } = senderDetails;
550+
const { url: senderURL, tabId, frameId } = sender;
551551
if (
552552
tabId === undefined ||
553553
frameId === undefined ||
@@ -649,8 +649,7 @@ const onMessage = function(request, sender, callback) {
649649
break;
650650
}
651651

652-
const senderDetails = µb.getMessageSenderDetails(sender);
653-
const pageStore = µb.pageStoreFromTabId(senderDetails.tabId);
652+
const pageStore = µb.pageStoreFromTabId(sender.tabId);
654653

655654
// Sync
656655
let response;
@@ -676,29 +675,29 @@ const onMessage = function(request, sender, callback) {
676675
break;
677676

678677
case 'maybeGoodPopup':
679-
µb.maybeGoodPopup.tabId = senderDetails.tabId;
678+
µb.maybeGoodPopup.tabId = sender.tabId;
680679
µb.maybeGoodPopup.url = request.url;
681680
break;
682681

683682
case 'shouldRenderNoscriptTags':
684683
if ( pageStore === null ) { break; }
685-
const fctxt = µb.filteringContext.fromTabId(senderDetails.tabId);
684+
const fctxt = µb.filteringContext.fromTabId(sender.tabId);
686685
if ( pageStore.filterScripting(fctxt, undefined) ) {
687-
vAPI.tabs.executeScript(senderDetails.tabId, {
686+
vAPI.tabs.executeScript(sender.tabId, {
688687
file: '/js/scriptlets/noscript-spoof.js',
689-
frameId: senderDetails.frameId,
688+
frameId: sender.frameId,
690689
runAt: 'document_end',
691690
});
692691
}
693692
break;
694693

695694
case 'retrieveContentScriptParameters':
696-
response = retrieveContentScriptParameters(senderDetails, request);
695+
response = retrieveContentScriptParameters(sender, request);
697696
break;
698697

699698
case 'retrieveGenericCosmeticSelectors':
700-
request.tabId = senderDetails.tabId;
701-
request.frameId = senderDetails.frameId;
699+
request.tabId = sender.tabId;
700+
request.frameId = sender.frameId;
702701
response = {
703702
result: µb.cosmeticFilteringEngine.retrieveGenericSelectors(request),
704703
};
@@ -1462,7 +1461,7 @@ vAPI.messaging.listen({
14621461
// >>>>> start of local scope
14631462

14641463
const onMessage = function(request, sender, callback) {
1465-
const tabId = sender && sender.tab ? sender.tab.id : 0;
1464+
const tabId = sender.tabId || 0;
14661465

14671466
// Async
14681467
switch ( request.what ) {
@@ -1614,7 +1613,7 @@ logCSPViolations.policyDirectiveToTypeMap = new Map([
16141613
]);
16151614

16161615
const onMessage = function(request, sender, callback) {
1617-
const tabId = sender && sender.tab ? sender.tab.id : 0;
1616+
const tabId = sender.tabId || 0;
16181617
const pageStore = µb.pageStoreFromTabId(tabId);
16191618

16201619
// Async

src/js/utils.js

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -683,18 +683,3 @@
683683
window.dispatchEvent(new CustomEvent(name));
684684
}
685685
};
686-
687-
/******************************************************************************/
688-
689-
µBlock.getMessageSenderDetails = function(sender) {
690-
const r = {};
691-
if ( sender instanceof Object ) {
692-
r.url = sender.url;
693-
r.frameId = sender.frameId;
694-
const tab = sender.tab;
695-
if ( tab instanceof Object ) {
696-
r.tabId = tab.id;
697-
}
698-
}
699-
return r;
700-
};

0 commit comments

Comments
 (0)